{"mappings":"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","sources":["node_modules/jquery/dist/jquery.js","node_modules/datatables.net/js/jquery.dataTables.mjs","node_modules/datatables.net-dt/js/dataTables.dataTables.mjs","node_modules/flatpickr/dist/esm/types/options.js","node_modules/flatpickr/dist/esm/l10n/default.js","node_modules/flatpickr/dist/esm/utils/index.js","node_modules/flatpickr/dist/esm/utils/dom.js","node_modules/flatpickr/dist/esm/utils/formatting.js","node_modules/flatpickr/dist/esm/utils/dates.js","node_modules/flatpickr/dist/esm/utils/polyfills.js","node_modules/flatpickr/dist/esm/index.js","src/datatable/main.js"],"sourcesContent":["/*!\n * jQuery JavaScript Library v3.6.4\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-03-08T15:28Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.6.4\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.10\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2023-02-14\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trleadingCombinator = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem && elem.namespaceURI,\n\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t// Make sure the the `:has()` argument is parsed unforgivingly.\n\t// We include `*` in the test to detect buggy implementations that are\n\t// _selectively_ forgiving (specifically when the list includes at least\n\t// one valid selector).\n\t// Note that we treat complete lack of support for `:has()` as if it were\n\t// spec-compliant support, which is fine because use of `:has()` in such\n\t// environments will fail in the qSA path and fall back to jQuery traversal\n\t// anyway.\n\tsupport.cssHas = assert( function() {\n\t\ttry {\n\t\t\tdocument.querySelector( \":has(*,:jqfake)\" );\n\t\t\treturn false;\n\t\t} catch ( e ) {\n\t\t\treturn true;\n\t\t}\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\tif ( !support.cssHas ) {\n\n\t\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t\t// Our regular `try-catch` mechanism fails to detect natively-unsupported\n\t\t// pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n\t\t// in browsers that parse the `:has()` argument as a forgiving selector list.\n\t\t// https://drafts.csswg.org/selectors/#relational now requires the argument\n\t\t// to be parsed unforgivingly, but browsers have not yet fully adjusted.\n\t\trbuggyQSA.push( \":has\" );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\n\t\t\t// Support: IE <9 only\n\t\t\t// IE doesn't have `contains` on `document` so we need to check for\n\t\t\t// `documentElement` presence.\n\t\t\t// We need to fall back to `a` when `documentElement` is missing\n\t\t\t// as `ownerDocument` of elements within `<template/>` may have\n\t\t\t// a null one - a default behavior of all modern browsers.\n\t\t\tvar adown = a.nodeType === 9 && a.documentElement || a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE <10 only\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rleadingCombinator.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)\n\t// Strict HTML recognition (trac-11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See trac-6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (trac-9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see trac-8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (trac-14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (trac-11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (trac-14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: Chrome 86+\n\t\t\t\t\t\t// In Chrome, if an element having a focusout handler is blurred by\n\t\t\t\t\t\t// clicking outside of it, it invokes the handler synchronously. If\n\t\t\t\t\t\t// that handler calls `.remove()` on the element, the data is cleared,\n\t\t\t\t\t\t// leaving `result` undefined. We need to guard against this.\n\t\t\t\t\t\treturn result && result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\n\trcleanScript = /^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is display: block\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, trac-12537)\n\t//   .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n\t\t// it's only available as `\"cssFloat\"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there's no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" ) || undefined;\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\n// Require that the \"whitespace run\" starts from a non-whitespace\n// to avoid O(N^2) behavior when the engine would try matching \"\\s+$\" at each space position.\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"$1\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (trac-13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","/*! DataTables 1.13.4\n * ©2008-2023 SpryMedia Ltd - datatables.net/license\n */\n\nimport jQuery from 'jquery';\n\n// DataTables code uses $ internally, but we want to be able to\n// reassign $ with the `use` method, so it is a regular var.\nlet $ = jQuery;\n\n\nvar DataTable = function ( selector, options )\n{\n\t// Check if called with a window or jQuery object for DOM less applications\n\t// This is for backwards compatibility\n\tif (DataTable.factory(selector, options)) {\n\t\treturn DataTable;\n\t}\n\n\t// When creating with `new`, create a new DataTable, returning the API instance\n\tif (this instanceof DataTable) {\n\t\treturn $(selector).DataTable(options);\n\t}\n\telse {\n\t\t// Argument switching\n\t\toptions = selector;\n\t}\n\n\t/**\n\t * Perform a jQuery selector action on the table's TR elements (from the tbody) and\n\t * return the resulting jQuery object.\n\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter\n\t *    criterion (\"applied\") or all TR elements (i.e. no filter).\n\t *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.\n\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t *    'original' whereby the original order the data was read into the table is used.\n\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t *  @returns {object} jQuery object, filtered by the given selector.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Highlight every second row\n\t *      oTable.$('tr:odd').css('backgroundColor', 'blue');\n\t *    } );\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Filter to rows with 'Webkit' in them, add a background colour and then\n\t *      // remove the filter, thus highlighting the 'Webkit' rows only.\n\t *      oTable.fnFilter('Webkit');\n\t *      oTable.$('tr', {\"search\": \"applied\"}).css('backgroundColor', 'blue');\n\t *      oTable.fnFilter('');\n\t *    } );\n\t */\n\tthis.$ = function ( sSelector, oOpts )\n\t{\n\t\treturn this.api(true).$( sSelector, oOpts );\n\t};\n\t\n\t\n\t/**\n\t * Almost identical to $ in operation, but in this case returns the data for the matched\n\t * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes\n\t * rather than any descendants, so the data can be obtained for the row/cell. If matching\n\t * rows are found, the data returned is the original data array/object that was used to\n\t * create the row (or a generated array if from a DOM source).\n\t *\n\t * This method is often useful in-combination with $ where both functions are given the\n\t * same parameters and the array indexes will match identically.\n\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t *  @param {string} [oOpts.filter=none] Select elements that meet the current filter\n\t *    criterion (\"applied\") or all elements (i.e. no filter).\n\t *  @param {string} [oOpts.order=current] Order of the data in the processed array.\n\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t *    'original' whereby the original order the data was read into the table is used.\n\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t *  @returns {array} Data for the matched elements. If any elements, as a result of the\n\t *    selector, were not TR, TD or TH elements in the DataTable, they will have a null\n\t *    entry in the array.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Get the data from the first row in the table\n\t *      var data = oTable._('tr:first');\n\t *\n\t *      // Do something useful with the data\n\t *      alert( \"First cell is: \"+data[0] );\n\t *    } );\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Filter to 'Webkit' and get all data for\n\t *      oTable.fnFilter('Webkit');\n\t *      var data = oTable._('tr', {\"search\": \"applied\"});\n\t *\n\t *      // Do something with the data\n\t *      alert( data.length+\" rows matched the search\" );\n\t *    } );\n\t */\n\tthis._ = function ( sSelector, oOpts )\n\t{\n\t\treturn this.api(true).rows( sSelector, oOpts ).data();\n\t};\n\t\n\t\n\t/**\n\t * Create a DataTables Api instance, with the currently selected tables for\n\t * the Api's context.\n\t * @param {boolean} [traditional=false] Set the API instance's context to be\n\t *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was\n\t *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),\n\t *   or if all tables captured in the jQuery object should be used.\n\t * @return {DataTables.Api}\n\t */\n\tthis.api = function ( traditional )\n\t{\n\t\treturn traditional ?\n\t\t\tnew _Api(\n\t\t\t\t_fnSettingsFromNode( this[ _ext.iApiIndex ] )\n\t\t\t) :\n\t\t\tnew _Api( this );\n\t};\n\t\n\t\n\t/**\n\t * Add a single new row or multiple rows of data to the table. Please note\n\t * that this is suitable for client-side processing only - if you are using\n\t * server-side processing (i.e. \"bServerSide\": true), then to add data, you\n\t * must add it to the data source, i.e. the server-side, through an Ajax call.\n\t *  @param {array|object} data The data to be added to the table. This can be:\n\t *    <ul>\n\t *      <li>1D array of data - add a single row with the data provided</li>\n\t *      <li>2D array of arrays - add multiple rows in a single call</li>\n\t *      <li>object - data object when using <i>mData</i></li>\n\t *      <li>array of objects - multiple data objects when using <i>mData</i></li>\n\t *    </ul>\n\t *  @param {bool} [redraw=true] redraw the table or not\n\t *  @returns {array} An array of integers, representing the list of indexes in\n\t *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to\n\t *    the table.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    // Global var for counter\n\t *    var giCount = 2;\n\t *\n\t *    $(document).ready(function() {\n\t *      $('#example').dataTable();\n\t *    } );\n\t *\n\t *    function fnClickAddRow() {\n\t *      $('#example').dataTable().fnAddData( [\n\t *        giCount+\".1\",\n\t *        giCount+\".2\",\n\t *        giCount+\".3\",\n\t *        giCount+\".4\" ]\n\t *      );\n\t *\n\t *      giCount++;\n\t *    }\n\t */\n\tthis.fnAddData = function( data, redraw )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\t/* Check if we want to add multiple rows or not */\n\t\tvar rows = Array.isArray(data) && ( Array.isArray(data[0]) || $.isPlainObject(data[0]) ) ?\n\t\t\tapi.rows.add( data ) :\n\t\t\tapi.row.add( data );\n\t\n\t\tif ( redraw === undefined || redraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\n\t\treturn rows.flatten().toArray();\n\t};\n\t\n\t\n\t/**\n\t * This function will make DataTables recalculate the column sizes, based on the data\n\t * contained in the table and the sizes applied to the columns (in the DOM, CSS or\n\t * through the sWidth parameter). This can be useful when the width of the table's\n\t * parent element changes (for example a window resize).\n\t *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable( {\n\t *        \"sScrollY\": \"200px\",\n\t *        \"bPaginate\": false\n\t *      } );\n\t *\n\t *      $(window).on('resize', function () {\n\t *        oTable.fnAdjustColumnSizing();\n\t *      } );\n\t *    } );\n\t */\n\tthis.fnAdjustColumnSizing = function ( bRedraw )\n\t{\n\t\tvar api = this.api( true ).columns.adjust();\n\t\tvar settings = api.settings()[0];\n\t\tvar scroll = settings.oScroll;\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw( false );\n\t\t}\n\t\telse if ( scroll.sX !== \"\" || scroll.sY !== \"\" ) {\n\t\t\t/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */\n\t\t\t_fnScrollDraw( settings );\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Quickly and simply clear a table\n\t *  @param {bool} [bRedraw=true] redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)\n\t *      oTable.fnClearTable();\n\t *    } );\n\t */\n\tthis.fnClearTable = function( bRedraw )\n\t{\n\t\tvar api = this.api( true ).clear();\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * The exact opposite of 'opening' a row, this function will close any rows which\n\t * are currently 'open'.\n\t *  @param {node} nTr the table row to 'close'\n\t *  @returns {int} 0 on success, or 1 if failed (can't find the row)\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnClose = function( nTr )\n\t{\n\t\tthis.api( true ).row( nTr ).child.hide();\n\t};\n\t\n\t\n\t/**\n\t * Remove a row for the table\n\t *  @param {mixed} target The index of the row from aoData to be deleted, or\n\t *    the TR element you want to delete\n\t *  @param {function|null} [callBack] Callback function\n\t *  @param {bool} [redraw=true] Redraw the table or not\n\t *  @returns {array} The row that was deleted\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Immediately remove the first row\n\t *      oTable.fnDeleteRow( 0 );\n\t *    } );\n\t */\n\tthis.fnDeleteRow = function( target, callback, redraw )\n\t{\n\t\tvar api = this.api( true );\n\t\tvar rows = api.rows( target );\n\t\tvar settings = rows.settings()[0];\n\t\tvar data = settings.aoData[ rows[0][0] ];\n\t\n\t\trows.remove();\n\t\n\t\tif ( callback ) {\n\t\t\tcallback.call( this, settings, data );\n\t\t}\n\t\n\t\tif ( redraw === undefined || redraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\n\t\treturn data;\n\t};\n\t\n\t\n\t/**\n\t * Restore the table to it's original state in the DOM by removing all of DataTables\n\t * enhancements, alterations to the DOM structure of the table and event listeners.\n\t *  @param {boolean} [remove=false] Completely remove the table from the DOM\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      // This example is fairly pointless in reality, but shows how fnDestroy can be used\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnDestroy();\n\t *    } );\n\t */\n\tthis.fnDestroy = function ( remove )\n\t{\n\t\tthis.api( true ).destroy( remove );\n\t};\n\t\n\t\n\t/**\n\t * Redraw the table\n\t *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)\n\t *      oTable.fnDraw();\n\t *    } );\n\t */\n\tthis.fnDraw = function( complete )\n\t{\n\t\t// Note that this isn't an exact match to the old call to _fnDraw - it takes\n\t\t// into account the new data, but can hold position.\n\t\tthis.api( true ).draw( complete );\n\t};\n\t\n\t\n\t/**\n\t * Filter the input based on data\n\t *  @param {string} sInput String to filter the table on\n\t *  @param {int|null} [iColumn] Column to limit filtering to\n\t *  @param {bool} [bRegex=false] Treat as regular expression or not\n\t *  @param {bool} [bSmart=true] Perform smart filtering or not\n\t *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)\n\t *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sometime later - filter...\n\t *      oTable.fnFilter( 'test string' );\n\t *    } );\n\t */\n\tthis.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( iColumn === null || iColumn === undefined ) {\n\t\t\tapi.search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t}\n\t\telse {\n\t\t\tapi.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t}\n\t\n\t\tapi.draw();\n\t};\n\t\n\t\n\t/**\n\t * Get the data for the whole table, an individual row or an individual cell based on the\n\t * provided parameters.\n\t *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as\n\t *    a TR node then the data source for the whole row will be returned. If given as a\n\t *    TD/TH cell node then iCol will be automatically calculated and the data for the\n\t *    cell returned. If given as an integer, then this is treated as the aoData internal\n\t *    data index for the row (see fnGetPosition) and the data for that row used.\n\t *  @param {int} [col] Optional column index that you want the data of.\n\t *  @returns {array|object|string} If mRow is undefined, then the data for all rows is\n\t *    returned. If mRow is defined, just data for that row, and is iCol is\n\t *    defined, only data for the designated cell is returned.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    // Row data\n\t *    $(document).ready(function() {\n\t *      oTable = $('#example').dataTable();\n\t *\n\t *      oTable.$('tr').click( function () {\n\t *        var data = oTable.fnGetData( this );\n\t *        // ... do something with the array / object of data for the row\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Individual cell data\n\t *    $(document).ready(function() {\n\t *      oTable = $('#example').dataTable();\n\t *\n\t *      oTable.$('td').click( function () {\n\t *        var sData = oTable.fnGetData( this );\n\t *        alert( 'The cell clicked on had the value of '+sData );\n\t *      } );\n\t *    } );\n\t */\n\tthis.fnGetData = function( src, col )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( src !== undefined ) {\n\t\t\tvar type = src.nodeName ? src.nodeName.toLowerCase() : '';\n\t\n\t\t\treturn col !== undefined || type == 'td' || type == 'th' ?\n\t\t\t\tapi.cell( src, col ).data() :\n\t\t\t\tapi.row( src ).data() || null;\n\t\t}\n\t\n\t\treturn api.data().toArray();\n\t};\n\t\n\t\n\t/**\n\t * Get an array of the TR nodes that are used in the table's body. Note that you will\n\t * typically want to use the '$' API method in preference to this as it is more\n\t * flexible.\n\t *  @param {int} [iRow] Optional row index for the TR element you want\n\t *  @returns {array|node} If iRow is undefined, returns an array of all TR elements\n\t *    in the table's body, or iRow is defined, just the TR element requested.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Get the nodes from the table\n\t *      var nNodes = oTable.fnGetNodes( );\n\t *    } );\n\t */\n\tthis.fnGetNodes = function( iRow )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\treturn iRow !== undefined ?\n\t\t\tapi.row( iRow ).node() :\n\t\t\tapi.rows().nodes().flatten().toArray();\n\t};\n\t\n\t\n\t/**\n\t * Get the array indexes of a particular cell from it's DOM element\n\t * and column index including hidden columns\n\t *  @param {node} node this can either be a TR, TD or TH in the table's body\n\t *  @returns {int} If nNode is given as a TR, then a single index is returned, or\n\t *    if given as a cell, an array of [row index, column index (visible),\n\t *    column index (all)] is given.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      $('#example tbody td').click( function () {\n\t *        // Get the position of the current data from the node\n\t *        var aPos = oTable.fnGetPosition( this );\n\t *\n\t *        // Get the data array for this row\n\t *        var aData = oTable.fnGetData( aPos[0] );\n\t *\n\t *        // Update the data array and return the value\n\t *        aData[ aPos[1] ] = 'clicked';\n\t *        this.innerHTML = 'clicked';\n\t *      } );\n\t *\n\t *      // Init DataTables\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnGetPosition = function( node )\n\t{\n\t\tvar api = this.api( true );\n\t\tvar nodeName = node.nodeName.toUpperCase();\n\t\n\t\tif ( nodeName == 'TR' ) {\n\t\t\treturn api.row( node ).index();\n\t\t}\n\t\telse if ( nodeName == 'TD' || nodeName == 'TH' ) {\n\t\t\tvar cell = api.cell( node ).index();\n\t\n\t\t\treturn [\n\t\t\t\tcell.row,\n\t\t\t\tcell.columnVisible,\n\t\t\t\tcell.column\n\t\t\t];\n\t\t}\n\t\treturn null;\n\t};\n\t\n\t\n\t/**\n\t * Check to see if a row is 'open' or not.\n\t *  @param {node} nTr the table row to check\n\t *  @returns {boolean} true if the row is currently open, false otherwise\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnIsOpen = function( nTr )\n\t{\n\t\treturn this.api( true ).row( nTr ).child.isShown();\n\t};\n\t\n\t\n\t/**\n\t * This function will place a new row directly after a row which is currently\n\t * on display on the page, with the HTML contents that is passed into the\n\t * function. This can be used, for example, to ask for confirmation that a\n\t * particular record should be deleted.\n\t *  @param {node} nTr The table row to 'open'\n\t *  @param {string|node|jQuery} mHtml The HTML to put into the row\n\t *  @param {string} sClass Class to give the new TD cell\n\t *  @returns {node} The row opened. Note that if the table row passed in as the\n\t *    first parameter, is not found in the table, this method will silently\n\t *    return.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnOpen = function( nTr, mHtml, sClass )\n\t{\n\t\treturn this.api( true )\n\t\t\t.row( nTr )\n\t\t\t.child( mHtml, sClass )\n\t\t\t.show()\n\t\t\t.child()[0];\n\t};\n\t\n\t\n\t/**\n\t * Change the pagination - provides the internal logic for pagination in a simple API\n\t * function. With this function you can have a DataTables table go to the next,\n\t * previous, first or last pages.\n\t *  @param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n\t *    or page number to jump to (integer), note that page 0 is the first page.\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnPageChange( 'next' );\n\t *    } );\n\t */\n\tthis.fnPageChange = function ( mAction, bRedraw )\n\t{\n\t\tvar api = this.api( true ).page( mAction );\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw(false);\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Show a particular column\n\t *  @param {int} iCol The column whose display should be changed\n\t *  @param {bool} bShow Show (true) or hide (false) the column\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Hide the second column after initialisation\n\t *      oTable.fnSetColumnVis( 1, false );\n\t *    } );\n\t */\n\tthis.fnSetColumnVis = function ( iCol, bShow, bRedraw )\n\t{\n\t\tvar api = this.api( true ).column( iCol ).visible( bShow );\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.columns.adjust().draw();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Get the settings for a particular table for external manipulation\n\t *  @returns {object} DataTables settings object. See\n\t *    {@link DataTable.models.oSettings}\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      var oSettings = oTable.fnSettings();\n\t *\n\t *      // Show an example parameter from the settings\n\t *      alert( oSettings._iDisplayStart );\n\t *    } );\n\t */\n\tthis.fnSettings = function()\n\t{\n\t\treturn _fnSettingsFromNode( this[_ext.iApiIndex] );\n\t};\n\t\n\t\n\t/**\n\t * Sort the table by a particular column\n\t *  @param {int} iCol the data index to sort on. Note that this will not match the\n\t *    'display index' if you have hidden data entries\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sort immediately with columns 0 and 1\n\t *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );\n\t *    } );\n\t */\n\tthis.fnSort = function( aaSort )\n\t{\n\t\tthis.api( true ).order( aaSort ).draw();\n\t};\n\t\n\t\n\t/**\n\t * Attach a sort listener to an element for a given column\n\t *  @param {node} nNode the element to attach the sort listener to\n\t *  @param {int} iColumn the column that a click on this node will sort on\n\t *  @param {function} [fnCallback] callback function when sort is run\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sort on column 1, when 'sorter' is clicked on\n\t *      oTable.fnSortListener( document.getElementById('sorter'), 1 );\n\t *    } );\n\t */\n\tthis.fnSortListener = function( nNode, iColumn, fnCallback )\n\t{\n\t\tthis.api( true ).order.listener( nNode, iColumn, fnCallback );\n\t};\n\t\n\t\n\t/**\n\t * Update a table cell or row - this method will accept either a single value to\n\t * update the cell with, an array of values with one element for each column or\n\t * an object in the same format as the original data source. The function is\n\t * self-referencing in order to make the multi column updates easier.\n\t *  @param {object|array|string} mData Data to update the cell/row with\n\t *  @param {node|int} mRow TR element you want to update or the aoData index\n\t *  @param {int} [iColumn] The column to update, give as null or undefined to\n\t *    update a whole row.\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @param {bool} [bAction=true] Perform pre-draw actions or not\n\t *  @returns {int} 0 on success, 1 on error\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell\n\t *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row\n\t *    } );\n\t */\n\tthis.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( iColumn === undefined || iColumn === null ) {\n\t\t\tapi.row( mRow ).data( mData );\n\t\t}\n\t\telse {\n\t\t\tapi.cell( mRow, iColumn ).data( mData );\n\t\t}\n\t\n\t\tif ( bAction === undefined || bAction ) {\n\t\t\tapi.columns.adjust();\n\t\t}\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\treturn 0;\n\t};\n\t\n\t\n\t/**\n\t * Provide a common method for plug-ins to check the version of DataTables being used, in order\n\t * to ensure compatibility.\n\t *  @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n\t *    formats \"X\" and \"X.Y\" are also acceptable.\n\t *  @returns {boolean} true if this version of DataTables is greater or equal to the required\n\t *    version, or false if this version of DataTales is not suitable\n\t *  @method\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      alert( oTable.fnVersionCheck( '1.9.0' ) );\n\t *    } );\n\t */\n\tthis.fnVersionCheck = _ext.fnVersionCheck;\n\t\n\n\tvar _that = this;\n\tvar emptyInit = options === undefined;\n\tvar len = this.length;\n\n\tif ( emptyInit ) {\n\t\toptions = {};\n\t}\n\n\tthis.oApi = this.internal = _ext.internal;\n\n\t// Extend with old style plug-in API methods\n\tfor ( var fn in DataTable.ext.internal ) {\n\t\tif ( fn ) {\n\t\t\tthis[fn] = _fnExternApiFunc(fn);\n\t\t}\n\t}\n\n\tthis.each(function() {\n\t\t// For each initialisation we want to give it a clean initialisation\n\t\t// object that can be bashed around\n\t\tvar o = {};\n\t\tvar oInit = len > 1 ? // optimisation for single table case\n\t\t\t_fnExtend( o, options, true ) :\n\t\t\toptions;\n\n\t\t/*global oInit,_that,emptyInit*/\n\t\tvar i=0, iLen, j, jLen, k, kLen;\n\t\tvar sId = this.getAttribute( 'id' );\n\t\tvar bInitHandedOff = false;\n\t\tvar defaults = DataTable.defaults;\n\t\tvar $this = $(this);\n\t\t\n\t\t\n\t\t/* Sanity check */\n\t\tif ( this.nodeName.toLowerCase() != 'table' )\n\t\t{\n\t\t\t_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t/* Backwards compatibility for the defaults */\n\t\t_fnCompatOpts( defaults );\n\t\t_fnCompatCols( defaults.column );\n\t\t\n\t\t/* Convert the camel-case defaults to Hungarian */\n\t\t_fnCamelToHungarian( defaults, defaults, true );\n\t\t_fnCamelToHungarian( defaults.column, defaults.column, true );\n\t\t\n\t\t/* Setting up the initialisation object */\n\t\t_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ), true );\n\t\t\n\t\t\n\t\t\n\t\t/* Check to see if we are re-initialising a table */\n\t\tvar allSettings = DataTable.settings;\n\t\tfor ( i=0, iLen=allSettings.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tvar s = allSettings[i];\n\t\t\n\t\t\t/* Base check on table node */\n\t\t\tif (\n\t\t\t\ts.nTable == this ||\n\t\t\t\t(s.nTHead && s.nTHead.parentNode == this) ||\n\t\t\t\t(s.nTFoot && s.nTFoot.parentNode == this)\n\t\t\t) {\n\t\t\t\tvar bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;\n\t\t\t\tvar bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;\n\t\t\n\t\t\t\tif ( emptyInit || bRetrieve )\n\t\t\t\t{\n\t\t\t\t\treturn s.oInstance;\n\t\t\t\t}\n\t\t\t\telse if ( bDestroy )\n\t\t\t\t{\n\t\t\t\t\ts.oInstance.fnDestroy();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t/* If the element we are initialising has the same ID as a table which was previously\n\t\t\t * initialised, but the table nodes don't match (from before) then we destroy the old\n\t\t\t * instance by simply deleting it. This is under the assumption that the table has been\n\t\t\t * destroyed by other methods. Anyone using non-id selectors will need to do this manually\n\t\t\t */\n\t\t\tif ( s.sTableId == this.id )\n\t\t\t{\n\t\t\t\tallSettings.splice( i, 1 );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* Ensure the table has an ID - required for accessibility */\n\t\tif ( sId === null || sId === \"\" )\n\t\t{\n\t\t\tsId = \"DataTables_Table_\"+(DataTable.ext._unique++);\n\t\t\tthis.id = sId;\n\t\t}\n\t\t\n\t\t/* Create the settings object for this table and set some of the default parameters */\n\t\tvar oSettings = $.extend( true, {}, DataTable.models.oSettings, {\n\t\t\t\"sDestroyWidth\": $this[0].style.width,\n\t\t\t\"sInstance\":     sId,\n\t\t\t\"sTableId\":      sId\n\t\t} );\n\t\toSettings.nTable = this;\n\t\toSettings.oApi   = _that.internal;\n\t\toSettings.oInit  = oInit;\n\t\t\n\t\tallSettings.push( oSettings );\n\t\t\n\t\t// Need to add the instance after the instance after the settings object has been added\n\t\t// to the settings array, so we can self reference the table instance if more than one\n\t\toSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();\n\t\t\n\t\t// Backwards compatibility, before we apply all the defaults\n\t\t_fnCompatOpts( oInit );\n\t\t_fnLanguageCompat( oInit.oLanguage );\n\t\t\n\t\t// If the length menu is given, but the init display length is not, use the length menu\n\t\tif ( oInit.aLengthMenu && ! oInit.iDisplayLength )\n\t\t{\n\t\t\toInit.iDisplayLength = Array.isArray( oInit.aLengthMenu[0] ) ?\n\t\t\t\toInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];\n\t\t}\n\t\t\n\t\t// Apply the defaults and init options to make a single init object will all\n\t\t// options defined from defaults and instance options.\n\t\toInit = _fnExtend( $.extend( true, {}, defaults ), oInit );\n\t\t\n\t\t\n\t\t// Map the initialisation options onto the settings object\n\t\t_fnMap( oSettings.oFeatures, oInit, [\n\t\t\t\"bPaginate\",\n\t\t\t\"bLengthChange\",\n\t\t\t\"bFilter\",\n\t\t\t\"bSort\",\n\t\t\t\"bSortMulti\",\n\t\t\t\"bInfo\",\n\t\t\t\"bProcessing\",\n\t\t\t\"bAutoWidth\",\n\t\t\t\"bSortClasses\",\n\t\t\t\"bServerSide\",\n\t\t\t\"bDeferRender\"\n\t\t] );\n\t\t_fnMap( oSettings, oInit, [\n\t\t\t\"asStripeClasses\",\n\t\t\t\"ajax\",\n\t\t\t\"fnServerData\",\n\t\t\t\"fnFormatNumber\",\n\t\t\t\"sServerMethod\",\n\t\t\t\"aaSorting\",\n\t\t\t\"aaSortingFixed\",\n\t\t\t\"aLengthMenu\",\n\t\t\t\"sPaginationType\",\n\t\t\t\"sAjaxSource\",\n\t\t\t\"sAjaxDataProp\",\n\t\t\t\"iStateDuration\",\n\t\t\t\"sDom\",\n\t\t\t\"bSortCellsTop\",\n\t\t\t\"iTabIndex\",\n\t\t\t\"fnStateLoadCallback\",\n\t\t\t\"fnStateSaveCallback\",\n\t\t\t\"renderer\",\n\t\t\t\"searchDelay\",\n\t\t\t\"rowId\",\n\t\t\t[ \"iCookieDuration\", \"iStateDuration\" ], // backwards compat\n\t\t\t[ \"oSearch\", \"oPreviousSearch\" ],\n\t\t\t[ \"aoSearchCols\", \"aoPreSearchCols\" ],\n\t\t\t[ \"iDisplayLength\", \"_iDisplayLength\" ]\n\t\t] );\n\t\t_fnMap( oSettings.oScroll, oInit, [\n\t\t\t[ \"sScrollX\", \"sX\" ],\n\t\t\t[ \"sScrollXInner\", \"sXInner\" ],\n\t\t\t[ \"sScrollY\", \"sY\" ],\n\t\t\t[ \"bScrollCollapse\", \"bCollapse\" ]\n\t\t] );\n\t\t_fnMap( oSettings.oLanguage, oInit, \"fnInfoCallback\" );\n\t\t\n\t\t/* Callback functions which are array driven */\n\t\t_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );\n\t\t_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );\n\t\t_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );\n\t\t_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );\n\t\t_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );\n\t\t_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );\n\t\t\n\t\toSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );\n\t\t\n\t\t/* Browser support detection */\n\t\t_fnBrowserDetect( oSettings );\n\t\t\n\t\tvar oClasses = oSettings.oClasses;\n\t\t\n\t\t$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );\n\t\t$this.addClass( oClasses.sTable );\n\t\t\n\t\t\n\t\tif ( oSettings.iInitDisplayStart === undefined )\n\t\t{\n\t\t\t/* Display start point, taking into account the save saving */\n\t\t\toSettings.iInitDisplayStart = oInit.iDisplayStart;\n\t\t\toSettings._iDisplayStart = oInit.iDisplayStart;\n\t\t}\n\t\t\n\t\tif ( oInit.iDeferLoading !== null )\n\t\t{\n\t\t\toSettings.bDeferLoading = true;\n\t\t\tvar tmp = Array.isArray( oInit.iDeferLoading );\n\t\t\toSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;\n\t\t\toSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;\n\t\t}\n\t\t\n\t\t/* Language definitions */\n\t\tvar oLanguage = oSettings.oLanguage;\n\t\t$.extend( true, oLanguage, oInit.oLanguage );\n\t\t\n\t\tif ( oLanguage.sUrl )\n\t\t{\n\t\t\t/* Get the language definitions from a file - because this Ajax call makes the language\n\t\t\t * get async to the remainder of this function we use bInitHandedOff to indicate that\n\t\t\t * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor\n\t\t\t */\n\t\t\t$.ajax( {\n\t\t\t\tdataType: 'json',\n\t\t\t\turl: oLanguage.sUrl,\n\t\t\t\tsuccess: function ( json ) {\n\t\t\t\t\t_fnCamelToHungarian( defaults.oLanguage, json );\n\t\t\t\t\t_fnLanguageCompat( json );\n\t\t\t\t\t$.extend( true, oLanguage, json, oSettings.oInit.oLanguage );\n\t\t\n\t\t\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t},\n\t\t\t\terror: function () {\n\t\t\t\t\t// Error occurred loading language file, continue on as best we can\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tbInitHandedOff = true;\n\t\t}\n\t\telse {\n\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);\n\t\t}\n\t\t\n\t\t/*\n\t\t * Stripes\n\t\t */\n\t\tif ( oInit.asStripeClasses === null )\n\t\t{\n\t\t\toSettings.asStripeClasses =[\n\t\t\t\toClasses.sStripeOdd,\n\t\t\t\toClasses.sStripeEven\n\t\t\t];\n\t\t}\n\t\t\n\t\t/* Remove row stripe classes if they are already on the table row */\n\t\tvar stripeClasses = oSettings.asStripeClasses;\n\t\tvar rowOne = $this.children('tbody').find('tr').eq(0);\n\t\tif ( $.inArray( true, $.map( stripeClasses, function(el, i) {\n\t\t\treturn rowOne.hasClass(el);\n\t\t} ) ) !== -1 ) {\n\t\t\t$('tbody tr', this).removeClass( stripeClasses.join(' ') );\n\t\t\toSettings.asDestroyStripes = stripeClasses.slice();\n\t\t}\n\t\t\n\t\t/*\n\t\t * Columns\n\t\t * See if we should load columns automatically or use defined ones\n\t\t */\n\t\tvar anThs = [];\n\t\tvar aoColumnsInit;\n\t\tvar nThead = this.getElementsByTagName('thead');\n\t\tif ( nThead.length !== 0 )\n\t\t{\n\t\t\t_fnDetectHeader( oSettings.aoHeader, nThead[0] );\n\t\t\tanThs = _fnGetUniqueThs( oSettings );\n\t\t}\n\t\t\n\t\t/* If not given a column array, generate one with nulls */\n\t\tif ( oInit.aoColumns === null )\n\t\t{\n\t\t\taoColumnsInit = [];\n\t\t\tfor ( i=0, iLen=anThs.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\taoColumnsInit.push( null );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\taoColumnsInit = oInit.aoColumns;\n\t\t}\n\t\t\n\t\t/* Add the columns */\n\t\tfor ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )\n\t\t{\n\t\t\t_fnAddColumn( oSettings, anThs ? anThs[i] : null );\n\t\t}\n\t\t\n\t\t/* Apply the column definitions */\n\t\t_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {\n\t\t\t_fnColumnOptions( oSettings, iCol, oDef );\n\t\t} );\n\t\t\n\t\t/* HTML5 attribute detection - build an mData object automatically if the\n\t\t * attributes are found\n\t\t */\n\t\tif ( rowOne.length ) {\n\t\t\tvar a = function ( cell, name ) {\n\t\t\t\treturn cell.getAttribute( 'data-'+name ) !== null ? name : null;\n\t\t\t};\n\t\t\n\t\t\t$( rowOne[0] ).children('th, td').each( function (i, cell) {\n\t\t\t\tvar col = oSettings.aoColumns[i];\n\t\t\n\t\t\t\tif (! col) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t\t}\n\t\t\n\t\t\t\tif ( col.mData === i ) {\n\t\t\t\t\tvar sort = a( cell, 'sort' ) || a( cell, 'order' );\n\t\t\t\t\tvar filter = a( cell, 'filter' ) || a( cell, 'search' );\n\t\t\n\t\t\t\t\tif ( sort !== null || filter !== null ) {\n\t\t\t\t\t\tcol.mData = {\n\t\t\t\t\t\t\t_:      i+'.display',\n\t\t\t\t\t\t\tsort:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\ttype:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\tfilter: filter !== null ? i+'.@data-'+filter : undefined\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcol._isArrayHost = true;\n\t\t\n\t\t\t\t\t\t_fnColumnOptions( oSettings, i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\t\n\t\tvar features = oSettings.oFeatures;\n\t\tvar loadedInit = function () {\n\t\t\t/*\n\t\t\t * Sorting\n\t\t\t * @todo For modularisation (1.11) this needs to do into a sort start up handler\n\t\t\t */\n\t\t\n\t\t\t// If aaSorting is not defined, then we use the first indicator in asSorting\n\t\t\t// in case that has been altered, so the default sort reflects that option\n\t\t\tif ( oInit.aaSorting === undefined ) {\n\t\t\t\tvar sorting = oSettings.aaSorting;\n\t\t\t\tfor ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {\n\t\t\t\t\tsorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t/* Do a first pass on the sorting classes (allows any size changes to be taken into\n\t\t\t * account, and also will apply sorting disabled classes if disabled\n\t\t\t */\n\t\t\t_fnSortingClasses( oSettings );\n\t\t\n\t\t\tif ( features.bSort ) {\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\tif ( oSettings.bSorted ) {\n\t\t\t\t\t\tvar aSort = _fnSortFlatten( oSettings );\n\t\t\t\t\t\tvar sortedColumns = {};\n\t\t\n\t\t\t\t\t\t$.each( aSort, function (i, val) {\n\t\t\t\t\t\t\tsortedColumns[ val.src ] = val.dir;\n\t\t\t\t\t\t} );\n\t\t\n\t\t\t\t\t\t_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );\n\t\t\t\t\t\t_fnSortAria( oSettings );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\n\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\tif ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {\n\t\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\t}\n\t\t\t}, 'sc' );\n\t\t\n\t\t\n\t\t\t/*\n\t\t\t * Final init\n\t\t\t * Cache the header, body and footer as required, creating them if needed\n\t\t\t */\n\t\t\n\t\t\t// Work around for Webkit bug 83867 - store the caption-side before removing from doc\n\t\t\tvar captions = $this.children('caption').each( function () {\n\t\t\t\tthis._captionSide = $(this).css('caption-side');\n\t\t\t} );\n\t\t\n\t\t\tvar thead = $this.children('thead');\n\t\t\tif ( thead.length === 0 ) {\n\t\t\t\tthead = $('<thead/>').appendTo($this);\n\t\t\t}\n\t\t\toSettings.nTHead = thead[0];\n\t\t\n\t\t\tvar tbody = $this.children('tbody');\n\t\t\tif ( tbody.length === 0 ) {\n\t\t\t\ttbody = $('<tbody/>').insertAfter(thead);\n\t\t\t}\n\t\t\toSettings.nTBody = tbody[0];\n\t\t\n\t\t\tvar tfoot = $this.children('tfoot');\n\t\t\tif ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\") ) {\n\t\t\t\t// If we are a scrolling table, and no footer has been given, then we need to create\n\t\t\t\t// a tfoot element for the caption element to be appended to\n\t\t\t\ttfoot = $('<tfoot/>').appendTo($this);\n\t\t\t}\n\t\t\n\t\t\tif ( tfoot.length === 0 || tfoot.children().length === 0 ) {\n\t\t\t\t$this.addClass( oClasses.sNoFooter );\n\t\t\t}\n\t\t\telse if ( tfoot.length > 0 ) {\n\t\t\t\toSettings.nTFoot = tfoot[0];\n\t\t\t\t_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );\n\t\t\t}\n\t\t\n\t\t\t/* Check if there is data passing into the constructor */\n\t\t\tif ( oInit.aaData ) {\n\t\t\t\tfor ( i=0 ; i<oInit.aaData.length ; i++ ) {\n\t\t\t\t\t_fnAddData( oSettings, oInit.aaData[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {\n\t\t\t\t/* Grab the data from the page - only do this when deferred loading or no Ajax\n\t\t\t\t * source since there is no point in reading the DOM data if we are then going\n\t\t\t\t * to replace it with Ajax data\n\t\t\t\t */\n\t\t\t\t_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );\n\t\t\t}\n\t\t\n\t\t\t/* Copy the data index array */\n\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\n\t\t\t/* Initialisation complete - table can be drawn */\n\t\t\toSettings.bInitialised = true;\n\t\t\n\t\t\t/* Check if we need to initialise the table (it might not have been handed off to the\n\t\t\t * language processor)\n\t\t\t */\n\t\t\tif ( bInitHandedOff === false ) {\n\t\t\t\t_fnInitialise( oSettings );\n\t\t\t}\n\t\t};\n\t\t\n\t\t/* Must be done after everything which can be overridden by the state saving! */\n\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );\n\t\t\n\t\tif ( oInit.bStateSave )\n\t\t{\n\t\t\tfeatures.bStateSave = true;\n\t\t\t_fnLoadState( oSettings, oInit, loadedInit );\n\t\t}\n\t\telse {\n\t\t\tloadedInit();\n\t\t}\n\t\t\n\t} );\n\t_that = null;\n\treturn this;\n};\n\n\n/*\n * It is useful to have variables which are scoped locally so only the\n * DataTables functions can access them and they don't leak into global space.\n * At the same time these functions are often useful over multiple files in the\n * core and API, so we list, or at least document, all variables which are used\n * by DataTables as private variables here. This also ensures that there is no\n * clashing of variable names and that they can easily referenced for reuse.\n */\n\n\n// Defined else where\n//  _selector_run\n//  _selector_opts\n//  _selector_first\n//  _selector_row_indexes\n\nvar _ext; // DataTable.ext\nvar _Api; // DataTable.Api\nvar _api_register; // DataTable.Api.register\nvar _api_registerPlural; // DataTable.Api.registerPlural\n\nvar _re_dic = {};\nvar _re_new_lines = /[\\r\\n\\u2028]/g;\nvar _re_html = /<.*?>/g;\n\n// This is not strict ISO8601 - Date.parse() is quite lax, although\n// implementations differ between browsers.\nvar _re_date = /^\\d{2,4}[\\.\\/\\-]\\d{1,2}[\\.\\/\\-]\\d{1,2}([T ]{1}\\d{1,2}[:\\.]\\d{2}([\\.:]\\d{2})?)?$/;\n\n// Escape regular expression special characters\nvar _re_escape_regex = new RegExp( '(\\\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-' ].join('|\\\\') + ')', 'g' );\n\n// http://en.wikipedia.org/wiki/Foreign_exchange_market\n// - \\u20BD - Russian ruble.\n// - \\u20a9 - South Korean Won\n// - \\u20BA - Turkish Lira\n// - \\u20B9 - Indian Rupee\n// - R - Brazil (R$) and South Africa\n// - fr - Swiss Franc\n// - kr - Swedish krona, Norwegian krone and Danish krone\n// - \\u2009 is thin space and \\u202F is narrow no-break space, both used in many\n// - Ƀ - Bitcoin\n// - Ξ - Ethereum\n//   standards as thousands separators.\nvar _re_formatted_numeric = /['\\u00A0,$£€¥%\\u2009\\u202F\\u20BD\\u20a9\\u20BArfkɃΞ]/gi;\n\n\nvar _empty = function ( d ) {\n\treturn !d || d === true || d === '-' ? true : false;\n};\n\n\nvar _intVal = function ( s ) {\n\tvar integer = parseInt( s, 10 );\n\treturn !isNaN(integer) && isFinite(s) ? integer : null;\n};\n\n// Convert from a formatted number with characters other than `.` as the\n// decimal place, to a Javascript number\nvar _numToDecimal = function ( num, decimalPoint ) {\n\t// Cache created regular expressions for speed as this function is called often\n\tif ( ! _re_dic[ decimalPoint ] ) {\n\t\t_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );\n\t}\n\treturn typeof num === 'string' && decimalPoint !== '.' ?\n\t\tnum.replace( /\\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :\n\t\tnum;\n};\n\n\nvar _isNumber = function ( d, decimalPoint, formatted ) {\n\tlet type = typeof d;\n\tvar strType = type === 'string';\n\n\tif ( type === 'number' || type === 'bigint') {\n\t\treturn true;\n\t}\n\n\t// If empty return immediately so there must be a number if it is a\n\t// formatted string (this stops the string \"k\", or \"kr\", etc being detected\n\t// as a formatted number for currency\n\tif ( _empty( d ) ) {\n\t\treturn true;\n\t}\n\n\tif ( decimalPoint && strType ) {\n\t\td = _numToDecimal( d, decimalPoint );\n\t}\n\n\tif ( formatted && strType ) {\n\t\td = d.replace( _re_formatted_numeric, '' );\n\t}\n\n\treturn !isNaN( parseFloat(d) ) && isFinite( d );\n};\n\n\n// A string without HTML in it can be considered to be HTML still\nvar _isHtml = function ( d ) {\n\treturn _empty( d ) || typeof d === 'string';\n};\n\n\nvar _htmlNumeric = function ( d, decimalPoint, formatted ) {\n\tif ( _empty( d ) ) {\n\t\treturn true;\n\t}\n\n\tvar html = _isHtml( d );\n\treturn ! html ?\n\t\tnull :\n\t\t_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?\n\t\t\ttrue :\n\t\t\tnull;\n};\n\n\nvar _pluck = function ( a, prop, prop2 ) {\n\tvar out = [];\n\tvar i=0, ien=a.length;\n\n\t// Could have the test in the loop for slightly smaller code, but speed\n\t// is essential here\n\tif ( prop2 !== undefined ) {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[i] && a[i][ prop ] ) {\n\t\t\t\tout.push( a[i][ prop ][ prop2 ] );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[i] ) {\n\t\t\t\tout.push( a[i][ prop ] );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\n// Basically the same as _pluck, but rather than looping over `a` we use `order`\n// as the indexes to pick from `a`\nvar _pluck_order = function ( a, order, prop, prop2 )\n{\n\tvar out = [];\n\tvar i=0, ien=order.length;\n\n\t// Could have the test in the loop for slightly smaller code, but speed\n\t// is essential here\n\tif ( prop2 !== undefined ) {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[ order[i] ][ prop ] ) {\n\t\t\t\tout.push( a[ order[i] ][ prop ][ prop2 ] );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tout.push( a[ order[i] ][ prop ] );\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\nvar _range = function ( len, start )\n{\n\tvar out = [];\n\tvar end;\n\n\tif ( start === undefined ) {\n\t\tstart = 0;\n\t\tend = len;\n\t}\n\telse {\n\t\tend = start;\n\t\tstart = len;\n\t}\n\n\tfor ( var i=start ; i<end ; i++ ) {\n\t\tout.push( i );\n\t}\n\n\treturn out;\n};\n\n\nvar _removeEmpty = function ( a )\n{\n\tvar out = [];\n\n\tfor ( var i=0, ien=a.length ; i<ien ; i++ ) {\n\t\tif ( a[i] ) { // careful - will remove all falsy values!\n\t\t\tout.push( a[i] );\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\nvar _stripHtml = function ( d ) {\n\treturn d.replace( _re_html, '' );\n};\n\n\n/**\n * Determine if all values in the array are unique. This means we can short\n * cut the _unique method at the cost of a single loop. A sorted array is used\n * to easily check the values.\n *\n * @param  {array} src Source array\n * @return {boolean} true if all unique, false otherwise\n * @ignore\n */\nvar _areAllUnique = function ( src ) {\n\tif ( src.length < 2 ) {\n\t\treturn true;\n\t}\n\n\tvar sorted = src.slice().sort();\n\tvar last = sorted[0];\n\n\tfor ( var i=1, ien=sorted.length ; i<ien ; i++ ) {\n\t\tif ( sorted[i] === last ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlast = sorted[i];\n\t}\n\n\treturn true;\n};\n\n\n/**\n * Find the unique elements in a source array.\n *\n * @param  {array} src Source array\n * @return {array} Array of unique items\n * @ignore\n */\nvar _unique = function ( src )\n{\n\tif ( _areAllUnique( src ) ) {\n\t\treturn src.slice();\n\t}\n\n\t// A faster unique method is to use object keys to identify used values,\n\t// but this doesn't work with arrays or objects, which we must also\n\t// consider. See jsperf.com/compare-array-unique-versions/4 for more\n\t// information.\n\tvar\n\t\tout = [],\n\t\tval,\n\t\ti, ien=src.length,\n\t\tj, k=0;\n\n\tagain: for ( i=0 ; i<ien ; i++ ) {\n\t\tval = src[i];\n\n\t\tfor ( j=0 ; j<k ; j++ ) {\n\t\t\tif ( out[j] === val ) {\n\t\t\t\tcontinue again;\n\t\t\t}\n\t\t}\n\n\t\tout.push( val );\n\t\tk++;\n\t}\n\n\treturn out;\n};\n\n// Surprisingly this is faster than [].concat.apply\n// https://jsperf.com/flatten-an-array-loop-vs-reduce/2\nvar _flatten = function (out, val) {\n\tif (Array.isArray(val)) {\n\t\tfor (var i=0 ; i<val.length ; i++) {\n\t\t\t_flatten(out, val[i]);\n\t\t}\n\t}\n\telse {\n\t\tout.push(val);\n\t}\n  \n\treturn out;\n}\n\nvar _includes = function (search, start) {\n\tif (start === undefined) {\n\t\tstart = 0;\n\t}\n\n\treturn this.indexOf(search, start) !== -1;\t\n};\n\n// Array.isArray polyfill.\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\nif (! Array.isArray) {\n    Array.isArray = function(arg) {\n        return Object.prototype.toString.call(arg) === '[object Array]';\n    };\n}\n\nif (! Array.prototype.includes) {\n\tArray.prototype.includes = _includes;\n}\n\n// .trim() polyfill\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim\nif (!String.prototype.trim) {\n  String.prototype.trim = function () {\n    return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n  };\n}\n\nif (! String.prototype.includes) {\n\tString.prototype.includes = _includes;\n}\n\n/**\n * DataTables utility methods\n * \n * This namespace provides helper methods that DataTables uses internally to\n * create a DataTable, but which are not exclusively used only for DataTables.\n * These methods can be used by extension authors to save the duplication of\n * code.\n *\n *  @namespace\n */\nDataTable.util = {\n\t/**\n\t * Throttle the calls to a function. Arguments and context are maintained\n\t * for the throttled function.\n\t *\n\t * @param {function} fn Function to be called\n\t * @param {integer} freq Call frequency in mS\n\t * @return {function} Wrapped function\n\t */\n\tthrottle: function ( fn, freq ) {\n\t\tvar\n\t\t\tfrequency = freq !== undefined ? freq : 200,\n\t\t\tlast,\n\t\t\ttimer;\n\n\t\treturn function () {\n\t\t\tvar\n\t\t\t\tthat = this,\n\t\t\t\tnow  = +new Date(),\n\t\t\t\targs = arguments;\n\n\t\t\tif ( last && now < last + frequency ) {\n\t\t\t\tclearTimeout( timer );\n\n\t\t\t\ttimer = setTimeout( function () {\n\t\t\t\t\tlast = undefined;\n\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t}, frequency );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlast = now;\n\t\t\t\tfn.apply( that, args );\n\t\t\t}\n\t\t};\n\t},\n\n\n\t/**\n\t * Escape a string such that it can be used in a regular expression\n\t *\n\t *  @param {string} val string to escape\n\t *  @returns {string} escaped string\n\t */\n\tescapeRegex: function ( val ) {\n\t\treturn val.replace( _re_escape_regex, '\\\\$1' );\n\t},\n\n\t/**\n\t * Create a function that will write to a nested object or array\n\t * @param {*} source JSON notation string\n\t * @returns Write function\n\t */\n\tset: function ( source ) {\n\t\tif ( $.isPlainObject( source ) ) {\n\t\t\t/* Unlike get, only the underscore (global) option is used for for\n\t\t\t * setting data since we don't know the type here. This is why an object\n\t\t\t * option is not documented for `mData` (which is read/write), but it is\n\t\t\t * for `mRender` which is read only.\n\t\t\t */\n\t\t\treturn DataTable.util.set( source._ );\n\t\t}\n\t\telse if ( source === null ) {\n\t\t\t// Nothing to do when the data source is null\n\t\t\treturn function () {};\n\t\t}\n\t\telse if ( typeof source === 'function' ) {\n\t\t\treturn function (data, val, meta) {\n\t\t\t\tsource( data, 'set', val, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'string' && (source.indexOf('.') !== -1 ||\n\t\t\t\t  source.indexOf('[') !== -1 || source.indexOf('(') !== -1) )\n\t\t{\n\t\t\t// Like the get, we need to get data from a nested object\n\t\t\tvar setData = function (data, val, src) {\n\t\t\t\tvar a = _fnSplitObjNotation( src ), b;\n\t\t\t\tvar aLast = a[a.length-1];\n\t\t\t\tvar arrayNotation, funcNotation, o, innerSrc;\n\t\n\t\t\t\tfor ( var i=0, iLen=a.length-1 ; i<iLen ; i++ ) {\n\t\t\t\t\t// Protect against prototype pollution\n\t\t\t\t\tif (a[i] === '__proto__' || a[i] === 'constructor') {\n\t\t\t\t\t\tthrow new Error('Cannot set prototype values');\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Check if we are dealing with an array notation request\n\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\tif ( arrayNotation ) {\n\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\t\t\t\tdata[ a[i] ] = [];\n\t\n\t\t\t\t\t\t// Get the remainder of the nested object to set so we can recurse\n\t\t\t\t\t\tb = a.slice();\n\t\t\t\t\t\tb.splice( 0, i+1 );\n\t\t\t\t\t\tinnerSrc = b.join('.');\n\t\n\t\t\t\t\t\t// Traverse each entry in the array setting the properties requested\n\t\t\t\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t\t\t\tfor ( var j=0, jLen=val.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\to = {};\n\t\t\t\t\t\t\t\tsetData( o, val[j], innerSrc );\n\t\t\t\t\t\t\t\tdata[ a[i] ].push( o );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// We've been asked to save data to an array, but it\n\t\t\t\t\t\t\t// isn't array data to be saved. Best that can be done\n\t\t\t\t\t\t\t// is to just save the value.\n\t\t\t\t\t\t\tdata[ a[i] ] = val;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// The inner call to setData has already traversed through the remainder\n\t\t\t\t\t\t// of the source and has set the data, thus we can exit here\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( funcNotation ) {\n\t\t\t\t\t\t// Function call\n\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\tdata = data[ a[i] ]( val );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If the nested object doesn't currently exist - since we are\n\t\t\t\t\t// trying to set the value - create it\n\t\t\t\t\tif ( data[ a[i] ] === null || data[ a[i] ] === undefined ) {\n\t\t\t\t\t\tdata[ a[i] ] = {};\n\t\t\t\t\t}\n\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t}\n\t\n\t\t\t\t// Last item in the input - i.e, the actual set\n\t\t\t\tif ( aLast.match(__reFn ) ) {\n\t\t\t\t\t// Function call\n\t\t\t\t\tdata = data[ aLast.replace(__reFn, '') ]( val );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// If array notation is used, we just want to strip it and use the property name\n\t\t\t\t\t// and assign the value. If it isn't used, then we get the result we want anyway\n\t\t\t\t\tdata[ aLast.replace(__reArray, '') ] = val;\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\treturn setData( data, val, source );\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\t// Array or flat object mapping\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\tdata[source] = val;\n\t\t\t};\n\t\t}\n\t},\n\n\t/**\n\t * Create a function that will read nested objects from arrays, based on JSON notation\n\t * @param {*} source JSON notation string\n\t * @returns Value read\n\t */\n\tget: function ( source ) {\n\t\tif ( $.isPlainObject( source ) ) {\n\t\t\t// Build an object of get functions, and wrap them in a single call\n\t\t\tvar o = {};\n\t\t\t$.each( source, function (key, val) {\n\t\t\t\tif ( val ) {\n\t\t\t\t\to[key] = DataTable.util.get( val );\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\tvar t = o[type] || o._;\n\t\t\t\treturn t !== undefined ?\n\t\t\t\t\tt(data, type, row, meta) :\n\t\t\t\t\tdata;\n\t\t\t};\n\t\t}\n\t\telse if ( source === null ) {\n\t\t\t// Give an empty string for rendering / sorting etc\n\t\t\treturn function (data) { // type, row and meta also passed, but not used\n\t\t\t\treturn data;\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'function' ) {\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\treturn source( data, type, row, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'string' && (source.indexOf('.') !== -1 ||\n\t\t\t\t  source.indexOf('[') !== -1 || source.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* If there is a . in the source string then the data source is in a\n\t\t\t * nested object so we loop over the data for each level to get the next\n\t\t\t * level down. On each loop we test for undefined, and if found immediately\n\t\t\t * return. This allows entire objects to be missing and sDefaultContent to\n\t\t\t * be used if defined, rather than throwing an error\n\t\t\t */\n\t\t\tvar fetchData = function (data, type, src) {\n\t\t\t\tvar arrayNotation, funcNotation, out, innerSrc;\n\t\n\t\t\t\tif ( src !== \"\" ) {\n\t\t\t\t\tvar a = _fnSplitObjNotation( src );\n\t\n\t\t\t\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ ) {\n\t\t\t\t\t\t// Check if we are dealing with special notation\n\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\t\tif ( arrayNotation ) {\n\t\t\t\t\t\t\t// Array notation\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\n\t\t\t\t\t\t\t// Condition allows simply [] to be passed in\n\t\t\t\t\t\t\tif ( a[i] !== \"\" ) {\n\t\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tout = [];\n\t\n\t\t\t\t\t\t\t// Get the remainder of the nested object to get\n\t\t\t\t\t\t\ta.splice( 0, i+1 );\n\t\t\t\t\t\t\tinnerSrc = a.join('.');\n\t\n\t\t\t\t\t\t\t// Traverse each entry in the array getting the properties requested\n\t\t\t\t\t\t\tif ( Array.isArray( data ) ) {\n\t\t\t\t\t\t\t\tfor ( var j=0, jLen=data.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\t\tout.push( fetchData( data[j], type, innerSrc ) );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\t// If a string is given in between the array notation indicators, that\n\t\t\t\t\t\t\t// is used to join the strings together, otherwise an array is returned\n\t\t\t\t\t\t\tvar join = arrayNotation[0].substring(1, arrayNotation[0].length-1);\n\t\t\t\t\t\t\tdata = (join===\"\") ? out : out.join(join);\n\t\n\t\t\t\t\t\t\t// The inner call to fetchData has already traversed through the remainder\n\t\t\t\t\t\t\t// of the source requested, so we exit from the loop\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( funcNotation ) {\n\t\t\t\t\t\t\t// Function call\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\t\tdata = data[ a[i] ]();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( data === null || data[ a[i] ] === undefined ) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn data;\n\t\t\t};\n\t\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn fetchData( data, type, source );\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\t// Array or flat object mapping\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn data[source];\n\t\t\t};\n\t\t}\n\t}\n};\n\n\n\n/**\n * Create a mapping object that allows camel case parameters to be looked up\n * for their Hungarian counterparts. The mapping is stored in a private\n * parameter called `_hungarianMap` which can be accessed on the source object.\n *  @param {object} o\n *  @memberof DataTable#oApi\n */\nfunction _fnHungarianMap ( o )\n{\n\tvar\n\t\thungarian = 'a aa ai ao as b fn i m o s ',\n\t\tmatch,\n\t\tnewKey,\n\t\tmap = {};\n\n\t$.each( o, function (key, val) {\n\t\tmatch = key.match(/^([^A-Z]+?)([A-Z])/);\n\n\t\tif ( match && hungarian.indexOf(match[1]+' ') !== -1 )\n\t\t{\n\t\t\tnewKey = key.replace( match[0], match[2].toLowerCase() );\n\t\t\tmap[ newKey ] = key;\n\n\t\t\tif ( match[1] === 'o' )\n\t\t\t{\n\t\t\t\t_fnHungarianMap( o[key] );\n\t\t\t}\n\t\t}\n\t} );\n\n\to._hungarianMap = map;\n}\n\n\n/**\n * Convert from camel case parameters to Hungarian, based on a Hungarian map\n * created by _fnHungarianMap.\n *  @param {object} src The model object which holds all parameters that can be\n *    mapped.\n *  @param {object} user The object to convert from camel case to Hungarian.\n *  @param {boolean} force When set to `true`, properties which already have a\n *    Hungarian value in the `user` object will be overwritten. Otherwise they\n *    won't be.\n *  @memberof DataTable#oApi\n */\nfunction _fnCamelToHungarian ( src, user, force )\n{\n\tif ( ! src._hungarianMap ) {\n\t\t_fnHungarianMap( src );\n\t}\n\n\tvar hungarianKey;\n\n\t$.each( user, function (key, val) {\n\t\thungarianKey = src._hungarianMap[ key ];\n\n\t\tif ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )\n\t\t{\n\t\t\t// For objects, we need to buzz down into the object to copy parameters\n\t\t\tif ( hungarianKey.charAt(0) === 'o' )\n\t\t\t{\n\t\t\t\t// Copy the camelCase options over to the hungarian\n\t\t\t\tif ( ! user[ hungarianKey ] ) {\n\t\t\t\t\tuser[ hungarianKey ] = {};\n\t\t\t\t}\n\t\t\t\t$.extend( true, user[hungarianKey], user[key] );\n\n\t\t\t\t_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser[hungarianKey] = user[ key ];\n\t\t\t}\n\t\t}\n\t} );\n}\n\n\n/**\n * Language compatibility - when certain options are given, and others aren't, we\n * need to duplicate the values over, in order to provide backwards compatibility\n * with older language files.\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnLanguageCompat( lang )\n{\n\t// Note the use of the Hungarian notation for the parameters in this method as\n\t// this is called after the mapping of camelCase to Hungarian\n\tvar defaults = DataTable.defaults.oLanguage;\n\n\t// Default mapping\n\tvar defaultDecimal = defaults.sDecimal;\n\tif ( defaultDecimal ) {\n\t\t_addNumericSort( defaultDecimal );\n\t}\n\n\tif ( lang ) {\n\t\tvar zeroRecords = lang.sZeroRecords;\n\n\t\t// Backwards compatibility - if there is no sEmptyTable given, then use the same as\n\t\t// sZeroRecords - assuming that is given.\n\t\tif ( ! lang.sEmptyTable && zeroRecords &&\n\t\t\tdefaults.sEmptyTable === \"No data available in table\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );\n\t\t}\n\n\t\t// Likewise with loading records\n\t\tif ( ! lang.sLoadingRecords && zeroRecords &&\n\t\t\tdefaults.sLoadingRecords === \"Loading...\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );\n\t\t}\n\n\t\t// Old parameter name of the thousands separator mapped onto the new\n\t\tif ( lang.sInfoThousands ) {\n\t\t\tlang.sThousands = lang.sInfoThousands;\n\t\t}\n\n\t\tvar decimal = lang.sDecimal;\n\t\tif ( decimal && defaultDecimal !== decimal ) {\n\t\t\t_addNumericSort( decimal );\n\t\t}\n\t}\n}\n\n\n/**\n * Map one parameter onto another\n *  @param {object} o Object to map\n *  @param {*} knew The new parameter name\n *  @param {*} old The old parameter name\n */\nvar _fnCompatMap = function ( o, knew, old ) {\n\tif ( o[ knew ] !== undefined ) {\n\t\to[ old ] = o[ knew ];\n\t}\n};\n\n\n/**\n * Provide backwards compatibility for the main DT options. Note that the new\n * options are mapped onto the old parameters, so this is an external interface\n * change only.\n *  @param {object} init Object to map\n */\nfunction _fnCompatOpts ( init )\n{\n\t_fnCompatMap( init, 'ordering',      'bSort' );\n\t_fnCompatMap( init, 'orderMulti',    'bSortMulti' );\n\t_fnCompatMap( init, 'orderClasses',  'bSortClasses' );\n\t_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );\n\t_fnCompatMap( init, 'order',         'aaSorting' );\n\t_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );\n\t_fnCompatMap( init, 'paging',        'bPaginate' );\n\t_fnCompatMap( init, 'pagingType',    'sPaginationType' );\n\t_fnCompatMap( init, 'pageLength',    'iDisplayLength' );\n\t_fnCompatMap( init, 'searching',     'bFilter' );\n\n\t// Boolean initialisation of x-scrolling\n\tif ( typeof init.sScrollX === 'boolean' ) {\n\t\tinit.sScrollX = init.sScrollX ? '100%' : '';\n\t}\n\tif ( typeof init.scrollX === 'boolean' ) {\n\t\tinit.scrollX = init.scrollX ? '100%' : '';\n\t}\n\n\t// Column search objects are in an array, so it needs to be converted\n\t// element by element\n\tvar searchCols = init.aoSearchCols;\n\n\tif ( searchCols ) {\n\t\tfor ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {\n\t\t\tif ( searchCols[i] ) {\n\t\t\t\t_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Provide backwards compatibility for column options. Note that the new options\n * are mapped onto the old parameters, so this is an external interface change\n * only.\n *  @param {object} init Object to map\n */\nfunction _fnCompatCols ( init )\n{\n\t_fnCompatMap( init, 'orderable',     'bSortable' );\n\t_fnCompatMap( init, 'orderData',     'aDataSort' );\n\t_fnCompatMap( init, 'orderSequence', 'asSorting' );\n\t_fnCompatMap( init, 'orderDataType', 'sortDataType' );\n\n\t// orderData can be given as an integer\n\tvar dataSort = init.aDataSort;\n\tif ( typeof dataSort === 'number' && ! Array.isArray( dataSort ) ) {\n\t\tinit.aDataSort = [ dataSort ];\n\t}\n}\n\n\n/**\n * Browser feature detection for capabilities, quirks\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnBrowserDetect( settings )\n{\n\t// We don't need to do this every time DataTables is constructed, the values\n\t// calculated are specific to the browser and OS configuration which we\n\t// don't expect to change between initialisations\n\tif ( ! DataTable.__browser ) {\n\t\tvar browser = {};\n\t\tDataTable.__browser = browser;\n\n\t\t// Scrolling feature / quirks detection\n\t\tvar n = $('<div/>')\n\t\t\t.css( {\n\t\t\t\tposition: 'fixed',\n\t\t\t\ttop: 0,\n\t\t\t\tleft: $(window).scrollLeft()*-1, // allow for scrolling\n\t\t\t\theight: 1,\n\t\t\t\twidth: 1,\n\t\t\t\toverflow: 'hidden'\n\t\t\t} )\n\t\t\t.append(\n\t\t\t\t$('<div/>')\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 1,\n\t\t\t\t\t\tleft: 1,\n\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\toverflow: 'scroll'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\theight: 10\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t)\n\t\t\t)\n\t\t\t.appendTo( 'body' );\n\n\t\tvar outer = n.children();\n\t\tvar inner = outer.children();\n\n\t\t// Numbers below, in order, are:\n\t\t// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth\n\t\t//\n\t\t// IE6 XP:                           100 100 100  83\n\t\t// IE7 Vista:                        100 100 100  83\n\t\t// IE 8+ Windows:                     83  83 100  83\n\t\t// Evergreen Windows:                 83  83 100  83\n\t\t// Evergreen Mac with scrollbars:     85  85 100  85\n\t\t// Evergreen Mac without scrollbars: 100 100 100 100\n\n\t\t// Get scrollbar width\n\t\tbrowser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;\n\n\t\t// IE6/7 will oversize a width 100% element inside a scrolling element, to\n\t\t// include the width of the scrollbar, while other browsers ensure the inner\n\t\t// element is contained without forcing scrolling\n\t\tbrowser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;\n\n\t\t// In rtl text layout, some browsers (most, but not all) will place the\n\t\t// scrollbar on the left, rather than the right.\n\t\tbrowser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;\n\n\t\t// IE8- don't provide height and width for getBoundingClientRect\n\t\tbrowser.bBounding = n[0].getBoundingClientRect().width ? true : false;\n\n\t\tn.remove();\n\t}\n\n\t$.extend( settings.oBrowser, DataTable.__browser );\n\tsettings.oScroll.iBarWidth = DataTable.__browser.barWidth;\n}\n\n\n/**\n * Array.prototype reduce[Right] method, used for browsers which don't support\n * JS 1.6. Done this way to reduce code size, since we iterate either way\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnReduce ( that, fn, init, start, end, inc )\n{\n\tvar\n\t\ti = start,\n\t\tvalue,\n\t\tisSet = false;\n\n\tif ( init !== undefined ) {\n\t\tvalue = init;\n\t\tisSet = true;\n\t}\n\n\twhile ( i !== end ) {\n\t\tif ( ! that.hasOwnProperty(i) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalue = isSet ?\n\t\t\tfn( value, that[i], i, that ) :\n\t\t\tthat[i];\n\n\t\tisSet = true;\n\t\ti += inc;\n\t}\n\n\treturn value;\n}\n\n/**\n * Add a column to the list used for the table with default values\n *  @param {object} oSettings dataTables settings object\n *  @param {node} nTh The th element for this column\n *  @memberof DataTable#oApi\n */\nfunction _fnAddColumn( oSettings, nTh )\n{\n\t// Add column to aoColumns array\n\tvar oDefaults = DataTable.defaults.column;\n\tvar iCol = oSettings.aoColumns.length;\n\tvar oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {\n\t\t\"nTh\": nTh ? nTh : document.createElement('th'),\n\t\t\"sTitle\":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',\n\t\t\"aDataSort\": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],\n\t\t\"mData\": oDefaults.mData ? oDefaults.mData : iCol,\n\t\tidx: iCol\n\t} );\n\toSettings.aoColumns.push( oCol );\n\n\t// Add search object for column specific search. Note that the `searchCols[ iCol ]`\n\t// passed into extend can be undefined. This allows the user to give a default\n\t// with only some of the parameters defined, and also not give a default\n\tvar searchCols = oSettings.aoPreSearchCols;\n\tsearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );\n\n\t// Use the default column options function to initialise classes etc\n\t_fnColumnOptions( oSettings, iCol, $(nTh).data() );\n}\n\n\n/**\n * Apply options for a column\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iCol column index to consider\n *  @param {object} oOptions object with sType, bVisible and bSearchable etc\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnOptions( oSettings, iCol, oOptions )\n{\n\tvar oCol = oSettings.aoColumns[ iCol ];\n\tvar oClasses = oSettings.oClasses;\n\tvar th = $(oCol.nTh);\n\n\t// Try to get width information from the DOM. We can't get it from CSS\n\t// as we'd need to parse the CSS stylesheet. `width` option can override\n\tif ( ! oCol.sWidthOrig ) {\n\t\t// Width attribute\n\t\toCol.sWidthOrig = th.attr('width') || null;\n\n\t\t// Style attribute\n\t\tvar t = (th.attr('style') || '').match(/width:\\s*(\\d+[pxem%]+)/);\n\t\tif ( t ) {\n\t\t\toCol.sWidthOrig = t[1];\n\t\t}\n\t}\n\n\t/* User specified column options */\n\tif ( oOptions !== undefined && oOptions !== null )\n\t{\n\t\t// Backwards compatibility\n\t\t_fnCompatCols( oOptions );\n\n\t\t// Map camel case parameters to their Hungarian counterparts\n\t\t_fnCamelToHungarian( DataTable.defaults.column, oOptions, true );\n\n\t\t/* Backwards compatibility for mDataProp */\n\t\tif ( oOptions.mDataProp !== undefined && !oOptions.mData )\n\t\t{\n\t\t\toOptions.mData = oOptions.mDataProp;\n\t\t}\n\n\t\tif ( oOptions.sType )\n\t\t{\n\t\t\toCol._sManualType = oOptions.sType;\n\t\t}\n\n\t\t// `class` is a reserved word in Javascript, so we need to provide\n\t\t// the ability to use a valid name for the camel case input\n\t\tif ( oOptions.className && ! oOptions.sClass )\n\t\t{\n\t\t\toOptions.sClass = oOptions.className;\n\t\t}\n\t\tif ( oOptions.sClass ) {\n\t\t\tth.addClass( oOptions.sClass );\n\t\t}\n\n\t\tvar origClass = oCol.sClass;\n\n\t\t$.extend( oCol, oOptions );\n\t\t_fnMap( oCol, oOptions, \"sWidth\", \"sWidthOrig\" );\n\n\t\t// Merge class from previously defined classes with this one, rather than just\n\t\t// overwriting it in the extend above\n\t\tif (origClass !== oCol.sClass) {\n\t\t\toCol.sClass = origClass + ' ' + oCol.sClass;\n\t\t}\n\n\t\t/* iDataSort to be applied (backwards compatibility), but aDataSort will take\n\t\t * priority if defined\n\t\t */\n\t\tif ( oOptions.iDataSort !== undefined )\n\t\t{\n\t\t\toCol.aDataSort = [ oOptions.iDataSort ];\n\t\t}\n\t\t_fnMap( oCol, oOptions, \"aDataSort\" );\n\t}\n\n\t/* Cache the data get and set functions for speed */\n\tvar mDataSrc = oCol.mData;\n\tvar mData = _fnGetObjectDataFn( mDataSrc );\n\tvar mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;\n\n\tvar attrTest = function( src ) {\n\t\treturn typeof src === 'string' && src.indexOf('@') !== -1;\n\t};\n\toCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (\n\t\tattrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)\n\t);\n\toCol._setter = null;\n\n\toCol.fnGetData = function (rowData, type, meta) {\n\t\tvar innerData = mData( rowData, type, undefined, meta );\n\n\t\treturn mRender && type ?\n\t\t\tmRender( innerData, type, rowData, meta ) :\n\t\t\tinnerData;\n\t};\n\toCol.fnSetData = function ( rowData, val, meta ) {\n\t\treturn _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );\n\t};\n\n\t// Indicate if DataTables should read DOM data as an object or array\n\t// Used in _fnGetRowElements\n\tif ( typeof mDataSrc !== 'number' && ! oCol._isArrayHost ) {\n\t\toSettings._rowReadObject = true;\n\t}\n\n\t/* Feature sorting overrides column specific when off */\n\tif ( !oSettings.oFeatures.bSort )\n\t{\n\t\toCol.bSortable = false;\n\t\tth.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called\n\t}\n\n\t/* Check that the class assignment is correct for sorting */\n\tvar bAsc = $.inArray('asc', oCol.asSorting) !== -1;\n\tvar bDesc = $.inArray('desc', oCol.asSorting) !== -1;\n\tif ( !oCol.bSortable || (!bAsc && !bDesc) )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableNone;\n\t\toCol.sSortingClassJUI = \"\";\n\t}\n\telse if ( bAsc && !bDesc )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableAsc;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;\n\t}\n\telse if ( !bAsc && bDesc )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableDesc;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;\n\t}\n\telse\n\t{\n\t\toCol.sSortingClass = oClasses.sSortable;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUI;\n\t}\n}\n\n\n/**\n * Adjust the table column widths for new data. Note: you would probably want to\n * do a redraw after calling this function!\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnAdjustColumnSizing ( settings )\n{\n\t/* Not interested in doing column width calculation if auto-width is disabled */\n\tif ( settings.oFeatures.bAutoWidth !== false )\n\t{\n\t\tvar columns = settings.aoColumns;\n\n\t\t_fnCalculateColumnWidths( settings );\n\t\tfor ( var i=0 , iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tcolumns[i].nTh.style.width = columns[i].sWidth;\n\t\t}\n\t}\n\n\tvar scroll = settings.oScroll;\n\tif ( scroll.sY !== '' || scroll.sX !== '')\n\t{\n\t\t_fnScrollDraw( settings );\n\t}\n\n\t_fnCallbackFire( settings, null, 'column-sizing', [settings] );\n}\n\n\n/**\n * Convert the index of a visible column to the index in the data array (take account\n * of hidden columns)\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iMatch Visible column index to lookup\n *  @returns {int} i the data index\n *  @memberof DataTable#oApi\n */\nfunction _fnVisibleToColumnIndex( oSettings, iMatch )\n{\n\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\n\treturn typeof aiVis[iMatch] === 'number' ?\n\t\taiVis[iMatch] :\n\t\tnull;\n}\n\n\n/**\n * Convert the index of an index in the data array and convert it to the visible\n *   column index (take account of hidden columns)\n *  @param {int} iMatch Column index to lookup\n *  @param {object} oSettings dataTables settings object\n *  @returns {int} i the data index\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnIndexToVisible( oSettings, iMatch )\n{\n\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\tvar iPos = $.inArray( iMatch, aiVis );\n\n\treturn iPos !== -1 ? iPos : null;\n}\n\n\n/**\n * Get the number of visible columns\n *  @param {object} oSettings dataTables settings object\n *  @returns {int} i the number of visible columns\n *  @memberof DataTable#oApi\n */\nfunction _fnVisbleColumns( oSettings )\n{\n\tvar vis = 0;\n\n\t// No reduce in IE8, use a loop for now\n\t$.each( oSettings.aoColumns, function ( i, col ) {\n\t\tif ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {\n\t\t\tvis++;\n\t\t}\n\t} );\n\n\treturn vis;\n}\n\n\n/**\n * Get an array of column indexes that match a given property\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sParam Parameter in aoColumns to look for - typically\n *    bVisible or bSearchable\n *  @returns {array} Array of indexes with matched properties\n *  @memberof DataTable#oApi\n */\nfunction _fnGetColumns( oSettings, sParam )\n{\n\tvar a = [];\n\n\t$.map( oSettings.aoColumns, function(val, i) {\n\t\tif ( val[sParam] ) {\n\t\t\ta.push( i );\n\t\t}\n\t} );\n\n\treturn a;\n}\n\n\n/**\n * Calculate the 'type' of a column\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnTypes ( settings )\n{\n\tvar columns = settings.aoColumns;\n\tvar data = settings.aoData;\n\tvar types = DataTable.ext.type.detect;\n\tvar i, ien, j, jen, k, ken;\n\tvar col, cell, detectedType, cache;\n\n\t// For each column, spin over the \n\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\tcol = columns[i];\n\t\tcache = [];\n\n\t\tif ( ! col.sType && col._sManualType ) {\n\t\t\tcol.sType = col._sManualType;\n\t\t}\n\t\telse if ( ! col.sType ) {\n\t\t\tfor ( j=0, jen=types.length ; j<jen ; j++ ) {\n\t\t\t\tfor ( k=0, ken=data.length ; k<ken ; k++ ) {\n\t\t\t\t\t// Use a cache array so we only need to get the type data\n\t\t\t\t\t// from the formatter once (when using multiple detectors)\n\t\t\t\t\tif ( cache[k] === undefined ) {\n\t\t\t\t\t\tcache[k] = _fnGetCellData( settings, k, i, 'type' );\n\t\t\t\t\t}\n\n\t\t\t\t\tdetectedType = types[j]( cache[k], settings );\n\n\t\t\t\t\t// If null, then this type can't apply to this column, so\n\t\t\t\t\t// rather than testing all cells, break out. There is an\n\t\t\t\t\t// exception for the last type which is `html`. We need to\n\t\t\t\t\t// scan all rows since it is possible to mix string and HTML\n\t\t\t\t\t// types\n\t\t\t\t\tif ( ! detectedType && j !== types.length-1 ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only a single match is needed for html type since it is\n\t\t\t\t\t// bottom of the pile and very similar to string - but it\n\t\t\t\t\t// must not be empty\n\t\t\t\t\tif ( detectedType === 'html' && ! _empty(cache[k]) ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Type is valid for all data points in the column - use this\n\t\t\t\t// type\n\t\t\t\tif ( detectedType ) {\n\t\t\t\t\tcol.sType = detectedType;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fall back - if no type was detected, always use string\n\t\t\tif ( ! col.sType ) {\n\t\t\t\tcol.sType = 'string';\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Take the column definitions and static columns arrays and calculate how\n * they relate to column indexes. The callback function will then apply the\n * definition found for a column to a suitable configuration object.\n *  @param {object} oSettings dataTables settings object\n *  @param {array} aoColDefs The aoColumnDefs array that is to be applied\n *  @param {array} aoCols The aoColumns array that defines columns individually\n *  @param {function} fn Callback function - takes two parameters, the calculated\n *    column index and the definition for that column.\n *  @memberof DataTable#oApi\n */\nfunction _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )\n{\n\tvar i, iLen, j, jLen, k, kLen, def;\n\tvar columns = oSettings.aoColumns;\n\n\t// Column definitions with aTargets\n\tif ( aoColDefs )\n\t{\n\t\t/* Loop over the definitions array - loop in reverse so first instance has priority */\n\t\tfor ( i=aoColDefs.length-1 ; i>=0 ; i-- )\n\t\t{\n\t\t\tdef = aoColDefs[i];\n\n\t\t\t/* Each definition can target multiple columns, as it is an array */\n\t\t\tvar aTargets = def.target !== undefined\n\t\t\t\t? def.target\n\t\t\t\t: def.targets !== undefined\n\t\t\t\t\t? def.targets\n\t\t\t\t\t: def.aTargets;\n\n\t\t\tif ( ! Array.isArray( aTargets ) )\n\t\t\t{\n\t\t\t\taTargets = [ aTargets ];\n\t\t\t}\n\n\t\t\tfor ( j=0, jLen=aTargets.length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tif ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )\n\t\t\t\t{\n\t\t\t\t\t/* Add columns that we don't yet know about */\n\t\t\t\t\twhile( columns.length <= aTargets[j] )\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnAddColumn( oSettings );\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Integer, basic index */\n\t\t\t\t\tfn( aTargets[j], def );\n\t\t\t\t}\n\t\t\t\telse if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )\n\t\t\t\t{\n\t\t\t\t\t/* Negative integer, right to left column counting */\n\t\t\t\t\tfn( columns.length+aTargets[j], def );\n\t\t\t\t}\n\t\t\t\telse if ( typeof aTargets[j] === 'string' )\n\t\t\t\t{\n\t\t\t\t\t/* Class name matching on TH element */\n\t\t\t\t\tfor ( k=0, kLen=columns.length ; k<kLen ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( aTargets[j] == \"_all\" ||\n\t\t\t\t\t\t     $(columns[k].nTh).hasClass( aTargets[j] ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfn( k, def );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Statically defined columns array\n\tif ( aoCols )\n\t{\n\t\tfor ( i=0, iLen=aoCols.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tfn( i, aoCols[i] );\n\t\t}\n\t}\n}\n\n/**\n * Add a data array to the table, creating DOM node etc. This is the parallel to\n * _fnGatherData, but for adding rows from a Javascript source, rather than a\n * DOM source.\n *  @param {object} oSettings dataTables settings object\n *  @param {array} aData data array to be added\n *  @param {node} [nTr] TR element to add to the table - optional. If not given,\n *    DataTables will create a row automatically\n *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n *    if nTr is.\n *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed\n *  @memberof DataTable#oApi\n */\nfunction _fnAddData ( oSettings, aDataIn, nTr, anTds )\n{\n\t/* Create the object for storing information about this new row */\n\tvar iRow = oSettings.aoData.length;\n\tvar oData = $.extend( true, {}, DataTable.models.oRow, {\n\t\tsrc: nTr ? 'dom' : 'data',\n\t\tidx: iRow\n\t} );\n\n\toData._aData = aDataIn;\n\toSettings.aoData.push( oData );\n\n\t/* Create the cells */\n\tvar nTd, sThisType;\n\tvar columns = oSettings.aoColumns;\n\n\t// Invalidate the column types as the new data needs to be revalidated\n\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t{\n\t\tcolumns[i].sType = null;\n\t}\n\n\t/* Add to the display array */\n\toSettings.aiDisplayMaster.push( iRow );\n\n\tvar id = oSettings.rowIdFn( aDataIn );\n\tif ( id !== undefined ) {\n\t\toSettings.aIds[ id ] = oData;\n\t}\n\n\t/* Create the DOM information, or register it if already present */\n\tif ( nTr || ! oSettings.oFeatures.bDeferRender )\n\t{\n\t\t_fnCreateTr( oSettings, iRow, nTr, anTds );\n\t}\n\n\treturn iRow;\n}\n\n\n/**\n * Add one or more TR elements to the table. Generally we'd expect to\n * use this for reading data from a DOM sourced table, but it could be\n * used for an TR element. Note that if a TR is given, it is used (i.e.\n * it is not cloned).\n *  @param {object} settings dataTables settings object\n *  @param {array|node|jQuery} trs The TR element(s) to add to the table\n *  @returns {array} Array of indexes for the added rows\n *  @memberof DataTable#oApi\n */\nfunction _fnAddTr( settings, trs )\n{\n\tvar row;\n\n\t// Allow an individual node to be passed in\n\tif ( ! (trs instanceof $) ) {\n\t\ttrs = $(trs);\n\t}\n\n\treturn trs.map( function (i, el) {\n\t\trow = _fnGetRowElements( settings, el );\n\t\treturn _fnAddData( settings, row.data, el, row.cells );\n\t} );\n}\n\n\n/**\n * Take a TR element and convert it to an index in aoData\n *  @param {object} oSettings dataTables settings object\n *  @param {node} n the TR element to find\n *  @returns {int} index if the node is found, null if not\n *  @memberof DataTable#oApi\n */\nfunction _fnNodeToDataIndex( oSettings, n )\n{\n\treturn (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;\n}\n\n\n/**\n * Take a TD element and convert it into a column data index (not the visible index)\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iRow The row number the TD/TH can be found in\n *  @param {node} n The TD/TH element to find\n *  @returns {int} index if the node is found, -1 if not\n *  @memberof DataTable#oApi\n */\nfunction _fnNodeToColumnIndex( oSettings, iRow, n )\n{\n\treturn $.inArray( n, oSettings.aoData[ iRow ].anCells );\n}\n\n\n/**\n * Get the data for a given cell from the internal cache, taking into account data mapping\n *  @param {object} settings dataTables settings object\n *  @param {int} rowIdx aoData row id\n *  @param {int} colIdx Column index\n *  @param {string} type data get type ('display', 'type' 'filter|search' 'sort|order')\n *  @returns {*} Cell data\n *  @memberof DataTable#oApi\n */\nfunction _fnGetCellData( settings, rowIdx, colIdx, type )\n{\n\tif (type === 'search') {\n\t\ttype = 'filter';\n\t}\n\telse if (type === 'order') {\n\t\ttype = 'sort';\n\t}\n\n\tvar draw           = settings.iDraw;\n\tvar col            = settings.aoColumns[colIdx];\n\tvar rowData        = settings.aoData[rowIdx]._aData;\n\tvar defaultContent = col.sDefaultContent;\n\tvar cellData       = col.fnGetData( rowData, type, {\n\t\tsettings: settings,\n\t\trow:      rowIdx,\n\t\tcol:      colIdx\n\t} );\n\n\tif ( cellData === undefined ) {\n\t\tif ( settings.iDrawError != draw && defaultContent === null ) {\n\t\t\t_fnLog( settings, 0, \"Requested unknown parameter \"+\n\t\t\t\t(typeof col.mData=='function' ? '{function}' : \"'\"+col.mData+\"'\")+\n\t\t\t\t\" for row \"+rowIdx+\", column \"+colIdx, 4 );\n\t\t\tsettings.iDrawError = draw;\n\t\t}\n\t\treturn defaultContent;\n\t}\n\n\t// When the data source is null and a specific data type is requested (i.e.\n\t// not the original data), we can use default column data\n\tif ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {\n\t\tcellData = defaultContent;\n\t}\n\telse if ( typeof cellData === 'function' ) {\n\t\t// If the data source is a function, then we run it and use the return,\n\t\t// executing in the scope of the data object (for instances)\n\t\treturn cellData.call( rowData );\n\t}\n\n\tif ( cellData === null && type === 'display' ) {\n\t\treturn '';\n\t}\n\n\tif ( type === 'filter' ) {\n\t\tvar fomatters = DataTable.ext.type.search;\n\n\t\tif ( fomatters[ col.sType ] ) {\n\t\t\tcellData = fomatters[ col.sType ]( cellData );\n\t\t}\n\t}\n\n\treturn cellData;\n}\n\n\n/**\n * Set the value for a specific cell, into the internal data cache\n *  @param {object} settings dataTables settings object\n *  @param {int} rowIdx aoData row id\n *  @param {int} colIdx Column index\n *  @param {*} val Value to set\n *  @memberof DataTable#oApi\n */\nfunction _fnSetCellData( settings, rowIdx, colIdx, val )\n{\n\tvar col     = settings.aoColumns[colIdx];\n\tvar rowData = settings.aoData[rowIdx]._aData;\n\n\tcol.fnSetData( rowData, val, {\n\t\tsettings: settings,\n\t\trow:      rowIdx,\n\t\tcol:      colIdx\n\t}  );\n}\n\n\n// Private variable that is used to match action syntax in the data property object\nvar __reArray = /\\[.*?\\]$/;\nvar __reFn = /\\(\\)$/;\n\n/**\n * Split string on periods, taking into account escaped periods\n * @param  {string} str String to split\n * @return {array} Split string\n */\nfunction _fnSplitObjNotation( str )\n{\n\treturn $.map( str.match(/(\\\\.|[^\\.])+/g) || [''], function ( s ) {\n\t\treturn s.replace(/\\\\\\./g, '.');\n\t} );\n}\n\n\n/**\n * Return a function that can be used to get data from a source object, taking\n * into account the ability to use nested objects as a source\n *  @param {string|int|function} mSource The data source for the object\n *  @returns {function} Data get function\n *  @memberof DataTable#oApi\n */\nvar _fnGetObjectDataFn = DataTable.util.get;\n\n\n/**\n * Return a function that can be used to set data from a source object, taking\n * into account the ability to use nested objects as a source\n *  @param {string|int|function} mSource The data source for the object\n *  @returns {function} Data set function\n *  @memberof DataTable#oApi\n */\nvar _fnSetObjectDataFn = DataTable.util.set;\n\n\n/**\n * Return an array with the full table data\n *  @param {object} oSettings dataTables settings object\n *  @returns array {array} aData Master data array\n *  @memberof DataTable#oApi\n */\nfunction _fnGetDataMaster ( settings )\n{\n\treturn _pluck( settings.aoData, '_aData' );\n}\n\n\n/**\n * Nuke the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnClearTable( settings )\n{\n\tsettings.aoData.length = 0;\n\tsettings.aiDisplayMaster.length = 0;\n\tsettings.aiDisplay.length = 0;\n\tsettings.aIds = {};\n}\n\n\n /**\n * Take an array of integers (index array) and remove a target integer (value - not\n * the key!)\n *  @param {array} a Index array to target\n *  @param {int} iTarget value to find\n *  @memberof DataTable#oApi\n */\nfunction _fnDeleteIndex( a, iTarget, splice )\n{\n\tvar iTargetIndex = -1;\n\n\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t{\n\t\tif ( a[i] == iTarget )\n\t\t{\n\t\t\tiTargetIndex = i;\n\t\t}\n\t\telse if ( a[i] > iTarget )\n\t\t{\n\t\t\ta[i]--;\n\t\t}\n\t}\n\n\tif ( iTargetIndex != -1 && splice === undefined )\n\t{\n\t\ta.splice( iTargetIndex, 1 );\n\t}\n}\n\n\n/**\n * Mark cached data as invalid such that a re-read of the data will occur when\n * the cached data is next requested. Also update from the data source object.\n *\n * @param {object} settings DataTables settings object\n * @param {int}    rowIdx   Row index to invalidate\n * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'\n *     or 'data'\n * @param {int}    [colIdx] Column index to invalidate. If undefined the whole\n *     row will be invalidated\n * @memberof DataTable#oApi\n *\n * @todo For the modularisation of v1.11 this will need to become a callback, so\n *   the sort and filter methods can subscribe to it. That will required\n *   initialisation options for sorting, which is why it is not already baked in\n */\nfunction _fnInvalidate( settings, rowIdx, src, colIdx )\n{\n\tvar row = settings.aoData[ rowIdx ];\n\tvar i, ien;\n\tvar cellWrite = function ( cell, col ) {\n\t\t// This is very frustrating, but in IE if you just write directly\n\t\t// to innerHTML, and elements that are overwritten are GC'ed,\n\t\t// even if there is a reference to them elsewhere\n\t\twhile ( cell.childNodes.length ) {\n\t\t\tcell.removeChild( cell.firstChild );\n\t\t}\n\n\t\tcell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );\n\t};\n\n\t// Are we reading last data from DOM or the data object?\n\tif ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {\n\t\t// Read the data from the DOM\n\t\trow._aData = _fnGetRowElements(\n\t\t\t\tsettings, row, colIdx, colIdx === undefined ? undefined : row._aData\n\t\t\t)\n\t\t\t.data;\n\t}\n\telse {\n\t\t// Reading from data object, update the DOM\n\t\tvar cells = row.anCells;\n\n\t\tif ( cells ) {\n\t\t\tif ( colIdx !== undefined ) {\n\t\t\t\tcellWrite( cells[colIdx], colIdx );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\t\tcellWrite( cells[i], i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// For both row and cell invalidation, the cached data for sorting and\n\t// filtering is nulled out\n\trow._aSortData = null;\n\trow._aFilterData = null;\n\n\t// Invalidate the type for a specific column (if given) or all columns since\n\t// the data might have changed\n\tvar cols = settings.aoColumns;\n\tif ( colIdx !== undefined ) {\n\t\tcols[ colIdx ].sType = null;\n\t}\n\telse {\n\t\tfor ( i=0, ien=cols.length ; i<ien ; i++ ) {\n\t\t\tcols[i].sType = null;\n\t\t}\n\n\t\t// Update DataTables special `DT_*` attributes for the row\n\t\t_fnRowAttributes( settings, row );\n\t}\n}\n\n\n/**\n * Build a data source object from an HTML row, reading the contents of the\n * cells that are in the row.\n *\n * @param {object} settings DataTables settings object\n * @param {node|object} TR element from which to read data or existing row\n *   object from which to re-read the data from the cells\n * @param {int} [colIdx] Optional column index\n * @param {array|object} [d] Data source object. If `colIdx` is given then this\n *   parameter should also be given and will be used to write the data into.\n *   Only the column in question will be written\n * @returns {object} Object with two parameters: `data` the data read, in\n *   document order, and `cells` and array of nodes (they can be useful to the\n *   caller, so rather than needing a second traversal to get them, just return\n *   them from here).\n * @memberof DataTable#oApi\n */\nfunction _fnGetRowElements( settings, row, colIdx, d )\n{\n\tvar\n\t\ttds = [],\n\t\ttd = row.firstChild,\n\t\tname, col, o, i=0, contents,\n\t\tcolumns = settings.aoColumns,\n\t\tobjectRead = settings._rowReadObject;\n\n\t// Allow the data object to be passed in, or construct\n\td = d !== undefined ?\n\t\td :\n\t\tobjectRead ?\n\t\t\t{} :\n\t\t\t[];\n\n\tvar attr = function ( str, td  ) {\n\t\tif ( typeof str === 'string' ) {\n\t\t\tvar idx = str.indexOf('@');\n\n\t\t\tif ( idx !== -1 ) {\n\t\t\t\tvar attr = str.substring( idx+1 );\n\t\t\t\tvar setter = _fnSetObjectDataFn( str );\n\t\t\t\tsetter( d, td.getAttribute( attr ) );\n\t\t\t}\n\t\t}\n\t};\n\n\t// Read data from a cell and store into the data object\n\tvar cellProcess = function ( cell ) {\n\t\tif ( colIdx === undefined || colIdx === i ) {\n\t\t\tcol = columns[i];\n\t\t\tcontents = (cell.innerHTML).trim();\n\n\t\t\tif ( col && col._bAttrSrc ) {\n\t\t\t\tvar setter = _fnSetObjectDataFn( col.mData._ );\n\t\t\t\tsetter( d, contents );\n\n\t\t\t\tattr( col.mData.sort, cell );\n\t\t\t\tattr( col.mData.type, cell );\n\t\t\t\tattr( col.mData.filter, cell );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Depending on the `data` option for the columns the data can\n\t\t\t\t// be read to either an object or an array.\n\t\t\t\tif ( objectRead ) {\n\t\t\t\t\tif ( ! col._setter ) {\n\t\t\t\t\t\t// Cache the setter function\n\t\t\t\t\t\tcol._setter = _fnSetObjectDataFn( col.mData );\n\t\t\t\t\t}\n\t\t\t\t\tcol._setter( d, contents );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\td[i] = contents;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ti++;\n\t};\n\n\tif ( td ) {\n\t\t// `tr` element was passed in\n\t\twhile ( td ) {\n\t\t\tname = td.nodeName.toUpperCase();\n\n\t\t\tif ( name == \"TD\" || name == \"TH\" ) {\n\t\t\t\tcellProcess( td );\n\t\t\t\ttds.push( td );\n\t\t\t}\n\n\t\t\ttd = td.nextSibling;\n\t\t}\n\t}\n\telse {\n\t\t// Existing row object passed in\n\t\ttds = row.anCells;\n\n\t\tfor ( var j=0, jen=tds.length ; j<jen ; j++ ) {\n\t\t\tcellProcess( tds[j] );\n\t\t}\n\t}\n\n\t// Read the ID from the DOM if present\n\tvar rowNode = row.firstChild ? row : row.nTr;\n\n\tif ( rowNode ) {\n\t\tvar id = rowNode.getAttribute( 'id' );\n\n\t\tif ( id ) {\n\t\t\t_fnSetObjectDataFn( settings.rowId )( d, id );\n\t\t}\n\t}\n\n\treturn {\n\t\tdata: d,\n\t\tcells: tds\n\t};\n}\n/**\n * Create a new TR element (and it's TD children) for a row\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iRow Row to consider\n *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,\n *    DataTables will create a row automatically\n *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n *    if nTr is.\n *  @memberof DataTable#oApi\n */\nfunction _fnCreateTr ( oSettings, iRow, nTrIn, anTds )\n{\n\tvar\n\t\trow = oSettings.aoData[iRow],\n\t\trowData = row._aData,\n\t\tcells = [],\n\t\tnTr, nTd, oCol,\n\t\ti, iLen, create;\n\n\tif ( row.nTr === null )\n\t{\n\t\tnTr = nTrIn || document.createElement('tr');\n\n\t\trow.nTr = nTr;\n\t\trow.anCells = cells;\n\n\t\t/* Use a private property on the node to allow reserve mapping from the node\n\t\t * to the aoData array for fast look up\n\t\t */\n\t\tnTr._DT_RowIndex = iRow;\n\n\t\t/* Special parameters can be given by the data source to be used on the row */\n\t\t_fnRowAttributes( oSettings, row );\n\n\t\t/* Process each column */\n\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\toCol = oSettings.aoColumns[i];\n\t\t\tcreate = nTrIn ? false : true;\n\n\t\t\tnTd = create ? document.createElement( oCol.sCellType ) : anTds[i];\n\n\t\t\tif (! nTd) {\n\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t}\n\n\t\t\tnTd._DT_CellIndex = {\n\t\t\t\trow: iRow,\n\t\t\t\tcolumn: i\n\t\t\t};\n\t\t\t\n\t\t\tcells.push( nTd );\n\n\t\t\t// Need to create the HTML if new, or if a rendering function is defined\n\t\t\tif ( create || ((oCol.mRender || oCol.mData !== i) &&\n\t\t\t\t (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')\n\t\t\t)) {\n\t\t\t\tnTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );\n\t\t\t}\n\n\t\t\t/* Add user defined class */\n\t\t\tif ( oCol.sClass )\n\t\t\t{\n\t\t\t\tnTd.className += ' '+oCol.sClass;\n\t\t\t}\n\n\t\t\t// Visibility - add or remove as required\n\t\t\tif ( oCol.bVisible && ! nTrIn )\n\t\t\t{\n\t\t\t\tnTr.appendChild( nTd );\n\t\t\t}\n\t\t\telse if ( ! oCol.bVisible && nTrIn )\n\t\t\t{\n\t\t\t\tnTd.parentNode.removeChild( nTd );\n\t\t\t}\n\n\t\t\tif ( oCol.fnCreatedCell )\n\t\t\t{\n\t\t\t\toCol.fnCreatedCell.call( oSettings.oInstance,\n\t\t\t\t\tnTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells] );\n\t}\n}\n\n\n/**\n * Add attributes to a row based on the special `DT_*` parameters in a data\n * source object.\n *  @param {object} settings DataTables settings object\n *  @param {object} DataTables row object for the row to be modified\n *  @memberof DataTable#oApi\n */\nfunction _fnRowAttributes( settings, row )\n{\n\tvar tr = row.nTr;\n\tvar data = row._aData;\n\n\tif ( tr ) {\n\t\tvar id = settings.rowIdFn( data );\n\n\t\tif ( id ) {\n\t\t\ttr.id = id;\n\t\t}\n\n\t\tif ( data.DT_RowClass ) {\n\t\t\t// Remove any classes added by DT_RowClass before\n\t\t\tvar a = data.DT_RowClass.split(' ');\n\t\t\trow.__rowc = row.__rowc ?\n\t\t\t\t_unique( row.__rowc.concat( a ) ) :\n\t\t\t\ta;\n\n\t\t\t$(tr)\n\t\t\t\t.removeClass( row.__rowc.join(' ') )\n\t\t\t\t.addClass( data.DT_RowClass );\n\t\t}\n\n\t\tif ( data.DT_RowAttr ) {\n\t\t\t$(tr).attr( data.DT_RowAttr );\n\t\t}\n\n\t\tif ( data.DT_RowData ) {\n\t\t\t$(tr).data( data.DT_RowData );\n\t\t}\n\t}\n}\n\n\n/**\n * Create the HTML header for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnBuildHead( oSettings )\n{\n\tvar i, ien, cell, row, column;\n\tvar thead = oSettings.nTHead;\n\tvar tfoot = oSettings.nTFoot;\n\tvar createHeader = $('th, td', thead).length === 0;\n\tvar classes = oSettings.oClasses;\n\tvar columns = oSettings.aoColumns;\n\n\tif ( createHeader ) {\n\t\trow = $('<tr/>').appendTo( thead );\n\t}\n\n\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\tcolumn = columns[i];\n\t\tcell = $( column.nTh ).addClass( column.sClass );\n\n\t\tif ( createHeader ) {\n\t\t\tcell.appendTo( row );\n\t\t}\n\n\t\t// 1.11 move into sorting\n\t\tif ( oSettings.oFeatures.bSort ) {\n\t\t\tcell.addClass( column.sSortingClass );\n\n\t\t\tif ( column.bSortable !== false ) {\n\t\t\t\tcell\n\t\t\t\t\t.attr( 'tabindex', oSettings.iTabIndex )\n\t\t\t\t\t.attr( 'aria-controls', oSettings.sTableId );\n\n\t\t\t\t_fnSortAttachListener( oSettings, column.nTh, i );\n\t\t\t}\n\t\t}\n\n\t\tif ( column.sTitle != cell[0].innerHTML ) {\n\t\t\tcell.html( column.sTitle );\n\t\t}\n\n\t\t_fnRenderer( oSettings, 'header' )(\n\t\t\toSettings, cell, column, classes\n\t\t);\n\t}\n\n\tif ( createHeader ) {\n\t\t_fnDetectHeader( oSettings.aoHeader, thead );\n\t}\n\n\t/* Deal with the footer - add classes if required */\n\t$(thead).children('tr').children('th, td').addClass( classes.sHeaderTH );\n\t$(tfoot).children('tr').children('th, td').addClass( classes.sFooterTH );\n\n\t// Cache the footer cells. Note that we only take the cells from the first\n\t// row in the footer. If there is more than one row the user wants to\n\t// interact with, they need to use the table().foot() method. Note also this\n\t// allows cells to be used for multiple columns using colspan\n\tif ( tfoot !== null ) {\n\t\tvar cells = oSettings.aoFooter[0];\n\n\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\tcolumn = columns[i];\n\n\t\t\tif (column) {\n\t\t\t\tcolumn.nTf = cells[i].cell;\n\t\n\t\t\t\tif ( column.sClass ) {\n\t\t\t\t\t$(column.nTf).addClass( column.sClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Draw the header (or footer) element based on the column visibility states. The\n * methodology here is to use the layout array from _fnDetectHeader, modified for\n * the instantaneous column visibility, to construct the new layout. The grid is\n * traversed over cell at a time in a rows x columns grid fashion, although each\n * cell insert can cover multiple elements in the grid - which is tracks using the\n * aApplied array. Cell inserts in the grid will only occur where there isn't\n * already a cell in that position.\n *  @param {object} oSettings dataTables settings object\n *  @param array {objects} aoSource Layout array from _fnDetectHeader\n *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,\n *  @memberof DataTable#oApi\n */\nfunction _fnDrawHead( oSettings, aoSource, bIncludeHidden )\n{\n\tvar i, iLen, j, jLen, k, kLen, n, nLocalTr;\n\tvar aoLocal = [];\n\tvar aApplied = [];\n\tvar iColumns = oSettings.aoColumns.length;\n\tvar iRowspan, iColspan;\n\n\tif ( ! aoSource )\n\t{\n\t\treturn;\n\t}\n\n\tif (  bIncludeHidden === undefined )\n\t{\n\t\tbIncludeHidden = false;\n\t}\n\n\t/* Make a copy of the master layout array, but without the visible columns in it */\n\tfor ( i=0, iLen=aoSource.length ; i<iLen ; i++ )\n\t{\n\t\taoLocal[i] = aoSource[i].slice();\n\t\taoLocal[i].nTr = aoSource[i].nTr;\n\n\t\t/* Remove any columns which are currently hidden */\n\t\tfor ( j=iColumns-1 ; j>=0 ; j-- )\n\t\t{\n\t\t\tif ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )\n\t\t\t{\n\t\t\t\taoLocal[i].splice( j, 1 );\n\t\t\t}\n\t\t}\n\n\t\t/* Prep the applied array - it needs an element for each row */\n\t\taApplied.push( [] );\n\t}\n\n\tfor ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )\n\t{\n\t\tnLocalTr = aoLocal[i].nTr;\n\n\t\t/* All cells are going to be replaced, so empty out the row */\n\t\tif ( nLocalTr )\n\t\t{\n\t\t\twhile( (n = nLocalTr.firstChild) )\n\t\t\t{\n\t\t\t\tnLocalTr.removeChild( n );\n\t\t\t}\n\t\t}\n\n\t\tfor ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )\n\t\t{\n\t\t\tiRowspan = 1;\n\t\t\tiColspan = 1;\n\n\t\t\t/* Check to see if there is already a cell (row/colspan) covering our target\n\t\t\t * insert point. If there is, then there is nothing to do.\n\t\t\t */\n\t\t\tif ( aApplied[i][j] === undefined )\n\t\t\t{\n\t\t\t\tnLocalTr.appendChild( aoLocal[i][j].cell );\n\t\t\t\taApplied[i][j] = 1;\n\n\t\t\t\t/* Expand the cell to cover as many rows as needed */\n\t\t\t\twhile ( aoLocal[i+iRowspan] !== undefined &&\n\t\t\t\t        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )\n\t\t\t\t{\n\t\t\t\t\taApplied[i+iRowspan][j] = 1;\n\t\t\t\t\tiRowspan++;\n\t\t\t\t}\n\n\t\t\t\t/* Expand the cell to cover as many columns as needed */\n\t\t\t\twhile ( aoLocal[i][j+iColspan] !== undefined &&\n\t\t\t\t        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )\n\t\t\t\t{\n\t\t\t\t\t/* Must update the applied array over the rows for the columns */\n\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taApplied[i+k][j+iColspan] = 1;\n\t\t\t\t\t}\n\t\t\t\t\tiColspan++;\n\t\t\t\t}\n\n\t\t\t\t/* Do the actual expansion in the DOM */\n\t\t\t\t$(aoLocal[i][j].cell)\n\t\t\t\t\t.attr('rowspan', iRowspan)\n\t\t\t\t\t.attr('colspan', iColspan);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Insert the required TR nodes into the table for display\n *  @param {object} oSettings dataTables settings object\n *  @param ajaxComplete true after ajax call to complete rendering\n *  @memberof DataTable#oApi\n */\nfunction _fnDraw( oSettings, ajaxComplete )\n{\n\t// Allow for state saving and a custom start position\n\t_fnStart( oSettings );\n\n\t/* Provide a pre-callback function which can be used to cancel the draw is false is returned */\n\tvar aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );\n\tif ( $.inArray( false, aPreDraw ) !== -1 )\n\t{\n\t\t_fnProcessingDisplay( oSettings, false );\n\t\treturn;\n\t}\n\n\tvar anRows = [];\n\tvar iRowCount = 0;\n\tvar asStripeClasses = oSettings.asStripeClasses;\n\tvar iStripes = asStripeClasses.length;\n\tvar oLang = oSettings.oLanguage;\n\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\tvar aiDisplay = oSettings.aiDisplay;\n\tvar iDisplayStart = oSettings._iDisplayStart;\n\tvar iDisplayEnd = oSettings.fnDisplayEnd();\n\n\toSettings.bDrawing = true;\n\n\t/* Server-side processing draw intercept */\n\tif ( oSettings.bDeferLoading )\n\t{\n\t\toSettings.bDeferLoading = false;\n\t\toSettings.iDraw++;\n\t\t_fnProcessingDisplay( oSettings, false );\n\t}\n\telse if ( !bServerSide )\n\t{\n\t\toSettings.iDraw++;\n\t}\n\telse if ( !oSettings.bDestroying && !ajaxComplete)\n\t{\n\t\t_fnAjaxUpdate( oSettings );\n\t\treturn;\n\t}\n\n\tif ( aiDisplay.length !== 0 )\n\t{\n\t\tvar iStart = bServerSide ? 0 : iDisplayStart;\n\t\tvar iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;\n\n\t\tfor ( var j=iStart ; j<iEnd ; j++ )\n\t\t{\n\t\t\tvar iDataIndex = aiDisplay[j];\n\t\t\tvar aoData = oSettings.aoData[ iDataIndex ];\n\t\t\tif ( aoData.nTr === null )\n\t\t\t{\n\t\t\t\t_fnCreateTr( oSettings, iDataIndex );\n\t\t\t}\n\n\t\t\tvar nRow = aoData.nTr;\n\n\t\t\t/* Remove the old striping classes and then add the new one */\n\t\t\tif ( iStripes !== 0 )\n\t\t\t{\n\t\t\t\tvar sStripe = asStripeClasses[ iRowCount % iStripes ];\n\t\t\t\tif ( aoData._sRowStripe != sStripe )\n\t\t\t\t{\n\t\t\t\t\t$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );\n\t\t\t\t\taoData._sRowStripe = sStripe;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Row callback functions - might want to manipulate the row\n\t\t\t// iRowCount and j are not currently documented. Are they at all\n\t\t\t// useful?\n\t\t\t_fnCallbackFire( oSettings, 'aoRowCallback', null,\n\t\t\t\t[nRow, aoData._aData, iRowCount, j, iDataIndex] );\n\n\t\t\tanRows.push( nRow );\n\t\t\tiRowCount++;\n\t\t}\n\t}\n\telse\n\t{\n\t\t/* Table is empty - create a row with an empty message in it */\n\t\tvar sZero = oLang.sZeroRecords;\n\t\tif ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )\n\t\t{\n\t\t\tsZero = oLang.sLoadingRecords;\n\t\t}\n\t\telse if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )\n\t\t{\n\t\t\tsZero = oLang.sEmptyTable;\n\t\t}\n\n\t\tanRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )\n\t\t\t.append( $('<td />', {\n\t\t\t\t'valign':  'top',\n\t\t\t\t'colSpan': _fnVisbleColumns( oSettings ),\n\t\t\t\t'class':   oSettings.oClasses.sRowEmpty\n\t\t\t} ).html( sZero ) )[0];\n\t}\n\n\t/* Header and footer callbacks */\n\t_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],\n\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\n\t_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],\n\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\n\tvar body = $(oSettings.nTBody);\n\n\tbody.children().detach();\n\tbody.append( $(anRows) );\n\n\t/* Call all required callback functions for the end of a draw */\n\t_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );\n\n\t/* Draw is complete, sorting and filtering must be as well */\n\toSettings.bSorted = false;\n\toSettings.bFiltered = false;\n\toSettings.bDrawing = false;\n}\n\n\n/**\n * Redraw the table - taking account of the various features which are enabled\n *  @param {object} oSettings dataTables settings object\n *  @param {boolean} [holdPosition] Keep the current paging position. By default\n *    the paging is reset to the first page\n *  @memberof DataTable#oApi\n */\nfunction _fnReDraw( settings, holdPosition )\n{\n\tvar\n\t\tfeatures = settings.oFeatures,\n\t\tsort     = features.bSort,\n\t\tfilter   = features.bFilter;\n\n\tif ( sort ) {\n\t\t_fnSort( settings );\n\t}\n\n\tif ( filter ) {\n\t\t_fnFilterComplete( settings, settings.oPreviousSearch );\n\t}\n\telse {\n\t\t// No filtering, so we want to just use the display master\n\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t}\n\n\tif ( holdPosition !== true ) {\n\t\tsettings._iDisplayStart = 0;\n\t}\n\n\t// Let any modules know about the draw hold position state (used by\n\t// scrolling internally)\n\tsettings._drawHold = holdPosition;\n\n\t_fnDraw( settings );\n\n\tsettings._drawHold = false;\n}\n\n\n/**\n * Add the options to the page HTML for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnAddOptionsHtml ( oSettings )\n{\n\tvar classes = oSettings.oClasses;\n\tvar table = $(oSettings.nTable);\n\tvar holding = $('<div/>').insertBefore( table ); // Holding element for speed\n\tvar features = oSettings.oFeatures;\n\n\t// All DataTables are wrapped in a div\n\tvar insert = $('<div/>', {\n\t\tid:      oSettings.sTableId+'_wrapper',\n\t\t'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)\n\t} );\n\n\toSettings.nHolding = holding[0];\n\toSettings.nTableWrapper = insert[0];\n\toSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;\n\n\t/* Loop over the user set positioning and place the elements as needed */\n\tvar aDom = oSettings.sDom.split('');\n\tvar featureNode, cOption, nNewNode, cNext, sAttr, j;\n\tfor ( var i=0 ; i<aDom.length ; i++ )\n\t{\n\t\tfeatureNode = null;\n\t\tcOption = aDom[i];\n\n\t\tif ( cOption == '<' )\n\t\t{\n\t\t\t/* New container div */\n\t\t\tnNewNode = $('<div/>')[0];\n\n\t\t\t/* Check to see if we should append an id and/or a class name to the container */\n\t\t\tcNext = aDom[i+1];\n\t\t\tif ( cNext == \"'\" || cNext == '\"' )\n\t\t\t{\n\t\t\t\tsAttr = \"\";\n\t\t\t\tj = 2;\n\t\t\t\twhile ( aDom[i+j] != cNext )\n\t\t\t\t{\n\t\t\t\t\tsAttr += aDom[i+j];\n\t\t\t\t\tj++;\n\t\t\t\t}\n\n\t\t\t\t/* Replace jQuery UI constants @todo depreciated */\n\t\t\t\tif ( sAttr == \"H\" )\n\t\t\t\t{\n\t\t\t\t\tsAttr = classes.sJUIHeader;\n\t\t\t\t}\n\t\t\t\telse if ( sAttr == \"F\" )\n\t\t\t\t{\n\t\t\t\t\tsAttr = classes.sJUIFooter;\n\t\t\t\t}\n\n\t\t\t\t/* The attribute can be in the format of \"#id.class\", \"#id\" or \"class\" This logic\n\t\t\t\t * breaks the string into parts and applies them as needed\n\t\t\t\t */\n\t\t\t\tif ( sAttr.indexOf('.') != -1 )\n\t\t\t\t{\n\t\t\t\t\tvar aSplit = sAttr.split('.');\n\t\t\t\t\tnNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);\n\t\t\t\t\tnNewNode.className = aSplit[1];\n\t\t\t\t}\n\t\t\t\telse if ( sAttr.charAt(0) == \"#\" )\n\t\t\t\t{\n\t\t\t\t\tnNewNode.id = sAttr.substr(1, sAttr.length-1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnNewNode.className = sAttr;\n\t\t\t\t}\n\n\t\t\t\ti += j; /* Move along the position array */\n\t\t\t}\n\n\t\t\tinsert.append( nNewNode );\n\t\t\tinsert = $(nNewNode);\n\t\t}\n\t\telse if ( cOption == '>' )\n\t\t{\n\t\t\t/* End container div */\n\t\t\tinsert = insert.parent();\n\t\t}\n\t\t// @todo Move options into their own plugins?\n\t\telse if ( cOption == 'l' && features.bPaginate && features.bLengthChange )\n\t\t{\n\t\t\t/* Length */\n\t\t\tfeatureNode = _fnFeatureHtmlLength( oSettings );\n\t\t}\n\t\telse if ( cOption == 'f' && features.bFilter )\n\t\t{\n\t\t\t/* Filter */\n\t\t\tfeatureNode = _fnFeatureHtmlFilter( oSettings );\n\t\t}\n\t\telse if ( cOption == 'r' && features.bProcessing )\n\t\t{\n\t\t\t/* pRocessing */\n\t\t\tfeatureNode = _fnFeatureHtmlProcessing( oSettings );\n\t\t}\n\t\telse if ( cOption == 't' )\n\t\t{\n\t\t\t/* Table */\n\t\t\tfeatureNode = _fnFeatureHtmlTable( oSettings );\n\t\t}\n\t\telse if ( cOption ==  'i' && features.bInfo )\n\t\t{\n\t\t\t/* Info */\n\t\t\tfeatureNode = _fnFeatureHtmlInfo( oSettings );\n\t\t}\n\t\telse if ( cOption == 'p' && features.bPaginate )\n\t\t{\n\t\t\t/* Pagination */\n\t\t\tfeatureNode = _fnFeatureHtmlPaginate( oSettings );\n\t\t}\n\t\telse if ( DataTable.ext.feature.length !== 0 )\n\t\t{\n\t\t\t/* Plug-in features */\n\t\t\tvar aoFeatures = DataTable.ext.feature;\n\t\t\tfor ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )\n\t\t\t{\n\t\t\t\tif ( cOption == aoFeatures[k].cFeature )\n\t\t\t\t{\n\t\t\t\t\tfeatureNode = aoFeatures[k].fnInit( oSettings );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* Add to the 2D features array */\n\t\tif ( featureNode )\n\t\t{\n\t\t\tvar aanFeatures = oSettings.aanFeatures;\n\n\t\t\tif ( ! aanFeatures[cOption] )\n\t\t\t{\n\t\t\t\taanFeatures[cOption] = [];\n\t\t\t}\n\n\t\t\taanFeatures[cOption].push( featureNode );\n\t\t\tinsert.append( featureNode );\n\t\t}\n\t}\n\n\t/* Built our DOM structure - replace the holding div with what we want */\n\tholding.replaceWith( insert );\n\toSettings.nHolding = null;\n}\n\n\n/**\n * Use the DOM source to create up an array of header cells. The idea here is to\n * create a layout grid (array) of rows x columns, which contains a reference\n * to the cell that that point in the grid (regardless of col/rowspan), such that\n * any column / row could be removed and the new grid constructed\n *  @param array {object} aLayout Array to store the calculated layout in\n *  @param {node} nThead The header/footer element for the table\n *  @memberof DataTable#oApi\n */\nfunction _fnDetectHeader ( aLayout, nThead )\n{\n\tvar nTrs = $(nThead).children('tr');\n\tvar nTr, nCell;\n\tvar i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;\n\tvar bUnique;\n\tvar fnShiftCol = function ( a, i, j ) {\n\t\tvar k = a[i];\n                while ( k[j] ) {\n\t\t\tj++;\n\t\t}\n\t\treturn j;\n\t};\n\n\taLayout.splice( 0, aLayout.length );\n\n\t/* We know how many rows there are in the layout - so prep it */\n\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t{\n\t\taLayout.push( [] );\n\t}\n\n\t/* Calculate a layout array */\n\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t{\n\t\tnTr = nTrs[i];\n\t\tiColumn = 0;\n\n\t\t/* For every cell in the row... */\n\t\tnCell = nTr.firstChild;\n\t\twhile ( nCell ) {\n\t\t\tif ( nCell.nodeName.toUpperCase() == \"TD\" ||\n\t\t\t     nCell.nodeName.toUpperCase() == \"TH\" )\n\t\t\t{\n\t\t\t\t/* Get the col and rowspan attributes from the DOM and sanitise them */\n\t\t\t\tiColspan = nCell.getAttribute('colspan') * 1;\n\t\t\t\tiRowspan = nCell.getAttribute('rowspan') * 1;\n\t\t\t\tiColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;\n\t\t\t\tiRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;\n\n\t\t\t\t/* There might be colspan cells already in this row, so shift our target\n\t\t\t\t * accordingly\n\t\t\t\t */\n\t\t\t\tiColShifted = fnShiftCol( aLayout, i, iColumn );\n\n\t\t\t\t/* Cache calculation for unique columns */\n\t\t\t\tbUnique = iColspan === 1 ? true : false;\n\n\t\t\t\t/* If there is col / rowspan, copy the information into the layout grid */\n\t\t\t\tfor ( l=0 ; l<iColspan ; l++ )\n\t\t\t\t{\n\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taLayout[i+k][iColShifted+l] = {\n\t\t\t\t\t\t\t\"cell\": nCell,\n\t\t\t\t\t\t\t\"unique\": bUnique\n\t\t\t\t\t\t};\n\t\t\t\t\t\taLayout[i+k].nTr = nTr;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tnCell = nCell.nextSibling;\n\t\t}\n\t}\n}\n\n\n/**\n * Get an array of unique th elements, one for each column\n *  @param {object} oSettings dataTables settings object\n *  @param {node} nHeader automatically detect the layout from this node - optional\n *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional\n *  @returns array {node} aReturn list of unique th's\n *  @memberof DataTable#oApi\n */\nfunction _fnGetUniqueThs ( oSettings, nHeader, aLayout )\n{\n\tvar aReturn = [];\n\tif ( !aLayout )\n\t{\n\t\taLayout = oSettings.aoHeader;\n\t\tif ( nHeader )\n\t\t{\n\t\t\taLayout = [];\n\t\t\t_fnDetectHeader( aLayout, nHeader );\n\t\t}\n\t}\n\n\tfor ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )\n\t{\n\t\tfor ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )\n\t\t{\n\t\t\tif ( aLayout[i][j].unique &&\n\t\t\t\t (!aReturn[j] || !oSettings.bSortCellsTop) )\n\t\t\t{\n\t\t\t\taReturn[j] = aLayout[i][j].cell;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn aReturn;\n}\n\n/**\n * Set the start position for draw\n *  @param {object} oSettings dataTables settings object\n */\nfunction _fnStart( oSettings )\n{\n\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\tvar iInitDisplayStart = oSettings.iInitDisplayStart;\n\n\t// Check and see if we have an initial draw position from state saving\n\tif ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )\n\t{\n\t\toSettings._iDisplayStart = bServerSide ?\n\t\t\tiInitDisplayStart :\n\t\t\tiInitDisplayStart >= oSettings.fnRecordsDisplay() ?\n\t\t\t\t0 :\n\t\t\t\tiInitDisplayStart;\n\n\t\toSettings.iInitDisplayStart = -1;\n\t}\n}\n\n/**\n * Create an Ajax call based on the table's settings, taking into account that\n * parameters can have multiple forms, and backwards compatibility.\n *\n * @param {object} oSettings dataTables settings object\n * @param {array} data Data to send to the server, required by\n *     DataTables - may be augmented by developer callbacks\n * @param {function} fn Callback function to run when data is obtained\n */\nfunction _fnBuildAjax( oSettings, data, fn )\n{\n\t// Compatibility with 1.9-, allow fnServerData and event to manipulate\n\t_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );\n\n\t// Convert to object based for 1.10+ if using the old array scheme which can\n\t// come from server-side processing or serverParams\n\tif ( data && Array.isArray(data) ) {\n\t\tvar tmp = {};\n\t\tvar rbracket = /(.*?)\\[\\]$/;\n\n\t\t$.each( data, function (key, val) {\n\t\t\tvar match = val.name.match(rbracket);\n\n\t\t\tif ( match ) {\n\t\t\t\t// Support for arrays\n\t\t\t\tvar name = match[0];\n\n\t\t\t\tif ( ! tmp[ name ] ) {\n\t\t\t\t\ttmp[ name ] = [];\n\t\t\t\t}\n\t\t\t\ttmp[ name ].push( val.value );\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttmp[val.name] = val.value;\n\t\t\t}\n\t\t} );\n\t\tdata = tmp;\n\t}\n\n\tvar ajaxData;\n\tvar ajax = oSettings.ajax;\n\tvar instance = oSettings.oInstance;\n\tvar callback = function ( json ) {\n\t\tvar status = oSettings.jqXHR\n\t\t\t? oSettings.jqXHR.status\n\t\t\t: null;\n\n\t\tif ( json === null || (typeof status === 'number' && status == 204 ) ) {\n\t\t\tjson = {};\n\t\t\t_fnAjaxDataSrc( oSettings, json, [] );\n\t\t}\n\n\t\tvar error = json.error || json.sError;\n\t\tif ( error ) {\n\t\t\t_fnLog( oSettings, 0, error );\n\t\t}\n\n\t\toSettings.json = json;\n\n\t\t_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );\n\t\tfn( json );\n\t};\n\n\tif ( $.isPlainObject( ajax ) && ajax.data )\n\t{\n\t\tajaxData = ajax.data;\n\n\t\tvar newData = typeof ajaxData === 'function' ?\n\t\t\tajaxData( data, oSettings ) :  // fn can manipulate data or return\n\t\t\tajaxData;                      // an object object or array to merge\n\n\t\t// If the function returned something, use that alone\n\t\tdata = typeof ajaxData === 'function' && newData ?\n\t\t\tnewData :\n\t\t\t$.extend( true, data, newData );\n\n\t\t// Remove the data property as we've resolved it already and don't want\n\t\t// jQuery to do it again (it is restored at the end of the function)\n\t\tdelete ajax.data;\n\t}\n\n\tvar baseAjax = {\n\t\t\"data\": data,\n\t\t\"success\": callback,\n\t\t\"dataType\": \"json\",\n\t\t\"cache\": false,\n\t\t\"type\": oSettings.sServerMethod,\n\t\t\"error\": function (xhr, error, thrown) {\n\t\t\tvar ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );\n\n\t\t\tif ( $.inArray( true, ret ) === -1 ) {\n\t\t\t\tif ( error == \"parsererror\" ) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Invalid JSON response', 1 );\n\t\t\t\t}\n\t\t\t\telse if ( xhr.readyState === 4 ) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Ajax error', 7 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t}\n\t};\n\n\t// Store the data submitted for the API\n\toSettings.oAjaxData = data;\n\n\t// Allow plug-ins and external processes to modify the data\n\t_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );\n\n\tif ( oSettings.fnServerData )\n\t{\n\t\t// DataTables 1.9- compatibility\n\t\toSettings.fnServerData.call( instance,\n\t\t\toSettings.sAjaxSource,\n\t\t\t$.map( data, function (val, key) { // Need to convert back to 1.9 trad format\n\t\t\t\treturn { name: key, value: val };\n\t\t\t} ),\n\t\t\tcallback,\n\t\t\toSettings\n\t\t);\n\t}\n\telse if ( oSettings.sAjaxSource || typeof ajax === 'string' )\n\t{\n\t\t// DataTables 1.9- compatibility\n\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, {\n\t\t\turl: ajax || oSettings.sAjaxSource\n\t\t} ) );\n\t}\n\telse if ( typeof ajax === 'function' )\n\t{\n\t\t// Is a function - let the caller define what needs to be done\n\t\toSettings.jqXHR = ajax.call( instance, data, callback, oSettings );\n\t}\n\telse\n\t{\n\t\t// Object to extend the base settings\n\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );\n\n\t\t// Restore for next time around\n\t\tajax.data = ajaxData;\n\t}\n}\n\n\n/**\n * Update the table using an Ajax call\n *  @param {object} settings dataTables settings object\n *  @returns {boolean} Block the table drawing or not\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxUpdate( settings )\n{\n\tsettings.iDraw++;\n\t_fnProcessingDisplay( settings, true );\n\n\t_fnBuildAjax(\n\t\tsettings,\n\t\t_fnAjaxParameters( settings ),\n\t\tfunction(json) {\n\t\t\t_fnAjaxUpdateDraw( settings, json );\n\t\t}\n\t);\n}\n\n\n/**\n * Build up the parameters in an object needed for a server-side processing\n * request. Note that this is basically done twice, is different ways - a modern\n * method which is used by default in DataTables 1.10 which uses objects and\n * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if\n * the sAjaxSource option is used in the initialisation, or the legacyAjax\n * option is set.\n *  @param {object} oSettings dataTables settings object\n *  @returns {bool} block the table drawing or not\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxParameters( settings )\n{\n\tvar\n\t\tcolumns = settings.aoColumns,\n\t\tcolumnCount = columns.length,\n\t\tfeatures = settings.oFeatures,\n\t\tpreSearch = settings.oPreviousSearch,\n\t\tpreColSearch = settings.aoPreSearchCols,\n\t\ti, data = [], dataProp, column, columnSearch,\n\t\tsort = _fnSortFlatten( settings ),\n\t\tdisplayStart = settings._iDisplayStart,\n\t\tdisplayLength = features.bPaginate !== false ?\n\t\t\tsettings._iDisplayLength :\n\t\t\t-1;\n\n\tvar param = function ( name, value ) {\n\t\tdata.push( { 'name': name, 'value': value } );\n\t};\n\n\t// DataTables 1.9- compatible method\n\tparam( 'sEcho',          settings.iDraw );\n\tparam( 'iColumns',       columnCount );\n\tparam( 'sColumns',       _pluck( columns, 'sName' ).join(',') );\n\tparam( 'iDisplayStart',  displayStart );\n\tparam( 'iDisplayLength', displayLength );\n\n\t// DataTables 1.10+ method\n\tvar d = {\n\t\tdraw:    settings.iDraw,\n\t\tcolumns: [],\n\t\torder:   [],\n\t\tstart:   displayStart,\n\t\tlength:  displayLength,\n\t\tsearch:  {\n\t\t\tvalue: preSearch.sSearch,\n\t\t\tregex: preSearch.bRegex\n\t\t}\n\t};\n\n\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\tcolumn = columns[i];\n\t\tcolumnSearch = preColSearch[i];\n\t\tdataProp = typeof column.mData==\"function\" ? 'function' : column.mData ;\n\n\t\td.columns.push( {\n\t\t\tdata:       dataProp,\n\t\t\tname:       column.sName,\n\t\t\tsearchable: column.bSearchable,\n\t\t\torderable:  column.bSortable,\n\t\t\tsearch:     {\n\t\t\t\tvalue: columnSearch.sSearch,\n\t\t\t\tregex: columnSearch.bRegex\n\t\t\t}\n\t\t} );\n\n\t\tparam( \"mDataProp_\"+i, dataProp );\n\n\t\tif ( features.bFilter ) {\n\t\t\tparam( 'sSearch_'+i,     columnSearch.sSearch );\n\t\t\tparam( 'bRegex_'+i,      columnSearch.bRegex );\n\t\t\tparam( 'bSearchable_'+i, column.bSearchable );\n\t\t}\n\n\t\tif ( features.bSort ) {\n\t\t\tparam( 'bSortable_'+i, column.bSortable );\n\t\t}\n\t}\n\n\tif ( features.bFilter ) {\n\t\tparam( 'sSearch', preSearch.sSearch );\n\t\tparam( 'bRegex', preSearch.bRegex );\n\t}\n\n\tif ( features.bSort ) {\n\t\t$.each( sort, function ( i, val ) {\n\t\t\td.order.push( { column: val.col, dir: val.dir } );\n\n\t\t\tparam( 'iSortCol_'+i, val.col );\n\t\t\tparam( 'sSortDir_'+i, val.dir );\n\t\t} );\n\n\t\tparam( 'iSortingCols', sort.length );\n\t}\n\n\t// If the legacy.ajax parameter is null, then we automatically decide which\n\t// form to use, based on sAjaxSource\n\tvar legacy = DataTable.ext.legacy.ajax;\n\tif ( legacy === null ) {\n\t\treturn settings.sAjaxSource ? data : d;\n\t}\n\n\t// Otherwise, if legacy has been specified then we use that to decide on the\n\t// form\n\treturn legacy ? data : d;\n}\n\n\n/**\n * Data the data from the server (nuking the old) and redraw the table\n *  @param {object} oSettings dataTables settings object\n *  @param {object} json json data return from the server.\n *  @param {string} json.sEcho Tracking flag for DataTables to match requests\n *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering\n *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering\n *  @param {array} json.aaData The data to display on this page\n *  @param {string} [json.sColumns] Column ordering (sName, comma separated)\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxUpdateDraw ( settings, json )\n{\n\t// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.\n\t// Support both\n\tvar compat = function ( old, modern ) {\n\t\treturn json[old] !== undefined ? json[old] : json[modern];\n\t};\n\n\tvar data = _fnAjaxDataSrc( settings, json );\n\tvar draw            = compat( 'sEcho',                'draw' );\n\tvar recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );\n\tvar recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );\n\n\tif ( draw !== undefined ) {\n\t\t// Protect against out of sequence returns\n\t\tif ( draw*1 < settings.iDraw ) {\n\t\t\treturn;\n\t\t}\n\t\tsettings.iDraw = draw * 1;\n\t}\n\n\t// No data in returned object, so rather than an array, we show an empty table\n\tif ( ! data ) {\n\t\tdata = [];\n\t}\n\n\t_fnClearTable( settings );\n\tsettings._iRecordsTotal   = parseInt(recordsTotal, 10);\n\tsettings._iRecordsDisplay = parseInt(recordsFiltered, 10);\n\n\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t_fnAddData( settings, data[i] );\n\t}\n\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\n\t_fnDraw( settings, true );\n\n\tif ( ! settings._bInitComplete ) {\n\t\t_fnInitComplete( settings, json );\n\t}\n\n\t_fnProcessingDisplay( settings, false );\n}\n\n\n/**\n * Get the data from the JSON data source to use for drawing a table. Using\n * `_fnGetObjectDataFn` allows the data to be sourced from a property of the\n * source object, or from a processing function.\n *  @param {object} oSettings dataTables settings object\n *  @param  {object} json Data source object / array from the server\n *  @return {array} Array of data to use\n */\n function _fnAjaxDataSrc ( oSettings, json, write )\n {\n\tvar dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?\n\t\toSettings.ajax.dataSrc :\n\t\toSettings.sAjaxDataProp; // Compatibility with 1.9-.\n\n\tif ( ! write ) {\n\t\tif ( dataSrc === 'data' ) {\n\t\t\t// If the default, then we still want to support the old style, and safely ignore\n\t\t\t// it if possible\n\t\t\treturn json.aaData || json[dataSrc];\n\t\t}\n\n\t\treturn dataSrc !== \"\" ?\n\t\t\t_fnGetObjectDataFn( dataSrc )( json ) :\n\t\t\tjson;\n\t}\n\n\t// set\n\t_fnSetObjectDataFn( dataSrc )( json, write );\n}\n\n/**\n * Generate the node required for filtering text\n *  @returns {node} Filter control element\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlFilter ( settings )\n{\n\tvar classes = settings.oClasses;\n\tvar tableId = settings.sTableId;\n\tvar language = settings.oLanguage;\n\tvar previousSearch = settings.oPreviousSearch;\n\tvar features = settings.aanFeatures;\n\tvar input = '<input type=\"search\" class=\"'+classes.sFilterInput+'\"/>';\n\n\tvar str = language.sSearch;\n\tstr = str.match(/_INPUT_/) ?\n\t\tstr.replace('_INPUT_', input) :\n\t\tstr+input;\n\n\tvar filter = $('<div/>', {\n\t\t\t'id': ! features.f ? tableId+'_filter' : null,\n\t\t\t'class': classes.sFilter\n\t\t} )\n\t\t.append( $('<label/>' ).append( str ) );\n\n\tvar searchFn = function(event) {\n\t\t/* Update all other filter input elements for the new display */\n\t\tvar n = features.f;\n\t\tvar val = !this.value ? \"\" : this.value; // mental IE8 fix :-(\n\t\tif(previousSearch.return && event.key !== \"Enter\") {\n\t\t\treturn;\n\t\t}\n\t\t/* Now do the filter */\n\t\tif ( val != previousSearch.sSearch ) {\n\t\t\t_fnFilterComplete( settings, {\n\t\t\t\t\"sSearch\": val,\n\t\t\t\t\"bRegex\": previousSearch.bRegex,\n\t\t\t\t\"bSmart\": previousSearch.bSmart ,\n\t\t\t\t\"bCaseInsensitive\": previousSearch.bCaseInsensitive,\n\t\t\t\t\"return\": previousSearch.return\n\t\t\t} );\n\n\t\t\t// Need to redraw, without resorting\n\t\t\tsettings._iDisplayStart = 0;\n\t\t\t_fnDraw( settings );\n\t\t}\n\t};\n\n\tvar searchDelay = settings.searchDelay !== null ?\n\t\tsettings.searchDelay :\n\t\t_fnDataSource( settings ) === 'ssp' ?\n\t\t\t400 :\n\t\t\t0;\n\n\tvar jqFilter = $('input', filter)\n\t\t.val( previousSearch.sSearch )\n\t\t.attr( 'placeholder', language.sSearchPlaceholder )\n\t\t.on(\n\t\t\t'keyup.DT search.DT input.DT paste.DT cut.DT',\n\t\t\tsearchDelay ?\n\t\t\t\t_fnThrottle( searchFn, searchDelay ) :\n\t\t\t\tsearchFn\n\t\t)\n\t\t.on( 'mouseup', function(e) {\n\t\t\t// Edge fix! Edge 17 does not trigger anything other than mouse events when clicking\n\t\t\t// on the clear icon (Edge bug 17584515). This is safe in other browsers as `searchFn`\n\t\t\t// checks the value to see if it has changed. In other browsers it won't have.\n\t\t\tsetTimeout( function () {\n\t\t\t\tsearchFn.call(jqFilter[0], e);\n\t\t\t}, 10);\n\t\t} )\n\t\t.on( 'keypress.DT', function(e) {\n\t\t\t/* Prevent form submission */\n\t\t\tif ( e.keyCode == 13 ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} )\n\t\t.attr('aria-controls', tableId);\n\n\t// Update the input elements whenever the table is filtered\n\t$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {\n\t\tif ( settings === s ) {\n\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t// inside an iframe or frame...\n\t\t\ttry {\n\t\t\t\tif ( jqFilter[0] !== document.activeElement ) {\n\t\t\t\t\tjqFilter.val( previousSearch.sSearch );\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch ( e ) {}\n\t\t}\n\t} );\n\n\treturn filter[0];\n}\n\n\n/**\n * Filter the table using both the global filter and column based filtering\n *  @param {object} oSettings dataTables settings object\n *  @param {object} oSearch search information\n *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterComplete ( oSettings, oInput, iForce )\n{\n\tvar oPrevSearch = oSettings.oPreviousSearch;\n\tvar aoPrevSearch = oSettings.aoPreSearchCols;\n\tvar fnSaveFilter = function ( oFilter ) {\n\t\t/* Save the filtering values */\n\t\toPrevSearch.sSearch = oFilter.sSearch;\n\t\toPrevSearch.bRegex = oFilter.bRegex;\n\t\toPrevSearch.bSmart = oFilter.bSmart;\n\t\toPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;\n\t\toPrevSearch.return = oFilter.return;\n\t};\n\tvar fnRegex = function ( o ) {\n\t\t// Backwards compatibility with the bEscapeRegex option\n\t\treturn o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;\n\t};\n\n\t// Resolve any column types that are unknown due to addition or invalidation\n\t// @todo As per sort - can this be moved into an event handler?\n\t_fnColumnTypes( oSettings );\n\n\t/* In server-side processing all filtering is done by the server, so no point hanging around here */\n\tif ( _fnDataSource( oSettings ) != 'ssp' )\n\t{\n\t\t/* Global filter */\n\t\t_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive, oInput.return );\n\t\tfnSaveFilter( oInput );\n\n\t\t/* Now do the individual column filter */\n\t\tfor ( var i=0 ; i<aoPrevSearch.length ; i++ )\n\t\t{\n\t\t\t_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),\n\t\t\t\taoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );\n\t\t}\n\n\t\t/* Custom filtering */\n\t\t_fnFilterCustom( oSettings );\n\t}\n\telse\n\t{\n\t\tfnSaveFilter( oInput );\n\t}\n\n\t/* Tell the draw function we have been filtering */\n\toSettings.bFiltered = true;\n\t_fnCallbackFire( oSettings, null, 'search', [oSettings] );\n}\n\n\n/**\n * Apply custom filtering functions\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterCustom( settings )\n{\n\tvar filters = DataTable.ext.search;\n\tvar displayRows = settings.aiDisplay;\n\tvar row, rowIdx;\n\n\tfor ( var i=0, ien=filters.length ; i<ien ; i++ ) {\n\t\tvar rows = [];\n\n\t\t// Loop over each row and see if it should be included\n\t\tfor ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {\n\t\t\trowIdx = displayRows[ j ];\n\t\t\trow = settings.aoData[ rowIdx ];\n\n\t\t\tif ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {\n\t\t\t\trows.push( rowIdx );\n\t\t\t}\n\t\t}\n\n\t\t// So the array reference doesn't break set the results into the\n\t\t// existing array\n\t\tdisplayRows.length = 0;\n\t\t$.merge( displayRows, rows );\n\t}\n}\n\n\n/**\n * Filter the table on a per-column basis\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sInput string to filter on\n *  @param {int} iColumn column to filter\n *  @param {bool} bRegex treat search string as a regular expression or not\n *  @param {bool} bSmart use smart filtering or not\n *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )\n{\n\tif ( searchStr === '' ) {\n\t\treturn;\n\t}\n\n\tvar data;\n\tvar out = [];\n\tvar display = settings.aiDisplay;\n\tvar rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );\n\n\tfor ( var i=0 ; i<display.length ; i++ ) {\n\t\tdata = settings.aoData[ display[i] ]._aFilterData[ colIdx ];\n\n\t\tif ( rpSearch.test( data ) ) {\n\t\t\tout.push( display[i] );\n\t\t}\n\t}\n\n\tsettings.aiDisplay = out;\n}\n\n\n/**\n * Filter the data table based on user input and draw the table\n *  @param {object} settings dataTables settings object\n *  @param {string} input string to filter on\n *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)\n *  @param {bool} regex treat as a regular expression or not\n *  @param {bool} smart perform smart filtering or not\n *  @param {bool} caseInsensitive Do case insensitive matching or not\n *  @memberof DataTable#oApi\n */\nfunction _fnFilter( settings, input, force, regex, smart, caseInsensitive )\n{\n\tvar rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );\n\tvar prevSearch = settings.oPreviousSearch.sSearch;\n\tvar displayMaster = settings.aiDisplayMaster;\n\tvar display, invalidated, i;\n\tvar filtered = [];\n\n\t// Need to take account of custom filtering functions - always filter\n\tif ( DataTable.ext.search.length !== 0 ) {\n\t\tforce = true;\n\t}\n\n\t// Check if any of the rows were invalidated\n\tinvalidated = _fnFilterData( settings );\n\n\t// If the input is blank - we just want the full data set\n\tif ( input.length <= 0 ) {\n\t\tsettings.aiDisplay = displayMaster.slice();\n\t}\n\telse {\n\t\t// New search - start from the master array\n\t\tif ( invalidated ||\n\t\t\t force ||\n\t\t\t regex ||\n\t\t\t prevSearch.length > input.length ||\n\t\t\t input.indexOf(prevSearch) !== 0 ||\n\t\t\t settings.bSorted // On resort, the display master needs to be\n\t\t\t                  // re-filtered since indexes will have changed\n\t\t) {\n\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t}\n\n\t\t// Search the display array\n\t\tdisplay = settings.aiDisplay;\n\n\t\tfor ( i=0 ; i<display.length ; i++ ) {\n\t\t\tif ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {\n\t\t\t\tfiltered.push( display[i] );\n\t\t\t}\n\t\t}\n\n\t\tsettings.aiDisplay = filtered;\n\t}\n}\n\n\n/**\n * Build a regular expression object suitable for searching a table\n *  @param {string} sSearch string to search for\n *  @param {bool} bRegex treat as a regular expression or not\n *  @param {bool} bSmart perform smart filtering or not\n *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n *  @returns {RegExp} constructed object\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterCreateSearch( search, regex, smart, caseInsensitive )\n{\n\tsearch = regex ?\n\t\tsearch :\n\t\t_fnEscapeRegex( search );\n\t\n\tif ( smart ) {\n\t\t/* For smart filtering we want to allow the search to work regardless of\n\t\t * word order. We also want double quoted text to be preserved, so word\n\t\t * order is important - a la google. So this is what we want to\n\t\t * generate:\n\t\t * \n\t\t * ^(?=.*?\\bone\\b)(?=.*?\\btwo three\\b)(?=.*?\\bfour\\b).*$\n\t\t */\n\t\tvar a = $.map( search.match( /\"[^\"]+\"|[^ ]+/g ) || [''], function ( word ) {\n\t\t\tif ( word.charAt(0) === '\"' ) {\n\t\t\t\tvar m = word.match( /^\"(.*)\"$/ );\n\t\t\t\tword = m ? m[1] : word;\n\t\t\t}\n\n\t\t\treturn word.replace('\"', '');\n\t\t} );\n\n\t\tsearch = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';\n\t}\n\n\treturn new RegExp( search, caseInsensitive ? 'i' : '' );\n}\n\n\n/**\n * Escape a string such that it can be used in a regular expression\n *  @param {string} sVal string to escape\n *  @returns {string} escaped string\n *  @memberof DataTable#oApi\n */\nvar _fnEscapeRegex = DataTable.util.escapeRegex;\n\nvar __filter_div = $('<div>')[0];\nvar __filter_div_textContent = __filter_div.textContent !== undefined;\n\n// Update the filtering data for each row if needed (by invalidation or first run)\nfunction _fnFilterData ( settings )\n{\n\tvar columns = settings.aoColumns;\n\tvar column;\n\tvar i, j, ien, jen, filterData, cellData, row;\n\tvar wasInvalidated = false;\n\n\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\trow = settings.aoData[i];\n\n\t\tif ( ! row._aFilterData ) {\n\t\t\tfilterData = [];\n\n\t\t\tfor ( j=0, jen=columns.length ; j<jen ; j++ ) {\n\t\t\t\tcolumn = columns[j];\n\n\t\t\t\tif ( column.bSearchable ) {\n\t\t\t\t\tcellData = _fnGetCellData( settings, i, j, 'filter' );\n\n\t\t\t\t\t// Search in DataTables 1.10 is string based. In 1.11 this\n\t\t\t\t\t// should be altered to also allow strict type checking.\n\t\t\t\t\tif ( cellData === null ) {\n\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof cellData !== 'string' && cellData.toString ) {\n\t\t\t\t\t\tcellData = cellData.toString();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcellData = '';\n\t\t\t\t}\n\n\t\t\t\t// If it looks like there is an HTML entity in the string,\n\t\t\t\t// attempt to decode it so sorting works as expected. Note that\n\t\t\t\t// we could use a single line of jQuery to do this, but the DOM\n\t\t\t\t// method used here is much faster http://jsperf.com/html-decode\n\t\t\t\tif ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {\n\t\t\t\t\t__filter_div.innerHTML = cellData;\n\t\t\t\t\tcellData = __filter_div_textContent ?\n\t\t\t\t\t\t__filter_div.textContent :\n\t\t\t\t\t\t__filter_div.innerText;\n\t\t\t\t}\n\n\t\t\t\tif ( cellData.replace ) {\n\t\t\t\t\tcellData = cellData.replace(/[\\r\\n\\u2028]/g, '');\n\t\t\t\t}\n\n\t\t\t\tfilterData.push( cellData );\n\t\t\t}\n\n\t\t\trow._aFilterData = filterData;\n\t\t\trow._sFilterRow = filterData.join('  ');\n\t\t\twasInvalidated = true;\n\t\t}\n\t}\n\n\treturn wasInvalidated;\n}\n\n\n/**\n * Convert from the internal Hungarian notation to camelCase for external\n * interaction\n *  @param {object} obj Object to convert\n *  @returns {object} Inverted object\n *  @memberof DataTable#oApi\n */\nfunction _fnSearchToCamel ( obj )\n{\n\treturn {\n\t\tsearch:          obj.sSearch,\n\t\tsmart:           obj.bSmart,\n\t\tregex:           obj.bRegex,\n\t\tcaseInsensitive: obj.bCaseInsensitive\n\t};\n}\n\n\n\n/**\n * Convert from camelCase notation to the internal Hungarian. We could use the\n * Hungarian convert function here, but this is cleaner\n *  @param {object} obj Object to convert\n *  @returns {object} Inverted object\n *  @memberof DataTable#oApi\n */\nfunction _fnSearchToHung ( obj )\n{\n\treturn {\n\t\tsSearch:          obj.search,\n\t\tbSmart:           obj.smart,\n\t\tbRegex:           obj.regex,\n\t\tbCaseInsensitive: obj.caseInsensitive\n\t};\n}\n\n/**\n * Generate the node required for the info display\n *  @param {object} oSettings dataTables settings object\n *  @returns {node} Information element\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlInfo ( settings )\n{\n\tvar\n\t\ttid = settings.sTableId,\n\t\tnodes = settings.aanFeatures.i,\n\t\tn = $('<div/>', {\n\t\t\t'class': settings.oClasses.sInfo,\n\t\t\t'id': ! nodes ? tid+'_info' : null\n\t\t} );\n\n\tif ( ! nodes ) {\n\t\t// Update display on each draw\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": _fnUpdateInfo,\n\t\t\t\"sName\": \"information\"\n\t\t} );\n\n\t\tn\n\t\t\t.attr( 'role', 'status' )\n\t\t\t.attr( 'aria-live', 'polite' );\n\n\t\t// Table is described by our info div\n\t\t$(settings.nTable).attr( 'aria-describedby', tid+'_info' );\n\t}\n\n\treturn n[0];\n}\n\n\n/**\n * Update the information elements in the display\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnUpdateInfo ( settings )\n{\n\t/* Show information about the table */\n\tvar nodes = settings.aanFeatures.i;\n\tif ( nodes.length === 0 ) {\n\t\treturn;\n\t}\n\n\tvar\n\t\tlang  = settings.oLanguage,\n\t\tstart = settings._iDisplayStart+1,\n\t\tend   = settings.fnDisplayEnd(),\n\t\tmax   = settings.fnRecordsTotal(),\n\t\ttotal = settings.fnRecordsDisplay(),\n\t\tout   = total ?\n\t\t\tlang.sInfo :\n\t\t\tlang.sInfoEmpty;\n\n\tif ( total !== max ) {\n\t\t/* Record set after filtering */\n\t\tout += ' ' + lang.sInfoFiltered;\n\t}\n\n\t// Convert the macros\n\tout += lang.sInfoPostFix;\n\tout = _fnInfoMacros( settings, out );\n\n\tvar callback = lang.fnInfoCallback;\n\tif ( callback !== null ) {\n\t\tout = callback.call( settings.oInstance,\n\t\t\tsettings, start, end, max, total, out\n\t\t);\n\t}\n\n\t$(nodes).html( out );\n}\n\n\nfunction _fnInfoMacros ( settings, str )\n{\n\t// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only\n\t// internally\n\tvar\n\t\tformatter  = settings.fnFormatNumber,\n\t\tstart      = settings._iDisplayStart+1,\n\t\tlen        = settings._iDisplayLength,\n\t\tvis        = settings.fnRecordsDisplay(),\n\t\tall        = len === -1;\n\n\treturn str.\n\t\treplace(/_START_/g, formatter.call( settings, start ) ).\n\t\treplace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).\n\t\treplace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).\n\t\treplace(/_TOTAL_/g, formatter.call( settings, vis ) ).\n\t\treplace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).\n\t\treplace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );\n}\n\n\n\n/**\n * Draw the table for the first time, adding all required features\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnInitialise ( settings )\n{\n\tvar i, iLen, iAjaxStart=settings.iInitDisplayStart;\n\tvar columns = settings.aoColumns, column;\n\tvar features = settings.oFeatures;\n\tvar deferLoading = settings.bDeferLoading; // value modified by the draw\n\n\t/* Ensure that the table data is fully initialised */\n\tif ( ! settings.bInitialised ) {\n\t\tsetTimeout( function(){ _fnInitialise( settings ); }, 200 );\n\t\treturn;\n\t}\n\n\t/* Show the display HTML options */\n\t_fnAddOptionsHtml( settings );\n\n\t/* Build and draw the header / footer for the table */\n\t_fnBuildHead( settings );\n\t_fnDrawHead( settings, settings.aoHeader );\n\t_fnDrawHead( settings, settings.aoFooter );\n\n\t/* Okay to show that something is going on now */\n\t_fnProcessingDisplay( settings, true );\n\n\t/* Calculate sizes for columns */\n\tif ( features.bAutoWidth ) {\n\t\t_fnCalculateColumnWidths( settings );\n\t}\n\n\tfor ( i=0, iLen=columns.length ; i<iLen ; i++ ) {\n\t\tcolumn = columns[i];\n\n\t\tif ( column.sWidth ) {\n\t\t\tcolumn.nTh.style.width = _fnStringToCss( column.sWidth );\n\t\t}\n\t}\n\n\t_fnCallbackFire( settings, null, 'preInit', [settings] );\n\n\t// If there is default sorting required - let's do it. The sort function\n\t// will do the drawing for us. Otherwise we draw the table regardless of the\n\t// Ajax source - this allows the table to look initialised for Ajax sourcing\n\t// data (show 'loading' message possibly)\n\t_fnReDraw( settings );\n\n\t// Server-side processing init complete is done by _fnAjaxUpdateDraw\n\tvar dataSrc = _fnDataSource( settings );\n\tif ( dataSrc != 'ssp' || deferLoading ) {\n\t\t// if there is an ajax source load the data\n\t\tif ( dataSrc == 'ajax' ) {\n\t\t\t_fnBuildAjax( settings, [], function(json) {\n\t\t\t\tvar aData = _fnAjaxDataSrc( settings, json );\n\n\t\t\t\t// Got the data - add it to the table\n\t\t\t\tfor ( i=0 ; i<aData.length ; i++ ) {\n\t\t\t\t\t_fnAddData( settings, aData[i] );\n\t\t\t\t}\n\n\t\t\t\t// Reset the init display for cookie saving. We've already done\n\t\t\t\t// a filter, and therefore cleared it before. So we need to make\n\t\t\t\t// it appear 'fresh'\n\t\t\t\tsettings.iInitDisplayStart = iAjaxStart;\n\n\t\t\t\t_fnReDraw( settings );\n\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t_fnInitComplete( settings, json );\n\t\t\t}, settings );\n\t\t}\n\t\telse {\n\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t_fnInitComplete( settings );\n\t\t}\n\t}\n}\n\n\n/**\n * Draw the table for the first time, adding all required features\n *  @param {object} oSettings dataTables settings object\n *  @param {object} [json] JSON from the server that completed the table, if using Ajax source\n *    with client-side processing (optional)\n *  @memberof DataTable#oApi\n */\nfunction _fnInitComplete ( settings, json )\n{\n\tsettings._bInitComplete = true;\n\n\t// When data was added after the initialisation (data or Ajax) we need to\n\t// calculate the column sizing\n\tif ( json || settings.oInit.aaData ) {\n\t\t_fnAdjustColumnSizing( settings );\n\t}\n\n\t_fnCallbackFire( settings, null, 'plugin-init', [settings, json] );\n\t_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );\n}\n\n\nfunction _fnLengthChange ( settings, val )\n{\n\tvar len = parseInt( val, 10 );\n\tsettings._iDisplayLength = len;\n\n\t_fnLengthOverflow( settings );\n\n\t// Fire length change event\n\t_fnCallbackFire( settings, null, 'length', [settings, len] );\n}\n\n\n/**\n * Generate the node required for user display length changing\n *  @param {object} settings dataTables settings object\n *  @returns {node} Display length feature node\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlLength ( settings )\n{\n\tvar\n\t\tclasses  = settings.oClasses,\n\t\ttableId  = settings.sTableId,\n\t\tmenu     = settings.aLengthMenu,\n\t\td2       = Array.isArray( menu[0] ),\n\t\tlengths  = d2 ? menu[0] : menu,\n\t\tlanguage = d2 ? menu[1] : menu;\n\n\tvar select = $('<select/>', {\n\t\t'name':          tableId+'_length',\n\t\t'aria-controls': tableId,\n\t\t'class':         classes.sLengthSelect\n\t} );\n\n\tfor ( var i=0, ien=lengths.length ; i<ien ; i++ ) {\n\t\tselect[0][ i ] = new Option(\n\t\t\ttypeof language[i] === 'number' ?\n\t\t\t\tsettings.fnFormatNumber( language[i] ) :\n\t\t\t\tlanguage[i],\n\t\t\tlengths[i]\n\t\t);\n\t}\n\n\tvar div = $('<div><label/></div>').addClass( classes.sLength );\n\tif ( ! settings.aanFeatures.l ) {\n\t\tdiv[0].id = tableId+'_length';\n\t}\n\n\tdiv.children().append(\n\t\tsettings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )\n\t);\n\n\t// Can't use `select` variable as user might provide their own and the\n\t// reference is broken by the use of outerHTML\n\t$('select', div)\n\t\t.val( settings._iDisplayLength )\n\t\t.on( 'change.DT', function(e) {\n\t\t\t_fnLengthChange( settings, $(this).val() );\n\t\t\t_fnDraw( settings );\n\t\t} );\n\n\t// Update node value whenever anything changes the table's length\n\t$(settings.nTable).on( 'length.dt.DT', function (e, s, len) {\n\t\tif ( settings === s ) {\n\t\t\t$('select', div).val( len );\n\t\t}\n\t} );\n\n\treturn div[0];\n}\n\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Note that most of the paging logic is done in\n * DataTable.ext.pager\n */\n\n/**\n * Generate the node required for default pagination\n *  @param {object} oSettings dataTables settings object\n *  @returns {node} Pagination feature node\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlPaginate ( settings )\n{\n\tvar\n\t\ttype   = settings.sPaginationType,\n\t\tplugin = DataTable.ext.pager[ type ],\n\t\tmodern = typeof plugin === 'function',\n\t\tredraw = function( settings ) {\n\t\t\t_fnDraw( settings );\n\t\t},\n\t\tnode = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],\n\t\tfeatures = settings.aanFeatures;\n\n\tif ( ! modern ) {\n\t\tplugin.fnInit( settings, node, redraw );\n\t}\n\n\t/* Add a draw callback for the pagination on first instance, to update the paging display */\n\tif ( ! features.p )\n\t{\n\t\tnode.id = settings.sTableId+'_paginate';\n\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": function( settings ) {\n\t\t\t\tif ( modern ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tstart      = settings._iDisplayStart,\n\t\t\t\t\t\tlen        = settings._iDisplayLength,\n\t\t\t\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\t\t\t\tall        = len === -1,\n\t\t\t\t\t\tpage = all ? 0 : Math.ceil( start / len ),\n\t\t\t\t\t\tpages = all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\t\t\tbuttons = plugin(page, pages),\n\t\t\t\t\t\ti, ien;\n\n\t\t\t\t\tfor ( i=0, ien=features.p.length ; i<ien ; i++ ) {\n\t\t\t\t\t\t_fnRenderer( settings, 'pageButton' )(\n\t\t\t\t\t\t\tsettings, features.p[i], i, buttons, page, pages\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tplugin.fnUpdate( settings, redraw );\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"sName\": \"pagination\"\n\t\t} );\n\t}\n\n\treturn node;\n}\n\n\n/**\n * Alter the display settings to change the page\n *  @param {object} settings DataTables settings object\n *  @param {string|int} action Paging action to take: \"first\", \"previous\",\n *    \"next\" or \"last\" or page number to jump to (integer)\n *  @param [bool] redraw Automatically draw the update or not\n *  @returns {bool} true page has changed, false - no change\n *  @memberof DataTable#oApi\n */\nfunction _fnPageChange ( settings, action, redraw )\n{\n\tvar\n\t\tstart     = settings._iDisplayStart,\n\t\tlen       = settings._iDisplayLength,\n\t\trecords   = settings.fnRecordsDisplay();\n\n\tif ( records === 0 || len === -1 )\n\t{\n\t\tstart = 0;\n\t}\n\telse if ( typeof action === \"number\" )\n\t{\n\t\tstart = action * len;\n\n\t\tif ( start > records )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t}\n\telse if ( action == \"first\" )\n\t{\n\t\tstart = 0;\n\t}\n\telse if ( action == \"previous\" )\n\t{\n\t\tstart = len >= 0 ?\n\t\t\tstart - len :\n\t\t\t0;\n\n\t\tif ( start < 0 )\n\t\t{\n\t\t  start = 0;\n\t\t}\n\t}\n\telse if ( action == \"next\" )\n\t{\n\t\tif ( start + len < records )\n\t\t{\n\t\t\tstart += len;\n\t\t}\n\t}\n\telse if ( action == \"last\" )\n\t{\n\t\tstart = Math.floor( (records-1) / len) * len;\n\t}\n\telse\n\t{\n\t\t_fnLog( settings, 0, \"Unknown paging action: \"+action, 5 );\n\t}\n\n\tvar changed = settings._iDisplayStart !== start;\n\tsettings._iDisplayStart = start;\n\n\tif ( changed ) {\n\t\t_fnCallbackFire( settings, null, 'page', [settings] );\n\n\t\tif ( redraw ) {\n\t\t\t_fnDraw( settings );\n\t\t}\n\t}\n\telse {\n\t\t// No change event - paging was called, but no change\n\t\t_fnCallbackFire( settings, null, 'page-nc', [settings] );\n\t}\n\n\treturn changed;\n}\n\n\n\n/**\n * Generate the node required for the processing node\n *  @param {object} settings dataTables settings object\n *  @returns {node} Processing element\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlProcessing ( settings )\n{\n\treturn $('<div/>', {\n\t\t\t'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,\n\t\t\t'class': settings.oClasses.sProcessing,\n\t\t\t'role': 'status'\n\t\t} )\n\t\t.html( settings.oLanguage.sProcessing )\n\t\t.append('<div><div></div><div></div><div></div><div></div></div>')\n\t\t.insertBefore( settings.nTable )[0];\n}\n\n\n/**\n * Display or hide the processing indicator\n *  @param {object} settings dataTables settings object\n *  @param {bool} show Show the processing indicator (true) or not (false)\n *  @memberof DataTable#oApi\n */\nfunction _fnProcessingDisplay ( settings, show )\n{\n\tif ( settings.oFeatures.bProcessing ) {\n\t\t$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );\n\t}\n\n\t_fnCallbackFire( settings, null, 'processing', [settings, show] );\n}\n\n/**\n * Add any control elements for the table - specifically scrolling\n *  @param {object} settings dataTables settings object\n *  @returns {node} Node to add to the DOM\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlTable ( settings )\n{\n\tvar table = $(settings.nTable);\n\n\t// Scrolling from here on in\n\tvar scroll = settings.oScroll;\n\n\tif ( scroll.sX === '' && scroll.sY === '' ) {\n\t\treturn settings.nTable;\n\t}\n\n\tvar scrollX = scroll.sX;\n\tvar scrollY = scroll.sY;\n\tvar classes = settings.oClasses;\n\tvar caption = table.children('caption');\n\tvar captionSide = caption.length ? caption[0]._captionSide : null;\n\tvar headerClone = $( table[0].cloneNode(false) );\n\tvar footerClone = $( table[0].cloneNode(false) );\n\tvar footer = table.children('tfoot');\n\tvar _div = '<div/>';\n\tvar size = function ( s ) {\n\t\treturn !s ? null : _fnStringToCss( s );\n\t};\n\n\tif ( ! footer.length ) {\n\t\tfooter = null;\n\t}\n\n\t/*\n\t * The HTML structure that we want to generate in this function is:\n\t *  div - scroller\n\t *    div - scroll head\n\t *      div - scroll head inner\n\t *        table - scroll head table\n\t *          thead - thead\n\t *    div - scroll body\n\t *      table - table (master table)\n\t *        thead - thead clone for sizing\n\t *        tbody - tbody\n\t *    div - scroll foot\n\t *      div - scroll foot inner\n\t *        table - scroll foot table\n\t *          tfoot - tfoot\n\t */\n\tvar scroller = $( _div, { 'class': classes.sScrollWrapper } )\n\t\t.append(\n\t\t\t$(_div, { 'class': classes.sScrollHead } )\n\t\t\t\t.css( {\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\tborder: 0,\n\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$(_div, { 'class': classes.sScrollHeadInner } )\n\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t'box-sizing': 'content-box',\n\t\t\t\t\t\t\twidth: scroll.sXInner || '100%'\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\theaderClone\n\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t.append( captionSide === 'top' ? caption : null )\n\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\ttable.children('thead')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t)\n\t\t.append(\n\t\t\t$(_div, { 'class': classes.sScrollBody } )\n\t\t\t\t.css( {\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\twidth: size( scrollX )\n\t\t\t\t} )\n\t\t\t\t.append( table )\n\t\t);\n\n\tif ( footer ) {\n\t\tscroller.append(\n\t\t\t$(_div, { 'class': classes.sScrollFoot } )\n\t\t\t\t.css( {\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\tborder: 0,\n\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$(_div, { 'class': classes.sScrollFootInner } )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\tfooterClone\n\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t.append( captionSide === 'bottom' ? caption : null )\n\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\ttable.children('tfoot')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t);\n\t}\n\n\tvar children = scroller.children();\n\tvar scrollHead = children[0];\n\tvar scrollBody = children[1];\n\tvar scrollFoot = footer ? children[2] : null;\n\n\t// When the body is scrolled, then we also want to scroll the headers\n\tif ( scrollX ) {\n\t\t$(scrollBody).on( 'scroll.DT', function (e) {\n\t\t\tvar scrollLeft = this.scrollLeft;\n\n\t\t\tscrollHead.scrollLeft = scrollLeft;\n\n\t\t\tif ( footer ) {\n\t\t\t\tscrollFoot.scrollLeft = scrollLeft;\n\t\t\t}\n\t\t} );\n\t}\n\n\t$(scrollBody).css('max-height', scrollY);\n\tif (! scroll.bCollapse) {\n\t\t$(scrollBody).css('height', scrollY);\n\t}\n\n\tsettings.nScrollHead = scrollHead;\n\tsettings.nScrollBody = scrollBody;\n\tsettings.nScrollFoot = scrollFoot;\n\n\t// On redraw - align columns\n\tsettings.aoDrawCallback.push( {\n\t\t\"fn\": _fnScrollDraw,\n\t\t\"sName\": \"scrolling\"\n\t} );\n\n\treturn scroller[0];\n}\n\n\n\n/**\n * Update the header, footer and body tables for resizing - i.e. column\n * alignment.\n *\n * Welcome to the most horrible function DataTables. The process that this\n * function follows is basically:\n *   1. Re-create the table inside the scrolling div\n *   2. Take live measurements from the DOM\n *   3. Apply the measurements to align the columns\n *   4. Clean up\n *\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnScrollDraw ( settings )\n{\n\t// Given that this is such a monster function, a lot of variables are use\n\t// to try and keep the minimised size as small as possible\n\tvar\n\t\tscroll         = settings.oScroll,\n\t\tscrollX        = scroll.sX,\n\t\tscrollXInner   = scroll.sXInner,\n\t\tscrollY        = scroll.sY,\n\t\tbarWidth       = scroll.iBarWidth,\n\t\tdivHeader      = $(settings.nScrollHead),\n\t\tdivHeaderStyle = divHeader[0].style,\n\t\tdivHeaderInner = divHeader.children('div'),\n\t\tdivHeaderInnerStyle = divHeaderInner[0].style,\n\t\tdivHeaderTable = divHeaderInner.children('table'),\n\t\tdivBodyEl      = settings.nScrollBody,\n\t\tdivBody        = $(divBodyEl),\n\t\tdivBodyStyle   = divBodyEl.style,\n\t\tdivFooter      = $(settings.nScrollFoot),\n\t\tdivFooterInner = divFooter.children('div'),\n\t\tdivFooterTable = divFooterInner.children('table'),\n\t\theader         = $(settings.nTHead),\n\t\ttable          = $(settings.nTable),\n\t\ttableEl        = table[0],\n\t\ttableStyle     = tableEl.style,\n\t\tfooter         = settings.nTFoot ? $(settings.nTFoot) : null,\n\t\tbrowser        = settings.oBrowser,\n\t\tie67           = browser.bScrollOversize,\n\t\tdtHeaderCells  = _pluck( settings.aoColumns, 'nTh' ),\n\t\theaderTrgEls, footerTrgEls,\n\t\theaderSrcEls, footerSrcEls,\n\t\theaderCopy, footerCopy,\n\t\theaderWidths=[], footerWidths=[],\n\t\theaderContent=[], footerContent=[],\n\t\tidx, correction, sanityWidth,\n\t\tzeroOut = function(nSizer) {\n\t\t\tvar style = nSizer.style;\n\t\t\tstyle.paddingTop = \"0\";\n\t\t\tstyle.paddingBottom = \"0\";\n\t\t\tstyle.borderTopWidth = \"0\";\n\t\t\tstyle.borderBottomWidth = \"0\";\n\t\t\tstyle.height = 0;\n\t\t};\n\n\t// If the scrollbar visibility has changed from the last draw, we need to\n\t// adjust the column sizes as the table width will have changed to account\n\t// for the scrollbar\n\tvar scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;\n\t\n\tif ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {\n\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t_fnAdjustColumnSizing( settings );\n\t\treturn; // adjust column sizing will call this function again\n\t}\n\telse {\n\t\tsettings.scrollBarVis = scrollBarVis;\n\t}\n\n\t/*\n\t * 1. Re-create the table inside the scrolling div\n\t */\n\n\t// Remove the old minimised thead and tfoot elements in the inner table\n\ttable.children('thead, tfoot').remove();\n\n\tif ( footer ) {\n\t\tfooterCopy = footer.clone().prependTo( table );\n\t\tfooterTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized\n\t\tfooterSrcEls = footerCopy.find('tr');\n\t\tfooterCopy.find('[id]').removeAttr('id');\n\t}\n\n\t// Clone the current header and footer elements and then place it into the inner table\n\theaderCopy = header.clone().prependTo( table );\n\theaderTrgEls = header.find('tr'); // original header is in its own table\n\theaderSrcEls = headerCopy.find('tr');\n\theaderCopy.find('th, td').removeAttr('tabindex');\n\theaderCopy.find('[id]').removeAttr('id');\n\n\n\t/*\n\t * 2. Take live measurements from the DOM - do not alter the DOM itself!\n\t */\n\n\t// Remove old sizing and apply the calculated column widths\n\t// Get the unique column headers in the newly created (cloned) header. We want to apply the\n\t// calculated sizes to this header\n\tif ( ! scrollX )\n\t{\n\t\tdivBodyStyle.width = '100%';\n\t\tdivHeader[0].style.width = '100%';\n\t}\n\n\t$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {\n\t\tidx = _fnVisibleToColumnIndex( settings, i );\n\t\tel.style.width = settings.aoColumns[idx].sWidth;\n\t} );\n\n\tif ( footer ) {\n\t\t_fnApplyToChildren( function(n) {\n\t\t\tn.style.width = \"\";\n\t\t}, footerSrcEls );\n\t}\n\n\t// Size the table as a whole\n\tsanityWidth = table.outerWidth();\n\tif ( scrollX === \"\" ) {\n\t\t// No x scrolling\n\t\ttableStyle.width = \"100%\";\n\n\t\t// IE7 will make the width of the table when 100% include the scrollbar\n\t\t// - which is shouldn't. When there is a scrollbar we need to take this\n\t\t// into account.\n\t\tif ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||\n\t\t\tdivBody.css('overflow-y') == \"scroll\")\n\t\t) {\n\t\t\ttableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);\n\t\t}\n\n\t\t// Recalculate the sanity width\n\t\tsanityWidth = table.outerWidth();\n\t}\n\telse if ( scrollXInner !== \"\" ) {\n\t\t// legacy x scroll inner has been given - use it\n\t\ttableStyle.width = _fnStringToCss(scrollXInner);\n\n\t\t// Recalculate the sanity width\n\t\tsanityWidth = table.outerWidth();\n\t}\n\n\t// Hidden header should have zero height, so remove padding and borders. Then\n\t// set the width based on the real headers\n\n\t// Apply all styles in one pass\n\t_fnApplyToChildren( zeroOut, headerSrcEls );\n\n\t// Read all widths in next pass\n\t_fnApplyToChildren( function(nSizer) {\n\t\tvar style = window.getComputedStyle ?\n\t\t\twindow.getComputedStyle(nSizer).width :\n\t\t\t_fnStringToCss( $(nSizer).width() );\n\n\t\theaderContent.push( nSizer.innerHTML );\n\t\theaderWidths.push( style );\n\t}, headerSrcEls );\n\n\t// Apply all widths in final pass\n\t_fnApplyToChildren( function(nToSize, i) {\n\t\tnToSize.style.width = headerWidths[i];\n\t}, headerTrgEls );\n\n\t$(headerSrcEls).css('height', 0);\n\n\t/* Same again with the footer if we have one */\n\tif ( footer )\n\t{\n\t\t_fnApplyToChildren( zeroOut, footerSrcEls );\n\n\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\tfooterContent.push( nSizer.innerHTML );\n\t\t\tfooterWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t}, footerSrcEls );\n\n\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\tnToSize.style.width = footerWidths[i];\n\t\t}, footerTrgEls );\n\n\t\t$(footerSrcEls).height(0);\n\t}\n\n\n\t/*\n\t * 3. Apply the measurements\n\t */\n\n\t// \"Hide\" the header and footer that we used for the sizing. We need to keep\n\t// the content of the cell so that the width applied to the header and body\n\t// both match, but we want to hide it completely. We want to also fix their\n\t// width to what they currently are\n\t_fnApplyToChildren( function(nSizer, i) {\n\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+headerContent[i]+'</div>';\n\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\tnSizer.style.width = headerWidths[i];\n\t}, headerSrcEls );\n\n\tif ( footer )\n\t{\n\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+footerContent[i]+'</div>';\n\t\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\t\tnSizer.style.width = footerWidths[i];\n\t\t}, footerSrcEls );\n\t}\n\n\t// Sanity check that the table is of a sensible width. If not then we are going to get\n\t// misalignment - try to prevent this by not allowing the table to shrink below its min width\n\tif ( Math.round(table.outerWidth()) < Math.round(sanityWidth) )\n\t{\n\t\t// The min width depends upon if we have a vertical scrollbar visible or not */\n\t\tcorrection = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||\n\t\t\tdivBody.css('overflow-y') == \"scroll\")) ?\n\t\t\t\tsanityWidth+barWidth :\n\t\t\t\tsanityWidth;\n\n\t\t// IE6/7 are a law unto themselves...\n\t\tif ( ie67 && (divBodyEl.scrollHeight >\n\t\t\tdivBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\")\n\t\t) {\n\t\t\ttableStyle.width = _fnStringToCss( correction-barWidth );\n\t\t}\n\n\t\t// And give the user a warning that we've stopped the table getting too small\n\t\tif ( scrollX === \"\" || scrollXInner !== \"\" ) {\n\t\t\t_fnLog( settings, 1, 'Possible column misalignment', 6 );\n\t\t}\n\t}\n\telse\n\t{\n\t\tcorrection = '100%';\n\t}\n\n\t// Apply to the container elements\n\tdivBodyStyle.width = _fnStringToCss( correction );\n\tdivHeaderStyle.width = _fnStringToCss( correction );\n\n\tif ( footer ) {\n\t\tsettings.nScrollFoot.style.width = _fnStringToCss( correction );\n\t}\n\n\n\t/*\n\t * 4. Clean up\n\t */\n\tif ( ! scrollY ) {\n\t\t/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting\n\t\t * the scrollbar height from the visible display, rather than adding it on. We need to\n\t\t * set the height in order to sort this. Don't want to do it in any other browsers.\n\t\t */\n\t\tif ( ie67 ) {\n\t\t\tdivBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );\n\t\t}\n\t}\n\n\t/* Finally set the width's of the header and footer tables */\n\tvar iOuterWidth = table.outerWidth();\n\tdivHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );\n\tdivHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );\n\n\t// Figure out if there are scrollbar present - if so then we need a the header and footer to\n\t// provide a bit more space to allow \"overflow\" scrolling (i.e. past the scrollbar)\n\tvar bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == \"scroll\";\n\tvar padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );\n\tdivHeaderInnerStyle[ padding ] = bScrolling ? barWidth+\"px\" : \"0px\";\n\n\tif ( footer ) {\n\t\tdivFooterTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivFooterInner[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivFooterInner[0].style[padding] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t}\n\n\t// Correct DOM ordering for colgroup - comes before the thead\n\ttable.children('colgroup').insertBefore( table.children('thead') );\n\n\t/* Adjust the position of the header in case we loose the y-scrollbar */\n\tdivBody.trigger('scroll');\n\n\t// If sorting or filtering has occurred, jump the scrolling back to the top\n\t// only if we aren't holding the position\n\tif ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {\n\t\tdivBodyEl.scrollTop = 0;\n\t}\n}\n\n\n\n/**\n * Apply a given function to the display child nodes of an element array (typically\n * TD children of TR rows\n *  @param {function} fn Method to apply to the objects\n *  @param array {nodes} an1 List of elements to look through for display children\n *  @param array {nodes} an2 Another list (identical structure to the first) - optional\n *  @memberof DataTable#oApi\n */\nfunction _fnApplyToChildren( fn, an1, an2 )\n{\n\tvar index=0, i=0, iLen=an1.length;\n\tvar nNode1, nNode2;\n\n\twhile ( i < iLen ) {\n\t\tnNode1 = an1[i].firstChild;\n\t\tnNode2 = an2 ? an2[i].firstChild : null;\n\n\t\twhile ( nNode1 ) {\n\t\t\tif ( nNode1.nodeType === 1 ) {\n\t\t\t\tif ( an2 ) {\n\t\t\t\t\tfn( nNode1, nNode2, index );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfn( nNode1, index );\n\t\t\t\t}\n\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\tnNode1 = nNode1.nextSibling;\n\t\t\tnNode2 = an2 ? nNode2.nextSibling : null;\n\t\t}\n\n\t\ti++;\n\t}\n}\n\n\n\nvar __re_html_remove = /<.*?>/g;\n\n\n/**\n * Calculate the width of columns for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnCalculateColumnWidths ( oSettings )\n{\n\tvar\n\t\ttable = oSettings.nTable,\n\t\tcolumns = oSettings.aoColumns,\n\t\tscroll = oSettings.oScroll,\n\t\tscrollY = scroll.sY,\n\t\tscrollX = scroll.sX,\n\t\tscrollXInner = scroll.sXInner,\n\t\tcolumnCount = columns.length,\n\t\tvisibleColumns = _fnGetColumns( oSettings, 'bVisible' ),\n\t\theaderCells = $('th', oSettings.nTHead),\n\t\ttableWidthAttr = table.getAttribute('width'), // from DOM element\n\t\ttableContainer = table.parentNode,\n\t\tuserInputs = false,\n\t\ti, column, columnIdx, width, outerWidth,\n\t\tbrowser = oSettings.oBrowser,\n\t\tie67 = browser.bScrollOversize;\n\n\tvar styleWidth = table.style.width;\n\tif ( styleWidth && styleWidth.indexOf('%') !== -1 ) {\n\t\ttableWidthAttr = styleWidth;\n\t}\n\n\t/* Convert any user input sizes into pixel sizes */\n\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\tcolumn = columns[ visibleColumns[i] ];\n\n\t\tif ( column.sWidth !== null ) {\n\t\t\tcolumn.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );\n\n\t\t\tuserInputs = true;\n\t\t}\n\t}\n\n\t/* If the number of columns in the DOM equals the number that we have to\n\t * process in DataTables, then we can use the offsets that are created by\n\t * the web- browser. No custom sizes can be set in order for this to happen,\n\t * nor scrolling used\n\t */\n\tif ( ie67 || ! userInputs && ! scrollX && ! scrollY &&\n\t     columnCount == _fnVisbleColumns( oSettings ) &&\n\t     columnCount == headerCells.length\n\t) {\n\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\tvar colIdx = _fnVisibleToColumnIndex( oSettings, i );\n\n\t\t\tif ( colIdx !== null ) {\n\t\t\t\tcolumns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Otherwise construct a single row, worst case, table with the widest\n\t\t// node in the data, assign any user defined widths, then insert it into\n\t\t// the DOM and allow the browser to do all the hard work of calculating\n\t\t// table widths\n\t\tvar tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table\n\t\t\t.css( 'visibility', 'hidden' )\n\t\t\t.removeAttr( 'id' );\n\n\t\t// Clean up the table body\n\t\ttmpTable.find('tbody tr').remove();\n\t\tvar tr = $('<tr/>').appendTo( tmpTable.find('tbody') );\n\n\t\t// Clone the table header and footer - we can't use the header / footer\n\t\t// from the cloned table, since if scrolling is active, the table's\n\t\t// real header and footer are contained in different table tags\n\t\ttmpTable.find('thead, tfoot').remove();\n\t\ttmpTable\n\t\t\t.append( $(oSettings.nTHead).clone() )\n\t\t\t.append( $(oSettings.nTFoot).clone() );\n\n\t\t// Remove any assigned widths from the footer (from scrolling)\n\t\ttmpTable.find('tfoot th, tfoot td').css('width', '');\n\n\t\t// Apply custom sizing to the cloned header\n\t\theaderCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );\n\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tcolumn = columns[ visibleColumns[i] ];\n\n\t\t\theaderCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?\n\t\t\t\t_fnStringToCss( column.sWidthOrig ) :\n\t\t\t\t'';\n\n\t\t\t// For scrollX we need to force the column width otherwise the\n\t\t\t// browser will collapse it. If this width is smaller than the\n\t\t\t// width the column requires, then it will have no effect\n\t\t\tif ( column.sWidthOrig && scrollX ) {\n\t\t\t\t$( headerCells[i] ).append( $('<div/>').css( {\n\t\t\t\t\twidth: column.sWidthOrig,\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tborder: 0,\n\t\t\t\t\theight: 1\n\t\t\t\t} ) );\n\t\t\t}\n\t\t}\n\n\t\t// Find the widest cell for each column and put it into the table\n\t\tif ( oSettings.aoData.length ) {\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tcolumnIdx = visibleColumns[i];\n\t\t\t\tcolumn = columns[ columnIdx ];\n\n\t\t\t\t$( _fnGetWidestNode( oSettings, columnIdx ) )\n\t\t\t\t\t.clone( false )\n\t\t\t\t\t.append( column.sContentPadding )\n\t\t\t\t\t.appendTo( tr );\n\t\t\t}\n\t\t}\n\n\t\t// Tidy the temporary table - remove name attributes so there aren't\n\t\t// duplicated in the dom (radio elements for example)\n\t\t$('[name]', tmpTable).removeAttr('name');\n\n\t\t// Table has been built, attach to the document so we can work with it.\n\t\t// A holding element is used, positioned at the top of the container\n\t\t// with minimal height, so it has no effect on if the container scrolls\n\t\t// or not. Otherwise it might trigger scrolling when it actually isn't\n\t\t// needed\n\t\tvar holder = $('<div/>').css( scrollX || scrollY ?\n\t\t\t\t{\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\theight: 1,\n\t\t\t\t\tright: 0,\n\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t} :\n\t\t\t\t{}\n\t\t\t)\n\t\t\t.append( tmpTable )\n\t\t\t.appendTo( tableContainer );\n\n\t\t// When scrolling (X or Y) we want to set the width of the table as \n\t\t// appropriate. However, when not scrolling leave the table width as it\n\t\t// is. This results in slightly different, but I think correct behaviour\n\t\tif ( scrollX && scrollXInner ) {\n\t\t\ttmpTable.width( scrollXInner );\n\t\t}\n\t\telse if ( scrollX ) {\n\t\t\ttmpTable.css( 'width', 'auto' );\n\t\t\ttmpTable.removeAttr('width');\n\n\t\t\t// If there is no width attribute or style, then allow the table to\n\t\t\t// collapse\n\t\t\tif ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {\n\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t}\n\t\t}\n\t\telse if ( scrollY ) {\n\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t}\n\t\telse if ( tableWidthAttr ) {\n\t\t\ttmpTable.width( tableWidthAttr );\n\t\t}\n\n\t\t// Get the width of each column in the constructed table - we need to\n\t\t// know the inner width (so it can be assigned to the other table's\n\t\t// cells) and the outer width so we can calculate the full width of the\n\t\t// table. This is safe since DataTables requires a unique cell for each\n\t\t// column, but if ever a header can span multiple columns, this will\n\t\t// need to be modified.\n\t\tvar total = 0;\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tvar cell = $(headerCells[i]);\n\t\t\tvar border = cell.outerWidth() - cell.width();\n\n\t\t\t// Use getBounding... where possible (not IE8-) because it can give\n\t\t\t// sub-pixel accuracy, which we then want to round up!\n\t\t\tvar bounding = browser.bBounding ?\n\t\t\t\tMath.ceil( headerCells[i].getBoundingClientRect().width ) :\n\t\t\t\tcell.outerWidth();\n\n\t\t\t// Total is tracked to remove any sub-pixel errors as the outerWidth\n\t\t\t// of the table might not equal the total given here (IE!).\n\t\t\ttotal += bounding;\n\n\t\t\t// Width for each column to use\n\t\t\tcolumns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );\n\t\t}\n\n\t\ttable.style.width = _fnStringToCss( total );\n\n\t\t// Finished with the table - ditch it\n\t\tholder.remove();\n\t}\n\n\t// If there is a width attr, we want to attach an event listener which\n\t// allows the table sizing to automatically adjust when the window is\n\t// resized. Use the width attr rather than CSS, since we can't know if the\n\t// CSS is a relative value or absolute - DOM read is always px.\n\tif ( tableWidthAttr ) {\n\t\ttable.style.width = _fnStringToCss( tableWidthAttr );\n\t}\n\n\tif ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {\n\t\tvar bindResize = function () {\n\t\t\t$(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {\n\t\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t} ) );\n\t\t};\n\n\t\t// IE6/7 will crash if we bind a resize event handler on page load.\n\t\t// To be removed in 1.11 which drops IE6/7 support\n\t\tif ( ie67 ) {\n\t\t\tsetTimeout( bindResize, 1000 );\n\t\t}\n\t\telse {\n\t\t\tbindResize();\n\t\t}\n\n\t\toSettings._reszEvt = true;\n\t}\n}\n\n\n/**\n * Throttle the calls to a function. Arguments and context are maintained for\n * the throttled function\n *  @param {function} fn Function to be called\n *  @param {int} [freq=200] call frequency in mS\n *  @returns {function} wrapped function\n *  @memberof DataTable#oApi\n */\nvar _fnThrottle = DataTable.util.throttle;\n\n\n/**\n * Convert a CSS unit width to pixels (e.g. 2em)\n *  @param {string} width width to be converted\n *  @param {node} parent parent to get the with for (required for relative widths) - optional\n *  @returns {int} width in pixels\n *  @memberof DataTable#oApi\n */\nfunction _fnConvertToWidth ( width, parent )\n{\n\tif ( ! width ) {\n\t\treturn 0;\n\t}\n\n\tvar n = $('<div/>')\n\t\t.css( 'width', _fnStringToCss( width ) )\n\t\t.appendTo( parent || document.body );\n\n\tvar val = n[0].offsetWidth;\n\tn.remove();\n\n\treturn val;\n}\n\n\n/**\n * Get the widest node\n *  @param {object} settings dataTables settings object\n *  @param {int} colIdx column of interest\n *  @returns {node} widest table node\n *  @memberof DataTable#oApi\n */\nfunction _fnGetWidestNode( settings, colIdx )\n{\n\tvar idx = _fnGetMaxLenString( settings, colIdx );\n\tif ( idx < 0 ) {\n\t\treturn null;\n\t}\n\n\tvar data = settings.aoData[ idx ];\n\treturn ! data.nTr ? // Might not have been created when deferred rendering\n\t\t$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :\n\t\tdata.anCells[ colIdx ];\n}\n\n\n/**\n * Get the maximum strlen for each data column\n *  @param {object} settings dataTables settings object\n *  @param {int} colIdx column of interest\n *  @returns {string} max string length for each column\n *  @memberof DataTable#oApi\n */\nfunction _fnGetMaxLenString( settings, colIdx )\n{\n\tvar s, max=-1, maxIdx = -1;\n\n\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\ts = _fnGetCellData( settings, i, colIdx, 'display' )+'';\n\t\ts = s.replace( __re_html_remove, '' );\n\t\ts = s.replace( /&nbsp;/g, ' ' );\n\n\t\tif ( s.length > max ) {\n\t\t\tmax = s.length;\n\t\t\tmaxIdx = i;\n\t\t}\n\t}\n\n\treturn maxIdx;\n}\n\n\n/**\n * Append a CSS unit (only if required) to a string\n *  @param {string} value to css-ify\n *  @returns {string} value with css unit\n *  @memberof DataTable#oApi\n */\nfunction _fnStringToCss( s )\n{\n\tif ( s === null ) {\n\t\treturn '0px';\n\t}\n\n\tif ( typeof s == 'number' ) {\n\t\treturn s < 0 ?\n\t\t\t'0px' :\n\t\t\ts+'px';\n\t}\n\n\t// Check it has a unit character already\n\treturn s.match(/\\d$/) ?\n\t\ts+'px' :\n\t\ts;\n}\n\n\n\nfunction _fnSortFlatten ( settings )\n{\n\tvar\n\t\ti, iLen, k, kLen,\n\t\taSort = [],\n\t\taiOrig = [],\n\t\taoColumns = settings.aoColumns,\n\t\taDataSort, iCol, sType, srcCol,\n\t\tfixed = settings.aaSortingFixed,\n\t\tfixedObj = $.isPlainObject( fixed ),\n\t\tnestedSort = [],\n\t\tadd = function ( a ) {\n\t\t\tif ( a.length && ! Array.isArray( a[0] ) ) {\n\t\t\t\t// 1D array\n\t\t\t\tnestedSort.push( a );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// 2D array\n\t\t\t\t$.merge( nestedSort, a );\n\t\t\t}\n\t\t};\n\n\t// Build the sort array, with pre-fix and post-fix options if they have been\n\t// specified\n\tif ( Array.isArray( fixed ) ) {\n\t\tadd( fixed );\n\t}\n\n\tif ( fixedObj && fixed.pre ) {\n\t\tadd( fixed.pre );\n\t}\n\n\tadd( settings.aaSorting );\n\n\tif (fixedObj && fixed.post ) {\n\t\tadd( fixed.post );\n\t}\n\n\tfor ( i=0 ; i<nestedSort.length ; i++ )\n\t{\n\t\tsrcCol = nestedSort[i][0];\n\t\taDataSort = aoColumns[ srcCol ].aDataSort;\n\n\t\tfor ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )\n\t\t{\n\t\t\tiCol = aDataSort[k];\n\t\t\tsType = aoColumns[ iCol ].sType || 'string';\n\n\t\t\tif ( nestedSort[i]._idx === undefined ) {\n\t\t\t\tnestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );\n\t\t\t}\n\n\t\t\taSort.push( {\n\t\t\t\tsrc:       srcCol,\n\t\t\t\tcol:       iCol,\n\t\t\t\tdir:       nestedSort[i][1],\n\t\t\t\tindex:     nestedSort[i]._idx,\n\t\t\t\ttype:      sType,\n\t\t\t\tformatter: DataTable.ext.type.order[ sType+\"-pre\" ]\n\t\t\t} );\n\t\t}\n\t}\n\n\treturn aSort;\n}\n\n/**\n * Change the order of the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n *  @todo This really needs split up!\n */\nfunction _fnSort ( oSettings )\n{\n\tvar\n\t\ti, ien, iLen, j, jLen, k, kLen,\n\t\tsDataType, nTh,\n\t\taiOrig = [],\n\t\toExtSort = DataTable.ext.type.order,\n\t\taoData = oSettings.aoData,\n\t\taoColumns = oSettings.aoColumns,\n\t\taDataSort, data, iCol, sType, oSort,\n\t\tformatters = 0,\n\t\tsortCol,\n\t\tdisplayMaster = oSettings.aiDisplayMaster,\n\t\taSort;\n\n\t// Resolve any column types that are unknown due to addition or invalidation\n\t// @todo Can this be moved into a 'data-ready' handler which is called when\n\t//   data is going to be used in the table?\n\t_fnColumnTypes( oSettings );\n\n\taSort = _fnSortFlatten( oSettings );\n\n\tfor ( i=0, ien=aSort.length ; i<ien ; i++ ) {\n\t\tsortCol = aSort[i];\n\n\t\t// Track if we can use the fast sort algorithm\n\t\tif ( sortCol.formatter ) {\n\t\t\tformatters++;\n\t\t}\n\n\t\t// Load the data needed for the sort, for each cell\n\t\t_fnSortData( oSettings, sortCol.col );\n\t}\n\n\t/* No sorting required if server-side or no sorting array */\n\tif ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )\n\t{\n\t\t// Create a value - key array of the current row positions such that we can use their\n\t\t// current position during the sort, if values match, in order to perform stable sorting\n\t\tfor ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {\n\t\t\taiOrig[ displayMaster[i] ] = i;\n\t\t}\n\n\t\t/* Do the sort - here we want multi-column sorting based on a given data source (column)\n\t\t * and sorting function (from oSort) in a certain direction. It's reasonably complex to\n\t\t * follow on it's own, but this is what we want (example two column sorting):\n\t\t *  fnLocalSorting = function(a,b){\n\t\t *    var iTest;\n\t\t *    iTest = oSort['string-asc']('data11', 'data12');\n\t\t *      if (iTest !== 0)\n\t\t *        return iTest;\n\t\t *    iTest = oSort['numeric-desc']('data21', 'data22');\n\t\t *    if (iTest !== 0)\n\t\t *      return iTest;\n\t\t *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n\t\t *  }\n\t\t * Basically we have a test for each sorting column, if the data in that column is equal,\n\t\t * test the next column. If all columns match, then we use a numeric sort on the row\n\t\t * positions in the original data array to provide a stable sort.\n\t\t *\n\t\t * Note - I know it seems excessive to have two sorting methods, but the first is around\n\t\t * 15% faster, so the second is only maintained for backwards compatibility with sorting\n\t\t * methods which do not have a pre-sort formatting function.\n\t\t */\n\t\tif ( formatters === aSort.length ) {\n\t\t\t// All sort types have formatting functions\n\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\tvar\n\t\t\t\t\tx, y, k, test, sort,\n\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\tdataB = aoData[b]._aSortData;\n\n\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\tsort = aSort[k];\n\n\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\ty = dataB[ sort.col ];\n\n\t\t\t\t\ttest = x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\treturn sort.dir === 'asc' ? test : -test;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tx = aiOrig[a];\n\t\t\t\ty = aiOrig[b];\n\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t} );\n\t\t}\n\t\telse {\n\t\t\t// Depreciated - remove in 1.11 (providing a plug-in option)\n\t\t\t// Not all sort types have formatting methods, so we have to call their sorting\n\t\t\t// methods.\n\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\tvar\n\t\t\t\t\tx, y, k, l, test, sort, fn,\n\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\tdataB = aoData[b]._aSortData;\n\n\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\tsort = aSort[k];\n\n\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\ty = dataB[ sort.col ];\n\n\t\t\t\t\tfn = oExtSort[ sort.type+\"-\"+sort.dir ] || oExtSort[ \"string-\"+sort.dir ];\n\t\t\t\t\ttest = fn( x, y );\n\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\treturn test;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tx = aiOrig[a];\n\t\t\t\ty = aiOrig[b];\n\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t} );\n\t\t}\n\t}\n\n\t/* Tell the draw function that we have sorted the data */\n\toSettings.bSorted = true;\n}\n\n\nfunction _fnSortAria ( settings )\n{\n\tvar label;\n\tvar nextSort;\n\tvar columns = settings.aoColumns;\n\tvar aSort = _fnSortFlatten( settings );\n\tvar oAria = settings.oLanguage.oAria;\n\n\t// ARIA attributes - need to loop all columns, to update all (removing old\n\t// attributes as needed)\n\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t{\n\t\tvar col = columns[i];\n\t\tvar asSorting = col.asSorting;\n\t\tvar sTitle = col.ariaTitle || col.sTitle.replace( /<.*?>/g, \"\" );\n\t\tvar th = col.nTh;\n\n\t\t// IE7 is throwing an error when setting these properties with jQuery's\n\t\t// attr() and removeAttr() methods...\n\t\tth.removeAttribute('aria-sort');\n\n\t\t/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */\n\t\tif ( col.bSortable ) {\n\t\t\tif ( aSort.length > 0 && aSort[0].col == i ) {\n\t\t\t\tth.setAttribute('aria-sort', aSort[0].dir==\"asc\" ? \"ascending\" : \"descending\" );\n\t\t\t\tnextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnextSort = asSorting[0];\n\t\t\t}\n\n\t\t\tlabel = sTitle + ( nextSort === \"asc\" ?\n\t\t\t\toAria.sSortAscending :\n\t\t\t\toAria.sSortDescending\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\tlabel = sTitle;\n\t\t}\n\n\t\tth.setAttribute('aria-label', label);\n\t}\n}\n\n\n/**\n * Function to run on user sort request\n *  @param {object} settings dataTables settings object\n *  @param {node} attachTo node to attach the handler to\n *  @param {int} colIdx column sorting index\n *  @param {boolean} [append=false] Append the requested sort to the existing\n *    sort if true (i.e. multi-column sort)\n *  @param {function} [callback] callback function\n *  @memberof DataTable#oApi\n */\nfunction _fnSortListener ( settings, colIdx, append, callback )\n{\n\tvar col = settings.aoColumns[ colIdx ];\n\tvar sorting = settings.aaSorting;\n\tvar asSorting = col.asSorting;\n\tvar nextSortIdx;\n\tvar next = function ( a, overflow ) {\n\t\tvar idx = a._idx;\n\t\tif ( idx === undefined ) {\n\t\t\tidx = $.inArray( a[1], asSorting );\n\t\t}\n\n\t\treturn idx+1 < asSorting.length ?\n\t\t\tidx+1 :\n\t\t\toverflow ?\n\t\t\t\tnull :\n\t\t\t\t0;\n\t};\n\n\t// Convert to 2D array if needed\n\tif ( typeof sorting[0] === 'number' ) {\n\t\tsorting = settings.aaSorting = [ sorting ];\n\t}\n\n\t// If appending the sort then we are multi-column sorting\n\tif ( append && settings.oFeatures.bSortMulti ) {\n\t\t// Are we already doing some kind of sort on this column?\n\t\tvar sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );\n\n\t\tif ( sortIdx !== -1 ) {\n\t\t\t// Yes, modify the sort\n\t\t\tnextSortIdx = next( sorting[sortIdx], true );\n\n\t\t\tif ( nextSortIdx === null && sorting.length === 1 ) {\n\t\t\t\tnextSortIdx = 0; // can't remove sorting completely\n\t\t\t}\n\n\t\t\tif ( nextSortIdx === null ) {\n\t\t\t\tsorting.splice( sortIdx, 1 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsorting[sortIdx][1] = asSorting[ nextSortIdx ];\n\t\t\t\tsorting[sortIdx]._idx = nextSortIdx;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// No sort on this column yet\n\t\t\tsorting.push( [ colIdx, asSorting[0], 0 ] );\n\t\t\tsorting[sorting.length-1]._idx = 0;\n\t\t}\n\t}\n\telse if ( sorting.length && sorting[0][0] == colIdx ) {\n\t\t// Single column - already sorting on this column, modify the sort\n\t\tnextSortIdx = next( sorting[0] );\n\n\t\tsorting.length = 1;\n\t\tsorting[0][1] = asSorting[ nextSortIdx ];\n\t\tsorting[0]._idx = nextSortIdx;\n\t}\n\telse {\n\t\t// Single column - sort only on this column\n\t\tsorting.length = 0;\n\t\tsorting.push( [ colIdx, asSorting[0] ] );\n\t\tsorting[0]._idx = 0;\n\t}\n\n\t// Run the sort by calling a full redraw\n\t_fnReDraw( settings );\n\n\t// callback used for async user interaction\n\tif ( typeof callback == 'function' ) {\n\t\tcallback( settings );\n\t}\n}\n\n\n/**\n * Attach a sort handler (click) to a node\n *  @param {object} settings dataTables settings object\n *  @param {node} attachTo node to attach the handler to\n *  @param {int} colIdx column sorting index\n *  @param {function} [callback] callback function\n *  @memberof DataTable#oApi\n */\nfunction _fnSortAttachListener ( settings, attachTo, colIdx, callback )\n{\n\tvar col = settings.aoColumns[ colIdx ];\n\n\t_fnBindAction( attachTo, {}, function (e) {\n\t\t/* If the column is not sortable - don't to anything */\n\t\tif ( col.bSortable === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If processing is enabled use a timeout to allow the processing\n\t\t// display to be shown - otherwise to it synchronously\n\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t_fnProcessingDisplay( settings, true );\n\n\t\t\tsetTimeout( function() {\n\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\n\t\t\t\t// In server-side processing, the draw callback will remove the\n\t\t\t\t// processing display\n\t\t\t\tif ( _fnDataSource( settings ) !== 'ssp' ) {\n\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t}\n\t\t\t}, 0 );\n\t\t}\n\t\telse {\n\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\t}\n\t} );\n}\n\n\n/**\n * Set the sorting classes on table's body, Note: it is safe to call this function\n * when bSort and bSortClasses are false\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnSortingClasses( settings )\n{\n\tvar oldSort = settings.aLastSort;\n\tvar sortClass = settings.oClasses.sSortColumn;\n\tvar sort = _fnSortFlatten( settings );\n\tvar features = settings.oFeatures;\n\tvar i, ien, colIdx;\n\n\tif ( features.bSort && features.bSortClasses ) {\n\t\t// Remove old sorting classes\n\t\tfor ( i=0, ien=oldSort.length ; i<ien ; i++ ) {\n\t\t\tcolIdx = oldSort[i].src;\n\n\t\t\t// Remove column sorting\n\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t.removeClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t}\n\n\t\t// Add new column sorting\n\t\tfor ( i=0, ien=sort.length ; i<ien ; i++ ) {\n\t\t\tcolIdx = sort[i].src;\n\n\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t.addClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t}\n\t}\n\n\tsettings.aLastSort = sort;\n}\n\n\n// Get the data to sort a column, be it from cache, fresh (populating the\n// cache), or from a sort formatter\nfunction _fnSortData( settings, idx )\n{\n\t// Custom sorting function - provided by the sort data type\n\tvar column = settings.aoColumns[ idx ];\n\tvar customSort = DataTable.ext.order[ column.sSortDataType ];\n\tvar customData;\n\n\tif ( customSort ) {\n\t\tcustomData = customSort.call( settings.oInstance, settings, idx,\n\t\t\t_fnColumnIndexToVisible( settings, idx )\n\t\t);\n\t}\n\n\t// Use / populate cache\n\tvar row, cellData;\n\tvar formatter = DataTable.ext.type.order[ column.sType+\"-pre\" ];\n\n\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\trow = settings.aoData[i];\n\n\t\tif ( ! row._aSortData ) {\n\t\t\trow._aSortData = [];\n\t\t}\n\n\t\tif ( ! row._aSortData[idx] || customSort ) {\n\t\t\tcellData = customSort ?\n\t\t\t\tcustomData[i] : // If there was a custom sort function, use data from there\n\t\t\t\t_fnGetCellData( settings, i, idx, 'sort' );\n\n\t\t\trow._aSortData[ idx ] = formatter ?\n\t\t\t\tformatter( cellData ) :\n\t\t\t\tcellData;\n\t\t}\n\t}\n}\n\n\n\n/**\n * Save the state of a table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnSaveState ( settings )\n{\n\tif (settings._bLoadingState) {\n\t\treturn;\n\t}\n\n\t/* Store the interesting variables */\n\tvar state = {\n\t\ttime:    +new Date(),\n\t\tstart:   settings._iDisplayStart,\n\t\tlength:  settings._iDisplayLength,\n\t\torder:   $.extend( true, [], settings.aaSorting ),\n\t\tsearch:  _fnSearchToCamel( settings.oPreviousSearch ),\n\t\tcolumns: $.map( settings.aoColumns, function ( col, i ) {\n\t\t\treturn {\n\t\t\t\tvisible: col.bVisible,\n\t\t\t\tsearch: _fnSearchToCamel( settings.aoPreSearchCols[i] )\n\t\t\t};\n\t\t} )\n\t};\n\n\tsettings.oSavedState = state;\n\t_fnCallbackFire( settings, \"aoStateSaveParams\", 'stateSaveParams', [settings, state] );\n\t\n\tif ( settings.oFeatures.bStateSave && !settings.bDestroying )\n\t{\n\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, state );\n\t}\t\n}\n\n\n/**\n * Attempt to load a saved table state\n *  @param {object} oSettings dataTables settings object\n *  @param {object} oInit DataTables init object so we can override settings\n *  @param {function} callback Callback to execute when the state has been loaded\n *  @memberof DataTable#oApi\n */\nfunction _fnLoadState ( settings, oInit, callback )\n{\n\tif ( ! settings.oFeatures.bStateSave ) {\n\t\tcallback();\n\t\treturn;\n\t}\n\n\tvar loaded = function(state) {\n\t\t_fnImplementState(settings, state, callback);\n\t}\n\n\tvar state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );\n\n\tif ( state !== undefined ) {\n\t\t_fnImplementState( settings, state, callback );\n\t}\n\t// otherwise, wait for the loaded callback to be executed\n\n\treturn true;\n}\n\nfunction _fnImplementState ( settings, s, callback) {\n\tvar i, ien;\n\tvar columns = settings.aoColumns;\n\tsettings._bLoadingState = true;\n\n\t// When StateRestore was introduced the state could now be implemented at any time\n\t// Not just initialisation. To do this an api instance is required in some places\n\tvar api = settings._bInitComplete ? new DataTable.Api(settings) : null;\n\n\tif ( ! s || ! s.time ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Allow custom and plug-in manipulation functions to alter the saved data set and\n\t// cancelling of loading by returning false\n\tvar abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );\n\tif ( $.inArray( false, abStateLoad ) !== -1 ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Reject old data\n\tvar duration = settings.iStateDuration;\n\tif ( duration > 0 && s.time < +new Date() - (duration*1000) ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Number of columns have changed - all bets are off, no restore of settings\n\tif ( s.columns && columns.length !== s.columns.length ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Store the saved state so it might be accessed at any time\n\tsettings.oLoadedState = $.extend( true, {}, s );\n\n\t// Page Length\n\tif ( s.length !== undefined ) {\n\t\t// If already initialised just set the value directly so that the select element is also updated\n\t\tif (api) {\n\t\t\tapi.page.len(s.length)\n\t\t}\n\t\telse {\n\t\t\tsettings._iDisplayLength   = s.length;\n\t\t}\n\t}\n\n\t// Restore key features - todo - for 1.11 this needs to be done by\n\t// subscribed events\n\tif ( s.start !== undefined ) {\n\t\tif(api === null) {\n\t\t\tsettings._iDisplayStart    = s.start;\n\t\t\tsettings.iInitDisplayStart = s.start;\n\t\t}\n\t\telse {\n\t\t\t_fnPageChange(settings, s.start/settings._iDisplayLength);\n\t\t}\n\t}\n\n\t// Order\n\tif ( s.order !== undefined ) {\n\t\tsettings.aaSorting = [];\n\t\t$.each( s.order, function ( i, col ) {\n\t\t\tsettings.aaSorting.push( col[0] >= columns.length ?\n\t\t\t\t[ 0, col[1] ] :\n\t\t\t\tcol\n\t\t\t);\n\t\t} );\n\t}\n\n\t// Search\n\tif ( s.search !== undefined ) {\n\t\t$.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );\n\t}\n\n\t// Columns\n\tif ( s.columns ) {\n\t\tfor ( i=0, ien=s.columns.length ; i<ien ; i++ ) {\n\t\t\tvar col = s.columns[i];\n\n\t\t\t// Visibility\n\t\t\tif ( col.visible !== undefined ) {\n\t\t\t\t// If the api is defined, the table has been initialised so we need to use it rather than internal settings\n\t\t\t\tif (api) {\n\t\t\t\t\t// Don't redraw the columns on every iteration of this loop, we will do this at the end instead\n\t\t\t\t\tapi.column(i).visible(col.visible, false);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcolumns[i].bVisible = col.visible;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Search\n\t\t\tif ( col.search !== undefined ) {\n\t\t\t\t$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );\n\t\t\t}\n\t\t}\n\t\t\n\t\t// If the api is defined then we need to adjust the columns once the visibility has been changed\n\t\tif (api) {\n\t\t\tapi.columns.adjust();\n\t\t}\n\t}\n\n\tsettings._bLoadingState = false;\n\t_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );\n\tcallback();\n};\n\n\n/**\n * Return the settings object for a particular table\n *  @param {node} table table we are using as a dataTable\n *  @returns {object} Settings object - or null if not found\n *  @memberof DataTable#oApi\n */\nfunction _fnSettingsFromNode ( table )\n{\n\tvar settings = DataTable.settings;\n\tvar idx = $.inArray( table, _pluck( settings, 'nTable' ) );\n\n\treturn idx !== -1 ?\n\t\tsettings[ idx ] :\n\t\tnull;\n}\n\n\n/**\n * Log an error message\n *  @param {object} settings dataTables settings object\n *  @param {int} level log error messages, or display them to the user\n *  @param {string} msg error message\n *  @param {int} tn Technical note id to get more information about the error.\n *  @memberof DataTable#oApi\n */\nfunction _fnLog( settings, level, msg, tn )\n{\n\tmsg = 'DataTables warning: '+\n\t\t(settings ? 'table id='+settings.sTableId+' - ' : '')+msg;\n\n\tif ( tn ) {\n\t\tmsg += '. For more information about this error, please see '+\n\t\t'http://datatables.net/tn/'+tn;\n\t}\n\n\tif ( ! level  ) {\n\t\t// Backwards compatibility pre 1.10\n\t\tvar ext = DataTable.ext;\n\t\tvar type = ext.sErrMode || ext.errMode;\n\n\t\tif ( settings ) {\n\t\t\t_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );\n\t\t}\n\n\t\tif ( type == 'alert' ) {\n\t\t\talert( msg );\n\t\t}\n\t\telse if ( type == 'throw' ) {\n\t\t\tthrow new Error(msg);\n\t\t}\n\t\telse if ( typeof type == 'function' ) {\n\t\t\ttype( settings, tn, msg );\n\t\t}\n\t}\n\telse if ( window.console && console.log ) {\n\t\tconsole.log( msg );\n\t}\n}\n\n\n/**\n * See if a property is defined on one object, if so assign it to the other object\n *  @param {object} ret target object\n *  @param {object} src source object\n *  @param {string} name property\n *  @param {string} [mappedName] name to map too - optional, name used if not given\n *  @memberof DataTable#oApi\n */\nfunction _fnMap( ret, src, name, mappedName )\n{\n\tif ( Array.isArray( name ) ) {\n\t\t$.each( name, function (i, val) {\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t_fnMap( ret, src, val[0], val[1] );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnMap( ret, src, val );\n\t\t\t}\n\t\t} );\n\n\t\treturn;\n\t}\n\n\tif ( mappedName === undefined ) {\n\t\tmappedName = name;\n\t}\n\n\tif ( src[name] !== undefined ) {\n\t\tret[mappedName] = src[name];\n\t}\n}\n\n\n/**\n * Extend objects - very similar to jQuery.extend, but deep copy objects, and\n * shallow copy arrays. The reason we need to do this, is that we don't want to\n * deep copy array init values (such as aaSorting) since the dev wouldn't be\n * able to override them, but we do want to deep copy arrays.\n *  @param {object} out Object to extend\n *  @param {object} extender Object from which the properties will be applied to\n *      out\n *  @param {boolean} breakRefs If true, then arrays will be sliced to take an\n *      independent copy with the exception of the `data` or `aaData` parameters\n *      if they are present. This is so you can pass in a collection to\n *      DataTables and have that used as your data source without breaking the\n *      references\n *  @returns {object} out Reference, just for convenience - out === the return.\n *  @memberof DataTable#oApi\n *  @todo This doesn't take account of arrays inside the deep copied objects.\n */\nfunction _fnExtend( out, extender, breakRefs )\n{\n\tvar val;\n\n\tfor ( var prop in extender ) {\n\t\tif ( extender.hasOwnProperty(prop) ) {\n\t\t\tval = extender[prop];\n\n\t\t\tif ( $.isPlainObject( val ) ) {\n\t\t\t\tif ( ! $.isPlainObject( out[prop] ) ) {\n\t\t\t\t\tout[prop] = {};\n\t\t\t\t}\n\t\t\t\t$.extend( true, out[prop], val );\n\t\t\t}\n\t\t\telse if ( breakRefs && prop !== 'data' && prop !== 'aaData' && Array.isArray(val) ) {\n\t\t\t\tout[prop] = val.slice();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tout[prop] = val;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out;\n}\n\n\n/**\n * Bind an event handers to allow a click or return key to activate the callback.\n * This is good for accessibility since a return on the keyboard will have the\n * same effect as a click, if the element has focus.\n *  @param {element} n Element to bind the action to\n *  @param {object} oData Data object to pass to the triggered function\n *  @param {function} fn Callback function for when the event is triggered\n *  @memberof DataTable#oApi\n */\nfunction _fnBindAction( n, oData, fn )\n{\n\t$(n)\n\t\t.on( 'click.DT', oData, function (e) {\n\t\t\t\t$(n).trigger('blur'); // Remove focus outline for mouse users\n\t\t\t\tfn(e);\n\t\t\t} )\n\t\t.on( 'keypress.DT', oData, function (e){\n\t\t\t\tif ( e.which === 13 ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tfn(e);\n\t\t\t\t}\n\t\t\t} )\n\t\t.on( 'selectstart.DT', function () {\n\t\t\t\t/* Take the brutal approach to cancelling text selection */\n\t\t\t\treturn false;\n\t\t\t} );\n}\n\n\n/**\n * Register a callback function. Easily allows a callback function to be added to\n * an array store of callback functions that can then all be called together.\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sStore Name of the array storage for the callbacks in oSettings\n *  @param {function} fn Function to be called back\n *  @param {string} sName Identifying name for the callback (i.e. a label)\n *  @memberof DataTable#oApi\n */\nfunction _fnCallbackReg( oSettings, sStore, fn, sName )\n{\n\tif ( fn )\n\t{\n\t\toSettings[sStore].push( {\n\t\t\t\"fn\": fn,\n\t\t\t\"sName\": sName\n\t\t} );\n\t}\n}\n\n\n/**\n * Fire callback functions and trigger events. Note that the loop over the\n * callback array store is done backwards! Further note that you do not want to\n * fire off triggers in time sensitive applications (for example cell creation)\n * as its slow.\n *  @param {object} settings dataTables settings object\n *  @param {string} callbackArr Name of the array storage for the callbacks in\n *      oSettings\n *  @param {string} eventName Name of the jQuery custom event to trigger. If\n *      null no trigger is fired\n *  @param {array} args Array of arguments to pass to the callback function /\n *      trigger\n *  @memberof DataTable#oApi\n */\nfunction _fnCallbackFire( settings, callbackArr, eventName, args )\n{\n\tvar ret = [];\n\n\tif ( callbackArr ) {\n\t\tret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {\n\t\t\treturn val.fn.apply( settings.oInstance, args );\n\t\t} );\n\t}\n\n\tif ( eventName !== null ) {\n\t\tvar e = $.Event( eventName+'.dt' );\n\t\tvar table = $(settings.nTable);\n\n\t\ttable.trigger( e, args );\n\n\t\t// If not yet attached to the document, trigger the event\n\t\t// on the body directly to sort of simulate the bubble\n\t\tif (table.parents('body').length === 0) {\n\t\t\t$('body').trigger( e, args );\n\t\t}\n\n\t\tret.push( e.result );\n\t}\n\n\treturn ret;\n}\n\n\nfunction _fnLengthOverflow ( settings )\n{\n\tvar\n\t\tstart = settings._iDisplayStart,\n\t\tend = settings.fnDisplayEnd(),\n\t\tlen = settings._iDisplayLength;\n\n\t/* If we have space to show extra rows (backing up from the end point - then do so */\n\tif ( start >= end )\n\t{\n\t\tstart = end - len;\n\t}\n\n\t// Keep the start record on the current page\n\tstart -= (start % len);\n\n\tif ( len === -1 || start < 0 )\n\t{\n\t\tstart = 0;\n\t}\n\n\tsettings._iDisplayStart = start;\n}\n\n\nfunction _fnRenderer( settings, type )\n{\n\tvar renderer = settings.renderer;\n\tvar host = DataTable.ext.renderer[type];\n\n\tif ( $.isPlainObject( renderer ) && renderer[type] ) {\n\t\t// Specific renderer for this type. If available use it, otherwise use\n\t\t// the default.\n\t\treturn host[renderer[type]] || host._;\n\t}\n\telse if ( typeof renderer === 'string' ) {\n\t\t// Common renderer - if there is one available for this type use it,\n\t\t// otherwise use the default\n\t\treturn host[renderer] || host._;\n\t}\n\n\t// Use the default\n\treturn host._;\n}\n\n\n/**\n * Detect the data source being used for the table. Used to simplify the code\n * a little (ajax) and to make it compress a little smaller.\n *\n *  @param {object} settings dataTables settings object\n *  @returns {string} Data source\n *  @memberof DataTable#oApi\n */\nfunction _fnDataSource ( settings )\n{\n\tif ( settings.oFeatures.bServerSide ) {\n\t\treturn 'ssp';\n\t}\n\telse if ( settings.ajax || settings.sAjaxSource ) {\n\t\treturn 'ajax';\n\t}\n\treturn 'dom';\n}\n\n\n\n\n/**\n * Computed structure of the DataTables API, defined by the options passed to\n * `DataTable.Api.register()` when building the API.\n *\n * The structure is built in order to speed creation and extension of the Api\n * objects since the extensions are effectively pre-parsed.\n *\n * The array is an array of objects with the following structure, where this\n * base array represents the Api prototype base:\n *\n *     [\n *       {\n *         name:      'data'                -- string   - Property name\n *         val:       function () {},       -- function - Api method (or undefined if just an object\n *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n *       },\n *       {\n *         name:     'row'\n *         val:       {},\n *         methodExt: [ ... ],\n *         propExt:   [\n *           {\n *             name:      'data'\n *             val:       function () {},\n *             methodExt: [ ... ],\n *             propExt:   [ ... ]\n *           },\n *           ...\n *         ]\n *       }\n *     ]\n *\n * @type {Array}\n * @ignore\n */\nvar __apiStruct = [];\n\n\n/**\n * `Array.prototype` reference.\n *\n * @type object\n * @ignore\n */\nvar __arrayProto = Array.prototype;\n\n\n/**\n * Abstraction for `context` parameter of the `Api` constructor to allow it to\n * take several different forms for ease of use.\n *\n * Each of the input parameter types will be converted to a DataTables settings\n * object where possible.\n *\n * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one\n *   of:\n *\n *   * `string` - jQuery selector. Any DataTables' matching the given selector\n *     with be found and used.\n *   * `node` - `TABLE` node which has already been formed into a DataTable.\n *   * `jQuery` - A jQuery object of `TABLE` nodes.\n *   * `object` - DataTables settings object\n *   * `DataTables.Api` - API instance\n * @return {array|null} Matching DataTables settings objects. `null` or\n *   `undefined` is returned if no matching DataTable is found.\n * @ignore\n */\nvar _toSettings = function ( mixed )\n{\n\tvar idx, jq;\n\tvar settings = DataTable.settings;\n\tvar tables = $.map( settings, function (el, i) {\n\t\treturn el.nTable;\n\t} );\n\n\tif ( ! mixed ) {\n\t\treturn [];\n\t}\n\telse if ( mixed.nTable && mixed.oApi ) {\n\t\t// DataTables settings object\n\t\treturn [ mixed ];\n\t}\n\telse if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {\n\t\t// Table node\n\t\tidx = $.inArray( mixed, tables );\n\t\treturn idx !== -1 ? [ settings[idx] ] : null;\n\t}\n\telse if ( mixed && typeof mixed.settings === 'function' ) {\n\t\treturn mixed.settings().toArray();\n\t}\n\telse if ( typeof mixed === 'string' ) {\n\t\t// jQuery selector\n\t\tjq = $(mixed);\n\t}\n\telse if ( mixed instanceof $ ) {\n\t\t// jQuery object (also DataTables instance)\n\t\tjq = mixed;\n\t}\n\n\tif ( jq ) {\n\t\treturn jq.map( function(i) {\n\t\t\tidx = $.inArray( this, tables );\n\t\t\treturn idx !== -1 ? settings[idx] : null;\n\t\t} ).toArray();\n\t}\n};\n\n\n/**\n * DataTables API class - used to control and interface with  one or more\n * DataTables enhanced tables.\n *\n * The API class is heavily based on jQuery, presenting a chainable interface\n * that you can use to interact with tables. Each instance of the API class has\n * a \"context\" - i.e. the tables that it will operate on. This could be a single\n * table, all tables on a page or a sub-set thereof.\n *\n * Additionally the API is designed to allow you to easily work with the data in\n * the tables, retrieving and manipulating it as required. This is done by\n * presenting the API class as an array like interface. The contents of the\n * array depend upon the actions requested by each method (for example\n * `rows().nodes()` will return an array of nodes, while `rows().data()` will\n * return an array of objects or arrays depending upon your table's\n * configuration). The API object has a number of array like methods (`push`,\n * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,\n * `unique` etc) to assist your working with the data held in a table.\n *\n * Most methods (those which return an Api instance) are chainable, which means\n * the return from a method call also has all of the methods available that the\n * top level object had. For example, these two calls are equivalent:\n *\n *     // Not chained\n *     api.row.add( {...} );\n *     api.draw();\n *\n *     // Chained\n *     api.row.add( {...} ).draw();\n *\n * @class DataTable.Api\n * @param {array|object|string|jQuery} context DataTable identifier. This is\n *   used to define which DataTables enhanced tables this API will operate on.\n *   Can be one of:\n *\n *   * `string` - jQuery selector. Any DataTables' matching the given selector\n *     with be found and used.\n *   * `node` - `TABLE` node which has already been formed into a DataTable.\n *   * `jQuery` - A jQuery object of `TABLE` nodes.\n *   * `object` - DataTables settings object\n * @param {array} [data] Data to initialise the Api instance with.\n *\n * @example\n *   // Direct initialisation during DataTables construction\n *   var api = $('#example').DataTable();\n *\n * @example\n *   // Initialisation using a DataTables jQuery object\n *   var api = $('#example').dataTable().api();\n *\n * @example\n *   // Initialisation as a constructor\n *   var api = new $.fn.DataTable.Api( 'table.dataTable' );\n */\n_Api = function ( context, data )\n{\n\tif ( ! (this instanceof _Api) ) {\n\t\treturn new _Api( context, data );\n\t}\n\n\tvar settings = [];\n\tvar ctxSettings = function ( o ) {\n\t\tvar a = _toSettings( o );\n\t\tif ( a ) {\n\t\t\tsettings.push.apply( settings, a );\n\t\t}\n\t};\n\n\tif ( Array.isArray( context ) ) {\n\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tctxSettings( context[i] );\n\t\t}\n\t}\n\telse {\n\t\tctxSettings( context );\n\t}\n\n\t// Remove duplicates\n\tthis.context = _unique( settings );\n\n\t// Initial data\n\tif ( data ) {\n\t\t$.merge( this, data );\n\t}\n\n\t// selector\n\tthis.selector = {\n\t\trows: null,\n\t\tcols: null,\n\t\topts: null\n\t};\n\n\t_Api.extend( this, this, __apiStruct );\n};\n\nDataTable.Api = _Api;\n\n// Don't destroy the existing prototype, just extend it. Required for jQuery 2's\n// isPlainObject.\n$.extend( _Api.prototype, {\n\tany: function ()\n\t{\n\t\treturn this.count() !== 0;\n\t},\n\n\n\tconcat:  __arrayProto.concat,\n\n\n\tcontext: [], // array of table settings objects\n\n\n\tcount: function ()\n\t{\n\t\treturn this.flatten().length;\n\t},\n\n\n\teach: function ( fn )\n\t{\n\t\tfor ( var i=0, ien=this.length ; i<ien; i++ ) {\n\t\t\tfn.call( this, this[i], i, this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\n\teq: function ( idx )\n\t{\n\t\tvar ctx = this.context;\n\n\t\treturn ctx.length > idx ?\n\t\t\tnew _Api( ctx[idx], this[idx] ) :\n\t\t\tnull;\n\t},\n\n\n\tfilter: function ( fn )\n\t{\n\t\tvar a = [];\n\n\t\tif ( __arrayProto.filter ) {\n\t\t\ta = __arrayProto.filter.call( this, fn, this );\n\t\t}\n\t\telse {\n\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\tif ( fn.call( this, this[i], i, this ) ) {\n\t\t\t\t\ta.push( this[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new _Api( this.context, a );\n\t},\n\n\n\tflatten: function ()\n\t{\n\t\tvar a = [];\n\t\treturn new _Api( this.context, a.concat.apply( a, this.toArray() ) );\n\t},\n\n\n\tjoin:    __arrayProto.join,\n\n\n\tindexOf: __arrayProto.indexOf || function (obj, start)\n\t{\n\t\tfor ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {\n\t\t\tif ( this[i] === obj ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\titerator: function ( flatten, type, fn, alwaysNew ) {\n\t\tvar\n\t\t\ta = [], ret,\n\t\t\ti, ien, j, jen,\n\t\t\tcontext = this.context,\n\t\t\trows, items, item,\n\t\t\tselector = this.selector;\n\n\t\t// Argument shifting\n\t\tif ( typeof flatten === 'string' ) {\n\t\t\talwaysNew = fn;\n\t\t\tfn = type;\n\t\t\ttype = flatten;\n\t\t\tflatten = false;\n\t\t}\n\n\t\tfor ( i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tvar apiInst = new _Api( context[i] );\n\n\t\t\tif ( type === 'table' ) {\n\t\t\t\tret = fn.call( apiInst, context[i], i );\n\n\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\ta.push( ret );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( type === 'columns' || type === 'rows' ) {\n\t\t\t\t// this has same length as context - one entry for each table\n\t\t\t\tret = fn.call( apiInst, context[i], this[i], i );\n\n\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\ta.push( ret );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {\n\t\t\t\t// columns and rows share the same structure.\n\t\t\t\t// 'this' is an array of column indexes for each context\n\t\t\t\titems = this[i];\n\n\t\t\t\tif ( type === 'column-rows' ) {\n\t\t\t\t\trows = _selector_row_indexes( context[i], selector.opts );\n\t\t\t\t}\n\n\t\t\t\tfor ( j=0, jen=items.length ; j<jen ; j++ ) {\n\t\t\t\t\titem = items[j];\n\n\t\t\t\t\tif ( type === 'cell' ) {\n\t\t\t\t\t\tret = fn.call( apiInst, context[i], item.row, item.column, i, j );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tret = fn.call( apiInst, context[i], item, i, j, rows );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( a.length || alwaysNew ) {\n\t\t\tvar api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );\n\t\t\tvar apiSelector = api.selector;\n\t\t\tapiSelector.rows = selector.rows;\n\t\t\tapiSelector.cols = selector.cols;\n\t\t\tapiSelector.opts = selector.opts;\n\t\t\treturn api;\n\t\t}\n\t\treturn this;\n\t},\n\n\n\tlastIndexOf: __arrayProto.lastIndexOf || function (obj, start)\n\t{\n\t\t// Bit cheeky...\n\t\treturn this.indexOf.apply( this.toArray.reverse(), arguments );\n\t},\n\n\n\tlength:  0,\n\n\n\tmap: function ( fn )\n\t{\n\t\tvar a = [];\n\n\t\tif ( __arrayProto.map ) {\n\t\t\ta = __arrayProto.map.call( this, fn, this );\n\t\t}\n\t\telse {\n\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\ta.push( fn.call( this, this[i], i ) );\n\t\t\t}\n\t\t}\n\n\t\treturn new _Api( this.context, a );\n\t},\n\n\n\tpluck: function ( prop )\n\t{\n\t\tvar fn = DataTable.util.get(prop);\n\n\t\treturn this.map( function ( el ) {\n\t\t\treturn fn(el);\n\t\t} );\n\t},\n\n\tpop:     __arrayProto.pop,\n\n\n\tpush:    __arrayProto.push,\n\n\n\t// Does not return an API instance\n\treduce: __arrayProto.reduce || function ( fn, init )\n\t{\n\t\treturn _fnReduce( this, fn, init, 0, this.length, 1 );\n\t},\n\n\n\treduceRight: __arrayProto.reduceRight || function ( fn, init )\n\t{\n\t\treturn _fnReduce( this, fn, init, this.length-1, -1, -1 );\n\t},\n\n\n\treverse: __arrayProto.reverse,\n\n\n\t// Object with rows, columns and opts\n\tselector: null,\n\n\n\tshift:   __arrayProto.shift,\n\n\n\tslice: function () {\n\t\treturn new _Api( this.context, this );\n\t},\n\n\n\tsort:    __arrayProto.sort, // ? name - order?\n\n\n\tsplice:  __arrayProto.splice,\n\n\n\ttoArray: function ()\n\t{\n\t\treturn __arrayProto.slice.call( this );\n\t},\n\n\n\tto$: function ()\n\t{\n\t\treturn $( this );\n\t},\n\n\n\ttoJQuery: function ()\n\t{\n\t\treturn $( this );\n\t},\n\n\n\tunique: function ()\n\t{\n\t\treturn new _Api( this.context, _unique(this) );\n\t},\n\n\n\tunshift: __arrayProto.unshift\n} );\n\n\n_Api.extend = function ( scope, obj, ext )\n{\n\t// Only extend API instances and static properties of the API\n\tif ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {\n\t\treturn;\n\t}\n\n\tvar\n\t\ti, ien,\n\t\tstruct,\n\t\tmethodScoping = function ( scope, fn, struc ) {\n\t\t\treturn function () {\n\t\t\t\tvar ret = fn.apply( scope, arguments );\n\n\t\t\t\t// Method extension\n\t\t\t\t_Api.extend( ret, ret, struc.methodExt );\n\t\t\t\treturn ret;\n\t\t\t};\n\t\t};\n\n\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\tstruct = ext[i];\n\n\t\t// Value\n\t\tobj[ struct.name ] = struct.type === 'function' ?\n\t\t\tmethodScoping( scope, struct.val, struct ) :\n\t\t\tstruct.type === 'object' ?\n\t\t\t\t{} :\n\t\t\t\tstruct.val;\n\n\t\tobj[ struct.name ].__dt_wrapper = true;\n\n\t\t// Property extension\n\t\t_Api.extend( scope, obj[ struct.name ], struct.propExt );\n\t}\n};\n\n\n// @todo - Is there need for an augment function?\n// _Api.augment = function ( inst, name )\n// {\n// \t// Find src object in the structure from the name\n// \tvar parts = name.split('.');\n\n// \t_Api.extend( inst, obj );\n// };\n\n\n//     [\n//       {\n//         name:      'data'                -- string   - Property name\n//         val:       function () {},       -- function - Api method (or undefined if just an object\n//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n//       },\n//       {\n//         name:     'row'\n//         val:       {},\n//         methodExt: [ ... ],\n//         propExt:   [\n//           {\n//             name:      'data'\n//             val:       function () {},\n//             methodExt: [ ... ],\n//             propExt:   [ ... ]\n//           },\n//           ...\n//         ]\n//       }\n//     ]\n\n_Api.register = _api_register = function ( name, val )\n{\n\tif ( Array.isArray( name ) ) {\n\t\tfor ( var j=0, jen=name.length ; j<jen ; j++ ) {\n\t\t\t_Api.register( name[j], val );\n\t\t}\n\t\treturn;\n\t}\n\n\tvar\n\t\ti, ien,\n\t\their = name.split('.'),\n\t\tstruct = __apiStruct,\n\t\tkey, method;\n\n\tvar find = function ( src, name ) {\n\t\tfor ( var i=0, ien=src.length ; i<ien ; i++ ) {\n\t\t\tif ( src[i].name === name ) {\n\t\t\t\treturn src[i];\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t};\n\n\tfor ( i=0, ien=heir.length ; i<ien ; i++ ) {\n\t\tmethod = heir[i].indexOf('()') !== -1;\n\t\tkey = method ?\n\t\t\their[i].replace('()', '') :\n\t\t\their[i];\n\n\t\tvar src = find( struct, key );\n\t\tif ( ! src ) {\n\t\t\tsrc = {\n\t\t\t\tname:      key,\n\t\t\t\tval:       {},\n\t\t\t\tmethodExt: [],\n\t\t\t\tpropExt:   [],\n\t\t\t\ttype:      'object'\n\t\t\t};\n\t\t\tstruct.push( src );\n\t\t}\n\n\t\tif ( i === ien-1 ) {\n\t\t\tsrc.val = val;\n\t\t\tsrc.type = typeof val === 'function' ?\n\t\t\t\t'function' :\n\t\t\t\t$.isPlainObject( val ) ?\n\t\t\t\t\t'object' :\n\t\t\t\t\t'other';\n\t\t}\n\t\telse {\n\t\t\tstruct = method ?\n\t\t\t\tsrc.methodExt :\n\t\t\t\tsrc.propExt;\n\t\t}\n\t}\n};\n\n_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {\n\t_Api.register( pluralName, val );\n\n\t_Api.register( singularName, function () {\n\t\tvar ret = val.apply( this, arguments );\n\n\t\tif ( ret === this ) {\n\t\t\t// Returned item is the API instance that was passed in, return it\n\t\t\treturn this;\n\t\t}\n\t\telse if ( ret instanceof _Api ) {\n\t\t\t// New API instance returned, want the value from the first item\n\t\t\t// in the returned array for the singular result.\n\t\t\treturn ret.length ?\n\t\t\t\tArray.isArray( ret[0] ) ?\n\t\t\t\t\tnew _Api( ret.context, ret[0] ) : // Array results are 'enhanced'\n\t\t\t\t\tret[0] :\n\t\t\t\tundefined;\n\t\t}\n\n\t\t// Non-API return - just fire it back\n\t\treturn ret;\n\t} );\n};\n\n\n/**\n * Selector for HTML tables. Apply the given selector to the give array of\n * DataTables settings objects.\n *\n * @param {string|integer} [selector] jQuery selector string or integer\n * @param  {array} Array of DataTables settings objects to be filtered\n * @return {array}\n * @ignore\n */\nvar __table_selector = function ( selector, a )\n{\n\tif ( Array.isArray(selector) ) {\n\t\treturn $.map( selector, function (item) {\n\t\t\treturn __table_selector(item, a);\n\t\t} );\n\t}\n\n\t// Integer is used to pick out a table by index\n\tif ( typeof selector === 'number' ) {\n\t\treturn [ a[ selector ] ];\n\t}\n\n\t// Perform a jQuery selector on the table nodes\n\tvar nodes = $.map( a, function (el, i) {\n\t\treturn el.nTable;\n\t} );\n\n\treturn $(nodes)\n\t\t.filter( selector )\n\t\t.map( function (i) {\n\t\t\t// Need to translate back from the table node to the settings\n\t\t\tvar idx = $.inArray( this, nodes );\n\t\t\treturn a[ idx ];\n\t\t} )\n\t\t.toArray();\n};\n\n\n\n/**\n * Context selector for the API's context (i.e. the tables the API instance\n * refers to.\n *\n * @name    DataTable.Api#tables\n * @param {string|integer} [selector] Selector to pick which tables the iterator\n *   should operate on. If not given, all tables in the current context are\n *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to\n *   select multiple tables or as an integer to select a single table.\n * @returns {DataTable.Api} Returns a new API instance if a selector is given.\n */\n_api_register( 'tables()', function ( selector ) {\n\t// A new instance is created if there was a selector specified\n\treturn selector !== undefined && selector !== null ?\n\t\tnew _Api( __table_selector( selector, this.context ) ) :\n\t\tthis;\n} );\n\n\n_api_register( 'table()', function ( selector ) {\n\tvar tables = this.tables( selector );\n\tvar ctx = tables.context;\n\n\t// Truncate to the first matched table\n\treturn ctx.length ?\n\t\tnew _Api( ctx[0] ) :\n\t\ttables;\n} );\n\n\n_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTable;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().body()', 'table().body()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTBody;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().header()', 'table().header()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTHead;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTFoot;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().containers()', 'table().container()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTableWrapper;\n\t}, 1 );\n} );\n\n\n\n/**\n * Redraw the tables in the current context.\n */\n_api_register( 'draw()', function ( paging ) {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( paging === 'page' ) {\n\t\t\t_fnDraw( settings );\n\t\t}\n\t\telse {\n\t\t\tif ( typeof paging === 'string' ) {\n\t\t\t\tpaging = paging === 'full-hold' ?\n\t\t\t\t\tfalse :\n\t\t\t\t\ttrue;\n\t\t\t}\n\n\t\t\t_fnReDraw( settings, paging===false );\n\t\t}\n\t} );\n} );\n\n\n\n/**\n * Get the current page index.\n *\n * @return {integer} Current page index (zero based)\n *//**\n * Set the current page.\n *\n * Note that if you attempt to show a page which does not exist, DataTables will\n * not throw an error, but rather reset the paging.\n *\n * @param {integer|string} action The paging action to take. This can be one of:\n *  * `integer` - The page index to jump to\n *  * `string` - An action to take:\n *    * `first` - Jump to first page.\n *    * `next` - Jump to the next page\n *    * `previous` - Jump to previous page\n *    * `last` - Jump to the last page.\n * @returns {DataTables.Api} this\n */\n_api_register( 'page()', function ( action ) {\n\tif ( action === undefined ) {\n\t\treturn this.page.info().page; // not an expensive call\n\t}\n\n\t// else, have an action to take on all tables\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnPageChange( settings, action );\n\t} );\n} );\n\n\n/**\n * Paging information for the first table in the current context.\n *\n * If you require paging information for another table, use the `table()` method\n * with a suitable selector.\n *\n * @return {object} Object with the following properties set:\n *  * `page` - Current page index (zero based - i.e. the first page is `0`)\n *  * `pages` - Total number of pages\n *  * `start` - Display index for the first record shown on the current page\n *  * `end` - Display index for the last record shown on the current page\n *  * `length` - Display length (number of records). Note that generally `start\n *    + length = end`, but this is not always true, for example if there are\n *    only 2 records to show on the final page, with a length of 10.\n *  * `recordsTotal` - Full data set length\n *  * `recordsDisplay` - Data set length once the current filtering criterion\n *    are applied.\n */\n_api_register( 'page.info()', function ( action ) {\n\tif ( this.context.length === 0 ) {\n\t\treturn undefined;\n\t}\n\n\tvar\n\t\tsettings   = this.context[0],\n\t\tstart      = settings._iDisplayStart,\n\t\tlen        = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,\n\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\tall        = len === -1;\n\n\treturn {\n\t\t\"page\":           all ? 0 : Math.floor( start / len ),\n\t\t\"pages\":          all ? 1 : Math.ceil( visRecords / len ),\n\t\t\"start\":          start,\n\t\t\"end\":            settings.fnDisplayEnd(),\n\t\t\"length\":         len,\n\t\t\"recordsTotal\":   settings.fnRecordsTotal(),\n\t\t\"recordsDisplay\": visRecords,\n\t\t\"serverSide\":     _fnDataSource( settings ) === 'ssp'\n\t};\n} );\n\n\n/**\n * Get the current page length.\n *\n * @return {integer} Current page length. Note `-1` indicates that all records\n *   are to be shown.\n *//**\n * Set the current page length.\n *\n * @param {integer} Page length to set. Use `-1` to show all records.\n * @returns {DataTables.Api} this\n */\n_api_register( 'page.len()', function ( len ) {\n\t// Note that we can't call this function 'length()' because `length`\n\t// is a Javascript property of functions which defines how many arguments\n\t// the function expects.\n\tif ( len === undefined ) {\n\t\treturn this.context.length !== 0 ?\n\t\t\tthis.context[0]._iDisplayLength :\n\t\t\tundefined;\n\t}\n\n\t// else, set the page length\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnLengthChange( settings, len );\n\t} );\n} );\n\n\n\nvar __reload = function ( settings, holdPosition, callback ) {\n\t// Use the draw event to trigger a callback\n\tif ( callback ) {\n\t\tvar api = new _Api( settings );\n\n\t\tapi.one( 'draw', function () {\n\t\t\tcallback( api.ajax.json() );\n\t\t} );\n\t}\n\n\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t_fnReDraw( settings, holdPosition );\n\t}\n\telse {\n\t\t_fnProcessingDisplay( settings, true );\n\n\t\t// Cancel an existing request\n\t\tvar xhr = settings.jqXHR;\n\t\tif ( xhr && xhr.readyState !== 4 ) {\n\t\t\txhr.abort();\n\t\t}\n\n\t\t// Trigger xhr\n\t\t_fnBuildAjax( settings, [], function( json ) {\n\t\t\t_fnClearTable( settings );\n\n\t\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t_fnAddData( settings, data[i] );\n\t\t\t}\n\n\t\t\t_fnReDraw( settings, holdPosition );\n\t\t\t_fnProcessingDisplay( settings, false );\n\t\t} );\n\t}\n};\n\n\n/**\n * Get the JSON response from the last Ajax request that DataTables made to the\n * server. Note that this returns the JSON from the first table in the current\n * context.\n *\n * @return {object} JSON received from the server.\n */\n_api_register( 'ajax.json()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length > 0 ) {\n\t\treturn ctx[0].json;\n\t}\n\n\t// else return undefined;\n} );\n\n\n/**\n * Get the data submitted in the last Ajax request\n */\n_api_register( 'ajax.params()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length > 0 ) {\n\t\treturn ctx[0].oAjaxData;\n\t}\n\n\t// else return undefined;\n} );\n\n\n/**\n * Reload tables from the Ajax data source. Note that this function will\n * automatically re-draw the table when the remote data has been loaded.\n *\n * @param {boolean} [reset=true] Reset (default) or hold the current paging\n *   position. A full re-sort and re-filter is performed when this method is\n *   called, which is why the pagination reset is the default action.\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.reload()', function ( callback, resetPaging ) {\n\treturn this.iterator( 'table', function (settings) {\n\t\t__reload( settings, resetPaging===false, callback );\n\t} );\n} );\n\n\n/**\n * Get the current Ajax URL. Note that this returns the URL from the first\n * table in the current context.\n *\n * @return {string} Current Ajax source URL\n *//**\n * Set the Ajax URL. Note that this will set the URL for all tables in the\n * current context.\n *\n * @param {string} url URL to set.\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.url()', function ( url ) {\n\tvar ctx = this.context;\n\n\tif ( url === undefined ) {\n\t\t// get\n\t\tif ( ctx.length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\t\tctx = ctx[0];\n\n\t\treturn ctx.ajax ?\n\t\t\t$.isPlainObject( ctx.ajax ) ?\n\t\t\t\tctx.ajax.url :\n\t\t\t\tctx.ajax :\n\t\t\tctx.sAjaxSource;\n\t}\n\n\t// set\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( $.isPlainObject( settings.ajax ) ) {\n\t\t\tsettings.ajax.url = url;\n\t\t}\n\t\telse {\n\t\t\tsettings.ajax = url;\n\t\t}\n\t\t// No need to consider sAjaxSource here since DataTables gives priority\n\t\t// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any\n\t\t// value of `sAjaxSource` redundant.\n\t} );\n} );\n\n\n/**\n * Load data from the newly set Ajax URL. Note that this method is only\n * available when `ajax.url()` is used to set a URL. Additionally, this method\n * has the same effect as calling `ajax.reload()` but is provided for\n * convenience when setting a new URL. Like `ajax.reload()` it will\n * automatically redraw the table once the remote data has been loaded.\n *\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {\n\t// Same as a reload, but makes sense to present it for easy access after a\n\t// url change\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\t__reload( ctx, resetPaging===false, callback );\n\t} );\n} );\n\n\n\n\nvar _selector_run = function ( type, selector, selectFn, settings, opts )\n{\n\tvar\n\t\tout = [], res,\n\t\ta, i, ien, j, jen,\n\t\tselectorType = typeof selector;\n\n\t// Can't just check for isArray here, as an API or jQuery instance might be\n\t// given with their array like look\n\tif ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {\n\t\tselector = [ selector ];\n\t}\n\n\tfor ( i=0, ien=selector.length ; i<ien ; i++ ) {\n\t\t// Only split on simple strings - complex expressions will be jQuery selectors\n\t\ta = selector[i] && selector[i].split && ! selector[i].match(/[\\[\\(:]/) ?\n\t\t\tselector[i].split(',') :\n\t\t\t[ selector[i] ];\n\n\t\tfor ( j=0, jen=a.length ; j<jen ; j++ ) {\n\t\t\tres = selectFn( typeof a[j] === 'string' ? (a[j]).trim() : a[j] );\n\n\t\t\tif ( res && res.length ) {\n\t\t\t\tout = out.concat( res );\n\t\t\t}\n\t\t}\n\t}\n\n\t// selector extensions\n\tvar ext = _ext.selector[ type ];\n\tif ( ext.length ) {\n\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\tout = ext[i]( settings, opts, out );\n\t\t}\n\t}\n\n\treturn _unique( out );\n};\n\n\nvar _selector_opts = function ( opts )\n{\n\tif ( ! opts ) {\n\t\topts = {};\n\t}\n\n\t// Backwards compatibility for 1.9- which used the terminology filter rather\n\t// than search\n\tif ( opts.filter && opts.search === undefined ) {\n\t\topts.search = opts.filter;\n\t}\n\n\treturn $.extend( {\n\t\tsearch: 'none',\n\t\torder: 'current',\n\t\tpage: 'all'\n\t}, opts );\n};\n\n\nvar _selector_first = function ( inst )\n{\n\t// Reduce the API instance to the first item found\n\tfor ( var i=0, ien=inst.length ; i<ien ; i++ ) {\n\t\tif ( inst[i].length > 0 ) {\n\t\t\t// Assign the first element to the first item in the instance\n\t\t\t// and truncate the instance and context\n\t\t\tinst[0] = inst[i];\n\t\t\tinst[0].length = 1;\n\t\t\tinst.length = 1;\n\t\t\tinst.context = [ inst.context[i] ];\n\n\t\t\treturn inst;\n\t\t}\n\t}\n\n\t// Not found - return an empty instance\n\tinst.length = 0;\n\treturn inst;\n};\n\n\nvar _selector_row_indexes = function ( settings, opts )\n{\n\tvar\n\t\ti, ien, tmp, a=[],\n\t\tdisplayFiltered = settings.aiDisplay,\n\t\tdisplayMaster = settings.aiDisplayMaster;\n\n\tvar\n\t\tsearch = opts.search,  // none, applied, removed\n\t\torder  = opts.order,   // applied, current, index (original - compatibility with 1.9)\n\t\tpage   = opts.page;    // all, current\n\n\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t// In server-side processing mode, most options are irrelevant since\n\t\t// rows not shown don't exist and the index order is the applied order\n\t\t// Removed is a special case - for consistency just return an empty\n\t\t// array\n\t\treturn search === 'removed' ?\n\t\t\t[] :\n\t\t\t_range( 0, displayMaster.length );\n\t}\n\telse if ( page == 'current' ) {\n\t\t// Current page implies that order=current and filter=applied, since it is\n\t\t// fairly senseless otherwise, regardless of what order and search actually\n\t\t// are\n\t\tfor ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {\n\t\t\ta.push( displayFiltered[i] );\n\t\t}\n\t}\n\telse if ( order == 'current' || order == 'applied' ) {\n\t\tif ( search == 'none') {\n\t\t\ta = displayMaster.slice();\n\t\t}\n\t\telse if ( search == 'applied' ) {\n\t\t\ta = displayFiltered.slice();\n\t\t}\n\t\telse if ( search == 'removed' ) {\n\t\t\t// O(n+m) solution by creating a hash map\n\t\t\tvar displayFilteredMap = {};\n\n\t\t\tfor ( var i=0, ien=displayFiltered.length ; i<ien ; i++ ) {\n\t\t\t\tdisplayFilteredMap[displayFiltered[i]] = null;\n\t\t\t}\n\n\t\t\ta = $.map( displayMaster, function (el) {\n\t\t\t\treturn ! displayFilteredMap.hasOwnProperty(el) ?\n\t\t\t\t\tel :\n\t\t\t\t\tnull;\n\t\t\t} );\n\t\t}\n\t}\n\telse if ( order == 'index' || order == 'original' ) {\n\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\tif ( search == 'none' ) {\n\t\t\t\ta.push( i );\n\t\t\t}\n\t\t\telse { // applied | removed\n\t\t\t\ttmp = $.inArray( i, displayFiltered );\n\n\t\t\t\tif ((tmp === -1 && search == 'removed') ||\n\t\t\t\t\t(tmp >= 0   && search == 'applied') )\n\t\t\t\t{\n\t\t\t\t\ta.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a;\n};\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Rows\n *\n * {}          - no selector - use all available rows\n * {integer}   - row aoData index\n * {node}      - TR node\n * {string}    - jQuery selector to apply to the TR elements\n * {array}     - jQuery array of nodes, or simply an array of TR nodes\n *\n */\nvar __row_selector = function ( settings, selector, opts )\n{\n\tvar rows;\n\tvar run = function ( sel ) {\n\t\tvar selInt = _intVal( sel );\n\t\tvar i, ien;\n\t\tvar aoData = settings.aoData;\n\n\t\t// Short cut - selector is a number and no options provided (default is\n\t\t// all records, so no need to check if the index is in there, since it\n\t\t// must be - dev error if the index doesn't exist).\n\t\tif ( selInt !== null && ! opts ) {\n\t\t\treturn [ selInt ];\n\t\t}\n\n\t\tif ( ! rows ) {\n\t\t\trows = _selector_row_indexes( settings, opts );\n\t\t}\n\n\t\tif ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {\n\t\t\t// Selector - integer\n\t\t\treturn [ selInt ];\n\t\t}\n\t\telse if ( sel === null || sel === undefined || sel === '' ) {\n\t\t\t// Selector - none\n\t\t\treturn rows;\n\t\t}\n\n\t\t// Selector - function\n\t\tif ( typeof sel === 'function' ) {\n\t\t\treturn $.map( rows, function (idx) {\n\t\t\t\tvar row = aoData[ idx ];\n\t\t\t\treturn sel( idx, row._aData, row.nTr ) ? idx : null;\n\t\t\t} );\n\t\t}\n\n\t\t// Selector - node\n\t\tif ( sel.nodeName ) {\n\t\t\tvar rowIdx = sel._DT_RowIndex;  // Property added by DT for fast lookup\n\t\t\tvar cellIdx = sel._DT_CellIndex;\n\n\t\t\tif ( rowIdx !== undefined ) {\n\t\t\t\t// Make sure that the row is actually still present in the table\n\t\t\t\treturn aoData[ rowIdx ] && aoData[ rowIdx ].nTr === sel ?\n\t\t\t\t\t[ rowIdx ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t\telse if ( cellIdx ) {\n\t\t\t\treturn aoData[ cellIdx.row ] && aoData[ cellIdx.row ].nTr === sel.parentNode ?\n\t\t\t\t\t[ cellIdx.row ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar host = $(sel).closest('*[data-dt-row]');\n\t\t\t\treturn host.length ?\n\t\t\t\t\t[ host.data('dt-row') ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t}\n\n\t\t// ID selector. Want to always be able to select rows by id, regardless\n\t\t// of if the tr element has been created or not, so can't rely upon\n\t\t// jQuery here - hence a custom implementation. This does not match\n\t\t// Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,\n\t\t// but to select it using a CSS selector engine (like Sizzle or\n\t\t// querySelect) it would need to need to be escaped for some characters.\n\t\t// DataTables simplifies this for row selectors since you can select\n\t\t// only a row. A # indicates an id any anything that follows is the id -\n\t\t// unescaped.\n\t\tif ( typeof sel === 'string' && sel.charAt(0) === '#' ) {\n\t\t\t// get row index from id\n\t\t\tvar rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];\n\t\t\tif ( rowObj !== undefined ) {\n\t\t\t\treturn [ rowObj.idx ];\n\t\t\t}\n\n\t\t\t// need to fall through to jQuery in case there is DOM id that\n\t\t\t// matches\n\t\t}\n\t\t\n\t\t// Get nodes in the order from the `rows` array with null values removed\n\t\tvar nodes = _removeEmpty(\n\t\t\t_pluck_order( settings.aoData, rows, 'nTr' )\n\t\t);\n\n\t\t// Selector - jQuery selector string, array of nodes or jQuery object/\n\t\t// As jQuery's .filter() allows jQuery objects to be passed in filter,\n\t\t// it also allows arrays, so this will cope with all three options\n\t\treturn $(nodes)\n\t\t\t.filter( sel )\n\t\t\t.map( function () {\n\t\t\t\treturn this._DT_RowIndex;\n\t\t\t} )\n\t\t\t.toArray();\n\t};\n\n\treturn _selector_run( 'row', selector, run, settings, opts );\n};\n\n\n_api_register( 'rows()', function ( selector, opts ) {\n\t// argument shifting\n\tif ( selector === undefined ) {\n\t\tselector = '';\n\t}\n\telse if ( $.isPlainObject( selector ) ) {\n\t\topts = selector;\n\t\tselector = '';\n\t}\n\n\topts = _selector_opts( opts );\n\n\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\treturn __row_selector( settings, selector, opts );\n\t}, 1 );\n\n\t// Want argument shifting here and in __row_selector?\n\tinst.selector.rows = selector;\n\tinst.selector.opts = opts;\n\n\treturn inst;\n} );\n\n_api_register( 'rows().nodes()', function () {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\treturn settings.aoData[ row ].nTr || undefined;\n\t}, 1 );\n} );\n\n_api_register( 'rows().data()', function () {\n\treturn this.iterator( true, 'rows', function ( settings, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows, '_aData' );\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\tvar r = settings.aoData[ row ];\n\t\treturn type === 'search' ? r._aFilterData : r._aSortData;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t_fnInvalidate( settings, row, src );\n\t} );\n} );\n\n_api_registerPlural( 'rows().indexes()', 'row().index()', function () {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\treturn row;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {\n\tvar a = [];\n\tvar context = this.context;\n\n\t// `iterator` will drop undefined values, but in this case we want them\n\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\tfor ( var j=0, jen=this[i].length ; j<jen ; j++ ) {\n\t\t\tvar id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );\n\t\t\ta.push( (hash === true ? '#' : '' )+ id );\n\t\t}\n\t}\n\n\treturn new _Api( context, a );\n} );\n\n_api_registerPlural( 'rows().remove()', 'row().remove()', function () {\n\tvar that = this;\n\n\tthis.iterator( 'row', function ( settings, row, thatIdx ) {\n\t\tvar data = settings.aoData;\n\t\tvar rowData = data[ row ];\n\t\tvar i, ien, j, jen;\n\t\tvar loopRow, loopCells;\n\n\t\tdata.splice( row, 1 );\n\n\t\t// Update the cached indexes\n\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\tloopRow = data[i];\n\t\t\tloopCells = loopRow.anCells;\n\n\t\t\t// Rows\n\t\t\tif ( loopRow.nTr !== null ) {\n\t\t\t\tloopRow.nTr._DT_RowIndex = i;\n\t\t\t}\n\n\t\t\t// Cells\n\t\t\tif ( loopCells !== null ) {\n\t\t\t\tfor ( j=0, jen=loopCells.length ; j<jen ; j++ ) {\n\t\t\t\t\tloopCells[j]._DT_CellIndex.row = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Delete from the display arrays\n\t\t_fnDeleteIndex( settings.aiDisplayMaster, row );\n\t\t_fnDeleteIndex( settings.aiDisplay, row );\n\t\t_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes\n\n\t\t// For server-side processing tables - subtract the deleted row from the count\n\t\tif ( settings._iRecordsDisplay > 0 ) {\n\t\t\tsettings._iRecordsDisplay--;\n\t\t}\n\n\t\t// Check for an 'overflow' they case for displaying the table\n\t\t_fnLengthOverflow( settings );\n\n\t\t// Remove the row's ID reference if there is one\n\t\tvar id = settings.rowIdFn( rowData._aData );\n\t\tif ( id !== undefined ) {\n\t\t\tdelete settings.aIds[ id ];\n\t\t}\n\t} );\n\n\tthis.iterator( 'table', function ( settings ) {\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\tsettings.aoData[i].idx = i;\n\t\t}\n\t} );\n\n\treturn this;\n} );\n\n\n_api_register( 'rows.add()', function ( rows ) {\n\tvar newRows = this.iterator( 'table', function ( settings ) {\n\t\t\tvar row, i, ien;\n\t\t\tvar out = [];\n\n\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\trow = rows[i];\n\n\t\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\t\tout.push( _fnAddTr( settings, row )[0] );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tout.push( _fnAddData( settings, row ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn out;\n\t\t}, 1 );\n\n\t// Return an Api.rows() extended instance, so rows().nodes() etc can be used\n\tvar modRows = this.rows( -1 );\n\tmodRows.pop();\n\t$.merge( modRows, newRows );\n\n\treturn modRows;\n} );\n\n\n\n\n\n/**\n *\n */\n_api_register( 'row()', function ( selector, opts ) {\n\treturn _selector_first( this.rows( selector, opts ) );\n} );\n\n\n_api_register( 'row().data()', function ( data ) {\n\tvar ctx = this.context;\n\n\tif ( data === undefined ) {\n\t\t// Get\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ]._aData :\n\t\t\tundefined;\n\t}\n\n\t// Set\n\tvar row = ctx[0].aoData[ this[0] ];\n\trow._aData = data;\n\n\t// If the DOM has an id, and the data source is an array\n\tif ( Array.isArray( data ) && row.nTr && row.nTr.id ) {\n\t\t_fnSetObjectDataFn( ctx[0].rowId )( data, row.nTr.id );\n\t}\n\n\t// Automatically invalidate\n\t_fnInvalidate( ctx[0], this[0], 'data' );\n\n\treturn this;\n} );\n\n\n_api_register( 'row().node()', function () {\n\tvar ctx = this.context;\n\n\treturn ctx.length && this.length ?\n\t\tctx[0].aoData[ this[0] ].nTr || null :\n\t\tnull;\n} );\n\n\n_api_register( 'row.add()', function ( row ) {\n\t// Allow a jQuery object to be passed in - only a single row is added from\n\t// it though - the first element in the set\n\tif ( row instanceof $ && row.length ) {\n\t\trow = row[0];\n\t}\n\n\tvar rows = this.iterator( 'table', function ( settings ) {\n\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\treturn _fnAddTr( settings, row )[0];\n\t\t}\n\t\treturn _fnAddData( settings, row );\n\t} );\n\n\t// Return an Api.rows() extended instance, with the newly added row selected\n\treturn this.row( rows[0] );\n} );\n\n\n$(document).on('plugin-init.dt', function (e, context) {\n\tvar api = new _Api( context );\n\tvar namespace = 'on-plugin-init';\n\tvar stateSaveParamsEvent = 'stateSaveParams.' + namespace;\n\tvar destroyEvent = 'destroy. ' + namespace;\n\n\tapi.on( stateSaveParamsEvent, function ( e, settings, d ) {\n\t\t// This could be more compact with the API, but it is a lot faster as a simple\n\t\t// internal loop\n\t\tvar idFn = settings.rowIdFn;\n\t\tvar data = settings.aoData;\n\t\tvar ids = [];\n\n\t\tfor (var i=0 ; i<data.length ; i++) {\n\t\t\tif (data[i]._detailsShow) {\n\t\t\t\tids.push( '#' + idFn(data[i]._aData) );\n\t\t\t}\n\t\t}\n\n\t\td.childRows = ids;\n\t});\n\n\tapi.on( destroyEvent, function () {\n\t\tapi.off(stateSaveParamsEvent + ' ' + destroyEvent);\n\t});\n\n\tvar loaded = api.state.loaded();\n\n\tif ( loaded && loaded.childRows ) {\n\t\tapi\n\t\t\t.rows( $.map(loaded.childRows, function (id){\n\t\t\t\treturn id.replace(/:/g, '\\\\:')\n\t\t\t}) )\n\t\t\t.every( function () {\n\t\t\t\t_fnCallbackFire( context, null, 'requestChild', [ this ] )\n\t\t\t});\n\t}\n});\n\nvar __details_add = function ( ctx, row, data, klass )\n{\n\t// Convert to array of TR elements\n\tvar rows = [];\n\tvar addRow = function ( r, k ) {\n\t\t// Recursion to allow for arrays of jQuery objects\n\t\tif ( Array.isArray( r ) || r instanceof $ ) {\n\t\t\tfor ( var i=0, ien=r.length ; i<ien ; i++ ) {\n\t\t\t\taddRow( r[i], k );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// If we get a TR element, then just add it directly - up to the dev\n\t\t// to add the correct number of columns etc\n\t\tif ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {\n\t\t\trows.push( r );\n\t\t}\n\t\telse {\n\t\t\t// Otherwise create a row with a wrapper\n\t\t\tvar created = $('<tr><td></td></tr>').addClass( k );\n\t\t\t$('td', created)\n\t\t\t\t.addClass( k )\n\t\t\t\t.html( r )\n\t\t\t\t[0].colSpan = _fnVisbleColumns( ctx );\n\n\t\t\trows.push( created[0] );\n\t\t}\n\t};\n\n\taddRow( data, klass );\n\n\tif ( row._details ) {\n\t\trow._details.detach();\n\t}\n\n\trow._details = $(rows);\n\n\t// If the children were already shown, that state should be retained\n\tif ( row._detailsShow ) {\n\t\trow._details.insertAfter( row.nTr );\n\t}\n};\n\n\n// Make state saving of child row details async to allow them to be batch processed\nvar __details_state = DataTable.util.throttle(\n\tfunction (ctx) {\n\t\t_fnSaveState( ctx[0] )\n\t},\n\t500\n);\n\n\nvar __details_remove = function ( api, idx )\n{\n\tvar ctx = api.context;\n\n\tif ( ctx.length ) {\n\t\tvar row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];\n\n\t\tif ( row && row._details ) {\n\t\t\trow._details.remove();\n\n\t\t\trow._detailsShow = undefined;\n\t\t\trow._details = undefined;\n\t\t\t$( row.nTr ).removeClass( 'dt-hasChild' );\n\t\t\t__details_state( ctx );\n\t\t}\n\t}\n};\n\n\nvar __details_display = function ( api, show ) {\n\tvar ctx = api.context;\n\n\tif ( ctx.length && api.length ) {\n\t\tvar row = ctx[0].aoData[ api[0] ];\n\n\t\tif ( row._details ) {\n\t\t\trow._detailsShow = show;\n\n\t\t\tif ( show ) {\n\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t$( row.nTr ).addClass( 'dt-hasChild' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\trow._details.detach();\n\t\t\t\t$( row.nTr ).removeClass( 'dt-hasChild' );\n\t\t\t}\n\n\t\t\t_fnCallbackFire( ctx[0], null, 'childRow', [ show, api.row( api[0] ) ] )\n\n\t\t\t__details_events( ctx[0] );\n\t\t\t__details_state( ctx );\n\t\t}\n\t}\n};\n\n\nvar __details_events = function ( settings )\n{\n\tvar api = new _Api( settings );\n\tvar namespace = '.dt.DT_details';\n\tvar drawEvent = 'draw'+namespace;\n\tvar colvisEvent = 'column-sizing'+namespace;\n\tvar destroyEvent = 'destroy'+namespace;\n\tvar data = settings.aoData;\n\n\tapi.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );\n\n\tif ( _pluck( data, '_details' ).length > 0 ) {\n\t\t// On each draw, insert the required elements into the document\n\t\tapi.on( drawEvent, function ( e, ctx ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tapi.rows( {page:'current'} ).eq(0).each( function (idx) {\n\t\t\t\t// Internal data grab\n\t\t\t\tvar row = data[ idx ];\n\n\t\t\t\tif ( row._detailsShow ) {\n\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\t// Column visibility change - update the colspan\n\t\tapi.on( colvisEvent, function ( e, ctx, idx, vis ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Update the colspan for the details rows (note, only if it already has\n\t\t\t// a colspan)\n\t\t\tvar row, visible = _fnVisbleColumns( ctx );\n\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\trow = data[i];\n\n\t\t\t\tif ( row._details ) {\n\t\t\t\t\trow._details.children('td[colspan]').attr('colspan', visible );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Table destroyed - nuke any child rows\n\t\tapi.on( destroyEvent, function ( e, ctx ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\tif ( data[i]._details ) {\n\t\t\t\t\t__details_remove( api, i );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n};\n\n// Strings for the method names to help minification\nvar _emp = '';\nvar _child_obj = _emp+'row().child';\nvar _child_mth = _child_obj+'()';\n\n// data can be:\n//  tr\n//  string\n//  jQuery or array of any of the above\n_api_register( _child_mth, function ( data, klass ) {\n\tvar ctx = this.context;\n\n\tif ( data === undefined ) {\n\t\t// get\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ]._details :\n\t\t\tundefined;\n\t}\n\telse if ( data === true ) {\n\t\t// show\n\t\tthis.child.show();\n\t}\n\telse if ( data === false ) {\n\t\t// remove\n\t\t__details_remove( this );\n\t}\n\telse if ( ctx.length && this.length ) {\n\t\t// set\n\t\t__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );\n\t}\n\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.show()',\n\t_child_mth+'.show()' // only when `child()` was called with parameters (without\n], function ( show ) {   // it returns an object and this method is not executed)\n\t__details_display( this, true );\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.hide()',\n\t_child_mth+'.hide()' // only when `child()` was called with parameters (without\n], function () {         // it returns an object and this method is not executed)\n\t__details_display( this, false );\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.remove()',\n\t_child_mth+'.remove()' // only when `child()` was called with parameters (without\n], function () {           // it returns an object and this method is not executed)\n\t__details_remove( this );\n\treturn this;\n} );\n\n\n_api_register( _child_obj+'.isShown()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length && this.length ) {\n\t\t// _detailsShown as false or undefined will fall through to return false\n\t\treturn ctx[0].aoData[ this[0] ]._detailsShow || false;\n\t}\n\treturn false;\n} );\n\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Columns\n *\n * {integer}           - column index (>=0 count from left, <0 count from right)\n * \"{integer}:visIdx\"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)\n * \"{integer}:visible\" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)\n * \"{string}:name\"     - column name\n * \"{string}\"          - jQuery selector on column header nodes\n *\n */\n\n// can be an array of these items, comma separated list, or an array of comma\n// separated lists\n\nvar __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;\n\n\n// r1 and r2 are redundant - but it means that the parameters match for the\n// iterator callback in columns().data()\nvar __columnData = function ( settings, column, r1, r2, rows ) {\n\tvar a = [];\n\tfor ( var row=0, ien=rows.length ; row<ien ; row++ ) {\n\t\ta.push( _fnGetCellData( settings, rows[row], column ) );\n\t}\n\treturn a;\n};\n\n\nvar __column_selector = function ( settings, selector, opts )\n{\n\tvar\n\t\tcolumns = settings.aoColumns,\n\t\tnames = _pluck( columns, 'sName' ),\n\t\tnodes = _pluck( columns, 'nTh' );\n\n\tvar run = function ( s ) {\n\t\tvar selInt = _intVal( s );\n\n\t\t// Selector - all\n\t\tif ( s === '' ) {\n\t\t\treturn _range( columns.length );\n\t\t}\n\n\t\t// Selector - index\n\t\tif ( selInt !== null ) {\n\t\t\treturn [ selInt >= 0 ?\n\t\t\t\tselInt : // Count from left\n\t\t\t\tcolumns.length + selInt // Count from right (+ because its a negative value)\n\t\t\t];\n\t\t}\n\n\t\t// Selector = function\n\t\tif ( typeof s === 'function' ) {\n\t\t\tvar rows = _selector_row_indexes( settings, opts );\n\n\t\t\treturn $.map( columns, function (col, idx) {\n\t\t\t\treturn s(\n\t\t\t\t\t\tidx,\n\t\t\t\t\t\t__columnData( settings, idx, 0, 0, rows ),\n\t\t\t\t\t\tnodes[ idx ]\n\t\t\t\t\t) ? idx : null;\n\t\t\t} );\n\t\t}\n\n\t\t// jQuery or string selector\n\t\tvar match = typeof s === 'string' ?\n\t\t\ts.match( __re_column_selector ) :\n\t\t\t'';\n\n\t\tif ( match ) {\n\t\t\tswitch( match[2] ) {\n\t\t\t\tcase 'visIdx':\n\t\t\t\tcase 'visible':\n\t\t\t\t\tvar idx = parseInt( match[1], 10 );\n\t\t\t\t\t// Visible index given, convert to column index\n\t\t\t\t\tif ( idx < 0 ) {\n\t\t\t\t\t\t// Counting from the right\n\t\t\t\t\t\tvar visColumns = $.map( columns, function (col,i) {\n\t\t\t\t\t\t\treturn col.bVisible ? i : null;\n\t\t\t\t\t\t} );\n\t\t\t\t\t\treturn [ visColumns[ visColumns.length + idx ] ];\n\t\t\t\t\t}\n\t\t\t\t\t// Counting from the left\n\t\t\t\t\treturn [ _fnVisibleToColumnIndex( settings, idx ) ];\n\n\t\t\t\tcase 'name':\n\t\t\t\t\t// match by name. `names` is column index complete and in order\n\t\t\t\t\treturn $.map( names, function (name, i) {\n\t\t\t\t\t\treturn name === match[1] ? i : null;\n\t\t\t\t\t} );\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn [];\n\t\t\t}\n\t\t}\n\n\t\t// Cell in the table body\n\t\tif ( s.nodeName && s._DT_CellIndex ) {\n\t\t\treturn [ s._DT_CellIndex.column ];\n\t\t}\n\n\t\t// jQuery selector on the TH elements for the columns\n\t\tvar jqResult = $( nodes )\n\t\t\t.filter( s )\n\t\t\t.map( function () {\n\t\t\t\treturn $.inArray( this, nodes ); // `nodes` is column index complete and in order\n\t\t\t} )\n\t\t\t.toArray();\n\n\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\treturn jqResult;\n\t\t}\n\n\t\t// Otherwise a node which might have a `dt-column` data attribute, or be\n\t\t// a child or such an element\n\t\tvar host = $(s).closest('*[data-dt-column]');\n\t\treturn host.length ?\n\t\t\t[ host.data('dt-column') ] :\n\t\t\t[];\n\t};\n\n\treturn _selector_run( 'column', selector, run, settings, opts );\n};\n\n\nvar __setColumnVis = function ( settings, column, vis ) {\n\tvar\n\t\tcols = settings.aoColumns,\n\t\tcol  = cols[ column ],\n\t\tdata = settings.aoData,\n\t\trow, cells, i, ien, tr;\n\n\t// Get\n\tif ( vis === undefined ) {\n\t\treturn col.bVisible;\n\t}\n\n\t// Set\n\t// No change\n\tif ( col.bVisible === vis ) {\n\t\treturn;\n\t}\n\n\tif ( vis ) {\n\t\t// Insert column\n\t\t// Need to decide if we should use appendChild or insertBefore\n\t\tvar insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );\n\n\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\ttr = data[i].nTr;\n\t\t\tcells = data[i].anCells;\n\n\t\t\tif ( tr ) {\n\t\t\t\t// insertBefore can act like appendChild if 2nd arg is null\n\t\t\t\ttr.insertBefore( cells[ column ], cells[ insertBefore ] || null );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\t// Remove column\n\t\t$( _pluck( settings.aoData, 'anCells', column ) ).detach();\n\t}\n\n\t// Common actions\n\tcol.bVisible = vis;\n};\n\n\n_api_register( 'columns()', function ( selector, opts ) {\n\t// argument shifting\n\tif ( selector === undefined ) {\n\t\tselector = '';\n\t}\n\telse if ( $.isPlainObject( selector ) ) {\n\t\topts = selector;\n\t\tselector = '';\n\t}\n\n\topts = _selector_opts( opts );\n\n\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\treturn __column_selector( settings, selector, opts );\n\t}, 1 );\n\n\t// Want argument shifting here and in _row_selector?\n\tinst.selector.cols = selector;\n\tinst.selector.opts = opts;\n\n\treturn inst;\n} );\n\n_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].nTh;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].nTf;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().data()', 'column().data()', function () {\n\treturn this.iterator( 'column-rows', __columnData, 1 );\n} );\n\n_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].mData;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {\n\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows,\n\t\t\ttype === 'search' ? '_aFilterData' : '_aSortData', column\n\t\t);\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {\n\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows, 'anCells', column ) ;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {\n\tvar that = this;\n\tvar ret = this.iterator( 'column', function ( settings, column ) {\n\t\tif ( vis === undefined ) {\n\t\t\treturn settings.aoColumns[ column ].bVisible;\n\t\t} // else\n\t\t__setColumnVis( settings, column, vis );\n\t} );\n\n\t// Group the column visibility changes\n\tif ( vis !== undefined ) {\n\t\tthis.iterator( 'table', function ( settings ) {\n\t\t\t// Redraw the header after changes\n\t\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\n\t\t\t// Update colspan for no records display. Child rows and extensions will use their own\n\t\t\t// listeners to do this - only need to update the empty table item here\n\t\t\tif ( ! settings.aiDisplay.length ) {\n\t\t\t\t$(settings.nTBody).find('td[colspan]').attr('colspan', _fnVisbleColumns(settings));\n\t\t\t}\n\t\n\t\t\t_fnSaveState( settings );\n\n\t\t\t// Second loop once the first is done for events\n\t\t\tthat.iterator( 'column', function ( settings, column ) {\n\t\t\t\t_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );\n\t\t\t} );\n\n\t\t\tif ( calc === undefined || calc ) {\n\t\t\t\tthat.columns.adjust();\n\t\t\t}\n\t\t});\n\t}\n\n\treturn ret;\n} );\n\n_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn type === 'visible' ?\n\t\t\t_fnColumnIndexToVisible( settings, column ) :\n\t\t\tcolumn;\n\t}, 1 );\n} );\n\n_api_register( 'columns.adjust()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnAdjustColumnSizing( settings );\n\t}, 1 );\n} );\n\n_api_register( 'column.index()', function ( type, idx ) {\n\tif ( this.context.length !== 0 ) {\n\t\tvar ctx = this.context[0];\n\n\t\tif ( type === 'fromVisible' || type === 'toData' ) {\n\t\t\treturn _fnVisibleToColumnIndex( ctx, idx );\n\t\t}\n\t\telse if ( type === 'fromData' || type === 'toVisible' ) {\n\t\t\treturn _fnColumnIndexToVisible( ctx, idx );\n\t\t}\n\t}\n} );\n\n_api_register( 'column()', function ( selector, opts ) {\n\treturn _selector_first( this.columns( selector, opts ) );\n} );\n\nvar __cell_selector = function ( settings, selector, opts )\n{\n\tvar data = settings.aoData;\n\tvar rows = _selector_row_indexes( settings, opts );\n\tvar cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );\n\tvar allCells = $(_flatten( [], cells ));\n\tvar row;\n\tvar columns = settings.aoColumns.length;\n\tvar a, i, ien, j, o, host;\n\n\tvar run = function ( s ) {\n\t\tvar fnSelector = typeof s === 'function';\n\n\t\tif ( s === null || s === undefined || fnSelector ) {\n\t\t\t// All cells and function selectors\n\t\t\ta = [];\n\n\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\trow = rows[i];\n\n\t\t\t\tfor ( j=0 ; j<columns ; j++ ) {\n\t\t\t\t\to = {\n\t\t\t\t\t\trow: row,\n\t\t\t\t\t\tcolumn: j\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( fnSelector ) {\n\t\t\t\t\t\t// Selector - function\n\t\t\t\t\t\thost = data[ row ];\n\n\t\t\t\t\t\tif ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {\n\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Selector - all\n\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn a;\n\t\t}\n\t\t\n\t\t// Selector - index\n\t\tif ( $.isPlainObject( s ) ) {\n\t\t\t// Valid cell index and its in the array of selectable rows\n\t\t\treturn s.column !== undefined && s.row !== undefined && $.inArray( s.row, rows ) !== -1 ?\n\t\t\t\t[s] :\n\t\t\t\t[];\n\t\t}\n\n\t\t// Selector - jQuery filtered cells\n\t\tvar jqResult = allCells\n\t\t\t.filter( s )\n\t\t\t.map( function (i, el) {\n\t\t\t\treturn { // use a new object, in case someone changes the values\n\t\t\t\t\trow:    el._DT_CellIndex.row,\n\t\t\t\t\tcolumn: el._DT_CellIndex.column\n \t\t\t\t};\n\t\t\t} )\n\t\t\t.toArray();\n\n\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\treturn jqResult;\n\t\t}\n\n\t\t// Otherwise the selector is a node, and there is one last option - the\n\t\t// element might be a child of an element which has dt-row and dt-column\n\t\t// data attributes\n\t\thost = $(s).closest('*[data-dt-row]');\n\t\treturn host.length ?\n\t\t\t[ {\n\t\t\t\trow: host.data('dt-row'),\n\t\t\t\tcolumn: host.data('dt-column')\n\t\t\t} ] :\n\t\t\t[];\n\t};\n\n\treturn _selector_run( 'cell', selector, run, settings, opts );\n};\n\n\n\n\n_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {\n\t// Argument shifting\n\tif ( $.isPlainObject( rowSelector ) ) {\n\t\t// Indexes\n\t\tif ( rowSelector.row === undefined ) {\n\t\t\t// Selector options in first parameter\n\t\t\topts = rowSelector;\n\t\t\trowSelector = null;\n\t\t}\n\t\telse {\n\t\t\t// Cell index objects in first parameter\n\t\t\topts = columnSelector;\n\t\t\tcolumnSelector = null;\n\t\t}\n\t}\n\tif ( $.isPlainObject( columnSelector ) ) {\n\t\topts = columnSelector;\n\t\tcolumnSelector = null;\n\t}\n\n\t// Cell selector\n\tif ( columnSelector === null || columnSelector === undefined ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\treturn __cell_selector( settings, rowSelector, _selector_opts( opts ) );\n\t\t} );\n\t}\n\n\t// The default built in options need to apply to row and columns\n\tvar internalOpts = opts ? {\n\t\tpage: opts.page,\n\t\torder: opts.order,\n\t\tsearch: opts.search\n\t} : {};\n\n\t// Row + column selector\n\tvar columns = this.columns( columnSelector, internalOpts );\n\tvar rows = this.rows( rowSelector, internalOpts );\n\tvar i, ien, j, jen;\n\n\tvar cellsNoOpts = this.iterator( 'table', function ( settings, idx ) {\n\t\tvar a = [];\n\n\t\tfor ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {\n\t\t\tfor ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {\n\t\t\t\ta.push( {\n\t\t\t\t\trow:    rows[idx][i],\n\t\t\t\t\tcolumn: columns[idx][j]\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\treturn a;\n\t}, 1 );\n\n\t// There is currently only one extension which uses a cell selector extension\n\t// It is a _major_ performance drag to run this if it isn't needed, so this is\n\t// an extension specific check at the moment\n\tvar cells = opts && opts.selected ?\n\t\tthis.cells( cellsNoOpts, opts ) :\n\t\tcellsNoOpts;\n\n\t$.extend( cells.selector, {\n\t\tcols: columnSelector,\n\t\trows: rowSelector,\n\t\topts: opts\n\t} );\n\n\treturn cells;\n} );\n\n\n_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\tvar data = settings.aoData[ row ];\n\n\t\treturn data && data.anCells ?\n\t\t\tdata.anCells[ column ] :\n\t\t\tundefined;\n\t}, 1 );\n} );\n\n\n_api_register( 'cells().data()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn _fnGetCellData( settings, row, column );\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {\n\ttype = type === 'search' ? '_aFilterData' : '_aSortData';\n\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn settings.aoData[ row ][ type ][ column ];\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn _fnGetCellData( settings, row, column, type );\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn {\n\t\t\trow: row,\n\t\t\tcolumn: column,\n\t\t\tcolumnVisible: _fnColumnIndexToVisible( settings, column )\n\t\t};\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t_fnInvalidate( settings, row, src, column );\n\t} );\n} );\n\n\n\n_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {\n\treturn _selector_first( this.cells( rowSelector, columnSelector, opts ) );\n} );\n\n\n_api_register( 'cell().data()', function ( data ) {\n\tvar ctx = this.context;\n\tvar cell = this[0];\n\n\tif ( data === undefined ) {\n\t\t// Get\n\t\treturn ctx.length && cell.length ?\n\t\t\t_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :\n\t\t\tundefined;\n\t}\n\n\t// Set\n\t_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );\n\t_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );\n\n\treturn this;\n} );\n\n\n\n/**\n * Get current ordering (sorting) that has been applied to the table.\n *\n * @returns {array} 2D array containing the sorting information for the first\n *   table in the current context. Each element in the parent array represents\n *   a column being sorted upon (i.e. multi-sorting with two columns would have\n *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is\n *   the column index that the sorting condition applies to, the second is the\n *   direction of the sort (`desc` or `asc`) and, optionally, the third is the\n *   index of the sorting order from the `column.sorting` initialisation array.\n *//**\n * Set the ordering for the table.\n *\n * @param {integer} order Column index to sort upon.\n * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)\n * @returns {DataTables.Api} this\n *//**\n * Set the ordering for the table.\n *\n * @param {array} order 1D array of sorting information to be applied.\n * @param {array} [...] Optional additional sorting conditions\n * @returns {DataTables.Api} this\n *//**\n * Set the ordering for the table.\n *\n * @param {array} order 2D array of sorting information to be applied.\n * @returns {DataTables.Api} this\n */\n_api_register( 'order()', function ( order, dir ) {\n\tvar ctx = this.context;\n\n\tif ( order === undefined ) {\n\t\t// get\n\t\treturn ctx.length !== 0 ?\n\t\t\tctx[0].aaSorting :\n\t\t\tundefined;\n\t}\n\n\t// set\n\tif ( typeof order === 'number' ) {\n\t\t// Simple column / direction passed in\n\t\torder = [ [ order, dir ] ];\n\t}\n\telse if ( order.length && ! Array.isArray( order[0] ) ) {\n\t\t// Arguments passed in (list of 1D arrays)\n\t\torder = Array.prototype.slice.call( arguments );\n\t}\n\t// otherwise a 2D array was passed in\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tsettings.aaSorting = order.slice();\n\t} );\n} );\n\n\n/**\n * Attach a sort listener to an element for a given column\n *\n * @param {node|jQuery|string} node Identifier for the element(s) to attach the\n *   listener to. This can take the form of a single DOM node, a jQuery\n *   collection of nodes or a jQuery selector which will identify the node(s).\n * @param {integer} column the column that a click on this node will sort on\n * @param {function} [callback] callback function when sort is run\n * @returns {DataTables.Api} this\n */\n_api_register( 'order.listener()', function ( node, column, callback ) {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnSortAttachListener( settings, node, column, callback );\n\t} );\n} );\n\n\n_api_register( 'order.fixed()', function ( set ) {\n\tif ( ! set ) {\n\t\tvar ctx = this.context;\n\t\tvar fixed = ctx.length ?\n\t\t\tctx[0].aaSortingFixed :\n\t\t\tundefined;\n\n\t\treturn Array.isArray( fixed ) ?\n\t\t\t{ pre: fixed } :\n\t\t\tfixed;\n\t}\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tsettings.aaSortingFixed = $.extend( true, {}, set );\n\t} );\n} );\n\n\n// Order by the selected column(s)\n_api_register( [\n\t'columns().order()',\n\t'column().order()'\n], function ( dir ) {\n\tvar that = this;\n\n\treturn this.iterator( 'table', function ( settings, i ) {\n\t\tvar sort = [];\n\n\t\t$.each( that[i], function (j, col) {\n\t\t\tsort.push( [ col, dir ] );\n\t\t} );\n\n\t\tsettings.aaSorting = sort;\n\t} );\n} );\n\n\n\n_api_register( 'search()', function ( input, regex, smart, caseInsen ) {\n\tvar ctx = this.context;\n\n\tif ( input === undefined ) {\n\t\t// get\n\t\treturn ctx.length !== 0 ?\n\t\t\tctx[0].oPreviousSearch.sSearch :\n\t\t\tundefined;\n\t}\n\n\t// set\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\treturn;\n\t\t}\n\n\t\t_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {\n\t\t\t\"sSearch\": input+\"\",\n\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t} ), 1 );\n\t} );\n} );\n\n\n_api_registerPlural(\n\t'columns().search()',\n\t'column().search()',\n\tfunction ( input, regex, smart, caseInsen ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\tvar preSearch = settings.aoPreSearchCols;\n\n\t\t\tif ( input === undefined ) {\n\t\t\t\t// get\n\t\t\t\treturn preSearch[ column ].sSearch;\n\t\t\t}\n\n\t\t\t// set\n\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$.extend( preSearch[ column ], {\n\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t} );\n\n\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch, 1 );\n\t\t} );\n\t}\n);\n\n/*\n * State API methods\n */\n\n_api_register( 'state()', function () {\n\treturn this.context.length ?\n\t\tthis.context[0].oSavedState :\n\t\tnull;\n} );\n\n\n_api_register( 'state.clear()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t// Save an empty object\n\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, {} );\n\t} );\n} );\n\n\n_api_register( 'state.loaded()', function () {\n\treturn this.context.length ?\n\t\tthis.context[0].oLoadedState :\n\t\tnull;\n} );\n\n\n_api_register( 'state.save()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnSaveState( settings );\n\t} );\n} );\n\n\n\n/**\n * Set the jQuery or window object to be used by DataTables\n *\n * @param {*} module Library / container object\n * @param {string} type Library or container type `lib` or `win`.\n */\nDataTable.use = function (module, type) {\n\tif (type === 'lib' || module.fn) {\n\t\t$ = module;\n\t}\n\telse if (type == 'win' || module.document) {\n\t\twindow = module;\n\t\tdocument = module.document;\n\t}\n}\n\n/**\n * CommonJS factory function pass through. This will check if the arguments\n * given are a window object or a jQuery object. If so they are set\n * accordingly.\n * @param {*} root Window\n * @param {*} jq jQUery\n * @returns {boolean} Indicator\n */\nDataTable.factory = function (root, jq) {\n\tvar is = false;\n\n\t// Test if the first parameter is a window object\n\tif (root && root.document) {\n\t\twindow = root;\n\t\tdocument = root.document;\n\t}\n\n\t// Test if the second parameter is a jQuery object\n\tif (jq && jq.fn && jq.fn.jquery) {\n\t\t$ = jq;\n\t\tis = true;\n\t}\n\n\treturn is;\n}\n\n/**\n * Provide a common method for plug-ins to check the version of DataTables being\n * used, in order to ensure compatibility.\n *\n *  @param {string} version Version string to check for, in the format \"X.Y.Z\".\n *    Note that the formats \"X\" and \"X.Y\" are also acceptable.\n *  @returns {boolean} true if this version of DataTables is greater or equal to\n *    the required version, or false if this version of DataTales is not\n *    suitable\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );\n */\nDataTable.versionCheck = DataTable.fnVersionCheck = function( version )\n{\n\tvar aThis = DataTable.version.split('.');\n\tvar aThat = version.split('.');\n\tvar iThis, iThat;\n\n\tfor ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {\n\t\tiThis = parseInt( aThis[i], 10 ) || 0;\n\t\tiThat = parseInt( aThat[i], 10 ) || 0;\n\n\t\t// Parts are the same, keep comparing\n\t\tif (iThis === iThat) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Parts are different, return immediately\n\t\treturn iThis > iThat;\n\t}\n\n\treturn true;\n};\n\n\n/**\n * Check if a `<table>` node is a DataTable table already or not.\n *\n *  @param {node|jquery|string} table Table node, jQuery object or jQuery\n *      selector for the table to test. Note that if more than more than one\n *      table is passed on, only the first will be checked\n *  @returns {boolean} true the table given is a DataTable, or false otherwise\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {\n *      $('#example').dataTable();\n *    }\n */\nDataTable.isDataTable = DataTable.fnIsDataTable = function ( table )\n{\n\tvar t = $(table).get(0);\n\tvar is = false;\n\n\tif ( table instanceof DataTable.Api ) {\n\t\treturn true;\n\t}\n\n\t$.each( DataTable.settings, function (i, o) {\n\t\tvar head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;\n\t\tvar foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;\n\n\t\tif ( o.nTable === t || head === t || foot === t ) {\n\t\t\tis = true;\n\t\t}\n\t} );\n\n\treturn is;\n};\n\n\n/**\n * Get all DataTable tables that have been initialised - optionally you can\n * select to get only currently visible tables.\n *\n *  @param {boolean} [visible=false] Flag to indicate if you want all (default)\n *    or visible tables only.\n *  @returns {array} Array of `table` nodes (not DataTable instances) which are\n *    DataTables\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    $.each( $.fn.dataTable.tables(true), function () {\n *      $(table).DataTable().columns.adjust();\n *    } );\n */\nDataTable.tables = DataTable.fnTables = function ( visible )\n{\n\tvar api = false;\n\n\tif ( $.isPlainObject( visible ) ) {\n\t\tapi = visible.api;\n\t\tvisible = visible.visible;\n\t}\n\n\tvar a = $.map( DataTable.settings, function (o) {\n\t\tif ( !visible || (visible && $(o.nTable).is(':visible')) ) {\n\t\t\treturn o.nTable;\n\t\t}\n\t} );\n\n\treturn api ?\n\t\tnew _Api( a ) :\n\t\ta;\n};\n\n\n/**\n * Convert from camel case parameters to Hungarian notation. This is made public\n * for the extensions to provide the same ability as DataTables core to accept\n * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase\n * parameters.\n *\n *  @param {object} src The model object which holds all parameters that can be\n *    mapped.\n *  @param {object} user The object to convert from camel case to Hungarian.\n *  @param {boolean} force When set to `true`, properties which already have a\n *    Hungarian value in the `user` object will be overwritten. Otherwise they\n *    won't be.\n */\nDataTable.camelToHungarian = _fnCamelToHungarian;\n\n\n\n/**\n *\n */\n_api_register( '$()', function ( selector, opts ) {\n\tvar\n\t\trows   = this.rows( opts ).nodes(), // Get all rows\n\t\tjqRows = $(rows);\n\n\treturn $( [].concat(\n\t\tjqRows.filter( selector ).toArray(),\n\t\tjqRows.find( selector ).toArray()\n\t) );\n} );\n\n\n// jQuery functions to operate on the tables\n$.each( [ 'on', 'one', 'off' ], function (i, key) {\n\t_api_register( key+'()', function ( /* event, handler */ ) {\n\t\tvar args = Array.prototype.slice.call(arguments);\n\n\t\t// Add the `dt` namespace automatically if it isn't already present\n\t\targs[0] = $.map( args[0].split( /\\s/ ), function ( e ) {\n\t\t\treturn ! e.match(/\\.dt\\b/) ?\n\t\t\t\te+'.dt' :\n\t\t\t\te;\n\t\t\t} ).join( ' ' );\n\n\t\tvar inst = $( this.tables().nodes() );\n\t\tinst[key].apply( inst, args );\n\t\treturn this;\n\t} );\n} );\n\n\n_api_register( 'clear()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnClearTable( settings );\n\t} );\n} );\n\n\n_api_register( 'settings()', function () {\n\treturn new _Api( this.context, this.context );\n} );\n\n\n_api_register( 'init()', function () {\n\tvar ctx = this.context;\n\treturn ctx.length ? ctx[0].oInit : null;\n} );\n\n\n_api_register( 'data()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\treturn _pluck( settings.aoData, '_aData' );\n\t} ).flatten();\n} );\n\n\n_api_register( 'destroy()', function ( remove ) {\n\tremove = remove || false;\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tvar classes   = settings.oClasses;\n\t\tvar table     = settings.nTable;\n\t\tvar tbody     = settings.nTBody;\n\t\tvar thead     = settings.nTHead;\n\t\tvar tfoot     = settings.nTFoot;\n\t\tvar jqTable   = $(table);\n\t\tvar jqTbody   = $(tbody);\n\t\tvar jqWrapper = $(settings.nTableWrapper);\n\t\tvar rows      = $.map( settings.aoData, function (r) { return r.nTr; } );\n\t\tvar i, ien;\n\n\t\t// Flag to note that the table is currently being destroyed - no action\n\t\t// should be taken\n\t\tsettings.bDestroying = true;\n\n\t\t// Fire off the destroy callbacks for plug-ins etc\n\t\t_fnCallbackFire( settings, \"aoDestroyCallback\", \"destroy\", [settings] );\n\n\t\t// If not being removed from the document, make all columns visible\n\t\tif ( ! remove ) {\n\t\t\tnew _Api( settings ).columns().visible( true );\n\t\t}\n\n\t\t// Blitz all `DT` namespaced events (these are internal events, the\n\t\t// lowercase, `dt` events are user subscribed and they are responsible\n\t\t// for removing them\n\t\tjqWrapper.off('.DT').find(':not(tbody *)').off('.DT');\n\t\t$(window).off('.DT-'+settings.sInstance);\n\n\t\t// When scrolling we had to break the table up - restore it\n\t\tif ( table != thead.parentNode ) {\n\t\t\tjqTable.children('thead').detach();\n\t\t\tjqTable.append( thead );\n\t\t}\n\n\t\tif ( tfoot && table != tfoot.parentNode ) {\n\t\t\tjqTable.children('tfoot').detach();\n\t\t\tjqTable.append( tfoot );\n\t\t}\n\n\t\tsettings.aaSorting = [];\n\t\tsettings.aaSortingFixed = [];\n\t\t_fnSortingClasses( settings );\n\n\t\t$( rows ).removeClass( settings.asStripeClasses.join(' ') );\n\n\t\t$('th, td', thead).removeClass( classes.sSortable+' '+\n\t\t\tclasses.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone\n\t\t);\n\n\t\t// Add the TR elements back into the table in their original order\n\t\tjqTbody.children().detach();\n\t\tjqTbody.append( rows );\n\n\t\tvar orig = settings.nTableWrapper.parentNode;\n\n\t\t// Remove the DataTables generated nodes, events and classes\n\t\tvar removedMethod = remove ? 'remove' : 'detach';\n\t\tjqTable[ removedMethod ]();\n\t\tjqWrapper[ removedMethod ]();\n\n\t\t// If we need to reattach the table to the document\n\t\tif ( ! remove && orig ) {\n\t\t\t// insertBefore acts like appendChild if !arg[1]\n\t\t\torig.insertBefore( table, settings.nTableReinsertBefore );\n\n\t\t\t// Restore the width of the original table - was read from the style property,\n\t\t\t// so we can restore directly to that\n\t\t\tjqTable\n\t\t\t\t.css( 'width', settings.sDestroyWidth )\n\t\t\t\t.removeClass( classes.sTable );\n\n\t\t\t// If the were originally stripe classes - then we add them back here.\n\t\t\t// Note this is not fool proof (for example if not all rows had stripe\n\t\t\t// classes - but it's a good effort without getting carried away\n\t\t\tien = settings.asDestroyStripes.length;\n\n\t\t\tif ( ien ) {\n\t\t\t\tjqTbody.children().each( function (i) {\n\t\t\t\t\t$(this).addClass( settings.asDestroyStripes[i % ien] );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\t/* Remove the settings object from the settings array */\n\t\tvar idx = $.inArray( settings, DataTable.settings );\n\t\tif ( idx !== -1 ) {\n\t\t\tDataTable.settings.splice( idx, 1 );\n\t\t}\n\t} );\n} );\n\n\n// Add the `every()` method for rows, columns and cells in a compact form\n$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {\n\t_api_register( type+'s().every()', function ( fn ) {\n\t\tvar opts = this.selector.opts;\n\t\tvar api = this;\n\n\t\treturn this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {\n\t\t\t// Rows and columns:\n\t\t\t//  arg1 - index\n\t\t\t//  arg2 - table counter\n\t\t\t//  arg3 - loop counter\n\t\t\t//  arg4 - undefined\n\t\t\t// Cells:\n\t\t\t//  arg1 - row index\n\t\t\t//  arg2 - column index\n\t\t\t//  arg3 - table counter\n\t\t\t//  arg4 - loop counter\n\t\t\tfn.call(\n\t\t\t\tapi[ type ](\n\t\t\t\t\targ1,\n\t\t\t\t\ttype==='cell' ? arg2 : opts,\n\t\t\t\t\ttype==='cell' ? opts : undefined\n\t\t\t\t),\n\t\t\t\targ1, arg2, arg3, arg4\n\t\t\t);\n\t\t} );\n\t} );\n} );\n\n\n// i18n method for extensions to be able to use the language object from the\n// DataTable\n_api_register( 'i18n()', function ( token, def, plural ) {\n\tvar ctx = this.context[0];\n\tvar resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );\n\n\tif ( resolved === undefined ) {\n\t\tresolved = def;\n\t}\n\n\tif ( plural !== undefined && $.isPlainObject( resolved ) ) {\n\t\tresolved = resolved[ plural ] !== undefined ?\n\t\t\tresolved[ plural ] :\n\t\t\tresolved._;\n\t}\n\n\treturn resolved.replace( '%d', plural ); // nb: plural might be undefined,\n} );\n/**\n * Version string for plug-ins to check compatibility. Allowed format is\n * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used\n * only for non-release builds. See http://semver.org/ for more information.\n *  @member\n *  @type string\n *  @default Version number\n */\nDataTable.version = \"1.13.4\";\n\n/**\n * Private data store, containing all of the settings objects that are\n * created for the tables on a given page.\n *\n * Note that the `DataTable.settings` object is aliased to\n * `jQuery.fn.dataTableExt` through which it may be accessed and\n * manipulated, or `jQuery.fn.dataTable.settings`.\n *  @member\n *  @type array\n *  @default []\n *  @private\n */\nDataTable.settings = [];\n\n/**\n * Object models container, for the various models that DataTables has\n * available to it. These models define the objects that are used to hold\n * the active state and configuration of the table.\n *  @namespace\n */\nDataTable.models = {};\n\n\n\n/**\n * Template object for the way in which DataTables holds information about\n * search information for the global filter and individual column filters.\n *  @namespace\n */\nDataTable.models.oSearch = {\n\t/**\n\t * Flag to indicate if the filtering should be case insensitive or not\n\t *  @type boolean\n\t *  @default true\n\t */\n\t\"bCaseInsensitive\": true,\n\n\t/**\n\t * Applied search term\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t */\n\t\"sSearch\": \"\",\n\n\t/**\n\t * Flag to indicate if the search term should be interpreted as a\n\t * regular expression (true) or not (false) and therefore and special\n\t * regex characters escaped.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bRegex\": false,\n\n\t/**\n\t * Flag to indicate if DataTables is to use its smart filtering or not.\n\t *  @type boolean\n\t *  @default true\n\t */\n\t\"bSmart\": true,\n\n\t/**\n\t * Flag to indicate if DataTables should only trigger a search when\n\t * the return key is pressed.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"return\": false\n};\n\n\n\n\n/**\n * Template object for the way in which DataTables holds information about\n * each individual row. This is the object format used for the settings\n * aoData array.\n *  @namespace\n */\nDataTable.models.oRow = {\n\t/**\n\t * TR element for the row\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTr\": null,\n\n\t/**\n\t * Array of TD elements for each row. This is null until the row has been\n\t * created.\n\t *  @type array nodes\n\t *  @default []\n\t */\n\t\"anCells\": null,\n\n\t/**\n\t * Data object from the original data source for the row. This is either\n\t * an array if using the traditional form of DataTables, or an object if\n\t * using mData options. The exact type will depend on the passed in\n\t * data from the data source, or will be an array if using DOM a data\n\t * source.\n\t *  @type array|object\n\t *  @default []\n\t */\n\t\"_aData\": [],\n\n\t/**\n\t * Sorting data cache - this array is ostensibly the same length as the\n\t * number of columns (although each index is generated only as it is\n\t * needed), and holds the data that is used for sorting each column in the\n\t * row. We do this cache generation at the start of the sort in order that\n\t * the formatting of the sort data need be done only once for each cell\n\t * per sort. This array should not be read from or written to by anything\n\t * other than the master sorting methods.\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_aSortData\": null,\n\n\t/**\n\t * Per cell filtering data cache. As per the sort data cache, used to\n\t * increase the performance of the filtering in DataTables\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_aFilterData\": null,\n\n\t/**\n\t * Filtering data cache. This is the same as the cell filtering cache, but\n\t * in this case a string rather than an array. This is easily computed with\n\t * a join on `_aFilterData`, but is provided as a cache so the join isn't\n\t * needed on every search (memory traded for performance)\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_sFilterRow\": null,\n\n\t/**\n\t * Cache of the class name that DataTables has applied to the row, so we\n\t * can quickly look at this variable rather than needing to do a DOM check\n\t * on className for the nTr property.\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *  @private\n\t */\n\t\"_sRowStripe\": \"\",\n\n\t/**\n\t * Denote if the original data source was from the DOM, or the data source\n\t * object. This is used for invalidating data, so DataTables can\n\t * automatically read data from the original source, unless uninstructed\n\t * otherwise.\n\t *  @type string\n\t *  @default null\n\t *  @private\n\t */\n\t\"src\": null,\n\n\t/**\n\t * Index in the aoData array. This saves an indexOf lookup when we have the\n\t * object, but want to know the index\n\t *  @type integer\n\t *  @default -1\n\t *  @private\n\t */\n\t\"idx\": -1\n};\n\n\n/**\n * Template object for the column information object in DataTables. This object\n * is held in the settings aoColumns array and contains all the information that\n * DataTables needs about each individual column.\n *\n * Note that this object is related to {@link DataTable.defaults.column}\n * but this one is the internal data store for DataTables's cache of columns.\n * It should NOT be manipulated outside of DataTables. Any configuration should\n * be done through the initialisation options.\n *  @namespace\n */\nDataTable.models.oColumn = {\n\t/**\n\t * Column index. This could be worked out on-the-fly with $.inArray, but it\n\t * is faster to just hold it as a variable\n\t *  @type integer\n\t *  @default null\n\t */\n\t\"idx\": null,\n\n\t/**\n\t * A list of the columns that sorting should occur on when this column\n\t * is sorted. That this property is an array allows multi-column sorting\n\t * to be defined for a column (for example first name / last name columns\n\t * would benefit from this). The values are integers pointing to the\n\t * columns to be sorted on (typically it will be a single integer pointing\n\t * at itself, but that doesn't need to be the case).\n\t *  @type array\n\t */\n\t\"aDataSort\": null,\n\n\t/**\n\t * Define the sorting directions that are applied to the column, in sequence\n\t * as the column is repeatedly sorted upon - i.e. the first value is used\n\t * as the sorting direction when the column if first sorted (clicked on).\n\t * Sort it again (click again) and it will move on to the next index.\n\t * Repeat until loop.\n\t *  @type array\n\t */\n\t\"asSorting\": null,\n\n\t/**\n\t * Flag to indicate if the column is searchable, and thus should be included\n\t * in the filtering or not.\n\t *  @type boolean\n\t */\n\t\"bSearchable\": null,\n\n\t/**\n\t * Flag to indicate if the column is sortable or not.\n\t *  @type boolean\n\t */\n\t\"bSortable\": null,\n\n\t/**\n\t * Flag to indicate if the column is currently visible in the table or not\n\t *  @type boolean\n\t */\n\t\"bVisible\": null,\n\n\t/**\n\t * Store for manual type assignment using the `column.type` option. This\n\t * is held in store so we can manipulate the column's `sType` property.\n\t *  @type string\n\t *  @default null\n\t *  @private\n\t */\n\t\"_sManualType\": null,\n\n\t/**\n\t * Flag to indicate if HTML5 data attributes should be used as the data\n\t * source for filtering or sorting. True is either are.\n\t *  @type boolean\n\t *  @default false\n\t *  @private\n\t */\n\t\"_bAttrSrc\": false,\n\n\t/**\n\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t * allowing you to modify the DOM element (add background colour for example) when the\n\t * element is available.\n\t *  @type function\n\t *  @param {element} nTd The TD node that has been created\n\t *  @param {*} sData The Data for the cell\n\t *  @param {array|object} oData The data for the whole row\n\t *  @param {int} iRow The row index for the aoData data store\n\t *  @default null\n\t */\n\t\"fnCreatedCell\": null,\n\n\t/**\n\t * Function to get data from a cell in a column. You should <b>never</b>\n\t * access data directly through _aData internally in DataTables - always use\n\t * the method attached to this property. It allows mData to function as\n\t * required. This function is automatically assigned by the column\n\t * initialisation method\n\t *  @type function\n\t *  @param {array|object} oData The data array/object for the array\n\t *    (i.e. aoData[]._aData)\n\t *  @param {string} sSpecific The specific data type you want to get -\n\t *    'display', 'type' 'filter' 'sort'\n\t *  @returns {*} The data for the cell from the given row's data\n\t *  @default null\n\t */\n\t\"fnGetData\": null,\n\n\t/**\n\t * Function to set data for a cell in the column. You should <b>never</b>\n\t * set the data directly to _aData internally in DataTables - always use\n\t * this method. It allows mData to function as required. This function\n\t * is automatically assigned by the column initialisation method\n\t *  @type function\n\t *  @param {array|object} oData The data array/object for the array\n\t *    (i.e. aoData[]._aData)\n\t *  @param {*} sValue Value to set\n\t *  @default null\n\t */\n\t\"fnSetData\": null,\n\n\t/**\n\t * Property to read the value for the cells in the column from the data\n\t * source array / object. If null, then the default content is used, if a\n\t * function is given then the return from the function is used.\n\t *  @type function|int|string|null\n\t *  @default null\n\t */\n\t\"mData\": null,\n\n\t/**\n\t * Partner property to mData which is used (only when defined) to get\n\t * the data - i.e. it is basically the same as mData, but without the\n\t * 'set' option, and also the data fed to it is the result from mData.\n\t * This is the rendering method to match the data method of mData.\n\t *  @type function|int|string|null\n\t *  @default null\n\t */\n\t\"mRender\": null,\n\n\t/**\n\t * Unique header TH/TD element for this column - this is what the sorting\n\t * listener is attached to (if sorting is enabled.)\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTh\": null,\n\n\t/**\n\t * Unique footer TH/TD element for this column (if there is one). Not used\n\t * in DataTables as such, but can be used for plug-ins to reference the\n\t * footer for each column.\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTf\": null,\n\n\t/**\n\t * The class to apply to all TD elements in the table's TBODY for the column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sClass\": null,\n\n\t/**\n\t * When DataTables calculates the column widths to assign to each column,\n\t * it finds the longest string in each column and then constructs a\n\t * temporary table and reads the widths from that. The problem with this\n\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t * string - thus the calculation can go wrong (doing it properly and putting\n\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t * a \"work around\" we provide this option. It will append its value to the\n\t * text that is found to be the longest string for the column - i.e. padding.\n\t *  @type string\n\t */\n\t\"sContentPadding\": null,\n\n\t/**\n\t * Allows a default value to be given for a column's data, and will be used\n\t * whenever a null data source is encountered (this can be because mData\n\t * is set to null, or because the data source itself is null).\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sDefaultContent\": null,\n\n\t/**\n\t * Name for the column, allowing reference to the column by name as well as\n\t * by index (needs a lookup to work by name).\n\t *  @type string\n\t */\n\t\"sName\": null,\n\n\t/**\n\t * Custom sorting data type - defines which of the available plug-ins in\n\t * afnSortData the custom sorting will use - if any is defined.\n\t *  @type string\n\t *  @default std\n\t */\n\t\"sSortDataType\": 'std',\n\n\t/**\n\t * Class to be applied to the header element when sorting on this column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sSortingClass\": null,\n\n\t/**\n\t * Class to be applied to the header element when sorting on this column -\n\t * when jQuery UI theming is used.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sSortingClassJUI\": null,\n\n\t/**\n\t * Title of the column - what is seen in the TH element (nTh).\n\t *  @type string\n\t */\n\t\"sTitle\": null,\n\n\t/**\n\t * Column sorting and filtering type\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sType\": null,\n\n\t/**\n\t * Width of the column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sWidth\": null,\n\n\t/**\n\t * Width of the column when it was first \"encountered\"\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sWidthOrig\": null\n};\n\n\n/*\n * Developer note: The properties of the object below are given in Hungarian\n * notation, that was used as the interface for DataTables prior to v1.10, however\n * from v1.10 onwards the primary interface is camel case. In order to avoid\n * breaking backwards compatibility utterly with this change, the Hungarian\n * version is still, internally the primary interface, but is is not documented\n * - hence the @name tags in each doc comment. This allows a Javascript function\n * to create a map from Hungarian notation to camel case (going the other direction\n * would require each property to be listed, which would add around 3K to the size\n * of DataTables, while this method is about a 0.5K hit).\n *\n * Ultimately this does pave the way for Hungarian notation to be dropped\n * completely, but that is a massive amount of work and will break current\n * installs (therefore is on-hold until v2).\n */\n\n/**\n * Initialisation options that can be given to DataTables at initialisation\n * time.\n *  @namespace\n */\nDataTable.defaults = {\n\t/**\n\t * An array of data to use for the table, passed in at initialisation which\n\t * will be used in preference to any data which is already in the DOM. This is\n\t * particularly useful for constructing tables purely in Javascript, for\n\t * example with a custom Ajax call.\n\t *  @type array\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.data\n\t *\n\t *  @example\n\t *    // Using a 2D array data source\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"data\": [\n\t *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],\n\t *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],\n\t *        ],\n\t *        \"columns\": [\n\t *          { \"title\": \"Engine\" },\n\t *          { \"title\": \"Browser\" },\n\t *          { \"title\": \"Platform\" },\n\t *          { \"title\": \"Version\" },\n\t *          { \"title\": \"Grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using an array of objects as a data source (`data`)\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"data\": [\n\t *          {\n\t *            \"engine\":   \"Trident\",\n\t *            \"browser\":  \"Internet Explorer 4.0\",\n\t *            \"platform\": \"Win 95+\",\n\t *            \"version\":  4,\n\t *            \"grade\":    \"X\"\n\t *          },\n\t *          {\n\t *            \"engine\":   \"Trident\",\n\t *            \"browser\":  \"Internet Explorer 5.0\",\n\t *            \"platform\": \"Win 95+\",\n\t *            \"version\":  5,\n\t *            \"grade\":    \"C\"\n\t *          }\n\t *        ],\n\t *        \"columns\": [\n\t *          { \"title\": \"Engine\",   \"data\": \"engine\" },\n\t *          { \"title\": \"Browser\",  \"data\": \"browser\" },\n\t *          { \"title\": \"Platform\", \"data\": \"platform\" },\n\t *          { \"title\": \"Version\",  \"data\": \"version\" },\n\t *          { \"title\": \"Grade\",    \"data\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"aaData\": null,\n\n\n\t/**\n\t * If ordering is enabled, then DataTables will perform a first pass sort on\n\t * initialisation. You can define which column(s) the sort is performed\n\t * upon, and the sorting direction, with this variable. The `sorting` array\n\t * should contain an array for each column to be sorted initially containing\n\t * the column's index and a direction string ('asc' or 'desc').\n\t *  @type array\n\t *  @default [[0,'asc']]\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.order\n\t *\n\t *  @example\n\t *    // Sort by 3rd column first, and then 4th column\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"order\": [[2,'asc'], [3,'desc']]\n\t *      } );\n\t *    } );\n\t *\n\t *    // No initial sorting\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"order\": []\n\t *      } );\n\t *    } );\n\t */\n\t\"aaSorting\": [[0,'asc']],\n\n\n\t/**\n\t * This parameter is basically identical to the `sorting` parameter, but\n\t * cannot be overridden by user interaction with the table. What this means\n\t * is that you could have a column (visible or hidden) which the sorting\n\t * will always be forced on first - any sorting after that (from the user)\n\t * will then be performed as required. This can be useful for grouping rows\n\t * together.\n\t *  @type array\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.orderFixed\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"orderFixed\": [[0,'asc']]\n\t *      } );\n\t *    } )\n\t */\n\t\"aaSortingFixed\": [],\n\n\n\t/**\n\t * DataTables can be instructed to load data to display in the table from a\n\t * Ajax source. This option defines how that Ajax call is made and where to.\n\t *\n\t * The `ajax` property has three different modes of operation, depending on\n\t * how it is defined. These are:\n\t *\n\t * * `string` - Set the URL from where the data should be loaded from.\n\t * * `object` - Define properties for `jQuery.ajax`.\n\t * * `function` - Custom data get function\n\t *\n\t * `string`\n\t * --------\n\t *\n\t * As a string, the `ajax` property simply defines the URL from which\n\t * DataTables will load data.\n\t *\n\t * `object`\n\t * --------\n\t *\n\t * As an object, the parameters in the object are passed to\n\t * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control\n\t * of the Ajax request. DataTables has a number of default parameters which\n\t * you can override using this option. Please refer to the jQuery\n\t * documentation for a full description of the options available, although\n\t * the following parameters provide additional options in DataTables or\n\t * require special consideration:\n\t *\n\t * * `data` - As with jQuery, `data` can be provided as an object, but it\n\t *   can also be used as a function to manipulate the data DataTables sends\n\t *   to the server. The function takes a single parameter, an object of\n\t *   parameters with the values that DataTables has readied for sending. An\n\t *   object may be returned which will be merged into the DataTables\n\t *   defaults, or you can add the items to the object that was passed in and\n\t *   not return anything from the function. This supersedes `fnServerParams`\n\t *   from DataTables 1.9-.\n\t *\n\t * * `dataSrc` - By default DataTables will look for the property `data` (or\n\t *   `aaData` for compatibility with DataTables 1.9-) when obtaining data\n\t *   from an Ajax source or for server-side processing - this parameter\n\t *   allows that property to be changed. You can use Javascript dotted\n\t *   object notation to get a data source for multiple levels of nesting, or\n\t *   it my be used as a function. As a function it takes a single parameter,\n\t *   the JSON returned from the server, which can be manipulated as\n\t *   required, with the returned value being that used by DataTables as the\n\t *   data source for the table. This supersedes `sAjaxDataProp` from\n\t *   DataTables 1.9-.\n\t *\n\t * * `success` - Should not be overridden it is used internally in\n\t *   DataTables. To manipulate / transform the data returned by the server\n\t *   use `ajax.dataSrc`, or use `ajax` as a function (see below).\n\t *\n\t * `function`\n\t * ----------\n\t *\n\t * As a function, making the Ajax call is left up to yourself allowing\n\t * complete control of the Ajax request. Indeed, if desired, a method other\n\t * than Ajax could be used to obtain the required data, such as Web storage\n\t * or an AIR database.\n\t *\n\t * The function is given four parameters and no return is required. The\n\t * parameters are:\n\t *\n\t * 1. _object_ - Data to send to the server\n\t * 2. _function_ - Callback function that must be executed when the required\n\t *    data has been obtained. That data should be passed into the callback\n\t *    as the only parameter\n\t * 3. _object_ - DataTables settings object for the table\n\t *\n\t * Note that this supersedes `fnServerData` from DataTables 1.9-.\n\t *\n\t *  @type string|object|function\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.ajax\n\t *  @since 1.10.0\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax.\n\t *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": \"data.json\"\n\t *   } );\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax, using `dataSrc` to change\n\t *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": \"tableData\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax, using `dataSrc` to read data\n\t *   // from a plain array rather than an array in an object\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": \"\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Manipulate the data returned from the server - add a link to data\n\t *   // (note this can, should, be done using `render` for the column - this\n\t *   // is just a simple example of how the data can be manipulated).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": function ( json ) {\n\t *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {\n\t *           json[i][0] = '<a href=\"/message/'+json[i][0]+'>View message</a>';\n\t *         }\n\t *         return json;\n\t *       }\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Add data to the request\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"data\": function ( d ) {\n\t *         return {\n\t *           \"extra_search\": $('#extra').val()\n\t *         };\n\t *       }\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Send request as POST\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"type\": \"POST\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Get the data from localStorage (could interface with a form for\n\t *   // adding, editing and removing rows).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": function (data, callback, settings) {\n\t *       callback(\n\t *         JSON.parse( localStorage.getItem('dataTablesData') )\n\t *       );\n\t *     }\n\t *   } );\n\t */\n\t\"ajax\": null,\n\n\n\t/**\n\t * This parameter allows you to readily specify the entries in the length drop\n\t * down menu that DataTables shows when pagination is enabled. It can be\n\t * either a 1D array of options which will be used for both the displayed\n\t * option and the value, or a 2D array which will use the array in the first\n\t * position as the value, and the array in the second position as the\n\t * displayed options (useful for language strings such as 'All').\n\t *\n\t * Note that the `pageLength` property will be automatically set to the\n\t * first value given in this array, unless `pageLength` is also provided.\n\t *  @type array\n\t *  @default [ 10, 25, 50, 100 ]\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.lengthMenu\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"lengthMenu\": [[10, 25, 50, -1], [10, 25, 50, \"All\"]]\n\t *      } );\n\t *    } );\n\t */\n\t\"aLengthMenu\": [ 10, 25, 50, 100 ],\n\n\n\t/**\n\t * The `columns` option in the initialisation parameter allows you to define\n\t * details about the way individual columns behave. For a full list of\n\t * column options that can be set, please see\n\t * {@link DataTable.defaults.column}. Note that if you use `columns` to\n\t * define your columns, you must have an entry in the array for every single\n\t * column that you have in your table (these can be null if you don't which\n\t * to specify any options).\n\t *  @member\n\t *\n\t *  @name DataTable.defaults.column\n\t */\n\t\"aoColumns\": null,\n\n\t/**\n\t * Very similar to `columns`, `columnDefs` allows you to target a specific\n\t * column, multiple columns, or all columns, using the `targets` property of\n\t * each object in the array. This allows great flexibility when creating\n\t * tables, as the `columnDefs` arrays can be of any length, targeting the\n\t * columns you specifically want. `columnDefs` may use any of the column\n\t * options available: {@link DataTable.defaults.column}, but it _must_\n\t * have `targets` defined in each object in the array. Values in the `targets`\n\t * array may be:\n\t *   <ul>\n\t *     <li>a string - class name will be matched on the TH for the column</li>\n\t *     <li>0 or a positive integer - column index counting from the left</li>\n\t *     <li>a negative integer - column index counting from the right</li>\n\t *     <li>the string \"_all\" - all columns (i.e. assign a default)</li>\n\t *   </ul>\n\t *  @member\n\t *\n\t *  @name DataTable.defaults.columnDefs\n\t */\n\t\"aoColumnDefs\": null,\n\n\n\t/**\n\t * Basically the same as `search`, this parameter defines the individual column\n\t * filtering state at initialisation time. The array must be of the same size\n\t * as the number of columns, and each element be an object with the parameters\n\t * `search` and `escapeRegex` (the latter is optional). 'null' is also\n\t * accepted and the default will be used.\n\t *  @type array\n\t *  @default []\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.searchCols\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"searchCols\": [\n\t *          null,\n\t *          { \"search\": \"My filter\" },\n\t *          null,\n\t *          { \"search\": \"^[0-9]\", \"escapeRegex\": false }\n\t *        ]\n\t *      } );\n\t *    } )\n\t */\n\t\"aoSearchCols\": [],\n\n\n\t/**\n\t * An array of CSS classes that should be applied to displayed rows. This\n\t * array may be of any length, and DataTables will apply each class\n\t * sequentially, looping when required.\n\t *  @type array\n\t *  @default null <i>Will take the values determined by the `oClasses.stripe*`\n\t *    options</i>\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.stripeClasses\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stripeClasses\": [ 'strip1', 'strip2', 'strip3' ]\n\t *      } );\n\t *    } )\n\t */\n\t\"asStripeClasses\": null,\n\n\n\t/**\n\t * Enable or disable automatic column width calculation. This can be disabled\n\t * as an optimisation (it takes some time to calculate the widths) if the\n\t * tables widths are passed in using `columns`.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.autoWidth\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"autoWidth\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bAutoWidth\": true,\n\n\n\t/**\n\t * Deferred rendering can provide DataTables with a huge speed boost when you\n\t * are using an Ajax or JS data source for the table. This option, when set to\n\t * true, will cause DataTables to defer the creation of the table elements for\n\t * each row until they are needed for a draw - saving a significant amount of\n\t * time.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.deferRender\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajax\": \"sources/arrays.txt\",\n\t *        \"deferRender\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bDeferRender\": false,\n\n\n\t/**\n\t * Replace a DataTable which matches the given selector and replace it with\n\t * one which has the properties of the new initialisation object passed. If no\n\t * table matches the selector, then the new DataTable will be constructed as\n\t * per normal.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.destroy\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"srollY\": \"200px\",\n\t *        \"paginate\": false\n\t *      } );\n\t *\n\t *      // Some time later....\n\t *      $('#example').dataTable( {\n\t *        \"filter\": false,\n\t *        \"destroy\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bDestroy\": false,\n\n\n\t/**\n\t * Enable or disable filtering of data. Filtering in DataTables is \"smart\" in\n\t * that it allows the end user to input multiple words (space separated) and\n\t * will match a row containing those words, even if not in the order that was\n\t * specified (this allow matching across multiple columns). Note that if you\n\t * wish to use filtering in DataTables this must remain 'true' - to remove the\n\t * default filtering input box and retain filtering abilities, please use\n\t * {@link DataTable.defaults.dom}.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.searching\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"searching\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bFilter\": true,\n\n\n\t/**\n\t * Enable or disable the table information display. This shows information\n\t * about the data that is currently visible on the page, including information\n\t * about filtered data if that action is being performed.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.info\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"info\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bInfo\": true,\n\n\n\t/**\n\t * Allows the end user to select the size of a formatted page from a select\n\t * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.lengthChange\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"lengthChange\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bLengthChange\": true,\n\n\n\t/**\n\t * Enable or disable pagination.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.paging\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"paging\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bPaginate\": true,\n\n\n\t/**\n\t * Enable or disable the display of a 'processing' indicator when the table is\n\t * being processed (e.g. a sort). This is particularly useful for tables with\n\t * large amounts of data where it can take a noticeable amount of time to sort\n\t * the entries.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.processing\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"processing\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bProcessing\": false,\n\n\n\t/**\n\t * Retrieve the DataTables object for the given selector. Note that if the\n\t * table has already been initialised, this parameter will cause DataTables\n\t * to simply return the object that has already been set up - it will not take\n\t * account of any changes you might have made to the initialisation object\n\t * passed to DataTables (setting this parameter to true is an acknowledgement\n\t * that you understand this). `destroy` can be used to reinitialise a table if\n\t * you need.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.retrieve\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      initTable();\n\t *      tableActions();\n\t *    } );\n\t *\n\t *    function initTable ()\n\t *    {\n\t *      return $('#example').dataTable( {\n\t *        \"scrollY\": \"200px\",\n\t *        \"paginate\": false,\n\t *        \"retrieve\": true\n\t *      } );\n\t *    }\n\t *\n\t *    function tableActions ()\n\t *    {\n\t *      var table = initTable();\n\t *      // perform API operations with oTable\n\t *    }\n\t */\n\t\"bRetrieve\": false,\n\n\n\t/**\n\t * When vertical (y) scrolling is enabled, DataTables will force the height of\n\t * the table's viewport to the given height at all times (useful for layout).\n\t * However, this can look odd when filtering data down to a small data set,\n\t * and the footer is left \"floating\" further down. This parameter (when\n\t * enabled) will cause DataTables to collapse the table's viewport down when\n\t * the result set will fit within the given Y height.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.scrollCollapse\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollY\": \"200\",\n\t *        \"scrollCollapse\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bScrollCollapse\": false,\n\n\n\t/**\n\t * Configure DataTables to use server-side processing. Note that the\n\t * `ajax` parameter must also be given in order to give DataTables a\n\t * source to obtain the required data for each draw.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverSide\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"xhr.php\"\n\t *      } );\n\t *    } );\n\t */\n\t\"bServerSide\": false,\n\n\n\t/**\n\t * Enable or disable sorting of columns. Sorting of individual columns can be\n\t * disabled by the `sortable` option for each column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.ordering\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"ordering\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSort\": true,\n\n\n\t/**\n\t * Enable or display DataTables' ability to sort multiple columns at the\n\t * same time (activated by shift-click by the user).\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.orderMulti\n\t *\n\t *  @example\n\t *    // Disable multiple column sorting ability\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"orderMulti\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortMulti\": true,\n\n\n\t/**\n\t * Allows control over whether DataTables should use the top (true) unique\n\t * cell that is found for a single column, or the bottom (false - default).\n\t * This is useful when using complex headers.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.orderCellsTop\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"orderCellsTop\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortCellsTop\": false,\n\n\n\t/**\n\t * Enable or disable the addition of the classes `sorting\\_1`, `sorting\\_2` and\n\t * `sorting\\_3` to the columns which are currently being sorted on. This is\n\t * presented as a feature switch as it can increase processing time (while\n\t * classes are removed and added) so for large data sets you might want to\n\t * turn this off.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.orderClasses\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"orderClasses\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortClasses\": true,\n\n\n\t/**\n\t * Enable or disable state saving. When enabled HTML5 `localStorage` will be\n\t * used to save table display information such as pagination information,\n\t * display length, filtering and sorting. As such when the end user reloads\n\t * the page the display display will match what thy had previously set up.\n\t *\n\t * Due to the use of `localStorage` the default state saving is not supported\n\t * in IE6 or 7. If state saving is required in those browsers, use\n\t * `stateSaveCallback` to provide a storage solution such as cookies.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.stateSave\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bStateSave\": false,\n\n\n\t/**\n\t * This function is called when a TR element is created (and all TD child\n\t * elements have been inserted), or registered if using a DOM source, allowing\n\t * manipulation of the TR element (adding classes etc).\n\t *  @type function\n\t *  @param {node} row \"TR\" element for the current row\n\t *  @param {array} data Raw data array for this row\n\t *  @param {int} dataIndex The index of this row in the internal aoData array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.createdRow\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"createdRow\": function( row, data, dataIndex ) {\n\t *          // Bold the grade for all 'A' grade browsers\n\t *          if ( data[4] == \"A\" )\n\t *          {\n\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnCreatedRow\": null,\n\n\n\t/**\n\t * This function is called on every 'draw' event, and allows you to\n\t * dynamically modify any aspect you want about the created DOM.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.drawCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"drawCallback\": function( settings ) {\n\t *          alert( 'DataTables has redrawn the table' );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnDrawCallback\": null,\n\n\n\t/**\n\t * Identical to fnHeaderCallback() but for the table footer this function\n\t * allows you to modify the table footer on every 'draw' event.\n\t *  @type function\n\t *  @param {node} foot \"TR\" element for the footer\n\t *  @param {array} data Full table data (as derived from the original HTML)\n\t *  @param {int} start Index for the current display starting point in the\n\t *    display array\n\t *  @param {int} end Index for the current display ending point in the\n\t *    display array\n\t *  @param {array int} display Index array to translate the visual position\n\t *    to the full data array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.footerCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"footerCallback\": function( tfoot, data, start, end, display ) {\n\t *          tfoot.getElementsByTagName('th')[0].innerHTML = \"Starting index is \"+start;\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnFooterCallback\": null,\n\n\n\t/**\n\t * When rendering large numbers in the information element for the table\n\t * (i.e. \"Showing 1 to 10 of 57 entries\") DataTables will render large numbers\n\t * to have a comma separator for the 'thousands' units (e.g. 1 million is\n\t * rendered as \"1,000,000\") to help readability for the end user. This\n\t * function will override the default method DataTables uses.\n\t *  @type function\n\t *  @member\n\t *  @param {int} toFormat number to be formatted\n\t *  @returns {string} formatted string for DataTables to show the number\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.formatNumber\n\t *\n\t *  @example\n\t *    // Format a number using a single quote for the separator (note that\n\t *    // this can also be done with the language.thousands option)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"formatNumber\": function ( toFormat ) {\n\t *          return toFormat.toString().replace(\n\t *            /\\B(?=(\\d{3})+(?!\\d))/g, \"'\"\n\t *          );\n\t *        };\n\t *      } );\n\t *    } );\n\t */\n\t\"fnFormatNumber\": function ( toFormat ) {\n\t\treturn toFormat.toString().replace(\n\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g,\n\t\t\tthis.oLanguage.sThousands\n\t\t);\n\t},\n\n\n\t/**\n\t * This function is called on every 'draw' event, and allows you to\n\t * dynamically modify the header row. This can be used to calculate and\n\t * display useful information about the table.\n\t *  @type function\n\t *  @param {node} head \"TR\" element for the header\n\t *  @param {array} data Full table data (as derived from the original HTML)\n\t *  @param {int} start Index for the current display starting point in the\n\t *    display array\n\t *  @param {int} end Index for the current display ending point in the\n\t *    display array\n\t *  @param {array int} display Index array to translate the visual position\n\t *    to the full data array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.headerCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"fheaderCallback\": function( head, data, start, end, display ) {\n\t *          head.getElementsByTagName('th')[0].innerHTML = \"Displaying \"+(end-start)+\" records\";\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnHeaderCallback\": null,\n\n\n\t/**\n\t * The information element can be used to convey information about the current\n\t * state of the table. Although the internationalisation options presented by\n\t * DataTables are quite capable of dealing with most customisations, there may\n\t * be times where you wish to customise the string further. This callback\n\t * allows you to do exactly that.\n\t *  @type function\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {int} start Starting position in data for the draw\n\t *  @param {int} end End position in data for the draw\n\t *  @param {int} max Total number of rows in the table (regardless of\n\t *    filtering)\n\t *  @param {int} total Total number of rows in the data set, after filtering\n\t *  @param {string} pre The string that DataTables has formatted using it's\n\t *    own rules\n\t *  @returns {string} The string to be displayed in the information element.\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.infoCallback\n\t *\n\t *  @example\n\t *    $('#example').dataTable( {\n\t *      \"infoCallback\": function( settings, start, end, max, total, pre ) {\n\t *        return start +\" to \"+ end;\n\t *      }\n\t *    } );\n\t */\n\t\"fnInfoCallback\": null,\n\n\n\t/**\n\t * Called when the table has been initialised. Normally DataTables will\n\t * initialise sequentially and there will be no need for this function,\n\t * however, this does not hold true when using external language information\n\t * since that is obtained using an async XHR call.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} json The JSON object request from the server - only\n\t *    present if client-side Ajax sourced data is used\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.initComplete\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"initComplete\": function(settings, json) {\n\t *          alert( 'DataTables has finished its initialisation.' );\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnInitComplete\": null,\n\n\n\t/**\n\t * Called at the very start of each table draw and can be used to cancel the\n\t * draw by returning false, any other return (including undefined) results in\n\t * the full draw occurring).\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @returns {boolean} False will cancel the draw, anything else (including no\n\t *    return) will allow it to complete.\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.preDrawCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"preDrawCallback\": function( settings ) {\n\t *          if ( $('#test').val() == 1 ) {\n\t *            return false;\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnPreDrawCallback\": null,\n\n\n\t/**\n\t * This function allows you to 'post process' each row after it have been\n\t * generated for each table draw, but before it is rendered on screen. This\n\t * function might be used for setting the row class name etc.\n\t *  @type function\n\t *  @param {node} row \"TR\" element for the current row\n\t *  @param {array} data Raw data array for this row\n\t *  @param {int} displayIndex The display index for the current table draw\n\t *  @param {int} displayIndexFull The index of the data in the full list of\n\t *    rows (after filtering)\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.rowCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"rowCallback\": function( row, data, displayIndex, displayIndexFull ) {\n\t *          // Bold the grade for all 'A' grade browsers\n\t *          if ( data[4] == \"A\" ) {\n\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnRowCallback\": null,\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * This parameter allows you to override the default function which obtains\n\t * the data from the server so something more suitable for your application.\n\t * For example you could use POST data, or pull information from a Gears or\n\t * AIR database.\n\t *  @type function\n\t *  @member\n\t *  @param {string} source HTTP source to obtain the data from (`ajax`)\n\t *  @param {array} data A key/value pair object containing the data to send\n\t *    to the server\n\t *  @param {function} callback to be called on completion of the data get\n\t *    process that will draw the data on the page.\n\t *  @param {object} settings DataTables settings object\n\t *\n\t *  @dtopt Callbacks\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverData\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"fnServerData\": null,\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t *  It is often useful to send extra data to the server when making an Ajax\n\t * request - for example custom filtering information, and this callback\n\t * function makes it trivial to send extra information to the server. The\n\t * passed in parameter is the data set that has been constructed by\n\t * DataTables, and you can add to this or modify it as you require.\n\t *  @type function\n\t *  @param {array} data Data array (array of objects which are name/value\n\t *    pairs) that has been constructed by DataTables and will be sent to the\n\t *    server. In the case of Ajax sourced data with server-side processing\n\t *    this will be an empty array, for server-side processing there will be a\n\t *    significant number of parameters!\n\t *  @returns {undefined} Ensure that you modify the data array passed in,\n\t *    as this is passed by reference.\n\t *\n\t *  @dtopt Callbacks\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverParams\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"fnServerParams\": null,\n\n\n\t/**\n\t * Load the table state. With this function you can define from where, and how, the\n\t * state of a table is loaded. By default DataTables will load from `localStorage`\n\t * but you might wish to use a server-side database or cookies.\n\t *  @type function\n\t *  @member\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} callback Callback that can be executed when done. It\n\t *    should be passed the loaded state object.\n\t *  @return {object} The DataTables state object to be loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoadCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadCallback\": function (settings, callback) {\n\t *          $.ajax( {\n\t *            \"url\": \"/state_load\",\n\t *            \"dataType\": \"json\",\n\t *            \"success\": function (json) {\n\t *              callback( json );\n\t *            }\n\t *          } );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoadCallback\": function ( settings ) {\n\t\ttry {\n\t\t\treturn JSON.parse(\n\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(\n\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname\n\t\t\t\t)\n\t\t\t);\n\t\t} catch (e) {\n\t\t\treturn {};\n\t\t}\n\t},\n\n\n\t/**\n\t * Callback which allows modification of the saved state prior to loading that state.\n\t * This callback is called when the table is loading state from the stored data, but\n\t * prior to the settings object being modified by the saved state. Note that for\n\t * plug-in authors, you should use the `stateLoadParams` event to load parameters for\n\t * a plug-in.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object that is to be loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoadParams\n\t *\n\t *  @example\n\t *    // Remove a saved filter, so filtering is never loaded\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadParams\": function (settings, data) {\n\t *          data.oSearch.sSearch = \"\";\n\t *        }\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Disallow state loading by returning false\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadParams\": function (settings, data) {\n\t *          return false;\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoadParams\": null,\n\n\n\t/**\n\t * Callback that is called when the state has been loaded from the state saving method\n\t * and the DataTables settings object has been modified as a result of the loaded state.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object that was loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoaded\n\t *\n\t *  @example\n\t *    // Show an alert with the filtering value that was saved\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoaded\": function (settings, data) {\n\t *          alert( 'Saved filter was: '+data.oSearch.sSearch );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoaded\": null,\n\n\n\t/**\n\t * Save the table state. This function allows you to define where and how the state\n\t * information for the table is stored By default DataTables will use `localStorage`\n\t * but you might wish to use a server-side database or cookies.\n\t *  @type function\n\t *  @member\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object to be saved\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateSaveCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateSaveCallback\": function (settings, data) {\n\t *          // Send an Ajax request to the server with the state object\n\t *          $.ajax( {\n\t *            \"url\": \"/state_save\",\n\t *            \"data\": data,\n\t *            \"dataType\": \"json\",\n\t *            \"method\": \"POST\"\n\t *            \"success\": function () {}\n\t *          } );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateSaveCallback\": function ( settings, data ) {\n\t\ttry {\n\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(\n\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname,\n\t\t\t\tJSON.stringify( data )\n\t\t\t);\n\t\t} catch (e) {}\n\t},\n\n\n\t/**\n\t * Callback which allows modification of the state to be saved. Called when the table\n\t * has changed state a new state save is required. This method allows modification of\n\t * the state saving object prior to actually doing the save, including addition or\n\t * other state properties or modification. Note that for plug-in authors, you should\n\t * use the `stateSaveParams` event to save parameters for a plug-in.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object to be saved\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateSaveParams\n\t *\n\t *  @example\n\t *    // Remove a saved filter, so filtering is never saved\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateSaveParams\": function (settings, data) {\n\t *          data.oSearch.sSearch = \"\";\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateSaveParams\": null,\n\n\n\t/**\n\t * Duration for which the saved state information is considered valid. After this period\n\t * has elapsed the state will be returned to the default.\n\t * Value is given in seconds.\n\t *  @type int\n\t *  @default 7200 <i>(2 hours)</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.stateDuration\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateDuration\": 60*60*24; // 1 day\n\t *      } );\n\t *    } )\n\t */\n\t\"iStateDuration\": 7200,\n\n\n\t/**\n\t * When enabled DataTables will not make a request to the server for the first\n\t * page draw - rather it will use the data already on the page (no sorting etc\n\t * will be applied to it), thus saving on an XHR at load time. `deferLoading`\n\t * is used to indicate that deferred loading is required, but it is also used\n\t * to tell DataTables how many records there are in the full table (allowing\n\t * the information element and pagination to be displayed correctly). In the case\n\t * where a filtering is applied to the table on initial load, this can be\n\t * indicated by giving the parameter as an array, where the first element is\n\t * the number of records available after filtering and the second element is the\n\t * number of records without filtering (allowing the table information element\n\t * to be shown correctly).\n\t *  @type int | array\n\t *  @default null\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.deferLoading\n\t *\n\t *  @example\n\t *    // 57 records available in the table, no filtering applied\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"scripts/server_processing.php\",\n\t *        \"deferLoading\": 57\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // 57 records after filtering, 100 without filtering (an initial filter applied)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"scripts/server_processing.php\",\n\t *        \"deferLoading\": [ 57, 100 ],\n\t *        \"search\": {\n\t *          \"search\": \"my_filter\"\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"iDeferLoading\": null,\n\n\n\t/**\n\t * Number of rows to display on a single page when using pagination. If\n\t * feature enabled (`lengthChange`) then the end user will be able to override\n\t * this to a custom setting using a pop-up menu.\n\t *  @type int\n\t *  @default 10\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.pageLength\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"pageLength\": 50\n\t *      } );\n\t *    } )\n\t */\n\t\"iDisplayLength\": 10,\n\n\n\t/**\n\t * Define the starting point for data display when using DataTables with\n\t * pagination. Note that this parameter is the number of records, rather than\n\t * the page number, so if you have 10 records per page and want to start on\n\t * the third page, it should be \"20\".\n\t *  @type int\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.displayStart\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"displayStart\": 20\n\t *      } );\n\t *    } )\n\t */\n\t\"iDisplayStart\": 0,\n\n\n\t/**\n\t * By default DataTables allows keyboard navigation of the table (sorting, paging,\n\t * and filtering) by adding a `tabindex` attribute to the required elements. This\n\t * allows you to tab through the controls and press the enter key to activate them.\n\t * The tabindex is default 0, meaning that the tab follows the flow of the document.\n\t * You can overrule this using this parameter if you wish. Use a value of -1 to\n\t * disable built-in keyboard navigation.\n\t *  @type int\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.tabIndex\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"tabIndex\": 1\n\t *      } );\n\t *    } );\n\t */\n\t\"iTabIndex\": 0,\n\n\n\t/**\n\t * Classes that DataTables assigns to the various components and features\n\t * that it adds to the HTML table. This allows classes to be configured\n\t * during initialisation in addition to through the static\n\t * {@link DataTable.ext.oStdClasses} object).\n\t *  @namespace\n\t *  @name DataTable.defaults.classes\n\t */\n\t\"oClasses\": {},\n\n\n\t/**\n\t * All strings that DataTables uses in the user interface that it creates\n\t * are defined in this object, allowing you to modified them individually or\n\t * completely replace them all as required.\n\t *  @namespace\n\t *  @name DataTable.defaults.language\n\t */\n\t\"oLanguage\": {\n\t\t/**\n\t\t * Strings that are used for WAI-ARIA labels and controls only (these are not\n\t\t * actually visible on the page, but will be read by screenreaders, and thus\n\t\t * must be internationalised as well).\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language.aria\n\t\t */\n\t\t\"oAria\": {\n\t\t\t/**\n\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t * sorted ascending by activing the column (click or return when focused).\n\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t *  @type string\n\t\t\t *  @default : activate to sort column ascending\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.aria.sortAscending\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"aria\": {\n\t\t\t *            \"sortAscending\": \" - click/return to sort ascending\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSortAscending\": \": activate to sort column ascending\",\n\n\t\t\t/**\n\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t * sorted descending by activing the column (click or return when focused).\n\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t *  @type string\n\t\t\t *  @default : activate to sort column ascending\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.aria.sortDescending\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"aria\": {\n\t\t\t *            \"sortDescending\": \" - click/return to sort descending\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSortDescending\": \": activate to sort column descending\"\n\t\t},\n\n\t\t/**\n\t\t * Pagination string used by DataTables for the built-in pagination\n\t\t * control types.\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language.paginate\n\t\t */\n\t\t\"oPaginate\": {\n\t\t\t/**\n\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t * button to take the user to the first page.\n\t\t\t *  @type string\n\t\t\t *  @default First\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.first\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"first\": \"First page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sFirst\": \"First\",\n\n\n\t\t\t/**\n\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t * button to take the user to the last page.\n\t\t\t *  @type string\n\t\t\t *  @default Last\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.last\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"last\": \"Last page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLast\": \"Last\",\n\n\n\t\t\t/**\n\t\t\t * Text to use for the 'next' pagination button (to take the user to the\n\t\t\t * next page).\n\t\t\t *  @type string\n\t\t\t *  @default Next\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.next\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"next\": \"Next page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sNext\": \"Next\",\n\n\n\t\t\t/**\n\t\t\t * Text to use for the 'previous' pagination button (to take the user to\n\t\t\t * the previous page).\n\t\t\t *  @type string\n\t\t\t *  @default Previous\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.previous\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"previous\": \"Previous page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sPrevious\": \"Previous\"\n\t\t},\n\n\t\t/**\n\t\t * This string is shown in preference to `zeroRecords` when the table is\n\t\t * empty of data (regardless of filtering). Note that this is an optional\n\t\t * parameter - if it is not given, the value of `zeroRecords` will be used\n\t\t * instead (either the default or given value).\n\t\t *  @type string\n\t\t *  @default No data available in table\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.emptyTable\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"emptyTable\": \"No data available in table\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sEmptyTable\": \"No data available in table\",\n\n\n\t\t/**\n\t\t * This string gives information to the end user about the information\n\t\t * that is current on display on the page. The following tokens can be\n\t\t * used in the string and will be dynamically replaced as the table\n\t\t * display updates. This tokens can be placed anywhere in the string, or\n\t\t * removed as needed by the language requires:\n\t\t *\n\t\t * * `\\_START\\_` - Display index of the first record on the current page\n\t\t * * `\\_END\\_` - Display index of the last record on the current page\n\t\t * * `\\_TOTAL\\_` - Number of records in the table after filtering\n\t\t * * `\\_MAX\\_` - Number of records in the table without filtering\n\t\t * * `\\_PAGE\\_` - Current page number\n\t\t * * `\\_PAGES\\_` - Total number of pages of data in the table\n\t\t *\n\t\t *  @type string\n\t\t *  @default Showing _START_ to _END_ of _TOTAL_ entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.info\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"info\": \"Showing page _PAGE_ of _PAGES_\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfo\": \"Showing _START_ to _END_ of _TOTAL_ entries\",\n\n\n\t\t/**\n\t\t * Display information string for when the table is empty. Typically the\n\t\t * format of this string should match `info`.\n\t\t *  @type string\n\t\t *  @default Showing 0 to 0 of 0 entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoEmpty\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoEmpty\": \"No entries to show\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoEmpty\": \"Showing 0 to 0 of 0 entries\",\n\n\n\t\t/**\n\t\t * When a user filters the information in a table, this string is appended\n\t\t * to the information (`info`) to give an idea of how strong the filtering\n\t\t * is. The variable _MAX_ is dynamically updated.\n\t\t *  @type string\n\t\t *  @default (filtered from _MAX_ total entries)\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoFiltered\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoFiltered\": \" - filtering from _MAX_ records\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoFiltered\": \"(filtered from _MAX_ total entries)\",\n\n\n\t\t/**\n\t\t * If can be useful to append extra information to the info string at times,\n\t\t * and this variable does exactly that. This information will be appended to\n\t\t * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are\n\t\t * being used) at all times.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoPostFix\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoPostFix\": \"All records shown are derived from real information.\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoPostFix\": \"\",\n\n\n\t\t/**\n\t\t * This decimal place operator is a little different from the other\n\t\t * language options since DataTables doesn't output floating point\n\t\t * numbers, so it won't ever use this for display of a number. Rather,\n\t\t * what this parameter does is modify the sort methods of the table so\n\t\t * that numbers which are in a format which has a character other than\n\t\t * a period (`.`) as a decimal place will be sorted numerically.\n\t\t *\n\t\t * Note that numbers with different decimal places cannot be shown in\n\t\t * the same table and still be sortable, the table must be consistent.\n\t\t * However, multiple different tables on the page can use different\n\t\t * decimal place characters.\n\t\t *  @type string\n\t\t *  @default \n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.decimal\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"decimal\": \",\"\n\t\t *          \"thousands\": \".\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDecimal\": \"\",\n\n\n\t\t/**\n\t\t * DataTables has a build in number formatter (`formatNumber`) which is\n\t\t * used to format large numbers that are used in the table information.\n\t\t * By default a comma is used, but this can be trivially changed to any\n\t\t * character you wish with this parameter.\n\t\t *  @type string\n\t\t *  @default ,\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.thousands\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"thousands\": \"'\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sThousands\": \",\",\n\n\n\t\t/**\n\t\t * Detail the action that will be taken when the drop down menu for the\n\t\t * pagination length option is changed. The '_MENU_' variable is replaced\n\t\t * with a default select list of 10, 25, 50 and 100, and can be replaced\n\t\t * with a custom select box if required.\n\t\t *  @type string\n\t\t *  @default Show _MENU_ entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.lengthMenu\n\t\t *\n\t\t *  @example\n\t\t *    // Language change only\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"lengthMenu\": \"Display _MENU_ records\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Language and options change\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"lengthMenu\": 'Display <select>'+\n\t\t *            '<option value=\"10\">10</option>'+\n\t\t *            '<option value=\"20\">20</option>'+\n\t\t *            '<option value=\"30\">30</option>'+\n\t\t *            '<option value=\"40\">40</option>'+\n\t\t *            '<option value=\"50\">50</option>'+\n\t\t *            '<option value=\"-1\">All</option>'+\n\t\t *            '</select> records'\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sLengthMenu\": \"Show _MENU_ entries\",\n\n\n\t\t/**\n\t\t * When using Ajax sourced data and during the first draw when DataTables is\n\t\t * gathering the data, this message is shown in an empty row in the table to\n\t\t * indicate to the end user the the data is being loaded. Note that this\n\t\t * parameter is not used when loading data by server-side processing, just\n\t\t * Ajax sourced data with client-side processing.\n\t\t *  @type string\n\t\t *  @default Loading...\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.loadingRecords\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"loadingRecords\": \"Please wait - loading...\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sLoadingRecords\": \"Loading...\",\n\n\n\t\t/**\n\t\t * Text which is displayed when the table is processing a user action\n\t\t * (usually a sort command or similar).\n\t\t *  @type string\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.processing\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"processing\": \"DataTables is currently busy\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sProcessing\": \"\",\n\n\n\t\t/**\n\t\t * Details the actions that will be taken when the user types into the\n\t\t * filtering input text box. The variable \"_INPUT_\", if used in the string,\n\t\t * is replaced with the HTML text box for the filtering input allowing\n\t\t * control over where it appears in the string. If \"_INPUT_\" is not given\n\t\t * then the input box is appended to the string automatically.\n\t\t *  @type string\n\t\t *  @default Search:\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.search\n\t\t *\n\t\t *  @example\n\t\t *    // Input text box will be appended at the end automatically\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"search\": \"Filter records:\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Specify where the filter should appear\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"search\": \"Apply filter _INPUT_ to table\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sSearch\": \"Search:\",\n\n\n\t\t/**\n\t\t * Assign a `placeholder` attribute to the search `input` element\n\t\t *  @type string\n\t\t *  @default \n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.searchPlaceholder\n\t\t */\n\t\t\"sSearchPlaceholder\": \"\",\n\n\n\t\t/**\n\t\t * All of the language information can be stored in a file on the\n\t\t * server-side, which DataTables will look up if this parameter is passed.\n\t\t * It must store the URL of the language file, which is in a JSON format,\n\t\t * and the object has the same properties as the oLanguage object in the\n\t\t * initialiser object (i.e. the above parameters). Please refer to one of\n\t\t * the example language files to see how this works in action.\n\t\t *  @type string\n\t\t *  @default <i>Empty string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.url\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"url\": \"http://www.sprymedia.co.uk/dataTables/lang.txt\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sUrl\": \"\",\n\n\n\t\t/**\n\t\t * Text shown inside the table records when the is no information to be\n\t\t * displayed after filtering. `emptyTable` is shown when there is simply no\n\t\t * information in the table at all (regardless of filtering).\n\t\t *  @type string\n\t\t *  @default No matching records found\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.zeroRecords\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"zeroRecords\": \"No records to display\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sZeroRecords\": \"No matching records found\"\n\t},\n\n\n\t/**\n\t * This parameter allows you to have define the global filtering state at\n\t * initialisation time. As an object the `search` parameter must be\n\t * defined, but all other parameters are optional. When `regex` is true,\n\t * the search string will be treated as a regular expression, when false\n\t * (default) it will be treated as a straight string. When `smart`\n\t * DataTables will use it's smart filtering methods (to word match at\n\t * any point in the data), when false this will not be done.\n\t *  @namespace\n\t *  @extends DataTable.models.oSearch\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.search\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"search\": {\"search\": \"Initial search\"}\n\t *      } );\n\t *    } )\n\t */\n\t\"oSearch\": $.extend( {}, DataTable.models.oSearch ),\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * By default DataTables will look for the property `data` (or `aaData` for\n\t * compatibility with DataTables 1.9-) when obtaining data from an Ajax\n\t * source or for server-side processing - this parameter allows that\n\t * property to be changed. You can use Javascript dotted object notation to\n\t * get a data source for multiple levels of nesting.\n\t *  @type string\n\t *  @default data\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.ajaxDataProp\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sAjaxDataProp\": \"data\",\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * You can instruct DataTables to load data from an external\n\t * source using this parameter (use aData if you want to pass data in you\n\t * already have). Simply provide a url a JSON object can be obtained from.\n\t *  @type string\n\t *  @default null\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.ajaxSource\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sAjaxSource\": null,\n\n\n\t/**\n\t * This initialisation variable allows you to specify exactly where in the\n\t * DOM you want DataTables to inject the various controls it adds to the page\n\t * (for example you might want the pagination controls at the top of the\n\t * table). DIV elements (with or without a custom class) can also be added to\n\t * aid styling. The follow syntax is used:\n\t *   <ul>\n\t *     <li>The following options are allowed:\n\t *       <ul>\n\t *         <li>'l' - Length changing</li>\n\t *         <li>'f' - Filtering input</li>\n\t *         <li>'t' - The table!</li>\n\t *         <li>'i' - Information</li>\n\t *         <li>'p' - Pagination</li>\n\t *         <li>'r' - pRocessing</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>The following constants are allowed:\n\t *       <ul>\n\t *         <li>'H' - jQueryUI theme \"header\" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>\n\t *         <li>'F' - jQueryUI theme \"footer\" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>The following syntax is expected:\n\t *       <ul>\n\t *         <li>'&lt;' and '&gt;' - div elements</li>\n\t *         <li>'&lt;\"class\" and '&gt;' - div with a class</li>\n\t *         <li>'&lt;\"#id\" and '&gt;' - div with an ID</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>Examples:\n\t *       <ul>\n\t *         <li>'&lt;\"wrapper\"flipt&gt;'</li>\n\t *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>\n\t *       </ul>\n\t *     </li>\n\t *   </ul>\n\t *  @type string\n\t *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>\n\t *    <\"H\"lfr>t<\"F\"ip> <i>(when `jQueryUI` is true)</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.dom\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"dom\": '&lt;\"top\"i&gt;rt&lt;\"bottom\"flp&gt;&lt;\"clear\"&gt;'\n\t *      } );\n\t *    } );\n\t */\n\t\"sDom\": \"lfrtip\",\n\n\n\t/**\n\t * Search delay option. This will throttle full table searches that use the\n\t * DataTables provided search input element (it does not effect calls to\n\t * `dt-api search()`, providing a delay before the search is made.\n\t *  @type integer\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.searchDelay\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"searchDelay\": 200\n\t *      } );\n\t *    } )\n\t */\n\t\"searchDelay\": null,\n\n\n\t/**\n\t * DataTables features six different built-in options for the buttons to\n\t * display for pagination control:\n\t *\n\t * * `numbers` - Page number buttons only\n\t * * `simple` - 'Previous' and 'Next' buttons only\n\t * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers\n\t * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons\n\t * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers\n\t * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers\n\t *  \n\t * Further methods can be added using {@link DataTable.ext.oPagination}.\n\t *  @type string\n\t *  @default simple_numbers\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.pagingType\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"pagingType\": \"full_numbers\"\n\t *      } );\n\t *    } )\n\t */\n\t\"sPaginationType\": \"simple_numbers\",\n\n\n\t/**\n\t * Enable horizontal scrolling. When a table is too wide to fit into a\n\t * certain layout, or you have a large number of columns in the table, you\n\t * can enable x-scrolling to show the table in a viewport, which can be\n\t * scrolled. This property can be `true` which will allow the table to\n\t * scroll horizontally when needed, or any CSS unit, or a number (in which\n\t * case it will be treated as a pixel measurement). Setting as simply `true`\n\t * is recommended.\n\t *  @type boolean|string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.scrollX\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollX\": true,\n\t *        \"scrollCollapse\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollX\": \"\",\n\n\n\t/**\n\t * This property can be used to force a DataTable to use more width than it\n\t * might otherwise do when x-scrolling is enabled. For example if you have a\n\t * table which requires to be well spaced, this parameter is useful for\n\t * \"over-sizing\" the table, and thus forcing scrolling. This property can by\n\t * any CSS unit, or a number (in which case it will be treated as a pixel\n\t * measurement).\n\t *  @type string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.scrollXInner\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollX\": \"100%\",\n\t *        \"scrollXInner\": \"110%\"\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollXInner\": \"\",\n\n\n\t/**\n\t * Enable vertical scrolling. Vertical scrolling will constrain the DataTable\n\t * to the given height, and enable scrolling for any data which overflows the\n\t * current viewport. This can be used as an alternative to paging to display\n\t * a lot of data in a small area (although paging and scrolling can both be\n\t * enabled at the same time). This property can be any CSS unit, or a number\n\t * (in which case it will be treated as a pixel measurement).\n\t *  @type string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.scrollY\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollY\": \"200px\",\n\t *        \"paginate\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollY\": \"\",\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * Set the HTTP method that is used to make the Ajax call for server-side\n\t * processing or Ajax sourced data.\n\t *  @type string\n\t *  @default GET\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverMethod\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sServerMethod\": \"GET\",\n\n\n\t/**\n\t * DataTables makes use of renderers when displaying HTML elements for\n\t * a table. These renderers can be added or modified by plug-ins to\n\t * generate suitable mark-up for a site. For example the Bootstrap\n\t * integration plug-in for DataTables uses a paging button renderer to\n\t * display pagination buttons in the mark-up required by Bootstrap.\n\t *\n\t * For further information about the renderers available see\n\t * DataTable.ext.renderer\n\t *  @type string|object\n\t *  @default null\n\t *\n\t *  @name DataTable.defaults.renderer\n\t *\n\t */\n\t\"renderer\": null,\n\n\n\t/**\n\t * Set the data property name that DataTables should use to get a row's id\n\t * to set as the `id` property in the node.\n\t *  @type string\n\t *  @default DT_RowId\n\t *\n\t *  @name DataTable.defaults.rowId\n\t */\n\t\"rowId\": \"DT_RowId\"\n};\n\n_fnHungarianMap( DataTable.defaults );\n\n\n\n/*\n * Developer note - See note in model.defaults.js about the use of Hungarian\n * notation and camel case.\n */\n\n/**\n * Column options that can be given to DataTables at initialisation time.\n *  @namespace\n */\nDataTable.defaults.column = {\n\t/**\n\t * Define which column(s) an order will occur on for this column. This\n\t * allows a column's ordering to take multiple columns into account when\n\t * doing a sort or use the data from a different column. For example first\n\t * name / last name columns make sense to do a multi-column sort over the\n\t * two columns.\n\t *  @type array|int\n\t *  @default null <i>Takes the value of the column index automatically</i>\n\t *\n\t *  @name DataTable.defaults.column.orderData\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderData\": [ 0, 1 ], \"targets\": [ 0 ] },\n\t *          { \"orderData\": [ 1, 0 ], \"targets\": [ 1 ] },\n\t *          { \"orderData\": 2, \"targets\": [ 2 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"orderData\": [ 0, 1 ] },\n\t *          { \"orderData\": [ 1, 0 ] },\n\t *          { \"orderData\": 2 },\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"aDataSort\": null,\n\t\"iDataSort\": -1,\n\n\n\t/**\n\t * You can control the default ordering direction, and even alter the\n\t * behaviour of the sort handler (i.e. only allow ascending ordering etc)\n\t * using this parameter.\n\t *  @type array\n\t *  @default [ 'asc', 'desc' ]\n\t *\n\t *  @name DataTable.defaults.column.orderSequence\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderSequence\": [ \"asc\" ], \"targets\": [ 1 ] },\n\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ], \"targets\": [ 2 ] },\n\t *          { \"orderSequence\": [ \"desc\" ], \"targets\": [ 3 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          { \"orderSequence\": [ \"asc\" ] },\n\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ] },\n\t *          { \"orderSequence\": [ \"desc\" ] },\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"asSorting\": [ 'asc', 'desc' ],\n\n\n\t/**\n\t * Enable or disable filtering on the data in this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.searchable\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"searchable\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"searchable\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bSearchable\": true,\n\n\n\t/**\n\t * Enable or disable ordering on this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.orderable\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderable\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"orderable\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bSortable\": true,\n\n\n\t/**\n\t * Enable or disable the display of this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.visible\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"visible\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"visible\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bVisible\": true,\n\n\n\t/**\n\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t * allowing you to modify the DOM element (add background colour for example) when the\n\t * element is available.\n\t *  @type function\n\t *  @param {element} td The TD node that has been created\n\t *  @param {*} cellData The Data for the cell\n\t *  @param {array|object} rowData The data for the whole row\n\t *  @param {int} row The row index for the aoData data store\n\t *  @param {int} col The column index for aoColumns\n\t *\n\t *  @name DataTable.defaults.column.createdCell\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [3],\n\t *          \"createdCell\": function (td, cellData, rowData, row, col) {\n\t *            if ( cellData == \"1.7\" ) {\n\t *              $(td).css('color', 'blue')\n\t *            }\n\t *          }\n\t *        } ]\n\t *      });\n\t *    } );\n\t */\n\t\"fnCreatedCell\": null,\n\n\n\t/**\n\t * This parameter has been replaced by `data` in DataTables to ensure naming\n\t * consistency. `dataProp` can still be used, as there is backwards\n\t * compatibility in DataTables for this option, but it is strongly\n\t * recommended that you use `data` in preference to `dataProp`.\n\t *  @name DataTable.defaults.column.dataProp\n\t */\n\n\n\t/**\n\t * This property can be used to read data from any data source property,\n\t * including deeply nested objects / properties. `data` can be given in a\n\t * number of different ways which effect its behaviour:\n\t *\n\t * * `integer` - treated as an array index for the data source. This is the\n\t *   default that DataTables uses (incrementally increased for each column).\n\t * * `string` - read an object property from the data source. There are\n\t *   three 'special' options that can be used in the string to alter how\n\t *   DataTables reads the data from the source object:\n\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t *      Javascript to read from nested objects, so to can the options\n\t *      specified in `data`. For example: `browser.version` or\n\t *      `browser.name`. If your object parameter name contains a period, use\n\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t *      from and array source, joining the data with the characters provided\n\t *      between the two brackets. For example: `name[, ]` would provide a\n\t *      comma-space separated list from the source array. If no characters\n\t *      are provided between the brackets, the original array source is\n\t *      returned.\n\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t *      execute a function of the name given. For example: `browser()` for a\n\t *      simple function on the data source, `browser.version()` for a\n\t *      function in a nested property or even `browser().version` to get an\n\t *      object property if the function called returns an object. Note that\n\t *      function notation is recommended for use in `render` rather than\n\t *      `data` as it is much simpler to use as a renderer.\n\t * * `null` - use the original data source for the row rather than plucking\n\t *   data directly from it. This action has effects on two other\n\t *   initialisation options:\n\t *    * `defaultContent` - When null is given as the `data` option and\n\t *      `defaultContent` is specified for the column, the value defined by\n\t *      `defaultContent` will be used for the cell.\n\t *    * `render` - When null is used for the `data` option and the `render`\n\t *      option is specified for the column, the whole data source for the\n\t *      row is used for the renderer.\n\t * * `function` - the function given will be executed whenever DataTables\n\t *   needs to set or get the data for a cell in the column. The function\n\t *   takes three parameters:\n\t *    * Parameters:\n\t *      * `{array|object}` The data source for the row\n\t *      * `{string}` The type call data requested - this will be 'set' when\n\t *        setting data or 'filter', 'display', 'type', 'sort' or undefined\n\t *        when gathering data. Note that when `undefined` is given for the\n\t *        type DataTables expects to get the raw data for the object back<\n\t *      * `{*}` Data to set when the second parameter is 'set'.\n\t *    * Return:\n\t *      * The return value from the function is not required when 'set' is\n\t *        the type of call, but otherwise the return is what will be used\n\t *        for the data requested.\n\t *\n\t * Note that `data` is a getter and setter option. If you just require\n\t * formatting of data for output, you will likely want to use `render` which\n\t * is simply a getter and thus simpler to use.\n\t *\n\t * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The\n\t * name change reflects the flexibility of this property and is consistent\n\t * with the naming of mRender. If 'mDataProp' is given, then it will still\n\t * be used by DataTables, as it automatically maps the old name to the new\n\t * if required.\n\t *\n\t *  @type string|int|function|null\n\t *  @default null <i>Use automatically calculated column index</i>\n\t *\n\t *  @name DataTable.defaults.column.data\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Read table data from objects\n\t *    // JSON structure for each row:\n\t *    //   {\n\t *    //      \"engine\": {value},\n\t *    //      \"browser\": {value},\n\t *    //      \"platform\": {value},\n\t *    //      \"version\": {value},\n\t *    //      \"grade\": {value}\n\t *    //   }\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/objects.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          { \"data\": \"platform\" },\n\t *          { \"data\": \"version\" },\n\t *          { \"data\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Read information from deeply nested objects\n\t *    // JSON structure for each row:\n\t *    //   {\n\t *    //      \"engine\": {value},\n\t *    //      \"browser\": {value},\n\t *    //      \"platform\": {\n\t *    //         \"inner\": {value}\n\t *    //      },\n\t *    //      \"details\": [\n\t *    //         {value}, {value}\n\t *    //      ]\n\t *    //   }\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          { \"data\": \"platform.inner\" },\n\t *          { \"data\": \"details.0\" },\n\t *          { \"data\": \"details.1\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `data` as a function to provide different information for\n\t *    // sorting, filtering and display. In this case, currency (price)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": function ( source, type, val ) {\n\t *            if (type === 'set') {\n\t *              source.price = val;\n\t *              // Store the computed display and filter values for efficiency\n\t *              source.price_display = val==\"\" ? \"\" : \"$\"+numberFormat(val);\n\t *              source.price_filter  = val==\"\" ? \"\" : \"$\"+numberFormat(val)+\" \"+val;\n\t *              return;\n\t *            }\n\t *            else if (type === 'display') {\n\t *              return source.price_display;\n\t *            }\n\t *            else if (type === 'filter') {\n\t *              return source.price_filter;\n\t *            }\n\t *            // 'sort', 'type' and undefined all just use the integer\n\t *            return source.price;\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using default content\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null,\n\t *          \"defaultContent\": \"Click to edit\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using array notation - outputting a list from an array\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": \"name[, ]\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t */\n\t\"mData\": null,\n\n\n\t/**\n\t * This property is the rendering partner to `data` and it is suggested that\n\t * when you want to manipulate data for display (including filtering,\n\t * sorting etc) without altering the underlying data for the table, use this\n\t * property. `render` can be considered to be the the read only companion to\n\t * `data` which is read / write (then as such more complex). Like `data`\n\t * this option can be given in a number of different ways to effect its\n\t * behaviour:\n\t *\n\t * * `integer` - treated as an array index for the data source. This is the\n\t *   default that DataTables uses (incrementally increased for each column).\n\t * * `string` - read an object property from the data source. There are\n\t *   three 'special' options that can be used in the string to alter how\n\t *   DataTables reads the data from the source object:\n\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t *      Javascript to read from nested objects, so to can the options\n\t *      specified in `data`. For example: `browser.version` or\n\t *      `browser.name`. If your object parameter name contains a period, use\n\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t *      from and array source, joining the data with the characters provided\n\t *      between the two brackets. For example: `name[, ]` would provide a\n\t *      comma-space separated list from the source array. If no characters\n\t *      are provided between the brackets, the original array source is\n\t *      returned.\n\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t *      execute a function of the name given. For example: `browser()` for a\n\t *      simple function on the data source, `browser.version()` for a\n\t *      function in a nested property or even `browser().version` to get an\n\t *      object property if the function called returns an object.\n\t * * `object` - use different data for the different data types requested by\n\t *   DataTables ('filter', 'display', 'type' or 'sort'). The property names\n\t *   of the object is the data type the property refers to and the value can\n\t *   defined using an integer, string or function using the same rules as\n\t *   `render` normally does. Note that an `_` option _must_ be specified.\n\t *   This is the default value to use if you haven't specified a value for\n\t *   the data type requested by DataTables.\n\t * * `function` - the function given will be executed whenever DataTables\n\t *   needs to set or get the data for a cell in the column. The function\n\t *   takes three parameters:\n\t *    * Parameters:\n\t *      * {array|object} The data source for the row (based on `data`)\n\t *      * {string} The type call data requested - this will be 'filter',\n\t *        'display', 'type' or 'sort'.\n\t *      * {array|object} The full data source for the row (not based on\n\t *        `data`)\n\t *    * Return:\n\t *      * The return value from the function is what will be used for the\n\t *        data requested.\n\t *\n\t *  @type string|int|function|object|null\n\t *  @default null Use the data source value.\n\t *\n\t *  @name DataTable.defaults.column.render\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Create a comma separated list from an array of objects\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          {\n\t *            \"data\": \"platform\",\n\t *            \"render\": \"[, ].name\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Execute a function to obtain data\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t *          \"render\": \"browserName()\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // As an object, extracting different data for the different types\n\t *    // This would be used with a data source such as:\n\t *    //   { \"phone\": 5552368, \"phone_filter\": \"5552368 555-2368\", \"phone_display\": \"555-2368\" }\n\t *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`\n\t *    // (which has both forms) is used for filtering for if a user inputs either format, while\n\t *    // the formatted phone number is the one that is shown in the table.\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t *          \"render\": {\n\t *            \"_\": \"phone\",\n\t *            \"filter\": \"phone_filter\",\n\t *            \"display\": \"phone_display\"\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Use as a function to create a link from the data source\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": \"download_link\",\n\t *          \"render\": function ( data, type, full ) {\n\t *            return '<a href=\"'+data+'\">Download</a>';\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t */\n\t\"mRender\": null,\n\n\n\t/**\n\t * Change the cell type created for the column - either TD cells or TH cells. This\n\t * can be useful as TH cells have semantic meaning in the table body, allowing them\n\t * to act as a header for a row (you may wish to add scope='row' to the TH elements).\n\t *  @type string\n\t *  @default td\n\t *\n\t *  @name DataTable.defaults.column.cellType\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Make the first column use TH cells\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"cellType\": \"th\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sCellType\": \"td\",\n\n\n\t/**\n\t * Class to give to each cell in this column.\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *\n\t *  @name DataTable.defaults.column.class\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"class\": \"my_class\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"class\": \"my_class\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sClass\": \"\",\n\n\t/**\n\t * When DataTables calculates the column widths to assign to each column,\n\t * it finds the longest string in each column and then constructs a\n\t * temporary table and reads the widths from that. The problem with this\n\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t * string - thus the calculation can go wrong (doing it properly and putting\n\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t * a \"work around\" we provide this option. It will append its value to the\n\t * text that is found to be the longest string for the column - i.e. padding.\n\t * Generally you shouldn't need this!\n\t *  @type string\n\t *  @default <i>Empty string<i>\n\t *\n\t *  @name DataTable.defaults.column.contentPadding\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          {\n\t *            \"contentPadding\": \"mmm\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sContentPadding\": \"\",\n\n\n\t/**\n\t * Allows a default value to be given for a column's data, and will be used\n\t * whenever a null data source is encountered (this can be because `data`\n\t * is set to null, or because the data source itself is null).\n\t *  @type string\n\t *  @default null\n\t *\n\t *  @name DataTable.defaults.column.defaultContent\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          {\n\t *            \"data\": null,\n\t *            \"defaultContent\": \"Edit\",\n\t *            \"targets\": [ -1 ]\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          {\n\t *            \"data\": null,\n\t *            \"defaultContent\": \"Edit\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sDefaultContent\": null,\n\n\n\t/**\n\t * This parameter is only used in DataTables' server-side processing. It can\n\t * be exceptionally useful to know what columns are being displayed on the\n\t * client side, and to map these to database fields. When defined, the names\n\t * also allow DataTables to reorder information from the server if it comes\n\t * back in an unexpected order (i.e. if you switch your columns around on the\n\t * client-side, your server-side code does not also need updating).\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *\n\t *  @name DataTable.defaults.column.name\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"name\": \"engine\", \"targets\": [ 0 ] },\n\t *          { \"name\": \"browser\", \"targets\": [ 1 ] },\n\t *          { \"name\": \"platform\", \"targets\": [ 2 ] },\n\t *          { \"name\": \"version\", \"targets\": [ 3 ] },\n\t *          { \"name\": \"grade\", \"targets\": [ 4 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"name\": \"engine\" },\n\t *          { \"name\": \"browser\" },\n\t *          { \"name\": \"platform\" },\n\t *          { \"name\": \"version\" },\n\t *          { \"name\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sName\": \"\",\n\n\n\t/**\n\t * Defines a data source type for the ordering which can be used to read\n\t * real-time information from the table (updating the internally cached\n\t * version) prior to ordering. This allows ordering to occur on user\n\t * editable elements such as form inputs.\n\t *  @type string\n\t *  @default std\n\t *\n\t *  @name DataTable.defaults.column.orderDataType\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderDataType\": \"dom-text\", \"targets\": [ 2, 3 ] },\n\t *          { \"type\": \"numeric\", \"targets\": [ 3 ] },\n\t *          { \"orderDataType\": \"dom-select\", \"targets\": [ 4 ] },\n\t *          { \"orderDataType\": \"dom-checkbox\", \"targets\": [ 5 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          { \"orderDataType\": \"dom-text\" },\n\t *          { \"orderDataType\": \"dom-text\", \"type\": \"numeric\" },\n\t *          { \"orderDataType\": \"dom-select\" },\n\t *          { \"orderDataType\": \"dom-checkbox\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sSortDataType\": \"std\",\n\n\n\t/**\n\t * The title of this column.\n\t *  @type string\n\t *  @default null <i>Derived from the 'TH' value for this column in the\n\t *    original HTML table.</i>\n\t *\n\t *  @name DataTable.defaults.column.title\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"title\": \"My column title\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"title\": \"My column title\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sTitle\": null,\n\n\n\t/**\n\t * The type allows you to specify how the data for this column will be\n\t * ordered. Four types (string, numeric, date and html (which will strip\n\t * HTML tags before ordering)) are currently available. Note that only date\n\t * formats understood by Javascript's Date() object will be accepted as type\n\t * date. For example: \"Mar 26, 2008 5:03 PM\". May take the values: 'string',\n\t * 'numeric', 'date' or 'html' (by default). Further types can be adding\n\t * through plug-ins.\n\t *  @type string\n\t *  @default null <i>Auto-detected from raw data</i>\n\t *\n\t *  @name DataTable.defaults.column.type\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"type\": \"html\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"type\": \"html\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sType\": null,\n\n\n\t/**\n\t * Defining the width of the column, this parameter may take any CSS value\n\t * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not\n\t * been given a specific width through this interface ensuring that the table\n\t * remains readable.\n\t *  @type string\n\t *  @default null <i>Automatic</i>\n\t *\n\t *  @name DataTable.defaults.column.width\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"width\": \"20%\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"width\": \"20%\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sWidth\": null\n};\n\n_fnHungarianMap( DataTable.defaults.column );\n\n\n\n/**\n * DataTables settings object - this holds all the information needed for a\n * given table, including configuration, data and current application of the\n * table options. DataTables does not have a single instance for each DataTable\n * with the settings attached to that instance, but rather instances of the\n * DataTable \"class\" are created on-the-fly as needed (typically by a\n * $().dataTable() call) and the settings object is then applied to that\n * instance.\n *\n * Note that this object is related to {@link DataTable.defaults} but this\n * one is the internal data store for DataTables's cache of columns. It should\n * NOT be manipulated outside of DataTables. Any configuration should be done\n * through the initialisation options.\n *  @namespace\n *  @todo Really should attach the settings object to individual instances so we\n *    don't need to create new instances on each $().dataTable() call (if the\n *    table already exists). It would also save passing oSettings around and\n *    into every single function. However, this is a very significant\n *    architecture change for DataTables and will almost certainly break\n *    backwards compatibility with older installations. This is something that\n *    will be done in 2.0.\n */\nDataTable.models.oSettings = {\n\t/**\n\t * Primary features of DataTables and their enablement state.\n\t *  @namespace\n\t */\n\t\"oFeatures\": {\n\n\t\t/**\n\t\t * Flag to say if DataTables should automatically try to calculate the\n\t\t * optimum table and columns widths (true) or not (false).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bAutoWidth\": null,\n\n\t\t/**\n\t\t * Delay the creation of TR and TD elements until they are actually\n\t\t * needed by a driven page draw. This can give a significant speed\n\t\t * increase for Ajax source and Javascript source data, but makes no\n\t\t * difference at all for DOM and server-side processing tables.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bDeferRender\": null,\n\n\t\t/**\n\t\t * Enable filtering on the table or not. Note that if this is disabled\n\t\t * then there is no filtering at all on the table, including fnFilter.\n\t\t * To just remove the filtering input use sDom and remove the 'f' option.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bFilter\": null,\n\n\t\t/**\n\t\t * Table information element (the 'Showing x of y records' div) enable\n\t\t * flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bInfo\": null,\n\n\t\t/**\n\t\t * Present a user control allowing the end user to change the page size\n\t\t * when pagination is enabled.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bLengthChange\": null,\n\n\t\t/**\n\t\t * Pagination enabled or not. Note that if this is disabled then length\n\t\t * changing must also be disabled.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bPaginate\": null,\n\n\t\t/**\n\t\t * Processing indicator enable flag whenever DataTables is enacting a\n\t\t * user request - typically an Ajax request for server-side processing.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bProcessing\": null,\n\n\t\t/**\n\t\t * Server-side processing enabled flag - when enabled DataTables will\n\t\t * get all data from the server for every draw - there is no filtering,\n\t\t * sorting or paging done on the client-side.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bServerSide\": null,\n\n\t\t/**\n\t\t * Sorting enablement flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSort\": null,\n\n\t\t/**\n\t\t * Multi-column sorting\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortMulti\": null,\n\n\t\t/**\n\t\t * Apply a class to the columns which are being sorted to provide a\n\t\t * visual highlight or not. This can slow things down when enabled since\n\t\t * there is a lot of DOM interaction.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortClasses\": null,\n\n\t\t/**\n\t\t * State saving enablement flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bStateSave\": null\n\t},\n\n\n\t/**\n\t * Scrolling settings for a table.\n\t *  @namespace\n\t */\n\t\"oScroll\": {\n\t\t/**\n\t\t * When the table is shorter in height than sScrollY, collapse the\n\t\t * table container down to the height of the table (when true).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bCollapse\": null,\n\n\t\t/**\n\t\t * Width of the scrollbar for the web-browser's platform. Calculated\n\t\t * during table initialisation.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iBarWidth\": 0,\n\n\t\t/**\n\t\t * Viewport width for horizontal scrolling. Horizontal scrolling is\n\t\t * disabled if an empty string.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sX\": null,\n\n\t\t/**\n\t\t * Width to expand the table to when using x-scrolling. Typically you\n\t\t * should not need to use this.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @deprecated\n\t\t */\n\t\t\"sXInner\": null,\n\n\t\t/**\n\t\t * Viewport height for vertical scrolling. Vertical scrolling is disabled\n\t\t * if an empty string.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sY\": null\n\t},\n\n\t/**\n\t * Language information for the table.\n\t *  @namespace\n\t *  @extends DataTable.defaults.oLanguage\n\t */\n\t\"oLanguage\": {\n\t\t/**\n\t\t * Information callback function. See\n\t\t * {@link DataTable.defaults.fnInfoCallback}\n\t\t *  @type function\n\t\t *  @default null\n\t\t */\n\t\t\"fnInfoCallback\": null\n\t},\n\n\t/**\n\t * Browser support parameters\n\t *  @namespace\n\t */\n\t\"oBrowser\": {\n\t\t/**\n\t\t * Indicate if the browser incorrectly calculates width:100% inside a\n\t\t * scrolling element (IE6/7)\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bScrollOversize\": false,\n\n\t\t/**\n\t\t * Determine if the vertical scrollbar is on the right or left of the\n\t\t * scrolling container - needed for rtl language layout, although not\n\t\t * all browsers move the scrollbar (Safari).\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bScrollbarLeft\": false,\n\n\t\t/**\n\t\t * Flag for if `getBoundingClientRect` is fully supported or not\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bBounding\": false,\n\n\t\t/**\n\t\t * Browser scrollbar width\n\t\t *  @type integer\n\t\t *  @default 0\n\t\t */\n\t\t\"barWidth\": 0\n\t},\n\n\n\t\"ajax\": null,\n\n\n\t/**\n\t * Array referencing the nodes which are used for the features. The\n\t * parameters of this object match what is allowed by sDom - i.e.\n\t *   <ul>\n\t *     <li>'l' - Length changing</li>\n\t *     <li>'f' - Filtering input</li>\n\t *     <li>'t' - The table!</li>\n\t *     <li>'i' - Information</li>\n\t *     <li>'p' - Pagination</li>\n\t *     <li>'r' - pRocessing</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aanFeatures\": [],\n\n\t/**\n\t * Store data information - see {@link DataTable.models.oRow} for detailed\n\t * information.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoData\": [],\n\n\t/**\n\t * Array of indexes which are in the current display (after filtering etc)\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aiDisplay\": [],\n\n\t/**\n\t * Array of indexes for display - no filtering\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aiDisplayMaster\": [],\n\n\t/**\n\t * Map of row ids to data indexes\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"aIds\": {},\n\n\t/**\n\t * Store information about each column that is in use\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoColumns\": [],\n\n\t/**\n\t * Store information about the table's header\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoHeader\": [],\n\n\t/**\n\t * Store information about the table's footer\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoFooter\": [],\n\n\t/**\n\t * Store the applied global search information in case we want to force a\n\t * research or compare the old search to a new one.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @namespace\n\t *  @extends DataTable.models.oSearch\n\t */\n\t\"oPreviousSearch\": {},\n\n\t/**\n\t * Store the applied search for each column - see\n\t * {@link DataTable.models.oSearch} for the format that is used for the\n\t * filtering information for each column.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoPreSearchCols\": [],\n\n\t/**\n\t * Sorting that is applied to the table. Note that the inner arrays are\n\t * used in the following manner:\n\t * <ul>\n\t *   <li>Index 0 - column number</li>\n\t *   <li>Index 1 - current sorting direction</li>\n\t * </ul>\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @todo These inner arrays should really be objects\n\t */\n\t\"aaSorting\": null,\n\n\t/**\n\t * Sorting that is always applied to the table (i.e. prefixed in front of\n\t * aaSorting).\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aaSortingFixed\": [],\n\n\t/**\n\t * Classes to use for the striping of a table.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"asStripeClasses\": null,\n\n\t/**\n\t * If restoring a table - we should restore its striping classes as well\n\t *  @type array\n\t *  @default []\n\t */\n\t\"asDestroyStripes\": [],\n\n\t/**\n\t * If restoring a table - we should restore its width\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"sDestroyWidth\": 0,\n\n\t/**\n\t * Callback functions array for every time a row is inserted (i.e. on a draw).\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoRowCallback\": [],\n\n\t/**\n\t * Callback functions for the header on each draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoHeaderCallback\": [],\n\n\t/**\n\t * Callback function for the footer on each draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoFooterCallback\": [],\n\n\t/**\n\t * Array of callback functions for draw callback functions\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoDrawCallback\": [],\n\n\t/**\n\t * Array of callback functions for row created function\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoRowCreatedCallback\": [],\n\n\t/**\n\t * Callback functions for just before the table is redrawn. A return of\n\t * false will be used to cancel the draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoPreDrawCallback\": [],\n\n\t/**\n\t * Callback functions for when the table has been initialised.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoInitComplete\": [],\n\n\n\t/**\n\t * Callbacks for modifying the settings to be stored for state saving, prior to\n\t * saving state.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateSaveParams\": [],\n\n\t/**\n\t * Callbacks for modifying the settings that have been stored for state saving\n\t * prior to using the stored values to restore the state.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoadParams\": [],\n\n\t/**\n\t * Callbacks for operating on the settings object once the saved state has been\n\t * loaded\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoaded\": [],\n\n\t/**\n\t * Cache the table ID for quick access\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t */\n\t\"sTableId\": \"\",\n\n\t/**\n\t * The TABLE node for the main table\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTable\": null,\n\n\t/**\n\t * Permanent ref to the thead element\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTHead\": null,\n\n\t/**\n\t * Permanent ref to the tfoot element - if it exists\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTFoot\": null,\n\n\t/**\n\t * Permanent ref to the tbody element\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTBody\": null,\n\n\t/**\n\t * Cache the wrapper node (contains all DataTables controlled elements)\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTableWrapper\": null,\n\n\t/**\n\t * Indicate if when using server-side processing the loading of data\n\t * should be deferred until the second draw.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bDeferLoading\": false,\n\n\t/**\n\t * Indicate if all required information has been read in\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bInitialised\": false,\n\n\t/**\n\t * Information about open rows. Each object in the array has the parameters\n\t * 'nTr' and 'nParent'\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoOpenRows\": [],\n\n\t/**\n\t * Dictate the positioning of DataTables' control elements - see\n\t * {@link DataTable.model.oInit.sDom}.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sDom\": null,\n\n\t/**\n\t * Search delay (in mS)\n\t *  @type integer\n\t *  @default null\n\t */\n\t\"searchDelay\": null,\n\n\t/**\n\t * Which type of pagination should be used.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default two_button\n\t */\n\t\"sPaginationType\": \"two_button\",\n\n\t/**\n\t * The state duration (for `stateSave`) in seconds.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"iStateDuration\": 0,\n\n\t/**\n\t * Array of callback functions for state saving. Each array element is an\n\t * object with the following parameters:\n\t *   <ul>\n\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t *       and the JSON string to save that has been thus far created. Returns\n\t *       a JSON string to be inserted into a json object\n\t *       (i.e. '\"param\": [ 0, 1, 2]')</li>\n\t *     <li>string:sName - name of callback</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateSave\": [],\n\n\t/**\n\t * Array of callback functions for state loading. Each array element is an\n\t * object with the following parameters:\n\t *   <ul>\n\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t *       and the object stored. May return false to cancel state loading</li>\n\t *     <li>string:sName - name of callback</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoad\": [],\n\n\t/**\n\t * State that was saved. Useful for back reference\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oSavedState\": null,\n\n\t/**\n\t * State that was loaded. Useful for back reference\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oLoadedState\": null,\n\n\t/**\n\t * Source url for AJAX data for the table.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sAjaxSource\": null,\n\n\t/**\n\t * Property from a given object from which to read the table data from. This\n\t * can be an empty string (when not server-side processing), in which case\n\t * it is  assumed an an array is given directly.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t */\n\t\"sAjaxDataProp\": null,\n\n\t/**\n\t * The last jQuery XHR object that was used for server-side data gathering.\n\t * This can be used for working with the XHR information in one of the\n\t * callbacks\n\t *  @type object\n\t *  @default null\n\t */\n\t\"jqXHR\": null,\n\n\t/**\n\t * JSON returned from the server in the last Ajax request\n\t *  @type object\n\t *  @default undefined\n\t */\n\t\"json\": undefined,\n\n\t/**\n\t * Data submitted as part of the last Ajax request\n\t *  @type object\n\t *  @default undefined\n\t */\n\t\"oAjaxData\": undefined,\n\n\t/**\n\t * Function to get the server-side data.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type function\n\t */\n\t\"fnServerData\": null,\n\n\t/**\n\t * Functions which are called prior to sending an Ajax request so extra\n\t * parameters can easily be sent to the server\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoServerParams\": [],\n\n\t/**\n\t * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if\n\t * required).\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t */\n\t\"sServerMethod\": null,\n\n\t/**\n\t * Format numbers for display.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type function\n\t */\n\t\"fnFormatNumber\": null,\n\n\t/**\n\t * List of options that can be used for the user selectable length menu.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aLengthMenu\": null,\n\n\t/**\n\t * Counter for the draws that the table does. Also used as a tracker for\n\t * server-side processing\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"iDraw\": 0,\n\n\t/**\n\t * Indicate if a redraw is being done - useful for Ajax\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bDrawing\": false,\n\n\t/**\n\t * Draw index (iDraw) of the last error when parsing the returned data\n\t *  @type int\n\t *  @default -1\n\t */\n\t\"iDrawError\": -1,\n\n\t/**\n\t * Paging display length\n\t *  @type int\n\t *  @default 10\n\t */\n\t\"_iDisplayLength\": 10,\n\n\t/**\n\t * Paging start point - aiDisplay index\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"_iDisplayStart\": 0,\n\n\t/**\n\t * Server-side processing - number of records in the result set\n\t * (i.e. before filtering), Use fnRecordsTotal rather than\n\t * this property to get the value of the number of records, regardless of\n\t * the server-side processing setting.\n\t *  @type int\n\t *  @default 0\n\t *  @private\n\t */\n\t\"_iRecordsTotal\": 0,\n\n\t/**\n\t * Server-side processing - number of records in the current display set\n\t * (i.e. after filtering). Use fnRecordsDisplay rather than\n\t * this property to get the value of the number of records, regardless of\n\t * the server-side processing setting.\n\t *  @type boolean\n\t *  @default 0\n\t *  @private\n\t */\n\t\"_iRecordsDisplay\": 0,\n\n\t/**\n\t * The classes to use for the table\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"oClasses\": {},\n\n\t/**\n\t * Flag attached to the settings object so you can check in the draw\n\t * callback if filtering has been done in the draw. Deprecated in favour of\n\t * events.\n\t *  @type boolean\n\t *  @default false\n\t *  @deprecated\n\t */\n\t\"bFiltered\": false,\n\n\t/**\n\t * Flag attached to the settings object so you can check in the draw\n\t * callback if sorting has been done in the draw. Deprecated in favour of\n\t * events.\n\t *  @type boolean\n\t *  @default false\n\t *  @deprecated\n\t */\n\t\"bSorted\": false,\n\n\t/**\n\t * Indicate that if multiple rows are in the header and there is more than\n\t * one unique cell per column, if the top one (true) or bottom one (false)\n\t * should be used for sorting / title by DataTables.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type boolean\n\t */\n\t\"bSortCellsTop\": null,\n\n\t/**\n\t * Initialisation object that is used for the table\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oInit\": null,\n\n\t/**\n\t * Destroy callback functions - for plug-ins to attach themselves to the\n\t * destroy so they can clean up markup and events.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoDestroyCallback\": [],\n\n\n\t/**\n\t * Get the number of records in the current record set, before filtering\n\t *  @type function\n\t */\n\t\"fnRecordsTotal\": function ()\n\t{\n\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\tthis._iRecordsTotal * 1 :\n\t\t\tthis.aiDisplayMaster.length;\n\t},\n\n\t/**\n\t * Get the number of records in the current record set, after filtering\n\t *  @type function\n\t */\n\t\"fnRecordsDisplay\": function ()\n\t{\n\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\tthis._iRecordsDisplay * 1 :\n\t\t\tthis.aiDisplay.length;\n\t},\n\n\t/**\n\t * Get the display end point - aiDisplay index\n\t *  @type function\n\t */\n\t\"fnDisplayEnd\": function ()\n\t{\n\t\tvar\n\t\t\tlen      = this._iDisplayLength,\n\t\t\tstart    = this._iDisplayStart,\n\t\t\tcalc     = start + len,\n\t\t\trecords  = this.aiDisplay.length,\n\t\t\tfeatures = this.oFeatures,\n\t\t\tpaginate = features.bPaginate;\n\n\t\tif ( features.bServerSide ) {\n\t\t\treturn paginate === false || len === -1 ?\n\t\t\t\tstart + records :\n\t\t\t\tMath.min( start+len, this._iRecordsDisplay );\n\t\t}\n\t\telse {\n\t\t\treturn ! paginate || calc>records || len===-1 ?\n\t\t\t\trecords :\n\t\t\t\tcalc;\n\t\t}\n\t},\n\n\t/**\n\t * The DataTables object for this table\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oInstance\": null,\n\n\t/**\n\t * Unique identifier for each instance of the DataTables object. If there\n\t * is an ID on the table node, then it takes that value, otherwise an\n\t * incrementing internal counter is used.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sInstance\": null,\n\n\t/**\n\t * tabindex attribute value that is added to DataTables control elements, allowing\n\t * keyboard navigation of the table and its controls.\n\t */\n\t\"iTabIndex\": 0,\n\n\t/**\n\t * DIV container for the footer scrolling table if scrolling\n\t */\n\t\"nScrollHead\": null,\n\n\t/**\n\t * DIV container for the footer scrolling table if scrolling\n\t */\n\t\"nScrollFoot\": null,\n\n\t/**\n\t * Last applied sort\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aLastSort\": [],\n\n\t/**\n\t * Stored plug-in instances\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"oPlugins\": {},\n\n\t/**\n\t * Function used to get a row's id from the row's data\n\t *  @type function\n\t *  @default null\n\t */\n\t\"rowIdFn\": null,\n\n\t/**\n\t * Data location where to store a row's id\n\t *  @type string\n\t *  @default null\n\t */\n\t\"rowId\": null\n};\n\n/**\n * Extension object for DataTables that is used to provide all extension\n * options.\n *\n * Note that the `DataTable.ext` object is available through\n * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is\n * also aliased to `jQuery.fn.dataTableExt` for historic reasons.\n *  @namespace\n *  @extends DataTable.models.ext\n */\n\n\n/**\n * DataTables extensions\n * \n * This namespace acts as a collection area for plug-ins that can be used to\n * extend DataTables capabilities. Indeed many of the build in methods\n * use this method to provide their own capabilities (sorting methods for\n * example).\n *\n * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy\n * reasons\n *\n *  @namespace\n */\nDataTable.ext = _ext = {\n\t/**\n\t * Buttons. For use with the Buttons extension for DataTables. This is\n\t * defined here so other extensions can define buttons regardless of load\n\t * order. It is _not_ used by DataTables core.\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tbuttons: {},\n\n\n\t/**\n\t * Element class names\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tclasses: {},\n\n\n\t/**\n\t * DataTables build type (expanded by the download builder)\n\t *\n\t *  @type string\n\t */\n\tbuilder: \"-source-\",\n\n\n\t/**\n\t * Error reporting.\n\t * \n\t * How should DataTables report an error. Can take the value 'alert',\n\t * 'throw', 'none' or a function.\n\t *\n\t *  @type string|function\n\t *  @default alert\n\t */\n\terrMode: \"alert\",\n\n\n\t/**\n\t * Feature plug-ins.\n\t * \n\t * This is an array of objects which describe the feature plug-ins that are\n\t * available to DataTables. These feature plug-ins are then available for\n\t * use through the `dom` initialisation option.\n\t * \n\t * Each feature plug-in is described by an object which must have the\n\t * following properties:\n\t * \n\t * * `fnInit` - function that is used to initialise the plug-in,\n\t * * `cFeature` - a character so the feature can be enabled by the `dom`\n\t *   instillation option. This is case sensitive.\n\t *\n\t * The `fnInit` function has the following input parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t *\n\t * And the following return is expected:\n\t * \n\t * * {node|null} The element which contains your feature. Note that the\n\t *   return may also be void if your plug-in does not require to inject any\n\t *   DOM elements into DataTables control (`dom`) - for example this might\n\t *   be useful when developing a plug-in which allows table control via\n\t *   keyboard entry\n\t *\n\t *  @type array\n\t *\n\t *  @example\n\t *    $.fn.dataTable.ext.features.push( {\n\t *      \"fnInit\": function( oSettings ) {\n\t *        return new TableTools( { \"oDTSettings\": oSettings } );\n\t *      },\n\t *      \"cFeature\": \"T\"\n\t *    } );\n\t */\n\tfeature: [],\n\n\n\t/**\n\t * Row searching.\n\t * \n\t * This method of searching is complimentary to the default type based\n\t * searching, and a lot more comprehensive as it allows you complete control\n\t * over the searching logic. Each element in this array is a function\n\t * (parameters described below) that is called for every row in the table,\n\t * and your logic decides if it should be included in the searching data set\n\t * or not.\n\t *\n\t * Searching functions have the following input parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t * 2. `{array|object}` Data for the row to be processed (same as the\n\t *    original format that was passed in as the data source, or an array\n\t *    from a DOM data source\n\t * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which\n\t *    can be useful to retrieve the `TR` element if you need DOM interaction.\n\t *\n\t * And the following return is expected:\n\t *\n\t * * {boolean} Include the row in the searched result set (true) or not\n\t *   (false)\n\t *\n\t * Note that as with the main search ability in DataTables, technically this\n\t * is \"filtering\", since it is subtractive. However, for consistency in\n\t * naming we call it searching here.\n\t *\n\t *  @type array\n\t *  @default []\n\t *\n\t *  @example\n\t *    // The following example shows custom search being applied to the\n\t *    // fourth column (i.e. the data[3] index) based on two input values\n\t *    // from the end-user, matching the data in a certain range.\n\t *    $.fn.dataTable.ext.search.push(\n\t *      function( settings, data, dataIndex ) {\n\t *        var min = document.getElementById('min').value * 1;\n\t *        var max = document.getElementById('max').value * 1;\n\t *        var version = data[3] == \"-\" ? 0 : data[3]*1;\n\t *\n\t *        if ( min == \"\" && max == \"\" ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min == \"\" && version < max ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min < version && \"\" == max ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min < version && version < max ) {\n\t *          return true;\n\t *        }\n\t *        return false;\n\t *      }\n\t *    );\n\t */\n\tsearch: [],\n\n\n\t/**\n\t * Selector extensions\n\t *\n\t * The `selector` option can be used to extend the options available for the\n\t * selector modifier options (`selector-modifier` object data type) that\n\t * each of the three built in selector types offer (row, column and cell +\n\t * their plural counterparts). For example the Select extension uses this\n\t * mechanism to provide an option to select only rows, columns and cells\n\t * that have been marked as selected by the end user (`{selected: true}`),\n\t * which can be used in conjunction with the existing built in selector\n\t * options.\n\t *\n\t * Each property is an array to which functions can be pushed. The functions\n\t * take three attributes:\n\t *\n\t * * Settings object for the host table\n\t * * Options object (`selector-modifier` object type)\n\t * * Array of selected item indexes\n\t *\n\t * The return is an array of the resulting item indexes after the custom\n\t * selector has been applied.\n\t *\n\t *  @type object\n\t */\n\tselector: {\n\t\tcell: [],\n\t\tcolumn: [],\n\t\trow: []\n\t},\n\n\n\t/**\n\t * Internal functions, exposed for used in plug-ins.\n\t * \n\t * Please note that you should not need to use the internal methods for\n\t * anything other than a plug-in (and even then, try to avoid if possible).\n\t * The internal function may change between releases.\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tinternal: {},\n\n\n\t/**\n\t * Legacy configuration options. Enable and disable legacy options that\n\t * are available in DataTables.\n\t *\n\t *  @type object\n\t */\n\tlegacy: {\n\t\t/**\n\t\t * Enable / disable DataTables 1.9 compatible server-side processing\n\t\t * requests\n\t\t *\n\t\t *  @type boolean\n\t\t *  @default null\n\t\t */\n\t\tajax: null\n\t},\n\n\n\t/**\n\t * Pagination plug-in methods.\n\t * \n\t * Each entry in this object is a function and defines which buttons should\n\t * be shown by the pagination rendering method that is used for the table:\n\t * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the\n\t * buttons are displayed in the document, while the functions here tell it\n\t * what buttons to display. This is done by returning an array of button\n\t * descriptions (what each button will do).\n\t *\n\t * Pagination types (the four built in options and any additional plug-in\n\t * options defined here) can be used through the `paginationType`\n\t * initialisation parameter.\n\t *\n\t * The functions defined take two parameters:\n\t *\n\t * 1. `{int} page` The current page index\n\t * 2. `{int} pages` The number of pages in the table\n\t *\n\t * Each function is expected to return an array where each element of the\n\t * array can be one of:\n\t *\n\t * * `first` - Jump to first page when activated\n\t * * `last` - Jump to last page when activated\n\t * * `previous` - Show previous page when activated\n\t * * `next` - Show next page when activated\n\t * * `{int}` - Show page of the index given\n\t * * `{array}` - A nested array containing the above elements to add a\n\t *   containing 'DIV' element (might be useful for styling).\n\t *\n\t * Note that DataTables v1.9- used this object slightly differently whereby\n\t * an object with two functions would be defined for each plug-in. That\n\t * ability is still supported by DataTables 1.10+ to provide backwards\n\t * compatibility, but this option of use is now decremented and no longer\n\t * documented in DataTables 1.10+.\n\t *\n\t *  @type object\n\t *  @default {}\n\t *\n\t *  @example\n\t *    // Show previous, next and current page buttons only\n\t *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {\n\t *      return [ 'previous', page, 'next' ];\n\t *    };\n\t */\n\tpager: {},\n\n\n\trenderer: {\n\t\tpageButton: {},\n\t\theader: {}\n\t},\n\n\n\t/**\n\t * Ordering plug-ins - custom data source\n\t * \n\t * The extension options for ordering of data available here is complimentary\n\t * to the default type based ordering that DataTables typically uses. It\n\t * allows much greater control over the the data that is being used to\n\t * order a column, but is necessarily therefore more complex.\n\t * \n\t * This type of ordering is useful if you want to do ordering based on data\n\t * live from the DOM (for example the contents of an 'input' element) rather\n\t * than just the static string that DataTables knows of.\n\t * \n\t * The way these plug-ins work is that you create an array of the values you\n\t * wish to be ordering for the column in question and then return that\n\t * array. The data in the array much be in the index order of the rows in\n\t * the table (not the currently ordering order!). Which order data gathering\n\t * function is run here depends on the `dt-init columns.orderDataType`\n\t * parameter that is used for the column (if any).\n\t *\n\t * The functions defined take two parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t * 2. `{int}` Target column index\n\t *\n\t * Each function is expected to return an array:\n\t *\n\t * * `{array}` Data for the column to be ordering upon\n\t *\n\t *  @type array\n\t *\n\t *  @example\n\t *    // Ordering using `input` node values\n\t *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )\n\t *    {\n\t *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {\n\t *        return $('input', td).val();\n\t *      } );\n\t *    }\n\t */\n\torder: {},\n\n\n\t/**\n\t * Type based plug-ins.\n\t *\n\t * Each column in DataTables has a type assigned to it, either by automatic\n\t * detection or by direct assignment using the `type` option for the column.\n\t * The type of a column will effect how it is ordering and search (plug-ins\n\t * can also make use of the column type if required).\n\t *\n\t * @namespace\n\t */\n\ttype: {\n\t\t/**\n\t\t * Type detection functions.\n\t\t *\n\t\t * The functions defined in this object are used to automatically detect\n\t\t * a column's type, making initialisation of DataTables super easy, even\n\t\t * when complex data is in the table.\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be analysed\n\t     *  2. `{settings}` DataTables settings object. This can be used to\n\t     *     perform context specific type detection - for example detection\n\t     *     based on language settings such as using a comma for a decimal\n\t     *     place. Generally speaking the options from the settings will not\n\t     *     be required\n\t\t *\n\t\t * Each function is expected to return:\n\t\t *\n\t\t * * `{string|null}` Data type detected, or null if unknown (and thus\n\t\t *   pass it on to the other type detection functions.\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    // Currency type detection plug-in:\n\t\t *    $.fn.dataTable.ext.type.detect.push(\n\t\t *      function ( data, settings ) {\n\t\t *        // Check the numeric part\n\t\t *        if ( ! data.substring(1).match(/[0-9]/) ) {\n\t\t *          return null;\n\t\t *        }\n\t\t *\n\t\t *        // Check prefixed by currency\n\t\t *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {\n\t\t *          return 'currency';\n\t\t *        }\n\t\t *        return null;\n\t\t *      }\n\t\t *    );\n\t\t */\n\t\tdetect: [],\n\n\n\t\t/**\n\t\t * Type based search formatting.\n\t\t *\n\t\t * The type based searching functions can be used to pre-format the\n\t\t * data to be search on. For example, it can be used to strip HTML\n\t\t * tags or to de-format telephone numbers for numeric only searching.\n\t\t *\n\t\t * Note that is a search is not defined for a column of a given type,\n\t\t * no search formatting will be performed.\n\t\t * \n\t\t * Pre-processing of searching data plug-ins - When you assign the sType\n\t\t * for a column (or have it automatically detected for you by DataTables\n\t\t * or a type detection plug-in), you will typically be using this for\n\t\t * custom sorting, but it can also be used to provide custom searching\n\t\t * by allowing you to pre-processing the data and returning the data in\n\t\t * the format that should be searched upon. This is done by adding\n\t\t * functions this object with a parameter name which matches the sType\n\t\t * for that target column. This is the corollary of <i>afnSortData</i>\n\t\t * for searching data.\n\t\t *\n\t\t * The functions defined take a single parameter:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be prepared for searching\n\t\t *\n\t\t * Each function is expected to return:\n\t\t *\n\t\t * * `{string|null}` Formatted string that will be used for the searching.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {\n\t\t *      return d.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t *    }\n\t\t */\n\t\tsearch: {},\n\n\n\t\t/**\n\t\t * Type based ordering.\n\t\t *\n\t\t * The column type tells DataTables what ordering to apply to the table\n\t\t * when a column is sorted upon. The order for each type that is defined,\n\t\t * is defined by the functions available in this object.\n\t\t *\n\t\t * Each ordering option can be described by three properties added to\n\t\t * this object:\n\t\t *\n\t\t * * `{type}-pre` - Pre-formatting function\n\t\t * * `{type}-asc` - Ascending order function\n\t\t * * `{type}-desc` - Descending order function\n\t\t *\n\t\t * All three can be used together, only `{type}-pre` or only\n\t\t * `{type}-asc` and `{type}-desc` together. It is generally recommended\n\t\t * that only `{type}-pre` is used, as this provides the optimal\n\t\t * implementation in terms of speed, although the others are provided\n\t\t * for compatibility with existing Javascript sort functions.\n\t\t *\n\t\t * `{type}-pre`: Functions defined take a single parameter:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be prepared for ordering\n\t\t *\n\t\t * And return:\n\t\t *\n\t\t * * `{*}` Data to be sorted upon\n\t\t *\n\t\t * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort\n\t\t * functions, taking two parameters:\n\t\t *\n\t     *  1. `{*}` Data to compare to the second parameter\n\t     *  2. `{*}` Data to compare to the first parameter\n\t\t *\n\t\t * And returning:\n\t\t *\n\t\t * * `{*}` Ordering match: <0 if first parameter should be sorted lower\n\t\t *   than the second parameter, ===0 if the two parameters are equal and\n\t\t *   >0 if the first parameter should be sorted height than the second\n\t\t *   parameter.\n\t\t * \n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    // Numeric ordering of formatted numbers with a pre-formatter\n\t\t *    $.extend( $.fn.dataTable.ext.type.order, {\n\t\t *      \"string-pre\": function(x) {\n\t\t *        a = (a === \"-\" || a === \"\") ? 0 : a.replace( /[^\\d\\-\\.]/g, \"\" );\n\t\t *        return parseFloat( a );\n\t\t *      }\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Case-sensitive string ordering, with no pre-formatting method\n\t\t *    $.extend( $.fn.dataTable.ext.order, {\n\t\t *      \"string-case-asc\": function(x,y) {\n\t\t *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t *      },\n\t\t *      \"string-case-desc\": function(x,y) {\n\t\t *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t *      }\n\t\t *    } );\n\t\t */\n\t\torder: {}\n\t},\n\n\t/**\n\t * Unique DataTables instance counter\n\t *\n\t * @type int\n\t * @private\n\t */\n\t_unique: 0,\n\n\n\t//\n\t// Depreciated\n\t// The following properties are retained for backwards compatibility only.\n\t// The should not be used in new projects and will be removed in a future\n\t// version\n\t//\n\n\t/**\n\t * Version check function.\n\t *  @type function\n\t *  @depreciated Since 1.10\n\t */\n\tfnVersionCheck: DataTable.fnVersionCheck,\n\n\n\t/**\n\t * Index for what 'this' index API functions should use\n\t *  @type int\n\t *  @deprecated Since v1.10\n\t */\n\tiApiIndex: 0,\n\n\n\t/**\n\t * jQuery UI class container\n\t *  @type object\n\t *  @deprecated Since v1.10\n\t */\n\toJUIClasses: {},\n\n\n\t/**\n\t * Software version\n\t *  @type string\n\t *  @deprecated Since v1.10\n\t */\n\tsVersion: DataTable.version\n};\n\n\n//\n// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts\n//\n$.extend( _ext, {\n\tafnFiltering: _ext.search,\n\taTypes:       _ext.type.detect,\n\tofnSearch:    _ext.type.search,\n\toSort:        _ext.type.order,\n\tafnSortData:  _ext.order,\n\taoFeatures:   _ext.feature,\n\toApi:         _ext.internal,\n\toStdClasses:  _ext.classes,\n\toPagination:  _ext.pager\n} );\n\n\n$.extend( DataTable.ext.classes, {\n\t\"sTable\": \"dataTable\",\n\t\"sNoFooter\": \"no-footer\",\n\n\t/* Paging buttons */\n\t\"sPageButton\": \"paginate_button\",\n\t\"sPageButtonActive\": \"current\",\n\t\"sPageButtonDisabled\": \"disabled\",\n\n\t/* Striping classes */\n\t\"sStripeOdd\": \"odd\",\n\t\"sStripeEven\": \"even\",\n\n\t/* Empty row */\n\t\"sRowEmpty\": \"dataTables_empty\",\n\n\t/* Features */\n\t\"sWrapper\": \"dataTables_wrapper\",\n\t\"sFilter\": \"dataTables_filter\",\n\t\"sInfo\": \"dataTables_info\",\n\t\"sPaging\": \"dataTables_paginate paging_\", /* Note that the type is postfixed */\n\t\"sLength\": \"dataTables_length\",\n\t\"sProcessing\": \"dataTables_processing\",\n\n\t/* Sorting */\n\t\"sSortAsc\": \"sorting_asc\",\n\t\"sSortDesc\": \"sorting_desc\",\n\t\"sSortable\": \"sorting\", /* Sortable in both directions */\n\t\"sSortableAsc\": \"sorting_desc_disabled\",\n\t\"sSortableDesc\": \"sorting_asc_disabled\",\n\t\"sSortableNone\": \"sorting_disabled\",\n\t\"sSortColumn\": \"sorting_\", /* Note that an int is postfixed for the sorting order */\n\n\t/* Filtering */\n\t\"sFilterInput\": \"\",\n\n\t/* Page length */\n\t\"sLengthSelect\": \"\",\n\n\t/* Scrolling */\n\t\"sScrollWrapper\": \"dataTables_scroll\",\n\t\"sScrollHead\": \"dataTables_scrollHead\",\n\t\"sScrollHeadInner\": \"dataTables_scrollHeadInner\",\n\t\"sScrollBody\": \"dataTables_scrollBody\",\n\t\"sScrollFoot\": \"dataTables_scrollFoot\",\n\t\"sScrollFootInner\": \"dataTables_scrollFootInner\",\n\n\t/* Misc */\n\t\"sHeaderTH\": \"\",\n\t\"sFooterTH\": \"\",\n\n\t// Deprecated\n\t\"sSortJUIAsc\": \"\",\n\t\"sSortJUIDesc\": \"\",\n\t\"sSortJUI\": \"\",\n\t\"sSortJUIAscAllowed\": \"\",\n\t\"sSortJUIDescAllowed\": \"\",\n\t\"sSortJUIWrapper\": \"\",\n\t\"sSortIcon\": \"\",\n\t\"sJUIHeader\": \"\",\n\t\"sJUIFooter\": \"\"\n} );\n\n\nvar extPagination = DataTable.ext.pager;\n\nfunction _numbers ( page, pages ) {\n\tvar\n\t\tnumbers = [],\n\t\tbuttons = extPagination.numbers_length,\n\t\thalf = Math.floor( buttons / 2 ),\n\t\ti = 1;\n\n\tif ( pages <= buttons ) {\n\t\tnumbers = _range( 0, pages );\n\t}\n\telse if ( page <= half ) {\n\t\tnumbers = _range( 0, buttons-2 );\n\t\tnumbers.push( 'ellipsis' );\n\t\tnumbers.push( pages-1 );\n\t}\n\telse if ( page >= pages - 1 - half ) {\n\t\tnumbers = _range( pages-(buttons-2), pages );\n\t\tnumbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6\n\t\tnumbers.splice( 0, 0, 0 );\n\t}\n\telse {\n\t\tnumbers = _range( page-half+2, page+half-1 );\n\t\tnumbers.push( 'ellipsis' );\n\t\tnumbers.push( pages-1 );\n\t\tnumbers.splice( 0, 0, 'ellipsis' );\n\t\tnumbers.splice( 0, 0, 0 );\n\t}\n\n\tnumbers.DT_el = 'span';\n\treturn numbers;\n}\n\n\n$.extend( extPagination, {\n\tsimple: function ( page, pages ) {\n\t\treturn [ 'previous', 'next' ];\n\t},\n\n\tfull: function ( page, pages ) {\n\t\treturn [  'first', 'previous', 'next', 'last' ];\n\t},\n\n\tnumbers: function ( page, pages ) {\n\t\treturn [ _numbers(page, pages) ];\n\t},\n\n\tsimple_numbers: function ( page, pages ) {\n\t\treturn [ 'previous', _numbers(page, pages), 'next' ];\n\t},\n\n\tfull_numbers: function ( page, pages ) {\n\t\treturn [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];\n\t},\n\t\n\tfirst_last_numbers: function (page, pages) {\n \t\treturn ['first', _numbers(page, pages), 'last'];\n \t},\n\n\t// For testing and plug-ins to use\n\t_numbers: _numbers,\n\n\t// Number of number buttons (including ellipsis) to show. _Must be odd!_\n\tnumbers_length: 7\n} );\n\n\n$.extend( true, DataTable.ext.renderer, {\n\tpageButton: {\n\t\t_: function ( settings, host, idx, buttons, page, pages ) {\n\t\t\tvar classes = settings.oClasses;\n\t\t\tvar lang = settings.oLanguage.oPaginate;\n\t\t\tvar aria = settings.oLanguage.oAria.paginate || {};\n\t\t\tvar btnDisplay, btnClass;\n\n\t\t\tvar attach = function( container, buttons ) {\n\t\t\t\tvar i, ien, node, button, tabIndex;\n\t\t\t\tvar disabledClass = classes.sPageButtonDisabled;\n\t\t\t\tvar clickHandler = function ( e ) {\n\t\t\t\t\t_fnPageChange( settings, e.data.action, true );\n\t\t\t\t};\n\n\t\t\t\tfor ( i=0, ien=buttons.length ; i<ien ; i++ ) {\n\t\t\t\t\tbutton = buttons[i];\n\n\t\t\t\t\tif ( Array.isArray( button ) ) {\n\t\t\t\t\t\tvar inner = $( '<'+(button.DT_el || 'div')+'/>' )\n\t\t\t\t\t\t\t.appendTo( container );\n\t\t\t\t\t\tattach( inner, button );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbtnDisplay = null;\n\t\t\t\t\t\tbtnClass = button;\n\t\t\t\t\t\ttabIndex = settings.iTabIndex;\n\n\t\t\t\t\t\tswitch ( button ) {\n\t\t\t\t\t\t\tcase 'ellipsis':\n\t\t\t\t\t\t\t\tcontainer.append('<span class=\"ellipsis\">&#x2026;</span>');\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'first':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sFirst;\n\n\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\n\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\n\t\t\t\t\t\t\t\tif ( pages === 0 || page === pages-1 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'last':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\n\t\t\t\t\t\t\t\tif ( pages === 0 || page === pages-1 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tbtnDisplay = settings.fnFormatNumber( button + 1 );\n\t\t\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t\t\tclasses.sPageButtonActive : '';\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( btnDisplay !== null ) {\n\t\t\t\t\t\t\tvar tag = settings.oInit.pagingTag || 'a';\n\t\t\t\t\t\t\tvar disabled = btnClass.indexOf(disabledClass) !== -1;\n\t\t\n\n\t\t\t\t\t\t\tnode = $('<'+tag+'>', {\n\t\t\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t\t'aria-disabled': disabled ? 'true' : null,\n\t\t\t\t\t\t\t\t\t'aria-label': aria[ button ],\n\t\t\t\t\t\t\t\t\t'aria-role': 'link',\n\t\t\t\t\t\t\t\t\t'aria-current': btnClass === classes.sPageButtonActive ? 'page' : null,\n\t\t\t\t\t\t\t\t\t'data-dt-idx': button,\n\t\t\t\t\t\t\t\t\t'tabindex': tabIndex,\n\t\t\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t\t\t.appendTo( container );\n\n\t\t\t\t\t\t\t_fnBindAction(\n\t\t\t\t\t\t\t\tnode, {action: button}, clickHandler\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t// inside an iframe or frame. Try / catch the error. Not good for\n\t\t\t// accessibility, but neither are frames.\n\t\t\tvar activeEl;\n\n\t\t\ttry {\n\t\t\t\t// Because this approach is destroying and recreating the paging\n\t\t\t\t// elements, focus is lost on the select button which is bad for\n\t\t\t\t// accessibility. So we want to restore focus once the draw has\n\t\t\t\t// completed\n\t\t\t\tactiveEl = $(host).find(document.activeElement).data('dt-idx');\n\t\t\t}\n\t\t\tcatch (e) {}\n\n\t\t\tattach( $(host).empty(), buttons );\n\n\t\t\tif ( activeEl !== undefined ) {\n\t\t\t\t$(host).find( '[data-dt-idx='+activeEl+']' ).trigger('focus');\n\t\t\t}\n\t\t}\n\t}\n} );\n\n\n\n// Built in type detection. See model.ext.aTypes for information about\n// what is required from this methods.\n$.extend( DataTable.ext.type.detect, [\n\t// Plain numbers - first since V8 detects some plain numbers as dates\n\t// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _isNumber( d, decimal ) ? 'num'+decimal : null;\n\t},\n\n\t// Dates (only those recognised by the browser's Date.parse)\n\tfunction ( d, settings )\n\t{\n\t\t// V8 tries _very_ hard to make a string passed into `Date.parse()`\n\t\t// valid, so we need to use a regex to restrict date formats. Use a\n\t\t// plug-in for anything other than ISO8601 style strings\n\t\tif ( d && !(d instanceof Date) && ! _re_date.test(d) ) {\n\t\t\treturn null;\n\t\t}\n\t\tvar parsed = Date.parse(d);\n\t\treturn (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;\n\t},\n\n\t// Formatted numbers\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;\n\t},\n\n\t// HTML numeric\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;\n\t},\n\n\t// HTML numeric, formatted\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;\n\t},\n\n\t// HTML (this is strict checking - there must be html)\n\tfunction ( d, settings )\n\t{\n\t\treturn _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?\n\t\t\t'html' : null;\n\t}\n] );\n\n\n\n// Filter formatting functions. See model.ext.ofnSearch for information about\n// what is required from these methods.\n// \n// Note that additional search methods are added for the html numbers and\n// html formatted numbers by `_addNumericSort()` when we know what the decimal\n// place is\n\n\n$.extend( DataTable.ext.type.search, {\n\thtml: function ( data ) {\n\t\treturn _empty(data) ?\n\t\t\tdata :\n\t\t\ttypeof data === 'string' ?\n\t\t\t\tdata\n\t\t\t\t\t.replace( _re_new_lines, \" \" )\n\t\t\t\t\t.replace( _re_html, \"\" ) :\n\t\t\t\t'';\n\t},\n\n\tstring: function ( data ) {\n\t\treturn _empty(data) ?\n\t\t\tdata :\n\t\t\ttypeof data === 'string' ?\n\t\t\t\tdata.replace( _re_new_lines, \" \" ) :\n\t\t\t\tdata;\n\t}\n} );\n\n\n\nvar __numericReplace = function ( d, decimalPlace, re1, re2 ) {\n\tif ( d !== 0 && (!d || d === '-') ) {\n\t\treturn -Infinity;\n\t}\n\t\n\tlet type = typeof d;\n\n\tif (type === 'number' || type === 'bigint') {\n\t\treturn d;\n\t}\n\n\t// If a decimal place other than `.` is used, it needs to be given to the\n\t// function so we can detect it and replace with a `.` which is the only\n\t// decimal place Javascript recognises - it is not locale aware.\n\tif ( decimalPlace ) {\n\t\td = _numToDecimal( d, decimalPlace );\n\t}\n\n\tif ( d.replace ) {\n\t\tif ( re1 ) {\n\t\t\td = d.replace( re1, '' );\n\t\t}\n\n\t\tif ( re2 ) {\n\t\t\td = d.replace( re2, '' );\n\t\t}\n\t}\n\n\treturn d * 1;\n};\n\n\n// Add the numeric 'deformatting' functions for sorting and search. This is done\n// in a function to provide an easy ability for the language options to add\n// additional methods if a non-period decimal place is used.\nfunction _addNumericSort ( decimalPlace ) {\n\t$.each(\n\t\t{\n\t\t\t// Plain numbers\n\t\t\t\"num\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace );\n\t\t\t},\n\n\t\t\t// Formatted numbers\n\t\t\t\"num-fmt\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_formatted_numeric );\n\t\t\t},\n\n\t\t\t// HTML numeric\n\t\t\t\"html-num\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html );\n\t\t\t},\n\n\t\t\t// HTML numeric, formatted\n\t\t\t\"html-num-fmt\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );\n\t\t\t}\n\t\t},\n\t\tfunction ( key, fn ) {\n\t\t\t// Add the ordering method\n\t\t\t_ext.type.order[ key+decimalPlace+'-pre' ] = fn;\n\n\t\t\t// For HTML types add a search formatter that will strip the HTML\n\t\t\tif ( key.match(/^html\\-/) ) {\n\t\t\t\t_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;\n\t\t\t}\n\t\t}\n\t);\n}\n\n\n// Default sort methods\n$.extend( _ext.type.order, {\n\t// Dates\n\t\"date-pre\": function ( d ) {\n\t\tvar ts = Date.parse( d );\n\t\treturn isNaN(ts) ? -Infinity : ts;\n\t},\n\n\t// html\n\t\"html-pre\": function ( a ) {\n\t\treturn _empty(a) ?\n\t\t\t'' :\n\t\t\ta.replace ?\n\t\t\t\ta.replace( /<.*?>/g, \"\" ).toLowerCase() :\n\t\t\t\ta+'';\n\t},\n\n\t// string\n\t\"string-pre\": function ( a ) {\n\t\t// This is a little complex, but faster than always calling toString,\n\t\t// http://jsperf.com/tostring-v-check\n\t\treturn _empty(a) ?\n\t\t\t'' :\n\t\t\ttypeof a === 'string' ?\n\t\t\t\ta.toLowerCase() :\n\t\t\t\t! a.toString ?\n\t\t\t\t\t'' :\n\t\t\t\t\ta.toString();\n\t},\n\n\t// string-asc and -desc are retained only for compatibility with the old\n\t// sort methods\n\t\"string-asc\": function ( x, y ) {\n\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t},\n\n\t\"string-desc\": function ( x, y ) {\n\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t}\n} );\n\n\n// Numeric sorting types - order doesn't matter here\n_addNumericSort( '' );\n\n\n$.extend( true, DataTable.ext.renderer, {\n\theader: {\n\t\t_: function ( settings, cell, column, classes ) {\n\t\t\t// No additional mark-up required\n\t\t\t// Attach a sort listener to update on sort - note that using the\n\t\t\t// `DT` namespace will allow the event to be removed automatically\n\t\t\t// on destroy, while the `dt` namespaced event is the one we are\n\t\t\t// listening for\n\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\tif ( settings !== ctx ) { // need to check this this is the host\n\t\t\t\t\treturn;               // table, not a nested one\n\t\t\t\t}\n\n\t\t\t\tvar colIdx = column.idx;\n\n\t\t\t\tcell\n\t\t\t\t\t.removeClass(\n\t\t\t\t\t\tclasses.sSortAsc +' '+\n\t\t\t\t\t\tclasses.sSortDesc\n\t\t\t\t\t)\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t);\n\t\t\t} );\n\t\t},\n\n\t\tjqueryui: function ( settings, cell, column, classes ) {\n\t\t\t$('<div/>')\n\t\t\t\t.addClass( classes.sSortJUIWrapper )\n\t\t\t\t.append( cell.contents() )\n\t\t\t\t.append( $('<span/>')\n\t\t\t\t\t.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )\n\t\t\t\t)\n\t\t\t\t.appendTo( cell );\n\n\t\t\t// Attach a sort listener to update on sort\n\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar colIdx = column.idx;\n\n\t\t\t\tcell\n\t\t\t\t\t.removeClass( classes.sSortAsc +\" \"+classes.sSortDesc )\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t);\n\n\t\t\t\tcell\n\t\t\t\t\t.find( 'span.'+classes.sSortIcon )\n\t\t\t\t\t.removeClass(\n\t\t\t\t\t\tclasses.sSortJUIAsc +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIDesc +\" \"+\n\t\t\t\t\t\tclasses.sSortJUI +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIAscAllowed +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIDescAllowed\n\t\t\t\t\t)\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortJUIAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortJUIDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClassJUI\n\t\t\t\t\t);\n\t\t\t} );\n\t\t}\n\t}\n} );\n\n/*\n * Public helper functions. These aren't used internally by DataTables, or\n * called by any of the options passed into DataTables, but they can be used\n * externally by developers working with DataTables. They are helper functions\n * to make working with DataTables a little bit easier.\n */\n\nvar __htmlEscapeEntities = function ( d ) {\n\tif (Array.isArray(d)) {\n\t\td = d.join(',');\n\t}\n\n\treturn typeof d === 'string' ?\n\t\td\n\t\t\t.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;') :\n\t\td;\n};\n\n// Common logic for moment, luxon or a date action\nfunction __mld( dt, momentFn, luxonFn, dateFn, arg1 ) {\n\tif (window.moment) {\n\t\treturn dt[momentFn]( arg1 );\n\t}\n\telse if (window.luxon) {\n\t\treturn dt[luxonFn]( arg1 );\n\t}\n\t\n\treturn dateFn ? dt[dateFn]( arg1 ) : dt;\n}\n\n\nvar __mlWarning = false;\nfunction __mldObj (d, format, locale) {\n\tvar dt;\n\n\tif (window.moment) {\n\t\tdt = window.moment.utc( d, format, locale, true );\n\n\t\tif (! dt.isValid()) {\n\t\t\treturn null;\n\t\t}\n\t}\n\telse if (window.luxon) {\n\t\tdt = format && typeof d === 'string'\n\t\t\t? window.luxon.DateTime.fromFormat( d, format )\n\t\t\t: window.luxon.DateTime.fromISO( d );\n\n\t\tif (! dt.isValid) {\n\t\t\treturn null;\n\t\t}\n\n\t\tdt.setLocale(locale);\n\t}\n\telse if (! format) {\n\t\t// No format given, must be ISO\n\t\tdt = new Date(d);\n\t}\n\telse {\n\t\tif (! __mlWarning) {\n\t\t\talert('DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17');\n\t\t}\n\n\t\t__mlWarning = true;\n\t}\n\n\treturn dt;\n}\n\n// Wrapper for date, datetime and time which all operate the same way with the exception of\n// the output string for auto locale support\nfunction __mlHelper (localeString) {\n\treturn function ( from, to, locale, def ) {\n\t\t// Luxon and Moment support\n\t\t// Argument shifting\n\t\tif ( arguments.length === 0 ) {\n\t\t\tlocale = 'en';\n\t\t\tto = null; // means toLocaleString\n\t\t\tfrom = null; // means iso8601\n\t\t}\n\t\telse if ( arguments.length === 1 ) {\n\t\t\tlocale = 'en';\n\t\t\tto = from;\n\t\t\tfrom = null;\n\t\t}\n\t\telse if ( arguments.length === 2 ) {\n\t\t\tlocale = to;\n\t\t\tto = from;\n\t\t\tfrom = null;\n\t\t}\n\n\t\tvar typeName = 'datetime-' + to;\n\n\t\t// Add type detection and sorting specific to this date format - we need to be able to identify\n\t\t// date type columns as such, rather than as numbers in extensions. Hence the need for this.\n\t\tif (! DataTable.ext.type.order[typeName]) {\n\t\t\t// The renderer will give the value to type detect as the type!\n\t\t\tDataTable.ext.type.detect.unshift(function (d) {\n\t\t\t\treturn d === typeName ? typeName : false;\n\t\t\t});\n\n\t\t\t// The renderer gives us Moment, Luxon or Date obects for the sorting, all of which have a\n\t\t\t// `valueOf` which gives milliseconds epoch\n\t\t\tDataTable.ext.type.order[typeName + '-asc'] = function (a, b) {\n\t\t\t\tvar x = a.valueOf();\n\t\t\t\tvar y = b.valueOf();\n\n\t\t\t\treturn x === y\n\t\t\t\t\t? 0\n\t\t\t\t\t: x < y\n\t\t\t\t\t\t? -1\n\t\t\t\t\t\t: 1;\n\t\t\t}\n\n\t\t\tDataTable.ext.type.order[typeName + '-desc'] = function (a, b) {\n\t\t\t\tvar x = a.valueOf();\n\t\t\t\tvar y = b.valueOf();\n\n\t\t\t\treturn x === y\n\t\t\t\t\t? 0\n\t\t\t\t\t: x > y\n\t\t\t\t\t\t? -1\n\t\t\t\t\t\t: 1;\n\t\t\t}\n\t\t}\n\t\n\t\treturn function ( d, type ) {\n\t\t\t// Allow for a default value\n\t\t\tif (d === null || d === undefined) {\n\t\t\t\tif (def === '--now') {\n\t\t\t\t\t// We treat everything as UTC further down, so no changes are\n\t\t\t\t\t// made, as such need to get the local date / time as if it were\n\t\t\t\t\t// UTC\n\t\t\t\t\tvar local = new Date();\n\t\t\t\t\td = new Date( Date.UTC(\n\t\t\t\t\t\tlocal.getFullYear(), local.getMonth(), local.getDate(),\n\t\t\t\t\t\tlocal.getHours(), local.getMinutes(), local.getSeconds()\n\t\t\t\t\t) );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\td = '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (type === 'type') {\n\t\t\t\t// Typing uses the type name for fast matching\n\t\t\t\treturn typeName;\n\t\t\t}\n\n\t\t\tif (d === '') {\n\t\t\t\treturn type !== 'sort'\n\t\t\t\t\t? ''\n\t\t\t\t\t: __mldObj('0000-01-01 00:00:00', null, locale);\n\t\t\t}\n\n\t\t\t// Shortcut. If `from` and `to` are the same, we are using the renderer to\n\t\t\t// format for ordering, not display - its already in the display format.\n\t\t\tif ( to !== null && from === to && type !== 'sort' && type !== 'type' && ! (d instanceof Date) ) {\n\t\t\t\treturn d;\n\t\t\t}\n\n\t\t\tvar dt = __mldObj(d, from, locale);\n\n\t\t\tif (dt === null) {\n\t\t\t\treturn d;\n\t\t\t}\n\n\t\t\tif (type === 'sort') {\n\t\t\t\treturn dt;\n\t\t\t}\n\t\t\t\n\t\t\tvar formatted = to === null\n\t\t\t\t? __mld(dt, 'toDate', 'toJSDate', '')[localeString]()\n\t\t\t\t: __mld(dt, 'format', 'toFormat', 'toISOString', to);\n\n\t\t\t// XSS protection\n\t\t\treturn type === 'display' ?\n\t\t\t\t__htmlEscapeEntities( formatted ) :\n\t\t\t\tformatted;\n\t\t};\n\t}\n}\n\n// Based on locale, determine standard number formatting\n// Fallback for legacy browsers is US English\nvar __thousands = ',';\nvar __decimal = '.';\n\nif (Intl) {\n\ttry {\n\t\tvar num = new Intl.NumberFormat().formatToParts(100000.1);\n\t\n\t\tfor (var i=0 ; i<num.length ; i++) {\n\t\t\tif (num[i].type === 'group') {\n\t\t\t\t__thousands = num[i].value;\n\t\t\t}\n\t\t\telse if (num[i].type === 'decimal') {\n\t\t\t\t__decimal = num[i].value;\n\t\t\t}\n\t\t}\n\t}\n\tcatch (e) {\n\t\t// noop\n\t}\n}\n\n// Formatted date time detection - use by declaring the formats you are going to use\nDataTable.datetime = function ( format, locale ) {\n\tvar typeName = 'datetime-detect-' + format;\n\n\tif (! locale) {\n\t\tlocale = 'en';\n\t}\n\n\tif (! DataTable.ext.type.order[typeName]) {\n\t\tDataTable.ext.type.detect.unshift(function (d) {\n\t\t\tvar dt = __mldObj(d, format, locale);\n\t\t\treturn d === '' || dt ? typeName : false;\n\t\t});\n\n\t\tDataTable.ext.type.order[typeName + '-pre'] = function (d) {\n\t\t\treturn __mldObj(d, format, locale) || 0;\n\t\t}\n\t}\n}\n\n/**\n * Helpers for `columns.render`.\n *\n * The options defined here can be used with the `columns.render` initialisation\n * option to provide a display renderer. The following functions are defined:\n *\n * * `number` - Will format numeric data (defined by `columns.data`) for\n *   display, retaining the original unformatted data for sorting and filtering.\n *   It takes 5 parameters:\n *   * `string` - Thousands grouping separator\n *   * `string` - Decimal point indicator\n *   * `integer` - Number of decimal points to show\n *   * `string` (optional) - Prefix.\n *   * `string` (optional) - Postfix (/suffix).\n * * `text` - Escape HTML to help prevent XSS attacks. It has no optional\n *   parameters.\n *\n * @example\n *   // Column definition using the number renderer\n *   {\n *     data: \"salary\",\n *     render: $.fn.dataTable.render.number( '\\'', '.', 0, '$' )\n *   }\n *\n * @namespace\n */\nDataTable.render = {\n\tdate: __mlHelper('toLocaleDateString'),\n\tdatetime: __mlHelper('toLocaleString'),\n\ttime: __mlHelper('toLocaleTimeString'),\n\tnumber: function ( thousands, decimal, precision, prefix, postfix ) {\n\t\t// Auto locale detection\n\t\tif (thousands === null || thousands === undefined) {\n\t\t\tthousands = __thousands;\n\t\t}\n\n\t\tif (decimal === null || decimal === undefined) {\n\t\t\tdecimal = __decimal;\n\t\t}\n\n\t\treturn {\n\t\t\tdisplay: function ( d ) {\n\t\t\t\tif ( typeof d !== 'number' && typeof d !== 'string' ) {\n\t\t\t\t\treturn d;\n\t\t\t\t}\n\n\t\t\t\tif (d === '' || d === null) {\n\t\t\t\t\treturn d;\n\t\t\t\t}\n\n\t\t\t\tvar negative = d < 0 ? '-' : '';\n\t\t\t\tvar flo = parseFloat( d );\n\n\t\t\t\t// If NaN then there isn't much formatting that we can do - just\n\t\t\t\t// return immediately, escaping any HTML (this was supposed to\n\t\t\t\t// be a number after all)\n\t\t\t\tif ( isNaN( flo ) ) {\n\t\t\t\t\treturn __htmlEscapeEntities( d );\n\t\t\t\t}\n\n\t\t\t\tflo = flo.toFixed( precision );\n\t\t\t\td = Math.abs( flo );\n\n\t\t\t\tvar intPart = parseInt( d, 10 );\n\t\t\t\tvar floatPart = precision ?\n\t\t\t\t\tdecimal+(d - intPart).toFixed( precision ).substring( 2 ):\n\t\t\t\t\t'';\n\n\t\t\t\t// If zero, then can't have a negative prefix\n\t\t\t\tif (intPart === 0 && parseFloat(floatPart) === 0) {\n\t\t\t\t\tnegative = '';\n\t\t\t\t}\n\n\t\t\t\treturn negative + (prefix||'') +\n\t\t\t\t\tintPart.toString().replace(\n\t\t\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g, thousands\n\t\t\t\t\t) +\n\t\t\t\t\tfloatPart +\n\t\t\t\t\t(postfix||'');\n\t\t\t}\n\t\t};\n\t},\n\n\ttext: function () {\n\t\treturn {\n\t\t\tdisplay: __htmlEscapeEntities,\n\t\t\tfilter: __htmlEscapeEntities\n\t\t};\n\t}\n};\n\n\n/*\n * This is really a good bit rubbish this method of exposing the internal methods\n * publicly... - To be fixed in 2.0 using methods on the prototype\n */\n\n\n/**\n * Create a wrapper function for exporting an internal functions to an external API.\n *  @param {string} fn API function name\n *  @returns {function} wrapped function\n *  @memberof DataTable#internal\n */\nfunction _fnExternApiFunc (fn)\n{\n\treturn function() {\n\t\tvar args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(\n\t\t\tArray.prototype.slice.call(arguments)\n\t\t);\n\t\treturn DataTable.ext.internal[fn].apply( this, args );\n\t};\n}\n\n\n/**\n * Reference to internal functions for use by plug-in developers. Note that\n * these methods are references to internal functions and are considered to be\n * private. If you use these methods, be aware that they are liable to change\n * between versions.\n *  @namespace\n */\n$.extend( DataTable.ext.internal, {\n\t_fnExternApiFunc: _fnExternApiFunc,\n\t_fnBuildAjax: _fnBuildAjax,\n\t_fnAjaxUpdate: _fnAjaxUpdate,\n\t_fnAjaxParameters: _fnAjaxParameters,\n\t_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,\n\t_fnAjaxDataSrc: _fnAjaxDataSrc,\n\t_fnAddColumn: _fnAddColumn,\n\t_fnColumnOptions: _fnColumnOptions,\n\t_fnAdjustColumnSizing: _fnAdjustColumnSizing,\n\t_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,\n\t_fnColumnIndexToVisible: _fnColumnIndexToVisible,\n\t_fnVisbleColumns: _fnVisbleColumns,\n\t_fnGetColumns: _fnGetColumns,\n\t_fnColumnTypes: _fnColumnTypes,\n\t_fnApplyColumnDefs: _fnApplyColumnDefs,\n\t_fnHungarianMap: _fnHungarianMap,\n\t_fnCamelToHungarian: _fnCamelToHungarian,\n\t_fnLanguageCompat: _fnLanguageCompat,\n\t_fnBrowserDetect: _fnBrowserDetect,\n\t_fnAddData: _fnAddData,\n\t_fnAddTr: _fnAddTr,\n\t_fnNodeToDataIndex: _fnNodeToDataIndex,\n\t_fnNodeToColumnIndex: _fnNodeToColumnIndex,\n\t_fnGetCellData: _fnGetCellData,\n\t_fnSetCellData: _fnSetCellData,\n\t_fnSplitObjNotation: _fnSplitObjNotation,\n\t_fnGetObjectDataFn: _fnGetObjectDataFn,\n\t_fnSetObjectDataFn: _fnSetObjectDataFn,\n\t_fnGetDataMaster: _fnGetDataMaster,\n\t_fnClearTable: _fnClearTable,\n\t_fnDeleteIndex: _fnDeleteIndex,\n\t_fnInvalidate: _fnInvalidate,\n\t_fnGetRowElements: _fnGetRowElements,\n\t_fnCreateTr: _fnCreateTr,\n\t_fnBuildHead: _fnBuildHead,\n\t_fnDrawHead: _fnDrawHead,\n\t_fnDraw: _fnDraw,\n\t_fnReDraw: _fnReDraw,\n\t_fnAddOptionsHtml: _fnAddOptionsHtml,\n\t_fnDetectHeader: _fnDetectHeader,\n\t_fnGetUniqueThs: _fnGetUniqueThs,\n\t_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,\n\t_fnFilterComplete: _fnFilterComplete,\n\t_fnFilterCustom: _fnFilterCustom,\n\t_fnFilterColumn: _fnFilterColumn,\n\t_fnFilter: _fnFilter,\n\t_fnFilterCreateSearch: _fnFilterCreateSearch,\n\t_fnEscapeRegex: _fnEscapeRegex,\n\t_fnFilterData: _fnFilterData,\n\t_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,\n\t_fnUpdateInfo: _fnUpdateInfo,\n\t_fnInfoMacros: _fnInfoMacros,\n\t_fnInitialise: _fnInitialise,\n\t_fnInitComplete: _fnInitComplete,\n\t_fnLengthChange: _fnLengthChange,\n\t_fnFeatureHtmlLength: _fnFeatureHtmlLength,\n\t_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,\n\t_fnPageChange: _fnPageChange,\n\t_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,\n\t_fnProcessingDisplay: _fnProcessingDisplay,\n\t_fnFeatureHtmlTable: _fnFeatureHtmlTable,\n\t_fnScrollDraw: _fnScrollDraw,\n\t_fnApplyToChildren: _fnApplyToChildren,\n\t_fnCalculateColumnWidths: _fnCalculateColumnWidths,\n\t_fnThrottle: _fnThrottle,\n\t_fnConvertToWidth: _fnConvertToWidth,\n\t_fnGetWidestNode: _fnGetWidestNode,\n\t_fnGetMaxLenString: _fnGetMaxLenString,\n\t_fnStringToCss: _fnStringToCss,\n\t_fnSortFlatten: _fnSortFlatten,\n\t_fnSort: _fnSort,\n\t_fnSortAria: _fnSortAria,\n\t_fnSortListener: _fnSortListener,\n\t_fnSortAttachListener: _fnSortAttachListener,\n\t_fnSortingClasses: _fnSortingClasses,\n\t_fnSortData: _fnSortData,\n\t_fnSaveState: _fnSaveState,\n\t_fnLoadState: _fnLoadState,\n\t_fnImplementState: _fnImplementState,\n\t_fnSettingsFromNode: _fnSettingsFromNode,\n\t_fnLog: _fnLog,\n\t_fnMap: _fnMap,\n\t_fnBindAction: _fnBindAction,\n\t_fnCallbackReg: _fnCallbackReg,\n\t_fnCallbackFire: _fnCallbackFire,\n\t_fnLengthOverflow: _fnLengthOverflow,\n\t_fnRenderer: _fnRenderer,\n\t_fnDataSource: _fnDataSource,\n\t_fnRowAttributes: _fnRowAttributes,\n\t_fnExtend: _fnExtend,\n\t_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant\n\t                                // in 1.10, so this dead-end function is\n\t                                // added to prevent errors\n} );\n\n\n// jQuery access\n$.fn.dataTable = DataTable;\n\n// Provide access to the host jQuery object (circular reference)\nDataTable.$ = $;\n\n// Legacy aliases\n$.fn.dataTableSettings = DataTable.settings;\n$.fn.dataTableExt = DataTable.ext;\n\n// With a capital `D` we return a DataTables API instance rather than a\n// jQuery object\n$.fn.DataTable = function ( opts ) {\n\treturn $(this).dataTable( opts ).api();\n};\n\n// All properties that are available to $.fn.dataTable should also be\n// available on $.fn.DataTable\n$.each( DataTable, function ( prop, val ) {\n\t$.fn.DataTable[ prop ] = val;\n} );\n\nexport default DataTable;\n","/*! DataTables styling integration\n * ©2018 SpryMedia Ltd - datatables.net/license\n */\n\nimport $ from 'jquery';\nimport DataTable from 'datatables.net';\n\n\n\n\nexport default DataTable;\n","export var HOOKS = [\n    \"onChange\",\n    \"onClose\",\n    \"onDayCreate\",\n    \"onDestroy\",\n    \"onKeyDown\",\n    \"onMonthChange\",\n    \"onOpen\",\n    \"onParseConfig\",\n    \"onReady\",\n    \"onValueUpdate\",\n    \"onYearChange\",\n    \"onPreCalendarPosition\",\n];\nexport var defaults = {\n    _disable: [],\n    allowInput: false,\n    allowInvalidPreload: false,\n    altFormat: \"F j, Y\",\n    altInput: false,\n    altInputClass: \"form-control input\",\n    animate: typeof window === \"object\" &&\n        window.navigator.userAgent.indexOf(\"MSIE\") === -1,\n    ariaDateFormat: \"F j, Y\",\n    autoFillDefaultTime: true,\n    clickOpens: true,\n    closeOnSelect: true,\n    conjunction: \", \",\n    dateFormat: \"Y-m-d\",\n    defaultHour: 12,\n    defaultMinute: 0,\n    defaultSeconds: 0,\n    disable: [],\n    disableMobile: false,\n    enableSeconds: false,\n    enableTime: false,\n    errorHandler: function (err) {\n        return typeof console !== \"undefined\" && console.warn(err);\n    },\n    getWeek: function (givenDate) {\n        var date = new Date(givenDate.getTime());\n        date.setHours(0, 0, 0, 0);\n        date.setDate(date.getDate() + 3 - ((date.getDay() + 6) % 7));\n        var week1 = new Date(date.getFullYear(), 0, 4);\n        return (1 +\n            Math.round(((date.getTime() - week1.getTime()) / 86400000 -\n                3 +\n                ((week1.getDay() + 6) % 7)) /\n                7));\n    },\n    hourIncrement: 1,\n    ignoredFocusElements: [],\n    inline: false,\n    locale: \"default\",\n    minuteIncrement: 5,\n    mode: \"single\",\n    monthSelectorType: \"dropdown\",\n    nextArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>\",\n    noCalendar: false,\n    now: new Date(),\n    onChange: [],\n    onClose: [],\n    onDayCreate: [],\n    onDestroy: [],\n    onKeyDown: [],\n    onMonthChange: [],\n    onOpen: [],\n    onParseConfig: [],\n    onReady: [],\n    onValueUpdate: [],\n    onYearChange: [],\n    onPreCalendarPosition: [],\n    plugins: [],\n    position: \"auto\",\n    positionElement: undefined,\n    prevArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>\",\n    shorthandCurrentMonth: false,\n    showMonths: 1,\n    static: false,\n    time_24hr: false,\n    weekNumbers: false,\n    wrap: false,\n};\n","export var english = {\n    weekdays: {\n        shorthand: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n        longhand: [\n            \"Sunday\",\n            \"Monday\",\n            \"Tuesday\",\n            \"Wednesday\",\n            \"Thursday\",\n            \"Friday\",\n            \"Saturday\",\n        ],\n    },\n    months: {\n        shorthand: [\n            \"Jan\",\n            \"Feb\",\n            \"Mar\",\n            \"Apr\",\n            \"May\",\n            \"Jun\",\n            \"Jul\",\n            \"Aug\",\n            \"Sep\",\n            \"Oct\",\n            \"Nov\",\n            \"Dec\",\n        ],\n        longhand: [\n            \"January\",\n            \"February\",\n            \"March\",\n            \"April\",\n            \"May\",\n            \"June\",\n            \"July\",\n            \"August\",\n            \"September\",\n            \"October\",\n            \"November\",\n            \"December\",\n        ],\n    },\n    daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],\n    firstDayOfWeek: 0,\n    ordinal: function (nth) {\n        var s = nth % 100;\n        if (s > 3 && s < 21)\n            return \"th\";\n        switch (s % 10) {\n            case 1:\n                return \"st\";\n            case 2:\n                return \"nd\";\n            case 3:\n                return \"rd\";\n            default:\n                return \"th\";\n        }\n    },\n    rangeSeparator: \" to \",\n    weekAbbreviation: \"Wk\",\n    scrollTitle: \"Scroll to increment\",\n    toggleTitle: \"Click to toggle\",\n    amPM: [\"AM\", \"PM\"],\n    yearAriaLabel: \"Year\",\n    monthAriaLabel: \"Month\",\n    hourAriaLabel: \"Hour\",\n    minuteAriaLabel: \"Minute\",\n    time_24hr: false,\n};\nexport default english;\n","export var pad = function (number, length) {\n    if (length === void 0) { length = 2; }\n    return (\"000\" + number).slice(length * -1);\n};\nexport var int = function (bool) { return (bool === true ? 1 : 0); };\nexport function debounce(fn, wait) {\n    var t;\n    return function () {\n        var _this = this;\n        var args = arguments;\n        clearTimeout(t);\n        t = setTimeout(function () { return fn.apply(_this, args); }, wait);\n    };\n}\nexport var arrayify = function (obj) {\n    return obj instanceof Array ? obj : [obj];\n};\n","export function toggleClass(elem, className, bool) {\n    if (bool === true)\n        return elem.classList.add(className);\n    elem.classList.remove(className);\n}\nexport function createElement(tag, className, content) {\n    var e = window.document.createElement(tag);\n    className = className || \"\";\n    content = content || \"\";\n    e.className = className;\n    if (content !== undefined)\n        e.textContent = content;\n    return e;\n}\nexport function clearNode(node) {\n    while (node.firstChild)\n        node.removeChild(node.firstChild);\n}\nexport function findParent(node, condition) {\n    if (condition(node))\n        return node;\n    else if (node.parentNode)\n        return findParent(node.parentNode, condition);\n    return undefined;\n}\nexport function createNumberInput(inputClassName, opts) {\n    var wrapper = createElement(\"div\", \"numInputWrapper\"), numInput = createElement(\"input\", \"numInput \" + inputClassName), arrowUp = createElement(\"span\", \"arrowUp\"), arrowDown = createElement(\"span\", \"arrowDown\");\n    if (navigator.userAgent.indexOf(\"MSIE 9.0\") === -1) {\n        numInput.type = \"number\";\n    }\n    else {\n        numInput.type = \"text\";\n        numInput.pattern = \"\\\\d*\";\n    }\n    if (opts !== undefined)\n        for (var key in opts)\n            numInput.setAttribute(key, opts[key]);\n    wrapper.appendChild(numInput);\n    wrapper.appendChild(arrowUp);\n    wrapper.appendChild(arrowDown);\n    return wrapper;\n}\nexport function getEventTarget(event) {\n    try {\n        if (typeof event.composedPath === \"function\") {\n            var path = event.composedPath();\n            return path[0];\n        }\n        return event.target;\n    }\n    catch (error) {\n        return event.target;\n    }\n}\n","import { int, pad } from \"../utils\";\nvar doNothing = function () { return undefined; };\nexport var monthToStr = function (monthNumber, shorthand, locale) { return locale.months[shorthand ? \"shorthand\" : \"longhand\"][monthNumber]; };\nexport var revFormat = {\n    D: doNothing,\n    F: function (dateObj, monthName, locale) {\n        dateObj.setMonth(locale.months.longhand.indexOf(monthName));\n    },\n    G: function (dateObj, hour) {\n        dateObj.setHours((dateObj.getHours() >= 12 ? 12 : 0) + parseFloat(hour));\n    },\n    H: function (dateObj, hour) {\n        dateObj.setHours(parseFloat(hour));\n    },\n    J: function (dateObj, day) {\n        dateObj.setDate(parseFloat(day));\n    },\n    K: function (dateObj, amPM, locale) {\n        dateObj.setHours((dateObj.getHours() % 12) +\n            12 * int(new RegExp(locale.amPM[1], \"i\").test(amPM)));\n    },\n    M: function (dateObj, shortMonth, locale) {\n        dateObj.setMonth(locale.months.shorthand.indexOf(shortMonth));\n    },\n    S: function (dateObj, seconds) {\n        dateObj.setSeconds(parseFloat(seconds));\n    },\n    U: function (_, unixSeconds) { return new Date(parseFloat(unixSeconds) * 1000); },\n    W: function (dateObj, weekNum, locale) {\n        var weekNumber = parseInt(weekNum);\n        var date = new Date(dateObj.getFullYear(), 0, 2 + (weekNumber - 1) * 7, 0, 0, 0, 0);\n        date.setDate(date.getDate() - date.getDay() + locale.firstDayOfWeek);\n        return date;\n    },\n    Y: function (dateObj, year) {\n        dateObj.setFullYear(parseFloat(year));\n    },\n    Z: function (_, ISODate) { return new Date(ISODate); },\n    d: function (dateObj, day) {\n        dateObj.setDate(parseFloat(day));\n    },\n    h: function (dateObj, hour) {\n        dateObj.setHours((dateObj.getHours() >= 12 ? 12 : 0) + parseFloat(hour));\n    },\n    i: function (dateObj, minutes) {\n        dateObj.setMinutes(parseFloat(minutes));\n    },\n    j: function (dateObj, day) {\n        dateObj.setDate(parseFloat(day));\n    },\n    l: doNothing,\n    m: function (dateObj, month) {\n        dateObj.setMonth(parseFloat(month) - 1);\n    },\n    n: function (dateObj, month) {\n        dateObj.setMonth(parseFloat(month) - 1);\n    },\n    s: function (dateObj, seconds) {\n        dateObj.setSeconds(parseFloat(seconds));\n    },\n    u: function (_, unixMillSeconds) {\n        return new Date(parseFloat(unixMillSeconds));\n    },\n    w: doNothing,\n    y: function (dateObj, year) {\n        dateObj.setFullYear(2000 + parseFloat(year));\n    },\n};\nexport var tokenRegex = {\n    D: \"\",\n    F: \"\",\n    G: \"(\\\\d\\\\d|\\\\d)\",\n    H: \"(\\\\d\\\\d|\\\\d)\",\n    J: \"(\\\\d\\\\d|\\\\d)\\\\w+\",\n    K: \"\",\n    M: \"\",\n    S: \"(\\\\d\\\\d|\\\\d)\",\n    U: \"(.+)\",\n    W: \"(\\\\d\\\\d|\\\\d)\",\n    Y: \"(\\\\d{4})\",\n    Z: \"(.+)\",\n    d: \"(\\\\d\\\\d|\\\\d)\",\n    h: \"(\\\\d\\\\d|\\\\d)\",\n    i: \"(\\\\d\\\\d|\\\\d)\",\n    j: \"(\\\\d\\\\d|\\\\d)\",\n    l: \"\",\n    m: \"(\\\\d\\\\d|\\\\d)\",\n    n: \"(\\\\d\\\\d|\\\\d)\",\n    s: \"(\\\\d\\\\d|\\\\d)\",\n    u: \"(.+)\",\n    w: \"(\\\\d\\\\d|\\\\d)\",\n    y: \"(\\\\d{2})\",\n};\nexport var formats = {\n    Z: function (date) { return date.toISOString(); },\n    D: function (date, locale, options) {\n        return locale.weekdays.shorthand[formats.w(date, locale, options)];\n    },\n    F: function (date, locale, options) {\n        return monthToStr(formats.n(date, locale, options) - 1, false, locale);\n    },\n    G: function (date, locale, options) {\n        return pad(formats.h(date, locale, options));\n    },\n    H: function (date) { return pad(date.getHours()); },\n    J: function (date, locale) {\n        return locale.ordinal !== undefined\n            ? date.getDate() + locale.ordinal(date.getDate())\n            : date.getDate();\n    },\n    K: function (date, locale) { return locale.amPM[int(date.getHours() > 11)]; },\n    M: function (date, locale) {\n        return monthToStr(date.getMonth(), true, locale);\n    },\n    S: function (date) { return pad(date.getSeconds()); },\n    U: function (date) { return date.getTime() / 1000; },\n    W: function (date, _, options) {\n        return options.getWeek(date);\n    },\n    Y: function (date) { return pad(date.getFullYear(), 4); },\n    d: function (date) { return pad(date.getDate()); },\n    h: function (date) { return (date.getHours() % 12 ? date.getHours() % 12 : 12); },\n    i: function (date) { return pad(date.getMinutes()); },\n    j: function (date) { return date.getDate(); },\n    l: function (date, locale) {\n        return locale.weekdays.longhand[date.getDay()];\n    },\n    m: function (date) { return pad(date.getMonth() + 1); },\n    n: function (date) { return date.getMonth() + 1; },\n    s: function (date) { return date.getSeconds(); },\n    u: function (date) { return date.getTime(); },\n    w: function (date) { return date.getDay(); },\n    y: function (date) { return String(date.getFullYear()).substring(2); },\n};\n","import { tokenRegex, revFormat, formats, } from \"./formatting\";\nimport { defaults } from \"../types/options\";\nimport { english } from \"../l10n/default\";\nexport var createDateFormatter = function (_a) {\n    var _b = _a.config, config = _b === void 0 ? defaults : _b, _c = _a.l10n, l10n = _c === void 0 ? english : _c, _d = _a.isMobile, isMobile = _d === void 0 ? false : _d;\n    return function (dateObj, frmt, overrideLocale) {\n        var locale = overrideLocale || l10n;\n        if (config.formatDate !== undefined && !isMobile) {\n            return config.formatDate(dateObj, frmt, locale);\n        }\n        return frmt\n            .split(\"\")\n            .map(function (c, i, arr) {\n            return formats[c] && arr[i - 1] !== \"\\\\\"\n                ? formats[c](dateObj, locale, config)\n                : c !== \"\\\\\"\n                    ? c\n                    : \"\";\n        })\n            .join(\"\");\n    };\n};\nexport var createDateParser = function (_a) {\n    var _b = _a.config, config = _b === void 0 ? defaults : _b, _c = _a.l10n, l10n = _c === void 0 ? english : _c;\n    return function (date, givenFormat, timeless, customLocale) {\n        if (date !== 0 && !date)\n            return undefined;\n        var locale = customLocale || l10n;\n        var parsedDate;\n        var dateOrig = date;\n        if (date instanceof Date)\n            parsedDate = new Date(date.getTime());\n        else if (typeof date !== \"string\" &&\n            date.toFixed !== undefined)\n            parsedDate = new Date(date);\n        else if (typeof date === \"string\") {\n            var format = givenFormat || (config || defaults).dateFormat;\n            var datestr = String(date).trim();\n            if (datestr === \"today\") {\n                parsedDate = new Date();\n                timeless = true;\n            }\n            else if (config && config.parseDate) {\n                parsedDate = config.parseDate(date, format);\n            }\n            else if (/Z$/.test(datestr) ||\n                /GMT$/.test(datestr)) {\n                parsedDate = new Date(date);\n            }\n            else {\n                var matched = void 0, ops = [];\n                for (var i = 0, matchIndex = 0, regexStr = \"\"; i < format.length; i++) {\n                    var token = format[i];\n                    var isBackSlash = token === \"\\\\\";\n                    var escaped = format[i - 1] === \"\\\\\" || isBackSlash;\n                    if (tokenRegex[token] && !escaped) {\n                        regexStr += tokenRegex[token];\n                        var match = new RegExp(regexStr).exec(date);\n                        if (match && (matched = true)) {\n                            ops[token !== \"Y\" ? \"push\" : \"unshift\"]({\n                                fn: revFormat[token],\n                                val: match[++matchIndex],\n                            });\n                        }\n                    }\n                    else if (!isBackSlash)\n                        regexStr += \".\";\n                }\n                parsedDate =\n                    !config || !config.noCalendar\n                        ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0)\n                        : new Date(new Date().setHours(0, 0, 0, 0));\n                ops.forEach(function (_a) {\n                    var fn = _a.fn, val = _a.val;\n                    return (parsedDate = fn(parsedDate, val, locale) || parsedDate);\n                });\n                parsedDate = matched ? parsedDate : undefined;\n            }\n        }\n        if (!(parsedDate instanceof Date && !isNaN(parsedDate.getTime()))) {\n            config.errorHandler(new Error(\"Invalid date provided: \" + dateOrig));\n            return undefined;\n        }\n        if (timeless === true)\n            parsedDate.setHours(0, 0, 0, 0);\n        return parsedDate;\n    };\n};\nexport function compareDates(date1, date2, timeless) {\n    if (timeless === void 0) { timeless = true; }\n    if (timeless !== false) {\n        return (new Date(date1.getTime()).setHours(0, 0, 0, 0) -\n            new Date(date2.getTime()).setHours(0, 0, 0, 0));\n    }\n    return date1.getTime() - date2.getTime();\n}\nexport function compareTimes(date1, date2) {\n    return (3600 * (date1.getHours() - date2.getHours()) +\n        60 * (date1.getMinutes() - date2.getMinutes()) +\n        date1.getSeconds() -\n        date2.getSeconds());\n}\nexport var isBetween = function (ts, ts1, ts2) {\n    return ts > Math.min(ts1, ts2) && ts < Math.max(ts1, ts2);\n};\nexport var calculateSecondsSinceMidnight = function (hours, minutes, seconds) {\n    return hours * 3600 + minutes * 60 + seconds;\n};\nexport var parseSeconds = function (secondsSinceMidnight) {\n    var hours = Math.floor(secondsSinceMidnight / 3600), minutes = (secondsSinceMidnight - hours * 3600) / 60;\n    return [hours, minutes, secondsSinceMidnight - hours * 3600 - minutes * 60];\n};\nexport var duration = {\n    DAY: 86400000,\n};\nexport function getDefaultHours(config) {\n    var hours = config.defaultHour;\n    var minutes = config.defaultMinute;\n    var seconds = config.defaultSeconds;\n    if (config.minDate !== undefined) {\n        var minHour = config.minDate.getHours();\n        var minMinutes = config.minDate.getMinutes();\n        var minSeconds = config.minDate.getSeconds();\n        if (hours < minHour) {\n            hours = minHour;\n        }\n        if (hours === minHour && minutes < minMinutes) {\n            minutes = minMinutes;\n        }\n        if (hours === minHour && minutes === minMinutes && seconds < minSeconds)\n            seconds = config.minDate.getSeconds();\n    }\n    if (config.maxDate !== undefined) {\n        var maxHr = config.maxDate.getHours();\n        var maxMinutes = config.maxDate.getMinutes();\n        hours = Math.min(hours, maxHr);\n        if (hours === maxHr)\n            minutes = Math.min(maxMinutes, minutes);\n        if (hours === maxHr && minutes === maxMinutes)\n            seconds = config.maxDate.getSeconds();\n    }\n    return { hours: hours, minutes: minutes, seconds: seconds };\n}\n","\"use strict\";\nif (typeof Object.assign !== \"function\") {\n    Object.assign = function (target) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        if (!target) {\n            throw TypeError(\"Cannot convert undefined or null to object\");\n        }\n        var _loop_1 = function (source) {\n            if (source) {\n                Object.keys(source).forEach(function (key) { return (target[key] = source[key]); });\n            }\n        };\n        for (var _a = 0, args_1 = args; _a < args_1.length; _a++) {\n            var source = args_1[_a];\n            _loop_1(source);\n        }\n        return target;\n    };\n}\n","var __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n            r[k] = a[j];\n    return r;\n};\nimport { defaults as defaultOptions, HOOKS, } from \"./types/options\";\nimport English from \"./l10n/default\";\nimport { arrayify, debounce, int, pad } from \"./utils\";\nimport { clearNode, createElement, createNumberInput, findParent, toggleClass, getEventTarget, } from \"./utils/dom\";\nimport { compareDates, createDateParser, createDateFormatter, duration, isBetween, getDefaultHours, calculateSecondsSinceMidnight, parseSeconds, } from \"./utils/dates\";\nimport { tokenRegex, monthToStr } from \"./utils/formatting\";\nimport \"./utils/polyfills\";\nvar DEBOUNCED_CHANGE_MS = 300;\nfunction FlatpickrInstance(element, instanceConfig) {\n    var self = {\n        config: __assign(__assign({}, defaultOptions), flatpickr.defaultConfig),\n        l10n: English,\n    };\n    self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });\n    self._handlers = [];\n    self.pluginElements = [];\n    self.loadedPlugins = [];\n    self._bind = bind;\n    self._setHoursFromDate = setHoursFromDate;\n    self._positionCalendar = positionCalendar;\n    self.changeMonth = changeMonth;\n    self.changeYear = changeYear;\n    self.clear = clear;\n    self.close = close;\n    self.onMouseOver = onMouseOver;\n    self._createElement = createElement;\n    self.createDay = createDay;\n    self.destroy = destroy;\n    self.isEnabled = isEnabled;\n    self.jumpToDate = jumpToDate;\n    self.updateValue = updateValue;\n    self.open = open;\n    self.redraw = redraw;\n    self.set = set;\n    self.setDate = setDate;\n    self.toggle = toggle;\n    function setupHelperFunctions() {\n        self.utils = {\n            getDaysInMonth: function (month, yr) {\n                if (month === void 0) { month = self.currentMonth; }\n                if (yr === void 0) { yr = self.currentYear; }\n                if (month === 1 && ((yr % 4 === 0 && yr % 100 !== 0) || yr % 400 === 0))\n                    return 29;\n                return self.l10n.daysInMonth[month];\n            },\n        };\n    }\n    function init() {\n        self.element = self.input = element;\n        self.isOpen = false;\n        parseConfig();\n        setupLocale();\n        setupInputs();\n        setupDates();\n        setupHelperFunctions();\n        if (!self.isMobile)\n            build();\n        bindEvents();\n        if (self.selectedDates.length || self.config.noCalendar) {\n            if (self.config.enableTime) {\n                setHoursFromDate(self.config.noCalendar ? self.latestSelectedDateObj : undefined);\n            }\n            updateValue(false);\n        }\n        setCalendarWidth();\n        var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n        if (!self.isMobile && isSafari) {\n            positionCalendar();\n        }\n        triggerEvent(\"onReady\");\n    }\n    function getClosestActiveElement() {\n        var _a;\n        return (((_a = self.calendarContainer) === null || _a === void 0 ? void 0 : _a.getRootNode())\n            .activeElement || document.activeElement);\n    }\n    function bindToInstance(fn) {\n        return fn.bind(self);\n    }\n    function setCalendarWidth() {\n        var config = self.config;\n        if (config.weekNumbers === false && config.showMonths === 1) {\n            return;\n        }\n        else if (config.noCalendar !== true) {\n            window.requestAnimationFrame(function () {\n                if (self.calendarContainer !== undefined) {\n                    self.calendarContainer.style.visibility = \"hidden\";\n                    self.calendarContainer.style.display = \"block\";\n                }\n                if (self.daysContainer !== undefined) {\n                    var daysWidth = (self.days.offsetWidth + 1) * config.showMonths;\n                    self.daysContainer.style.width = daysWidth + \"px\";\n                    self.calendarContainer.style.width =\n                        daysWidth +\n                            (self.weekWrapper !== undefined\n                                ? self.weekWrapper.offsetWidth\n                                : 0) +\n                            \"px\";\n                    self.calendarContainer.style.removeProperty(\"visibility\");\n                    self.calendarContainer.style.removeProperty(\"display\");\n                }\n            });\n        }\n    }\n    function updateTime(e) {\n        if (self.selectedDates.length === 0) {\n            var defaultDate = self.config.minDate === undefined ||\n                compareDates(new Date(), self.config.minDate) >= 0\n                ? new Date()\n                : new Date(self.config.minDate.getTime());\n            var defaults = getDefaultHours(self.config);\n            defaultDate.setHours(defaults.hours, defaults.minutes, defaults.seconds, defaultDate.getMilliseconds());\n            self.selectedDates = [defaultDate];\n            self.latestSelectedDateObj = defaultDate;\n        }\n        if (e !== undefined && e.type !== \"blur\") {\n            timeWrapper(e);\n        }\n        var prevValue = self._input.value;\n        setHoursFromInputs();\n        updateValue();\n        if (self._input.value !== prevValue) {\n            self._debouncedChange();\n        }\n    }\n    function ampm2military(hour, amPM) {\n        return (hour % 12) + 12 * int(amPM === self.l10n.amPM[1]);\n    }\n    function military2ampm(hour) {\n        switch (hour % 24) {\n            case 0:\n            case 12:\n                return 12;\n            default:\n                return hour % 12;\n        }\n    }\n    function setHoursFromInputs() {\n        if (self.hourElement === undefined || self.minuteElement === undefined)\n            return;\n        var hours = (parseInt(self.hourElement.value.slice(-2), 10) || 0) % 24, minutes = (parseInt(self.minuteElement.value, 10) || 0) % 60, seconds = self.secondElement !== undefined\n            ? (parseInt(self.secondElement.value, 10) || 0) % 60\n            : 0;\n        if (self.amPM !== undefined) {\n            hours = ampm2military(hours, self.amPM.textContent);\n        }\n        var limitMinHours = self.config.minTime !== undefined ||\n            (self.config.minDate &&\n                self.minDateHasTime &&\n                self.latestSelectedDateObj &&\n                compareDates(self.latestSelectedDateObj, self.config.minDate, true) ===\n                    0);\n        var limitMaxHours = self.config.maxTime !== undefined ||\n            (self.config.maxDate &&\n                self.maxDateHasTime &&\n                self.latestSelectedDateObj &&\n                compareDates(self.latestSelectedDateObj, self.config.maxDate, true) ===\n                    0);\n        if (self.config.maxTime !== undefined &&\n            self.config.minTime !== undefined &&\n            self.config.minTime > self.config.maxTime) {\n            var minBound = calculateSecondsSinceMidnight(self.config.minTime.getHours(), self.config.minTime.getMinutes(), self.config.minTime.getSeconds());\n            var maxBound = calculateSecondsSinceMidnight(self.config.maxTime.getHours(), self.config.maxTime.getMinutes(), self.config.maxTime.getSeconds());\n            var currentTime = calculateSecondsSinceMidnight(hours, minutes, seconds);\n            if (currentTime > maxBound && currentTime < minBound) {\n                var result = parseSeconds(minBound);\n                hours = result[0];\n                minutes = result[1];\n                seconds = result[2];\n            }\n        }\n        else {\n            if (limitMaxHours) {\n                var maxTime = self.config.maxTime !== undefined\n                    ? self.config.maxTime\n                    : self.config.maxDate;\n                hours = Math.min(hours, maxTime.getHours());\n                if (hours === maxTime.getHours())\n                    minutes = Math.min(minutes, maxTime.getMinutes());\n                if (minutes === maxTime.getMinutes())\n                    seconds = Math.min(seconds, maxTime.getSeconds());\n            }\n            if (limitMinHours) {\n                var minTime = self.config.minTime !== undefined\n                    ? self.config.minTime\n                    : self.config.minDate;\n                hours = Math.max(hours, minTime.getHours());\n                if (hours === minTime.getHours() && minutes < minTime.getMinutes())\n                    minutes = minTime.getMinutes();\n                if (minutes === minTime.getMinutes())\n                    seconds = Math.max(seconds, minTime.getSeconds());\n            }\n        }\n        setHours(hours, minutes, seconds);\n    }\n    function setHoursFromDate(dateObj) {\n        var date = dateObj || self.latestSelectedDateObj;\n        if (date && date instanceof Date) {\n            setHours(date.getHours(), date.getMinutes(), date.getSeconds());\n        }\n    }\n    function setHours(hours, minutes, seconds) {\n        if (self.latestSelectedDateObj !== undefined) {\n            self.latestSelectedDateObj.setHours(hours % 24, minutes, seconds || 0, 0);\n        }\n        if (!self.hourElement || !self.minuteElement || self.isMobile)\n            return;\n        self.hourElement.value = pad(!self.config.time_24hr\n            ? ((12 + hours) % 12) + 12 * int(hours % 12 === 0)\n            : hours);\n        self.minuteElement.value = pad(minutes);\n        if (self.amPM !== undefined)\n            self.amPM.textContent = self.l10n.amPM[int(hours >= 12)];\n        if (self.secondElement !== undefined)\n            self.secondElement.value = pad(seconds);\n    }\n    function onYearInput(event) {\n        var eventTarget = getEventTarget(event);\n        var year = parseInt(eventTarget.value) + (event.delta || 0);\n        if (year / 1000 > 1 ||\n            (event.key === \"Enter\" && !/[^\\d]/.test(year.toString()))) {\n            changeYear(year);\n        }\n    }\n    function bind(element, event, handler, options) {\n        if (event instanceof Array)\n            return event.forEach(function (ev) { return bind(element, ev, handler, options); });\n        if (element instanceof Array)\n            return element.forEach(function (el) { return bind(el, event, handler, options); });\n        element.addEventListener(event, handler, options);\n        self._handlers.push({\n            remove: function () { return element.removeEventListener(event, handler, options); },\n        });\n    }\n    function triggerChange() {\n        triggerEvent(\"onChange\");\n    }\n    function bindEvents() {\n        if (self.config.wrap) {\n            [\"open\", \"close\", \"toggle\", \"clear\"].forEach(function (evt) {\n                Array.prototype.forEach.call(self.element.querySelectorAll(\"[data-\" + evt + \"]\"), function (el) {\n                    return bind(el, \"click\", self[evt]);\n                });\n            });\n        }\n        if (self.isMobile) {\n            setupMobile();\n            return;\n        }\n        var debouncedResize = debounce(onResize, 50);\n        self._debouncedChange = debounce(triggerChange, DEBOUNCED_CHANGE_MS);\n        if (self.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent))\n            bind(self.daysContainer, \"mouseover\", function (e) {\n                if (self.config.mode === \"range\")\n                    onMouseOver(getEventTarget(e));\n            });\n        bind(self._input, \"keydown\", onKeyDown);\n        if (self.calendarContainer !== undefined) {\n            bind(self.calendarContainer, \"keydown\", onKeyDown);\n        }\n        if (!self.config.inline && !self.config.static)\n            bind(window, \"resize\", debouncedResize);\n        if (window.ontouchstart !== undefined)\n            bind(window.document, \"touchstart\", documentClick);\n        else\n            bind(window.document, \"mousedown\", documentClick);\n        bind(window.document, \"focus\", documentClick, { capture: true });\n        if (self.config.clickOpens === true) {\n            bind(self._input, \"focus\", self.open);\n            bind(self._input, \"click\", self.open);\n        }\n        if (self.daysContainer !== undefined) {\n            bind(self.monthNav, \"click\", onMonthNavClick);\n            bind(self.monthNav, [\"keyup\", \"increment\"], onYearInput);\n            bind(self.daysContainer, \"click\", selectDate);\n        }\n        if (self.timeContainer !== undefined &&\n            self.minuteElement !== undefined &&\n            self.hourElement !== undefined) {\n            var selText = function (e) {\n                return getEventTarget(e).select();\n            };\n            bind(self.timeContainer, [\"increment\"], updateTime);\n            bind(self.timeContainer, \"blur\", updateTime, { capture: true });\n            bind(self.timeContainer, \"click\", timeIncrement);\n            bind([self.hourElement, self.minuteElement], [\"focus\", \"click\"], selText);\n            if (self.secondElement !== undefined)\n                bind(self.secondElement, \"focus\", function () { return self.secondElement && self.secondElement.select(); });\n            if (self.amPM !== undefined) {\n                bind(self.amPM, \"click\", function (e) {\n                    updateTime(e);\n                });\n            }\n        }\n        if (self.config.allowInput) {\n            bind(self._input, \"blur\", onBlur);\n        }\n    }\n    function jumpToDate(jumpDate, triggerChange) {\n        var jumpTo = jumpDate !== undefined\n            ? self.parseDate(jumpDate)\n            : self.latestSelectedDateObj ||\n                (self.config.minDate && self.config.minDate > self.now\n                    ? self.config.minDate\n                    : self.config.maxDate && self.config.maxDate < self.now\n                        ? self.config.maxDate\n                        : self.now);\n        var oldYear = self.currentYear;\n        var oldMonth = self.currentMonth;\n        try {\n            if (jumpTo !== undefined) {\n                self.currentYear = jumpTo.getFullYear();\n                self.currentMonth = jumpTo.getMonth();\n            }\n        }\n        catch (e) {\n            e.message = \"Invalid date supplied: \" + jumpTo;\n            self.config.errorHandler(e);\n        }\n        if (triggerChange && self.currentYear !== oldYear) {\n            triggerEvent(\"onYearChange\");\n            buildMonthSwitch();\n        }\n        if (triggerChange &&\n            (self.currentYear !== oldYear || self.currentMonth !== oldMonth)) {\n            triggerEvent(\"onMonthChange\");\n        }\n        self.redraw();\n    }\n    function timeIncrement(e) {\n        var eventTarget = getEventTarget(e);\n        if (~eventTarget.className.indexOf(\"arrow\"))\n            incrementNumInput(e, eventTarget.classList.contains(\"arrowUp\") ? 1 : -1);\n    }\n    function incrementNumInput(e, delta, inputElem) {\n        var target = e && getEventTarget(e);\n        var input = inputElem ||\n            (target && target.parentNode && target.parentNode.firstChild);\n        var event = createEvent(\"increment\");\n        event.delta = delta;\n        input && input.dispatchEvent(event);\n    }\n    function build() {\n        var fragment = window.document.createDocumentFragment();\n        self.calendarContainer = createElement(\"div\", \"flatpickr-calendar\");\n        self.calendarContainer.tabIndex = -1;\n        if (!self.config.noCalendar) {\n            fragment.appendChild(buildMonthNav());\n            self.innerContainer = createElement(\"div\", \"flatpickr-innerContainer\");\n            if (self.config.weekNumbers) {\n                var _a = buildWeeks(), weekWrapper = _a.weekWrapper, weekNumbers = _a.weekNumbers;\n                self.innerContainer.appendChild(weekWrapper);\n                self.weekNumbers = weekNumbers;\n                self.weekWrapper = weekWrapper;\n            }\n            self.rContainer = createElement(\"div\", \"flatpickr-rContainer\");\n            self.rContainer.appendChild(buildWeekdays());\n            if (!self.daysContainer) {\n                self.daysContainer = createElement(\"div\", \"flatpickr-days\");\n                self.daysContainer.tabIndex = -1;\n            }\n            buildDays();\n            self.rContainer.appendChild(self.daysContainer);\n            self.innerContainer.appendChild(self.rContainer);\n            fragment.appendChild(self.innerContainer);\n        }\n        if (self.config.enableTime) {\n            fragment.appendChild(buildTime());\n        }\n        toggleClass(self.calendarContainer, \"rangeMode\", self.config.mode === \"range\");\n        toggleClass(self.calendarContainer, \"animate\", self.config.animate === true);\n        toggleClass(self.calendarContainer, \"multiMonth\", self.config.showMonths > 1);\n        self.calendarContainer.appendChild(fragment);\n        var customAppend = self.config.appendTo !== undefined &&\n            self.config.appendTo.nodeType !== undefined;\n        if (self.config.inline || self.config.static) {\n            self.calendarContainer.classList.add(self.config.inline ? \"inline\" : \"static\");\n            if (self.config.inline) {\n                if (!customAppend && self.element.parentNode)\n                    self.element.parentNode.insertBefore(self.calendarContainer, self._input.nextSibling);\n                else if (self.config.appendTo !== undefined)\n                    self.config.appendTo.appendChild(self.calendarContainer);\n            }\n            if (self.config.static) {\n                var wrapper = createElement(\"div\", \"flatpickr-wrapper\");\n                if (self.element.parentNode)\n                    self.element.parentNode.insertBefore(wrapper, self.element);\n                wrapper.appendChild(self.element);\n                if (self.altInput)\n                    wrapper.appendChild(self.altInput);\n                wrapper.appendChild(self.calendarContainer);\n            }\n        }\n        if (!self.config.static && !self.config.inline)\n            (self.config.appendTo !== undefined\n                ? self.config.appendTo\n                : window.document.body).appendChild(self.calendarContainer);\n    }\n    function createDay(className, date, _dayNumber, i) {\n        var dateIsEnabled = isEnabled(date, true), dayElement = createElement(\"span\", className, date.getDate().toString());\n        dayElement.dateObj = date;\n        dayElement.$i = i;\n        dayElement.setAttribute(\"aria-label\", self.formatDate(date, self.config.ariaDateFormat));\n        if (className.indexOf(\"hidden\") === -1 &&\n            compareDates(date, self.now) === 0) {\n            self.todayDateElem = dayElement;\n            dayElement.classList.add(\"today\");\n            dayElement.setAttribute(\"aria-current\", \"date\");\n        }\n        if (dateIsEnabled) {\n            dayElement.tabIndex = -1;\n            if (isDateSelected(date)) {\n                dayElement.classList.add(\"selected\");\n                self.selectedDateElem = dayElement;\n                if (self.config.mode === \"range\") {\n                    toggleClass(dayElement, \"startRange\", self.selectedDates[0] &&\n                        compareDates(date, self.selectedDates[0], true) === 0);\n                    toggleClass(dayElement, \"endRange\", self.selectedDates[1] &&\n                        compareDates(date, self.selectedDates[1], true) === 0);\n                    if (className === \"nextMonthDay\")\n                        dayElement.classList.add(\"inRange\");\n                }\n            }\n        }\n        else {\n            dayElement.classList.add(\"flatpickr-disabled\");\n        }\n        if (self.config.mode === \"range\") {\n            if (isDateInRange(date) && !isDateSelected(date))\n                dayElement.classList.add(\"inRange\");\n        }\n        if (self.weekNumbers &&\n            self.config.showMonths === 1 &&\n            className !== \"prevMonthDay\" &&\n            i % 7 === 6) {\n            self.weekNumbers.insertAdjacentHTML(\"beforeend\", \"<span class='flatpickr-day'>\" + self.config.getWeek(date) + \"</span>\");\n        }\n        triggerEvent(\"onDayCreate\", dayElement);\n        return dayElement;\n    }\n    function focusOnDayElem(targetNode) {\n        targetNode.focus();\n        if (self.config.mode === \"range\")\n            onMouseOver(targetNode);\n    }\n    function getFirstAvailableDay(delta) {\n        var startMonth = delta > 0 ? 0 : self.config.showMonths - 1;\n        var endMonth = delta > 0 ? self.config.showMonths : -1;\n        for (var m = startMonth; m != endMonth; m += delta) {\n            var month = self.daysContainer.children[m];\n            var startIndex = delta > 0 ? 0 : month.children.length - 1;\n            var endIndex = delta > 0 ? month.children.length : -1;\n            for (var i = startIndex; i != endIndex; i += delta) {\n                var c = month.children[i];\n                if (c.className.indexOf(\"hidden\") === -1 && isEnabled(c.dateObj))\n                    return c;\n            }\n        }\n        return undefined;\n    }\n    function getNextAvailableDay(current, delta) {\n        var givenMonth = current.className.indexOf(\"Month\") === -1\n            ? current.dateObj.getMonth()\n            : self.currentMonth;\n        var endMonth = delta > 0 ? self.config.showMonths : -1;\n        var loopDelta = delta > 0 ? 1 : -1;\n        for (var m = givenMonth - self.currentMonth; m != endMonth; m += loopDelta) {\n            var month = self.daysContainer.children[m];\n            var startIndex = givenMonth - self.currentMonth === m\n                ? current.$i + delta\n                : delta < 0\n                    ? month.children.length - 1\n                    : 0;\n            var numMonthDays = month.children.length;\n            for (var i = startIndex; i >= 0 && i < numMonthDays && i != (delta > 0 ? numMonthDays : -1); i += loopDelta) {\n                var c = month.children[i];\n                if (c.className.indexOf(\"hidden\") === -1 &&\n                    isEnabled(c.dateObj) &&\n                    Math.abs(current.$i - i) >= Math.abs(delta))\n                    return focusOnDayElem(c);\n            }\n        }\n        self.changeMonth(loopDelta);\n        focusOnDay(getFirstAvailableDay(loopDelta), 0);\n        return undefined;\n    }\n    function focusOnDay(current, offset) {\n        var activeElement = getClosestActiveElement();\n        var dayFocused = isInView(activeElement || document.body);\n        var startElem = current !== undefined\n            ? current\n            : dayFocused\n                ? activeElement\n                : self.selectedDateElem !== undefined && isInView(self.selectedDateElem)\n                    ? self.selectedDateElem\n                    : self.todayDateElem !== undefined && isInView(self.todayDateElem)\n                        ? self.todayDateElem\n                        : getFirstAvailableDay(offset > 0 ? 1 : -1);\n        if (startElem === undefined) {\n            self._input.focus();\n        }\n        else if (!dayFocused) {\n            focusOnDayElem(startElem);\n        }\n        else {\n            getNextAvailableDay(startElem, offset);\n        }\n    }\n    function buildMonthDays(year, month) {\n        var firstOfMonth = (new Date(year, month, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7;\n        var prevMonthDays = self.utils.getDaysInMonth((month - 1 + 12) % 12, year);\n        var daysInMonth = self.utils.getDaysInMonth(month, year), days = window.document.createDocumentFragment(), isMultiMonth = self.config.showMonths > 1, prevMonthDayClass = isMultiMonth ? \"prevMonthDay hidden\" : \"prevMonthDay\", nextMonthDayClass = isMultiMonth ? \"nextMonthDay hidden\" : \"nextMonthDay\";\n        var dayNumber = prevMonthDays + 1 - firstOfMonth, dayIndex = 0;\n        for (; dayNumber <= prevMonthDays; dayNumber++, dayIndex++) {\n            days.appendChild(createDay(\"flatpickr-day \" + prevMonthDayClass, new Date(year, month - 1, dayNumber), dayNumber, dayIndex));\n        }\n        for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++, dayIndex++) {\n            days.appendChild(createDay(\"flatpickr-day\", new Date(year, month, dayNumber), dayNumber, dayIndex));\n        }\n        for (var dayNum = daysInMonth + 1; dayNum <= 42 - firstOfMonth &&\n            (self.config.showMonths === 1 || dayIndex % 7 !== 0); dayNum++, dayIndex++) {\n            days.appendChild(createDay(\"flatpickr-day \" + nextMonthDayClass, new Date(year, month + 1, dayNum % daysInMonth), dayNum, dayIndex));\n        }\n        var dayContainer = createElement(\"div\", \"dayContainer\");\n        dayContainer.appendChild(days);\n        return dayContainer;\n    }\n    function buildDays() {\n        if (self.daysContainer === undefined) {\n            return;\n        }\n        clearNode(self.daysContainer);\n        if (self.weekNumbers)\n            clearNode(self.weekNumbers);\n        var frag = document.createDocumentFragment();\n        for (var i = 0; i < self.config.showMonths; i++) {\n            var d = new Date(self.currentYear, self.currentMonth, 1);\n            d.setMonth(self.currentMonth + i);\n            frag.appendChild(buildMonthDays(d.getFullYear(), d.getMonth()));\n        }\n        self.daysContainer.appendChild(frag);\n        self.days = self.daysContainer.firstChild;\n        if (self.config.mode === \"range\" && self.selectedDates.length === 1) {\n            onMouseOver();\n        }\n    }\n    function buildMonthSwitch() {\n        if (self.config.showMonths > 1 ||\n            self.config.monthSelectorType !== \"dropdown\")\n            return;\n        var shouldBuildMonth = function (month) {\n            if (self.config.minDate !== undefined &&\n                self.currentYear === self.config.minDate.getFullYear() &&\n                month < self.config.minDate.getMonth()) {\n                return false;\n            }\n            return !(self.config.maxDate !== undefined &&\n                self.currentYear === self.config.maxDate.getFullYear() &&\n                month > self.config.maxDate.getMonth());\n        };\n        self.monthsDropdownContainer.tabIndex = -1;\n        self.monthsDropdownContainer.innerHTML = \"\";\n        for (var i = 0; i < 12; i++) {\n            if (!shouldBuildMonth(i))\n                continue;\n            var month = createElement(\"option\", \"flatpickr-monthDropdown-month\");\n            month.value = new Date(self.currentYear, i).getMonth().toString();\n            month.textContent = monthToStr(i, self.config.shorthandCurrentMonth, self.l10n);\n            month.tabIndex = -1;\n            if (self.currentMonth === i) {\n                month.selected = true;\n            }\n            self.monthsDropdownContainer.appendChild(month);\n        }\n    }\n    function buildMonth() {\n        var container = createElement(\"div\", \"flatpickr-month\");\n        var monthNavFragment = window.document.createDocumentFragment();\n        var monthElement;\n        if (self.config.showMonths > 1 ||\n            self.config.monthSelectorType === \"static\") {\n            monthElement = createElement(\"span\", \"cur-month\");\n        }\n        else {\n            self.monthsDropdownContainer = createElement(\"select\", \"flatpickr-monthDropdown-months\");\n            self.monthsDropdownContainer.setAttribute(\"aria-label\", self.l10n.monthAriaLabel);\n            bind(self.monthsDropdownContainer, \"change\", function (e) {\n                var target = getEventTarget(e);\n                var selectedMonth = parseInt(target.value, 10);\n                self.changeMonth(selectedMonth - self.currentMonth);\n                triggerEvent(\"onMonthChange\");\n            });\n            buildMonthSwitch();\n            monthElement = self.monthsDropdownContainer;\n        }\n        var yearInput = createNumberInput(\"cur-year\", { tabindex: \"-1\" });\n        var yearElement = yearInput.getElementsByTagName(\"input\")[0];\n        yearElement.setAttribute(\"aria-label\", self.l10n.yearAriaLabel);\n        if (self.config.minDate) {\n            yearElement.setAttribute(\"min\", self.config.minDate.getFullYear().toString());\n        }\n        if (self.config.maxDate) {\n            yearElement.setAttribute(\"max\", self.config.maxDate.getFullYear().toString());\n            yearElement.disabled =\n                !!self.config.minDate &&\n                    self.config.minDate.getFullYear() === self.config.maxDate.getFullYear();\n        }\n        var currentMonth = createElement(\"div\", \"flatpickr-current-month\");\n        currentMonth.appendChild(monthElement);\n        currentMonth.appendChild(yearInput);\n        monthNavFragment.appendChild(currentMonth);\n        container.appendChild(monthNavFragment);\n        return {\n            container: container,\n            yearElement: yearElement,\n            monthElement: monthElement,\n        };\n    }\n    function buildMonths() {\n        clearNode(self.monthNav);\n        self.monthNav.appendChild(self.prevMonthNav);\n        if (self.config.showMonths) {\n            self.yearElements = [];\n            self.monthElements = [];\n        }\n        for (var m = self.config.showMonths; m--;) {\n            var month = buildMonth();\n            self.yearElements.push(month.yearElement);\n            self.monthElements.push(month.monthElement);\n            self.monthNav.appendChild(month.container);\n        }\n        self.monthNav.appendChild(self.nextMonthNav);\n    }\n    function buildMonthNav() {\n        self.monthNav = createElement(\"div\", \"flatpickr-months\");\n        self.yearElements = [];\n        self.monthElements = [];\n        self.prevMonthNav = createElement(\"span\", \"flatpickr-prev-month\");\n        self.prevMonthNav.innerHTML = self.config.prevArrow;\n        self.nextMonthNav = createElement(\"span\", \"flatpickr-next-month\");\n        self.nextMonthNav.innerHTML = self.config.nextArrow;\n        buildMonths();\n        Object.defineProperty(self, \"_hidePrevMonthArrow\", {\n            get: function () { return self.__hidePrevMonthArrow; },\n            set: function (bool) {\n                if (self.__hidePrevMonthArrow !== bool) {\n                    toggleClass(self.prevMonthNav, \"flatpickr-disabled\", bool);\n                    self.__hidePrevMonthArrow = bool;\n                }\n            },\n        });\n        Object.defineProperty(self, \"_hideNextMonthArrow\", {\n            get: function () { return self.__hideNextMonthArrow; },\n            set: function (bool) {\n                if (self.__hideNextMonthArrow !== bool) {\n                    toggleClass(self.nextMonthNav, \"flatpickr-disabled\", bool);\n                    self.__hideNextMonthArrow = bool;\n                }\n            },\n        });\n        self.currentYearElement = self.yearElements[0];\n        updateNavigationCurrentMonth();\n        return self.monthNav;\n    }\n    function buildTime() {\n        self.calendarContainer.classList.add(\"hasTime\");\n        if (self.config.noCalendar)\n            self.calendarContainer.classList.add(\"noCalendar\");\n        var defaults = getDefaultHours(self.config);\n        self.timeContainer = createElement(\"div\", \"flatpickr-time\");\n        self.timeContainer.tabIndex = -1;\n        var separator = createElement(\"span\", \"flatpickr-time-separator\", \":\");\n        var hourInput = createNumberInput(\"flatpickr-hour\", {\n            \"aria-label\": self.l10n.hourAriaLabel,\n        });\n        self.hourElement = hourInput.getElementsByTagName(\"input\")[0];\n        var minuteInput = createNumberInput(\"flatpickr-minute\", {\n            \"aria-label\": self.l10n.minuteAriaLabel,\n        });\n        self.minuteElement = minuteInput.getElementsByTagName(\"input\")[0];\n        self.hourElement.tabIndex = self.minuteElement.tabIndex = -1;\n        self.hourElement.value = pad(self.latestSelectedDateObj\n            ? self.latestSelectedDateObj.getHours()\n            : self.config.time_24hr\n                ? defaults.hours\n                : military2ampm(defaults.hours));\n        self.minuteElement.value = pad(self.latestSelectedDateObj\n            ? self.latestSelectedDateObj.getMinutes()\n            : defaults.minutes);\n        self.hourElement.setAttribute(\"step\", self.config.hourIncrement.toString());\n        self.minuteElement.setAttribute(\"step\", self.config.minuteIncrement.toString());\n        self.hourElement.setAttribute(\"min\", self.config.time_24hr ? \"0\" : \"1\");\n        self.hourElement.setAttribute(\"max\", self.config.time_24hr ? \"23\" : \"12\");\n        self.hourElement.setAttribute(\"maxlength\", \"2\");\n        self.minuteElement.setAttribute(\"min\", \"0\");\n        self.minuteElement.setAttribute(\"max\", \"59\");\n        self.minuteElement.setAttribute(\"maxlength\", \"2\");\n        self.timeContainer.appendChild(hourInput);\n        self.timeContainer.appendChild(separator);\n        self.timeContainer.appendChild(minuteInput);\n        if (self.config.time_24hr)\n            self.timeContainer.classList.add(\"time24hr\");\n        if (self.config.enableSeconds) {\n            self.timeContainer.classList.add(\"hasSeconds\");\n            var secondInput = createNumberInput(\"flatpickr-second\");\n            self.secondElement = secondInput.getElementsByTagName(\"input\")[0];\n            self.secondElement.value = pad(self.latestSelectedDateObj\n                ? self.latestSelectedDateObj.getSeconds()\n                : defaults.seconds);\n            self.secondElement.setAttribute(\"step\", self.minuteElement.getAttribute(\"step\"));\n            self.secondElement.setAttribute(\"min\", \"0\");\n            self.secondElement.setAttribute(\"max\", \"59\");\n            self.secondElement.setAttribute(\"maxlength\", \"2\");\n            self.timeContainer.appendChild(createElement(\"span\", \"flatpickr-time-separator\", \":\"));\n            self.timeContainer.appendChild(secondInput);\n        }\n        if (!self.config.time_24hr) {\n            self.amPM = createElement(\"span\", \"flatpickr-am-pm\", self.l10n.amPM[int((self.latestSelectedDateObj\n                ? self.hourElement.value\n                : self.config.defaultHour) > 11)]);\n            self.amPM.title = self.l10n.toggleTitle;\n            self.amPM.tabIndex = -1;\n            self.timeContainer.appendChild(self.amPM);\n        }\n        return self.timeContainer;\n    }\n    function buildWeekdays() {\n        if (!self.weekdayContainer)\n            self.weekdayContainer = createElement(\"div\", \"flatpickr-weekdays\");\n        else\n            clearNode(self.weekdayContainer);\n        for (var i = self.config.showMonths; i--;) {\n            var container = createElement(\"div\", \"flatpickr-weekdaycontainer\");\n            self.weekdayContainer.appendChild(container);\n        }\n        updateWeekdays();\n        return self.weekdayContainer;\n    }\n    function updateWeekdays() {\n        if (!self.weekdayContainer) {\n            return;\n        }\n        var firstDayOfWeek = self.l10n.firstDayOfWeek;\n        var weekdays = __spreadArrays(self.l10n.weekdays.shorthand);\n        if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) {\n            weekdays = __spreadArrays(weekdays.splice(firstDayOfWeek, weekdays.length), weekdays.splice(0, firstDayOfWeek));\n        }\n        for (var i = self.config.showMonths; i--;) {\n            self.weekdayContainer.children[i].innerHTML = \"\\n      <span class='flatpickr-weekday'>\\n        \" + weekdays.join(\"</span><span class='flatpickr-weekday'>\") + \"\\n      </span>\\n      \";\n        }\n    }\n    function buildWeeks() {\n        self.calendarContainer.classList.add(\"hasWeeks\");\n        var weekWrapper = createElement(\"div\", \"flatpickr-weekwrapper\");\n        weekWrapper.appendChild(createElement(\"span\", \"flatpickr-weekday\", self.l10n.weekAbbreviation));\n        var weekNumbers = createElement(\"div\", \"flatpickr-weeks\");\n        weekWrapper.appendChild(weekNumbers);\n        return {\n            weekWrapper: weekWrapper,\n            weekNumbers: weekNumbers,\n        };\n    }\n    function changeMonth(value, isOffset) {\n        if (isOffset === void 0) { isOffset = true; }\n        var delta = isOffset ? value : value - self.currentMonth;\n        if ((delta < 0 && self._hidePrevMonthArrow === true) ||\n            (delta > 0 && self._hideNextMonthArrow === true))\n            return;\n        self.currentMonth += delta;\n        if (self.currentMonth < 0 || self.currentMonth > 11) {\n            self.currentYear += self.currentMonth > 11 ? 1 : -1;\n            self.currentMonth = (self.currentMonth + 12) % 12;\n            triggerEvent(\"onYearChange\");\n            buildMonthSwitch();\n        }\n        buildDays();\n        triggerEvent(\"onMonthChange\");\n        updateNavigationCurrentMonth();\n    }\n    function clear(triggerChangeEvent, toInitial) {\n        if (triggerChangeEvent === void 0) { triggerChangeEvent = true; }\n        if (toInitial === void 0) { toInitial = true; }\n        self.input.value = \"\";\n        if (self.altInput !== undefined)\n            self.altInput.value = \"\";\n        if (self.mobileInput !== undefined)\n            self.mobileInput.value = \"\";\n        self.selectedDates = [];\n        self.latestSelectedDateObj = undefined;\n        if (toInitial === true) {\n            self.currentYear = self._initialDate.getFullYear();\n            self.currentMonth = self._initialDate.getMonth();\n        }\n        if (self.config.enableTime === true) {\n            var _a = getDefaultHours(self.config), hours = _a.hours, minutes = _a.minutes, seconds = _a.seconds;\n            setHours(hours, minutes, seconds);\n        }\n        self.redraw();\n        if (triggerChangeEvent)\n            triggerEvent(\"onChange\");\n    }\n    function close() {\n        self.isOpen = false;\n        if (!self.isMobile) {\n            if (self.calendarContainer !== undefined) {\n                self.calendarContainer.classList.remove(\"open\");\n            }\n            if (self._input !== undefined) {\n                self._input.classList.remove(\"active\");\n            }\n        }\n        triggerEvent(\"onClose\");\n    }\n    function destroy() {\n        if (self.config !== undefined)\n            triggerEvent(\"onDestroy\");\n        for (var i = self._handlers.length; i--;) {\n            self._handlers[i].remove();\n        }\n        self._handlers = [];\n        if (self.mobileInput) {\n            if (self.mobileInput.parentNode)\n                self.mobileInput.parentNode.removeChild(self.mobileInput);\n            self.mobileInput = undefined;\n        }\n        else if (self.calendarContainer && self.calendarContainer.parentNode) {\n            if (self.config.static && self.calendarContainer.parentNode) {\n                var wrapper = self.calendarContainer.parentNode;\n                wrapper.lastChild && wrapper.removeChild(wrapper.lastChild);\n                if (wrapper.parentNode) {\n                    while (wrapper.firstChild)\n                        wrapper.parentNode.insertBefore(wrapper.firstChild, wrapper);\n                    wrapper.parentNode.removeChild(wrapper);\n                }\n            }\n            else\n                self.calendarContainer.parentNode.removeChild(self.calendarContainer);\n        }\n        if (self.altInput) {\n            self.input.type = \"text\";\n            if (self.altInput.parentNode)\n                self.altInput.parentNode.removeChild(self.altInput);\n            delete self.altInput;\n        }\n        if (self.input) {\n            self.input.type = self.input._type;\n            self.input.classList.remove(\"flatpickr-input\");\n            self.input.removeAttribute(\"readonly\");\n        }\n        [\n            \"_showTimeInput\",\n            \"latestSelectedDateObj\",\n            \"_hideNextMonthArrow\",\n            \"_hidePrevMonthArrow\",\n            \"__hideNextMonthArrow\",\n            \"__hidePrevMonthArrow\",\n            \"isMobile\",\n            \"isOpen\",\n            \"selectedDateElem\",\n            \"minDateHasTime\",\n            \"maxDateHasTime\",\n            \"days\",\n            \"daysContainer\",\n            \"_input\",\n            \"_positionElement\",\n            \"innerContainer\",\n            \"rContainer\",\n            \"monthNav\",\n            \"todayDateElem\",\n            \"calendarContainer\",\n            \"weekdayContainer\",\n            \"prevMonthNav\",\n            \"nextMonthNav\",\n            \"monthsDropdownContainer\",\n            \"currentMonthElement\",\n            \"currentYearElement\",\n            \"navigationCurrentMonth\",\n            \"selectedDateElem\",\n            \"config\",\n        ].forEach(function (k) {\n            try {\n                delete self[k];\n            }\n            catch (_) { }\n        });\n    }\n    function isCalendarElem(elem) {\n        return self.calendarContainer.contains(elem);\n    }\n    function documentClick(e) {\n        if (self.isOpen && !self.config.inline) {\n            var eventTarget_1 = getEventTarget(e);\n            var isCalendarElement = isCalendarElem(eventTarget_1);\n            var isInput = eventTarget_1 === self.input ||\n                eventTarget_1 === self.altInput ||\n                self.element.contains(eventTarget_1) ||\n                (e.path &&\n                    e.path.indexOf &&\n                    (~e.path.indexOf(self.input) ||\n                        ~e.path.indexOf(self.altInput)));\n            var lostFocus = !isInput &&\n                !isCalendarElement &&\n                !isCalendarElem(e.relatedTarget);\n            var isIgnored = !self.config.ignoredFocusElements.some(function (elem) {\n                return elem.contains(eventTarget_1);\n            });\n            if (lostFocus && isIgnored) {\n                if (self.config.allowInput) {\n                    self.setDate(self._input.value, false, self.config.altInput\n                        ? self.config.altFormat\n                        : self.config.dateFormat);\n                }\n                if (self.timeContainer !== undefined &&\n                    self.minuteElement !== undefined &&\n                    self.hourElement !== undefined &&\n                    self.input.value !== \"\" &&\n                    self.input.value !== undefined) {\n                    updateTime();\n                }\n                self.close();\n                if (self.config &&\n                    self.config.mode === \"range\" &&\n                    self.selectedDates.length === 1)\n                    self.clear(false);\n            }\n        }\n    }\n    function changeYear(newYear) {\n        if (!newYear ||\n            (self.config.minDate && newYear < self.config.minDate.getFullYear()) ||\n            (self.config.maxDate && newYear > self.config.maxDate.getFullYear()))\n            return;\n        var newYearNum = newYear, isNewYear = self.currentYear !== newYearNum;\n        self.currentYear = newYearNum || self.currentYear;\n        if (self.config.maxDate &&\n            self.currentYear === self.config.maxDate.getFullYear()) {\n            self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);\n        }\n        else if (self.config.minDate &&\n            self.currentYear === self.config.minDate.getFullYear()) {\n            self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);\n        }\n        if (isNewYear) {\n            self.redraw();\n            triggerEvent(\"onYearChange\");\n            buildMonthSwitch();\n        }\n    }\n    function isEnabled(date, timeless) {\n        var _a;\n        if (timeless === void 0) { timeless = true; }\n        var dateToCheck = self.parseDate(date, undefined, timeless);\n        if ((self.config.minDate &&\n            dateToCheck &&\n            compareDates(dateToCheck, self.config.minDate, timeless !== undefined ? timeless : !self.minDateHasTime) < 0) ||\n            (self.config.maxDate &&\n                dateToCheck &&\n                compareDates(dateToCheck, self.config.maxDate, timeless !== undefined ? timeless : !self.maxDateHasTime) > 0))\n            return false;\n        if (!self.config.enable && self.config.disable.length === 0)\n            return true;\n        if (dateToCheck === undefined)\n            return false;\n        var bool = !!self.config.enable, array = (_a = self.config.enable) !== null && _a !== void 0 ? _a : self.config.disable;\n        for (var i = 0, d = void 0; i < array.length; i++) {\n            d = array[i];\n            if (typeof d === \"function\" &&\n                d(dateToCheck))\n                return bool;\n            else if (d instanceof Date &&\n                dateToCheck !== undefined &&\n                d.getTime() === dateToCheck.getTime())\n                return bool;\n            else if (typeof d === \"string\") {\n                var parsed = self.parseDate(d, undefined, true);\n                return parsed && parsed.getTime() === dateToCheck.getTime()\n                    ? bool\n                    : !bool;\n            }\n            else if (typeof d === \"object\" &&\n                dateToCheck !== undefined &&\n                d.from &&\n                d.to &&\n                dateToCheck.getTime() >= d.from.getTime() &&\n                dateToCheck.getTime() <= d.to.getTime())\n                return bool;\n        }\n        return !bool;\n    }\n    function isInView(elem) {\n        if (self.daysContainer !== undefined)\n            return (elem.className.indexOf(\"hidden\") === -1 &&\n                elem.className.indexOf(\"flatpickr-disabled\") === -1 &&\n                self.daysContainer.contains(elem));\n        return false;\n    }\n    function onBlur(e) {\n        var isInput = e.target === self._input;\n        var valueChanged = self._input.value.trimEnd() !== getDateStr();\n        if (isInput &&\n            valueChanged &&\n            !(e.relatedTarget && isCalendarElem(e.relatedTarget))) {\n            self.setDate(self._input.value, true, e.target === self.altInput\n                ? self.config.altFormat\n                : self.config.dateFormat);\n        }\n    }\n    function onKeyDown(e) {\n        var eventTarget = getEventTarget(e);\n        var isInput = self.config.wrap\n            ? element.contains(eventTarget)\n            : eventTarget === self._input;\n        var allowInput = self.config.allowInput;\n        var allowKeydown = self.isOpen && (!allowInput || !isInput);\n        var allowInlineKeydown = self.config.inline && isInput && !allowInput;\n        if (e.keyCode === 13 && isInput) {\n            if (allowInput) {\n                self.setDate(self._input.value, true, eventTarget === self.altInput\n                    ? self.config.altFormat\n                    : self.config.dateFormat);\n                self.close();\n                return eventTarget.blur();\n            }\n            else {\n                self.open();\n            }\n        }\n        else if (isCalendarElem(eventTarget) ||\n            allowKeydown ||\n            allowInlineKeydown) {\n            var isTimeObj = !!self.timeContainer &&\n                self.timeContainer.contains(eventTarget);\n            switch (e.keyCode) {\n                case 13:\n                    if (isTimeObj) {\n                        e.preventDefault();\n                        updateTime();\n                        focusAndClose();\n                    }\n                    else\n                        selectDate(e);\n                    break;\n                case 27:\n                    e.preventDefault();\n                    focusAndClose();\n                    break;\n                case 8:\n                case 46:\n                    if (isInput && !self.config.allowInput) {\n                        e.preventDefault();\n                        self.clear();\n                    }\n                    break;\n                case 37:\n                case 39:\n                    if (!isTimeObj && !isInput) {\n                        e.preventDefault();\n                        var activeElement = getClosestActiveElement();\n                        if (self.daysContainer !== undefined &&\n                            (allowInput === false ||\n                                (activeElement && isInView(activeElement)))) {\n                            var delta_1 = e.keyCode === 39 ? 1 : -1;\n                            if (!e.ctrlKey)\n                                focusOnDay(undefined, delta_1);\n                            else {\n                                e.stopPropagation();\n                                changeMonth(delta_1);\n                                focusOnDay(getFirstAvailableDay(1), 0);\n                            }\n                        }\n                    }\n                    else if (self.hourElement)\n                        self.hourElement.focus();\n                    break;\n                case 38:\n                case 40:\n                    e.preventDefault();\n                    var delta = e.keyCode === 40 ? 1 : -1;\n                    if ((self.daysContainer &&\n                        eventTarget.$i !== undefined) ||\n                        eventTarget === self.input ||\n                        eventTarget === self.altInput) {\n                        if (e.ctrlKey) {\n                            e.stopPropagation();\n                            changeYear(self.currentYear - delta);\n                            focusOnDay(getFirstAvailableDay(1), 0);\n                        }\n                        else if (!isTimeObj)\n                            focusOnDay(undefined, delta * 7);\n                    }\n                    else if (eventTarget === self.currentYearElement) {\n                        changeYear(self.currentYear - delta);\n                    }\n                    else if (self.config.enableTime) {\n                        if (!isTimeObj && self.hourElement)\n                            self.hourElement.focus();\n                        updateTime(e);\n                        self._debouncedChange();\n                    }\n                    break;\n                case 9:\n                    if (isTimeObj) {\n                        var elems = [\n                            self.hourElement,\n                            self.minuteElement,\n                            self.secondElement,\n                            self.amPM,\n                        ]\n                            .concat(self.pluginElements)\n                            .filter(function (x) { return x; });\n                        var i = elems.indexOf(eventTarget);\n                        if (i !== -1) {\n                            var target = elems[i + (e.shiftKey ? -1 : 1)];\n                            e.preventDefault();\n                            (target || self._input).focus();\n                        }\n                    }\n                    else if (!self.config.noCalendar &&\n                        self.daysContainer &&\n                        self.daysContainer.contains(eventTarget) &&\n                        e.shiftKey) {\n                        e.preventDefault();\n                        self._input.focus();\n                    }\n                    break;\n                default:\n                    break;\n            }\n        }\n        if (self.amPM !== undefined && eventTarget === self.amPM) {\n            switch (e.key) {\n                case self.l10n.amPM[0].charAt(0):\n                case self.l10n.amPM[0].charAt(0).toLowerCase():\n                    self.amPM.textContent = self.l10n.amPM[0];\n                    setHoursFromInputs();\n                    updateValue();\n                    break;\n                case self.l10n.amPM[1].charAt(0):\n                case self.l10n.amPM[1].charAt(0).toLowerCase():\n                    self.amPM.textContent = self.l10n.amPM[1];\n                    setHoursFromInputs();\n                    updateValue();\n                    break;\n            }\n        }\n        if (isInput || isCalendarElem(eventTarget)) {\n            triggerEvent(\"onKeyDown\", e);\n        }\n    }\n    function onMouseOver(elem, cellClass) {\n        if (cellClass === void 0) { cellClass = \"flatpickr-day\"; }\n        if (self.selectedDates.length !== 1 ||\n            (elem &&\n                (!elem.classList.contains(cellClass) ||\n                    elem.classList.contains(\"flatpickr-disabled\"))))\n            return;\n        var hoverDate = elem\n            ? elem.dateObj.getTime()\n            : self.days.firstElementChild.dateObj.getTime(), initialDate = self.parseDate(self.selectedDates[0], undefined, true).getTime(), rangeStartDate = Math.min(hoverDate, self.selectedDates[0].getTime()), rangeEndDate = Math.max(hoverDate, self.selectedDates[0].getTime());\n        var containsDisabled = false;\n        var minRange = 0, maxRange = 0;\n        for (var t = rangeStartDate; t < rangeEndDate; t += duration.DAY) {\n            if (!isEnabled(new Date(t), true)) {\n                containsDisabled =\n                    containsDisabled || (t > rangeStartDate && t < rangeEndDate);\n                if (t < initialDate && (!minRange || t > minRange))\n                    minRange = t;\n                else if (t > initialDate && (!maxRange || t < maxRange))\n                    maxRange = t;\n            }\n        }\n        var hoverableCells = Array.from(self.rContainer.querySelectorAll(\"*:nth-child(-n+\" + self.config.showMonths + \") > .\" + cellClass));\n        hoverableCells.forEach(function (dayElem) {\n            var date = dayElem.dateObj;\n            var timestamp = date.getTime();\n            var outOfRange = (minRange > 0 && timestamp < minRange) ||\n                (maxRange > 0 && timestamp > maxRange);\n            if (outOfRange) {\n                dayElem.classList.add(\"notAllowed\");\n                [\"inRange\", \"startRange\", \"endRange\"].forEach(function (c) {\n                    dayElem.classList.remove(c);\n                });\n                return;\n            }\n            else if (containsDisabled && !outOfRange)\n                return;\n            [\"startRange\", \"inRange\", \"endRange\", \"notAllowed\"].forEach(function (c) {\n                dayElem.classList.remove(c);\n            });\n            if (elem !== undefined) {\n                elem.classList.add(hoverDate <= self.selectedDates[0].getTime()\n                    ? \"startRange\"\n                    : \"endRange\");\n                if (initialDate < hoverDate && timestamp === initialDate)\n                    dayElem.classList.add(\"startRange\");\n                else if (initialDate > hoverDate && timestamp === initialDate)\n                    dayElem.classList.add(\"endRange\");\n                if (timestamp >= minRange &&\n                    (maxRange === 0 || timestamp <= maxRange) &&\n                    isBetween(timestamp, initialDate, hoverDate))\n                    dayElem.classList.add(\"inRange\");\n            }\n        });\n    }\n    function onResize() {\n        if (self.isOpen && !self.config.static && !self.config.inline)\n            positionCalendar();\n    }\n    function open(e, positionElement) {\n        if (positionElement === void 0) { positionElement = self._positionElement; }\n        if (self.isMobile === true) {\n            if (e) {\n                e.preventDefault();\n                var eventTarget = getEventTarget(e);\n                if (eventTarget) {\n                    eventTarget.blur();\n                }\n            }\n            if (self.mobileInput !== undefined) {\n                self.mobileInput.focus();\n                self.mobileInput.click();\n            }\n            triggerEvent(\"onOpen\");\n            return;\n        }\n        else if (self._input.disabled || self.config.inline) {\n            return;\n        }\n        var wasOpen = self.isOpen;\n        self.isOpen = true;\n        if (!wasOpen) {\n            self.calendarContainer.classList.add(\"open\");\n            self._input.classList.add(\"active\");\n            triggerEvent(\"onOpen\");\n            positionCalendar(positionElement);\n        }\n        if (self.config.enableTime === true && self.config.noCalendar === true) {\n            if (self.config.allowInput === false &&\n                (e === undefined ||\n                    !self.timeContainer.contains(e.relatedTarget))) {\n                setTimeout(function () { return self.hourElement.select(); }, 50);\n            }\n        }\n    }\n    function minMaxDateSetter(type) {\n        return function (date) {\n            var dateObj = (self.config[\"_\" + type + \"Date\"] = self.parseDate(date, self.config.dateFormat));\n            var inverseDateObj = self.config[\"_\" + (type === \"min\" ? \"max\" : \"min\") + \"Date\"];\n            if (dateObj !== undefined) {\n                self[type === \"min\" ? \"minDateHasTime\" : \"maxDateHasTime\"] =\n                    dateObj.getHours() > 0 ||\n                        dateObj.getMinutes() > 0 ||\n                        dateObj.getSeconds() > 0;\n            }\n            if (self.selectedDates) {\n                self.selectedDates = self.selectedDates.filter(function (d) { return isEnabled(d); });\n                if (!self.selectedDates.length && type === \"min\")\n                    setHoursFromDate(dateObj);\n                updateValue();\n            }\n            if (self.daysContainer) {\n                redraw();\n                if (dateObj !== undefined)\n                    self.currentYearElement[type] = dateObj.getFullYear().toString();\n                else\n                    self.currentYearElement.removeAttribute(type);\n                self.currentYearElement.disabled =\n                    !!inverseDateObj &&\n                        dateObj !== undefined &&\n                        inverseDateObj.getFullYear() === dateObj.getFullYear();\n            }\n        };\n    }\n    function parseConfig() {\n        var boolOpts = [\n            \"wrap\",\n            \"weekNumbers\",\n            \"allowInput\",\n            \"allowInvalidPreload\",\n            \"clickOpens\",\n            \"time_24hr\",\n            \"enableTime\",\n            \"noCalendar\",\n            \"altInput\",\n            \"shorthandCurrentMonth\",\n            \"inline\",\n            \"static\",\n            \"enableSeconds\",\n            \"disableMobile\",\n        ];\n        var userConfig = __assign(__assign({}, JSON.parse(JSON.stringify(element.dataset || {}))), instanceConfig);\n        var formats = {};\n        self.config.parseDate = userConfig.parseDate;\n        self.config.formatDate = userConfig.formatDate;\n        Object.defineProperty(self.config, \"enable\", {\n            get: function () { return self.config._enable; },\n            set: function (dates) {\n                self.config._enable = parseDateRules(dates);\n            },\n        });\n        Object.defineProperty(self.config, \"disable\", {\n            get: function () { return self.config._disable; },\n            set: function (dates) {\n                self.config._disable = parseDateRules(dates);\n            },\n        });\n        var timeMode = userConfig.mode === \"time\";\n        if (!userConfig.dateFormat && (userConfig.enableTime || timeMode)) {\n            var defaultDateFormat = flatpickr.defaultConfig.dateFormat || defaultOptions.dateFormat;\n            formats.dateFormat =\n                userConfig.noCalendar || timeMode\n                    ? \"H:i\" + (userConfig.enableSeconds ? \":S\" : \"\")\n                    : defaultDateFormat + \" H:i\" + (userConfig.enableSeconds ? \":S\" : \"\");\n        }\n        if (userConfig.altInput &&\n            (userConfig.enableTime || timeMode) &&\n            !userConfig.altFormat) {\n            var defaultAltFormat = flatpickr.defaultConfig.altFormat || defaultOptions.altFormat;\n            formats.altFormat =\n                userConfig.noCalendar || timeMode\n                    ? \"h:i\" + (userConfig.enableSeconds ? \":S K\" : \" K\")\n                    : defaultAltFormat + (\" h:i\" + (userConfig.enableSeconds ? \":S\" : \"\") + \" K\");\n        }\n        Object.defineProperty(self.config, \"minDate\", {\n            get: function () { return self.config._minDate; },\n            set: minMaxDateSetter(\"min\"),\n        });\n        Object.defineProperty(self.config, \"maxDate\", {\n            get: function () { return self.config._maxDate; },\n            set: minMaxDateSetter(\"max\"),\n        });\n        var minMaxTimeSetter = function (type) { return function (val) {\n            self.config[type === \"min\" ? \"_minTime\" : \"_maxTime\"] = self.parseDate(val, \"H:i:S\");\n        }; };\n        Object.defineProperty(self.config, \"minTime\", {\n            get: function () { return self.config._minTime; },\n            set: minMaxTimeSetter(\"min\"),\n        });\n        Object.defineProperty(self.config, \"maxTime\", {\n            get: function () { return self.config._maxTime; },\n            set: minMaxTimeSetter(\"max\"),\n        });\n        if (userConfig.mode === \"time\") {\n            self.config.noCalendar = true;\n            self.config.enableTime = true;\n        }\n        Object.assign(self.config, formats, userConfig);\n        for (var i = 0; i < boolOpts.length; i++)\n            self.config[boolOpts[i]] =\n                self.config[boolOpts[i]] === true ||\n                    self.config[boolOpts[i]] === \"true\";\n        HOOKS.filter(function (hook) { return self.config[hook] !== undefined; }).forEach(function (hook) {\n            self.config[hook] = arrayify(self.config[hook] || []).map(bindToInstance);\n        });\n        self.isMobile =\n            !self.config.disableMobile &&\n                !self.config.inline &&\n                self.config.mode === \"single\" &&\n                !self.config.disable.length &&\n                !self.config.enable &&\n                !self.config.weekNumbers &&\n                /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n        for (var i = 0; i < self.config.plugins.length; i++) {\n            var pluginConf = self.config.plugins[i](self) || {};\n            for (var key in pluginConf) {\n                if (HOOKS.indexOf(key) > -1) {\n                    self.config[key] = arrayify(pluginConf[key])\n                        .map(bindToInstance)\n                        .concat(self.config[key]);\n                }\n                else if (typeof userConfig[key] === \"undefined\")\n                    self.config[key] = pluginConf[key];\n            }\n        }\n        if (!userConfig.altInputClass) {\n            self.config.altInputClass =\n                getInputElem().className + \" \" + self.config.altInputClass;\n        }\n        triggerEvent(\"onParseConfig\");\n    }\n    function getInputElem() {\n        return self.config.wrap\n            ? element.querySelector(\"[data-input]\")\n            : element;\n    }\n    function setupLocale() {\n        if (typeof self.config.locale !== \"object\" &&\n            typeof flatpickr.l10ns[self.config.locale] === \"undefined\")\n            self.config.errorHandler(new Error(\"flatpickr: invalid locale \" + self.config.locale));\n        self.l10n = __assign(__assign({}, flatpickr.l10ns.default), (typeof self.config.locale === \"object\"\n            ? self.config.locale\n            : self.config.locale !== \"default\"\n                ? flatpickr.l10ns[self.config.locale]\n                : undefined));\n        tokenRegex.D = \"(\" + self.l10n.weekdays.shorthand.join(\"|\") + \")\";\n        tokenRegex.l = \"(\" + self.l10n.weekdays.longhand.join(\"|\") + \")\";\n        tokenRegex.M = \"(\" + self.l10n.months.shorthand.join(\"|\") + \")\";\n        tokenRegex.F = \"(\" + self.l10n.months.longhand.join(\"|\") + \")\";\n        tokenRegex.K = \"(\" + self.l10n.amPM[0] + \"|\" + self.l10n.amPM[1] + \"|\" + self.l10n.amPM[0].toLowerCase() + \"|\" + self.l10n.amPM[1].toLowerCase() + \")\";\n        var userConfig = __assign(__assign({}, instanceConfig), JSON.parse(JSON.stringify(element.dataset || {})));\n        if (userConfig.time_24hr === undefined &&\n            flatpickr.defaultConfig.time_24hr === undefined) {\n            self.config.time_24hr = self.l10n.time_24hr;\n        }\n        self.formatDate = createDateFormatter(self);\n        self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });\n    }\n    function positionCalendar(customPositionElement) {\n        if (typeof self.config.position === \"function\") {\n            return void self.config.position(self, customPositionElement);\n        }\n        if (self.calendarContainer === undefined)\n            return;\n        triggerEvent(\"onPreCalendarPosition\");\n        var positionElement = customPositionElement || self._positionElement;\n        var calendarHeight = Array.prototype.reduce.call(self.calendarContainer.children, (function (acc, child) { return acc + child.offsetHeight; }), 0), calendarWidth = self.calendarContainer.offsetWidth, configPos = self.config.position.split(\" \"), configPosVertical = configPos[0], configPosHorizontal = configPos.length > 1 ? configPos[1] : null, inputBounds = positionElement.getBoundingClientRect(), distanceFromBottom = window.innerHeight - inputBounds.bottom, showOnTop = configPosVertical === \"above\" ||\n            (configPosVertical !== \"below\" &&\n                distanceFromBottom < calendarHeight &&\n                inputBounds.top > calendarHeight);\n        var top = window.pageYOffset +\n            inputBounds.top +\n            (!showOnTop ? positionElement.offsetHeight + 2 : -calendarHeight - 2);\n        toggleClass(self.calendarContainer, \"arrowTop\", !showOnTop);\n        toggleClass(self.calendarContainer, \"arrowBottom\", showOnTop);\n        if (self.config.inline)\n            return;\n        var left = window.pageXOffset + inputBounds.left;\n        var isCenter = false;\n        var isRight = false;\n        if (configPosHorizontal === \"center\") {\n            left -= (calendarWidth - inputBounds.width) / 2;\n            isCenter = true;\n        }\n        else if (configPosHorizontal === \"right\") {\n            left -= calendarWidth - inputBounds.width;\n            isRight = true;\n        }\n        toggleClass(self.calendarContainer, \"arrowLeft\", !isCenter && !isRight);\n        toggleClass(self.calendarContainer, \"arrowCenter\", isCenter);\n        toggleClass(self.calendarContainer, \"arrowRight\", isRight);\n        var right = window.document.body.offsetWidth -\n            (window.pageXOffset + inputBounds.right);\n        var rightMost = left + calendarWidth > window.document.body.offsetWidth;\n        var centerMost = right + calendarWidth > window.document.body.offsetWidth;\n        toggleClass(self.calendarContainer, \"rightMost\", rightMost);\n        if (self.config.static)\n            return;\n        self.calendarContainer.style.top = top + \"px\";\n        if (!rightMost) {\n            self.calendarContainer.style.left = left + \"px\";\n            self.calendarContainer.style.right = \"auto\";\n        }\n        else if (!centerMost) {\n            self.calendarContainer.style.left = \"auto\";\n            self.calendarContainer.style.right = right + \"px\";\n        }\n        else {\n            var doc = getDocumentStyleSheet();\n            if (doc === undefined)\n                return;\n            var bodyWidth = window.document.body.offsetWidth;\n            var centerLeft = Math.max(0, bodyWidth / 2 - calendarWidth / 2);\n            var centerBefore = \".flatpickr-calendar.centerMost:before\";\n            var centerAfter = \".flatpickr-calendar.centerMost:after\";\n            var centerIndex = doc.cssRules.length;\n            var centerStyle = \"{left:\" + inputBounds.left + \"px;right:auto;}\";\n            toggleClass(self.calendarContainer, \"rightMost\", false);\n            toggleClass(self.calendarContainer, \"centerMost\", true);\n            doc.insertRule(centerBefore + \",\" + centerAfter + centerStyle, centerIndex);\n            self.calendarContainer.style.left = centerLeft + \"px\";\n            self.calendarContainer.style.right = \"auto\";\n        }\n    }\n    function getDocumentStyleSheet() {\n        var editableSheet = null;\n        for (var i = 0; i < document.styleSheets.length; i++) {\n            var sheet = document.styleSheets[i];\n            if (!sheet.cssRules)\n                continue;\n            try {\n                sheet.cssRules;\n            }\n            catch (err) {\n                continue;\n            }\n            editableSheet = sheet;\n            break;\n        }\n        return editableSheet != null ? editableSheet : createStyleSheet();\n    }\n    function createStyleSheet() {\n        var style = document.createElement(\"style\");\n        document.head.appendChild(style);\n        return style.sheet;\n    }\n    function redraw() {\n        if (self.config.noCalendar || self.isMobile)\n            return;\n        buildMonthSwitch();\n        updateNavigationCurrentMonth();\n        buildDays();\n    }\n    function focusAndClose() {\n        self._input.focus();\n        if (window.navigator.userAgent.indexOf(\"MSIE\") !== -1 ||\n            navigator.msMaxTouchPoints !== undefined) {\n            setTimeout(self.close, 0);\n        }\n        else {\n            self.close();\n        }\n    }\n    function selectDate(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        var isSelectable = function (day) {\n            return day.classList &&\n                day.classList.contains(\"flatpickr-day\") &&\n                !day.classList.contains(\"flatpickr-disabled\") &&\n                !day.classList.contains(\"notAllowed\");\n        };\n        var t = findParent(getEventTarget(e), isSelectable);\n        if (t === undefined)\n            return;\n        var target = t;\n        var selectedDate = (self.latestSelectedDateObj = new Date(target.dateObj.getTime()));\n        var shouldChangeMonth = (selectedDate.getMonth() < self.currentMonth ||\n            selectedDate.getMonth() >\n                self.currentMonth + self.config.showMonths - 1) &&\n            self.config.mode !== \"range\";\n        self.selectedDateElem = target;\n        if (self.config.mode === \"single\")\n            self.selectedDates = [selectedDate];\n        else if (self.config.mode === \"multiple\") {\n            var selectedIndex = isDateSelected(selectedDate);\n            if (selectedIndex)\n                self.selectedDates.splice(parseInt(selectedIndex), 1);\n            else\n                self.selectedDates.push(selectedDate);\n        }\n        else if (self.config.mode === \"range\") {\n            if (self.selectedDates.length === 2) {\n                self.clear(false, false);\n            }\n            self.latestSelectedDateObj = selectedDate;\n            self.selectedDates.push(selectedDate);\n            if (compareDates(selectedDate, self.selectedDates[0], true) !== 0)\n                self.selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });\n        }\n        setHoursFromInputs();\n        if (shouldChangeMonth) {\n            var isNewYear = self.currentYear !== selectedDate.getFullYear();\n            self.currentYear = selectedDate.getFullYear();\n            self.currentMonth = selectedDate.getMonth();\n            if (isNewYear) {\n                triggerEvent(\"onYearChange\");\n                buildMonthSwitch();\n            }\n            triggerEvent(\"onMonthChange\");\n        }\n        updateNavigationCurrentMonth();\n        buildDays();\n        updateValue();\n        if (!shouldChangeMonth &&\n            self.config.mode !== \"range\" &&\n            self.config.showMonths === 1)\n            focusOnDayElem(target);\n        else if (self.selectedDateElem !== undefined &&\n            self.hourElement === undefined) {\n            self.selectedDateElem && self.selectedDateElem.focus();\n        }\n        if (self.hourElement !== undefined)\n            self.hourElement !== undefined && self.hourElement.focus();\n        if (self.config.closeOnSelect) {\n            var single = self.config.mode === \"single\" && !self.config.enableTime;\n            var range = self.config.mode === \"range\" &&\n                self.selectedDates.length === 2 &&\n                !self.config.enableTime;\n            if (single || range) {\n                focusAndClose();\n            }\n        }\n        triggerChange();\n    }\n    var CALLBACKS = {\n        locale: [setupLocale, updateWeekdays],\n        showMonths: [buildMonths, setCalendarWidth, buildWeekdays],\n        minDate: [jumpToDate],\n        maxDate: [jumpToDate],\n        positionElement: [updatePositionElement],\n        clickOpens: [\n            function () {\n                if (self.config.clickOpens === true) {\n                    bind(self._input, \"focus\", self.open);\n                    bind(self._input, \"click\", self.open);\n                }\n                else {\n                    self._input.removeEventListener(\"focus\", self.open);\n                    self._input.removeEventListener(\"click\", self.open);\n                }\n            },\n        ],\n    };\n    function set(option, value) {\n        if (option !== null && typeof option === \"object\") {\n            Object.assign(self.config, option);\n            for (var key in option) {\n                if (CALLBACKS[key] !== undefined)\n                    CALLBACKS[key].forEach(function (x) { return x(); });\n            }\n        }\n        else {\n            self.config[option] = value;\n            if (CALLBACKS[option] !== undefined)\n                CALLBACKS[option].forEach(function (x) { return x(); });\n            else if (HOOKS.indexOf(option) > -1)\n                self.config[option] = arrayify(value);\n        }\n        self.redraw();\n        updateValue(true);\n    }\n    function setSelectedDate(inputDate, format) {\n        var dates = [];\n        if (inputDate instanceof Array)\n            dates = inputDate.map(function (d) { return self.parseDate(d, format); });\n        else if (inputDate instanceof Date || typeof inputDate === \"number\")\n            dates = [self.parseDate(inputDate, format)];\n        else if (typeof inputDate === \"string\") {\n            switch (self.config.mode) {\n                case \"single\":\n                case \"time\":\n                    dates = [self.parseDate(inputDate, format)];\n                    break;\n                case \"multiple\":\n                    dates = inputDate\n                        .split(self.config.conjunction)\n                        .map(function (date) { return self.parseDate(date, format); });\n                    break;\n                case \"range\":\n                    dates = inputDate\n                        .split(self.l10n.rangeSeparator)\n                        .map(function (date) { return self.parseDate(date, format); });\n                    break;\n                default:\n                    break;\n            }\n        }\n        else\n            self.config.errorHandler(new Error(\"Invalid date supplied: \" + JSON.stringify(inputDate)));\n        self.selectedDates = (self.config.allowInvalidPreload\n            ? dates\n            : dates.filter(function (d) { return d instanceof Date && isEnabled(d, false); }));\n        if (self.config.mode === \"range\")\n            self.selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });\n    }\n    function setDate(date, triggerChange, format) {\n        if (triggerChange === void 0) { triggerChange = false; }\n        if (format === void 0) { format = self.config.dateFormat; }\n        if ((date !== 0 && !date) || (date instanceof Array && date.length === 0))\n            return self.clear(triggerChange);\n        setSelectedDate(date, format);\n        self.latestSelectedDateObj =\n            self.selectedDates[self.selectedDates.length - 1];\n        self.redraw();\n        jumpToDate(undefined, triggerChange);\n        setHoursFromDate();\n        if (self.selectedDates.length === 0) {\n            self.clear(false);\n        }\n        updateValue(triggerChange);\n        if (triggerChange)\n            triggerEvent(\"onChange\");\n    }\n    function parseDateRules(arr) {\n        return arr\n            .slice()\n            .map(function (rule) {\n            if (typeof rule === \"string\" ||\n                typeof rule === \"number\" ||\n                rule instanceof Date) {\n                return self.parseDate(rule, undefined, true);\n            }\n            else if (rule &&\n                typeof rule === \"object\" &&\n                rule.from &&\n                rule.to)\n                return {\n                    from: self.parseDate(rule.from, undefined),\n                    to: self.parseDate(rule.to, undefined),\n                };\n            return rule;\n        })\n            .filter(function (x) { return x; });\n    }\n    function setupDates() {\n        self.selectedDates = [];\n        self.now = self.parseDate(self.config.now) || new Date();\n        var preloadedDate = self.config.defaultDate ||\n            ((self.input.nodeName === \"INPUT\" ||\n                self.input.nodeName === \"TEXTAREA\") &&\n                self.input.placeholder &&\n                self.input.value === self.input.placeholder\n                ? null\n                : self.input.value);\n        if (preloadedDate)\n            setSelectedDate(preloadedDate, self.config.dateFormat);\n        self._initialDate =\n            self.selectedDates.length > 0\n                ? self.selectedDates[0]\n                : self.config.minDate &&\n                    self.config.minDate.getTime() > self.now.getTime()\n                    ? self.config.minDate\n                    : self.config.maxDate &&\n                        self.config.maxDate.getTime() < self.now.getTime()\n                        ? self.config.maxDate\n                        : self.now;\n        self.currentYear = self._initialDate.getFullYear();\n        self.currentMonth = self._initialDate.getMonth();\n        if (self.selectedDates.length > 0)\n            self.latestSelectedDateObj = self.selectedDates[0];\n        if (self.config.minTime !== undefined)\n            self.config.minTime = self.parseDate(self.config.minTime, \"H:i\");\n        if (self.config.maxTime !== undefined)\n            self.config.maxTime = self.parseDate(self.config.maxTime, \"H:i\");\n        self.minDateHasTime =\n            !!self.config.minDate &&\n                (self.config.minDate.getHours() > 0 ||\n                    self.config.minDate.getMinutes() > 0 ||\n                    self.config.minDate.getSeconds() > 0);\n        self.maxDateHasTime =\n            !!self.config.maxDate &&\n                (self.config.maxDate.getHours() > 0 ||\n                    self.config.maxDate.getMinutes() > 0 ||\n                    self.config.maxDate.getSeconds() > 0);\n    }\n    function setupInputs() {\n        self.input = getInputElem();\n        if (!self.input) {\n            self.config.errorHandler(new Error(\"Invalid input element specified\"));\n            return;\n        }\n        self.input._type = self.input.type;\n        self.input.type = \"text\";\n        self.input.classList.add(\"flatpickr-input\");\n        self._input = self.input;\n        if (self.config.altInput) {\n            self.altInput = createElement(self.input.nodeName, self.config.altInputClass);\n            self._input = self.altInput;\n            self.altInput.placeholder = self.input.placeholder;\n            self.altInput.disabled = self.input.disabled;\n            self.altInput.required = self.input.required;\n            self.altInput.tabIndex = self.input.tabIndex;\n            self.altInput.type = \"text\";\n            self.input.setAttribute(\"type\", \"hidden\");\n            if (!self.config.static && self.input.parentNode)\n                self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling);\n        }\n        if (!self.config.allowInput)\n            self._input.setAttribute(\"readonly\", \"readonly\");\n        updatePositionElement();\n    }\n    function updatePositionElement() {\n        self._positionElement = self.config.positionElement || self._input;\n    }\n    function setupMobile() {\n        var inputType = self.config.enableTime\n            ? self.config.noCalendar\n                ? \"time\"\n                : \"datetime-local\"\n            : \"date\";\n        self.mobileInput = createElement(\"input\", self.input.className + \" flatpickr-mobile\");\n        self.mobileInput.tabIndex = 1;\n        self.mobileInput.type = inputType;\n        self.mobileInput.disabled = self.input.disabled;\n        self.mobileInput.required = self.input.required;\n        self.mobileInput.placeholder = self.input.placeholder;\n        self.mobileFormatStr =\n            inputType === \"datetime-local\"\n                ? \"Y-m-d\\\\TH:i:S\"\n                : inputType === \"date\"\n                    ? \"Y-m-d\"\n                    : \"H:i:S\";\n        if (self.selectedDates.length > 0) {\n            self.mobileInput.defaultValue = self.mobileInput.value = self.formatDate(self.selectedDates[0], self.mobileFormatStr);\n        }\n        if (self.config.minDate)\n            self.mobileInput.min = self.formatDate(self.config.minDate, \"Y-m-d\");\n        if (self.config.maxDate)\n            self.mobileInput.max = self.formatDate(self.config.maxDate, \"Y-m-d\");\n        if (self.input.getAttribute(\"step\"))\n            self.mobileInput.step = String(self.input.getAttribute(\"step\"));\n        self.input.type = \"hidden\";\n        if (self.altInput !== undefined)\n            self.altInput.type = \"hidden\";\n        try {\n            if (self.input.parentNode)\n                self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling);\n        }\n        catch (_a) { }\n        bind(self.mobileInput, \"change\", function (e) {\n            self.setDate(getEventTarget(e).value, false, self.mobileFormatStr);\n            triggerEvent(\"onChange\");\n            triggerEvent(\"onClose\");\n        });\n    }\n    function toggle(e) {\n        if (self.isOpen === true)\n            return self.close();\n        self.open(e);\n    }\n    function triggerEvent(event, data) {\n        if (self.config === undefined)\n            return;\n        var hooks = self.config[event];\n        if (hooks !== undefined && hooks.length > 0) {\n            for (var i = 0; hooks[i] && i < hooks.length; i++)\n                hooks[i](self.selectedDates, self.input.value, self, data);\n        }\n        if (event === \"onChange\") {\n            self.input.dispatchEvent(createEvent(\"change\"));\n            self.input.dispatchEvent(createEvent(\"input\"));\n        }\n    }\n    function createEvent(name) {\n        var e = document.createEvent(\"Event\");\n        e.initEvent(name, true, true);\n        return e;\n    }\n    function isDateSelected(date) {\n        for (var i = 0; i < self.selectedDates.length; i++) {\n            var selectedDate = self.selectedDates[i];\n            if (selectedDate instanceof Date &&\n                compareDates(selectedDate, date) === 0)\n                return \"\" + i;\n        }\n        return false;\n    }\n    function isDateInRange(date) {\n        if (self.config.mode !== \"range\" || self.selectedDates.length < 2)\n            return false;\n        return (compareDates(date, self.selectedDates[0]) >= 0 &&\n            compareDates(date, self.selectedDates[1]) <= 0);\n    }\n    function updateNavigationCurrentMonth() {\n        if (self.config.noCalendar || self.isMobile || !self.monthNav)\n            return;\n        self.yearElements.forEach(function (yearElement, i) {\n            var d = new Date(self.currentYear, self.currentMonth, 1);\n            d.setMonth(self.currentMonth + i);\n            if (self.config.showMonths > 1 ||\n                self.config.monthSelectorType === \"static\") {\n                self.monthElements[i].textContent =\n                    monthToStr(d.getMonth(), self.config.shorthandCurrentMonth, self.l10n) + \" \";\n            }\n            else {\n                self.monthsDropdownContainer.value = d.getMonth().toString();\n            }\n            yearElement.value = d.getFullYear().toString();\n        });\n        self._hidePrevMonthArrow =\n            self.config.minDate !== undefined &&\n                (self.currentYear === self.config.minDate.getFullYear()\n                    ? self.currentMonth <= self.config.minDate.getMonth()\n                    : self.currentYear < self.config.minDate.getFullYear());\n        self._hideNextMonthArrow =\n            self.config.maxDate !== undefined &&\n                (self.currentYear === self.config.maxDate.getFullYear()\n                    ? self.currentMonth + 1 > self.config.maxDate.getMonth()\n                    : self.currentYear > self.config.maxDate.getFullYear());\n    }\n    function getDateStr(specificFormat) {\n        var format = specificFormat ||\n            (self.config.altInput ? self.config.altFormat : self.config.dateFormat);\n        return self.selectedDates\n            .map(function (dObj) { return self.formatDate(dObj, format); })\n            .filter(function (d, i, arr) {\n            return self.config.mode !== \"range\" ||\n                self.config.enableTime ||\n                arr.indexOf(d) === i;\n        })\n            .join(self.config.mode !== \"range\"\n            ? self.config.conjunction\n            : self.l10n.rangeSeparator);\n    }\n    function updateValue(triggerChange) {\n        if (triggerChange === void 0) { triggerChange = true; }\n        if (self.mobileInput !== undefined && self.mobileFormatStr) {\n            self.mobileInput.value =\n                self.latestSelectedDateObj !== undefined\n                    ? self.formatDate(self.latestSelectedDateObj, self.mobileFormatStr)\n                    : \"\";\n        }\n        self.input.value = getDateStr(self.config.dateFormat);\n        if (self.altInput !== undefined) {\n            self.altInput.value = getDateStr(self.config.altFormat);\n        }\n        if (triggerChange !== false)\n            triggerEvent(\"onValueUpdate\");\n    }\n    function onMonthNavClick(e) {\n        var eventTarget = getEventTarget(e);\n        var isPrevMonth = self.prevMonthNav.contains(eventTarget);\n        var isNextMonth = self.nextMonthNav.contains(eventTarget);\n        if (isPrevMonth || isNextMonth) {\n            changeMonth(isPrevMonth ? -1 : 1);\n        }\n        else if (self.yearElements.indexOf(eventTarget) >= 0) {\n            eventTarget.select();\n        }\n        else if (eventTarget.classList.contains(\"arrowUp\")) {\n            self.changeYear(self.currentYear + 1);\n        }\n        else if (eventTarget.classList.contains(\"arrowDown\")) {\n            self.changeYear(self.currentYear - 1);\n        }\n    }\n    function timeWrapper(e) {\n        e.preventDefault();\n        var isKeyDown = e.type === \"keydown\", eventTarget = getEventTarget(e), input = eventTarget;\n        if (self.amPM !== undefined && eventTarget === self.amPM) {\n            self.amPM.textContent =\n                self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n        }\n        var min = parseFloat(input.getAttribute(\"min\")), max = parseFloat(input.getAttribute(\"max\")), step = parseFloat(input.getAttribute(\"step\")), curValue = parseInt(input.value, 10), delta = e.delta ||\n            (isKeyDown ? (e.which === 38 ? 1 : -1) : 0);\n        var newValue = curValue + step * delta;\n        if (typeof input.value !== \"undefined\" && input.value.length === 2) {\n            var isHourElem = input === self.hourElement, isMinuteElem = input === self.minuteElement;\n            if (newValue < min) {\n                newValue =\n                    max +\n                        newValue +\n                        int(!isHourElem) +\n                        (int(isHourElem) && int(!self.amPM));\n                if (isMinuteElem)\n                    incrementNumInput(undefined, -1, self.hourElement);\n            }\n            else if (newValue > max) {\n                newValue =\n                    input === self.hourElement ? newValue - max - int(!self.amPM) : min;\n                if (isMinuteElem)\n                    incrementNumInput(undefined, 1, self.hourElement);\n            }\n            if (self.amPM &&\n                isHourElem &&\n                (step === 1\n                    ? newValue + curValue === 23\n                    : Math.abs(newValue - curValue) > step)) {\n                self.amPM.textContent =\n                    self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n            }\n            input.value = pad(newValue);\n        }\n    }\n    init();\n    return self;\n}\nfunction _flatpickr(nodeList, config) {\n    var nodes = Array.prototype.slice\n        .call(nodeList)\n        .filter(function (x) { return x instanceof HTMLElement; });\n    var instances = [];\n    for (var i = 0; i < nodes.length; i++) {\n        var node = nodes[i];\n        try {\n            if (node.getAttribute(\"data-fp-omit\") !== null)\n                continue;\n            if (node._flatpickr !== undefined) {\n                node._flatpickr.destroy();\n                node._flatpickr = undefined;\n            }\n            node._flatpickr = FlatpickrInstance(node, config || {});\n            instances.push(node._flatpickr);\n        }\n        catch (e) {\n            console.error(e);\n        }\n    }\n    return instances.length === 1 ? instances[0] : instances;\n}\nif (typeof HTMLElement !== \"undefined\" &&\n    typeof HTMLCollection !== \"undefined\" &&\n    typeof NodeList !== \"undefined\") {\n    HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) {\n        return _flatpickr(this, config);\n    };\n    HTMLElement.prototype.flatpickr = function (config) {\n        return _flatpickr([this], config);\n    };\n}\nvar flatpickr = function (selector, config) {\n    if (typeof selector === \"string\") {\n        return _flatpickr(window.document.querySelectorAll(selector), config);\n    }\n    else if (selector instanceof Node) {\n        return _flatpickr([selector], config);\n    }\n    else {\n        return _flatpickr(selector, config);\n    }\n};\nflatpickr.defaultConfig = {};\nflatpickr.l10ns = {\n    en: __assign({}, English),\n    default: __assign({}, English),\n};\nflatpickr.localize = function (l10n) {\n    flatpickr.l10ns.default = __assign(__assign({}, flatpickr.l10ns.default), l10n);\n};\nflatpickr.setDefaults = function (config) {\n    flatpickr.defaultConfig = __assign(__assign({}, flatpickr.defaultConfig), config);\n};\nflatpickr.parseDate = createDateParser({});\nflatpickr.formatDate = createDateFormatter({});\nflatpickr.compareDates = compareDates;\nif (typeof jQuery !== \"undefined\" && typeof jQuery.fn !== \"undefined\") {\n    jQuery.fn.flatpickr = function (config) {\n        return _flatpickr(this, config);\n    };\n}\nDate.prototype.fp_incr = function (days) {\n    return new Date(this.getFullYear(), this.getMonth(), this.getDate() + (typeof days === \"string\" ? parseInt(days, 10) : days));\n};\nif (typeof window !== \"undefined\") {\n    window.flatpickr = flatpickr;\n}\nexport default flatpickr;\n","import $ from 'jquery';\nimport dt from 'datatables.net-dt';\nimport flatpickr from 'flatpickr';\nimport './datatable.css';\n\nconst DATA_PREFIX = \"data-jagdt\";\n\n/**\n * DataTables may generate invalid aria-role attributes.\n * Convert aria-role=\"link\" into role=\"link\" and remove aria-role.\n */\nfunction fixInvalidAriaRole(rootEl) {\n  if (!rootEl) {\n    return;\n  }\n\n  rootEl.querySelectorAll('[aria-role]').forEach((el) => {\n    const ariaRoleValue = el.getAttribute('aria-role');\n\n    if (ariaRoleValue && !el.hasAttribute('role')) {\n      el.setAttribute('role', ariaRoleValue);\n    }\n\n    el.removeAttribute('aria-role');\n  });\n}\n\nfunction createDataTable(tableWrapperEl) {\n  let options = {\n    responsive: true,\n  };\n\n  if (window._jagDatatableProfiles) {\n    const profileName = tableWrapperEl.getAttribute(`${DATA_PREFIX}-profile`);\n\n    if (profileName && profileName in window._jagDatatableProfiles) {\n      options = {\n        ...options,\n        ...window._jagDatatableProfiles[profileName],\n      };\n    }\n  }\n\n  const tableEl = tableWrapperEl.querySelector('table');\n  if (!tableEl) {\n    return;\n  }\n\n  let table;\n  let minDate;\n  let maxDate;\n\n  if (options.date_search_field) {\n    const dateMinFilter = tableWrapperEl.querySelector(`[${DATA_PREFIX}-min-filter]`);\n    const dateMaxFilter = tableWrapperEl.querySelector(`[${DATA_PREFIX}-max-filter]`);\n\n    if (dateMinFilter) {\n      flatpickr(dateMinFilter, {\n        defaultDate: null,\n        enableTime: options.is_datetime_search === true,\n        onChange: (dataObj, data, instance) => {\n          minDate = dataObj[0];\n          table.draw();\n        }\n      });\n    }\n\n    if (dateMaxFilter) {\n      flatpickr(dateMaxFilter, {\n        enableTime: options.is_datetime_search === true,\n        onChange: (dataObj, data, instance) => {\n          maxDate = dataObj[0];\n          table.draw();\n        }\n      });\n    }\n  }\n\n  const ajaxUrl = tableEl.getAttribute(`${DATA_PREFIX}-ajax`);\n\n  if (ajaxUrl) {\n    options.ajax = {\n      url: ajaxUrl,\n      dataSrc: 'results',\n\n      dataFilter: (d) => {\n        const data = JSON.parse(d);\n\n        data.recordsTotal = data.count;\n        data.recordsFiltered = data.count;\n\n        return JSON.stringify(data);\n      },\n\n      data: (d, settings) => {\n        const api = new $.fn.dataTable.Api(settings);\n\n        let params = {\n          page: (d.start / d.length) + 1,\n          page_size: d.length,\n          q: d.search.value,\n        };\n\n        const extraQueryParams = tableEl.getAttribute(`${DATA_PREFIX}-queryParams`);\n\n        if (extraQueryParams) {\n          params = {\n            ...params,\n            ...JSON.parse(extraQueryParams),\n          };\n        }\n\n        if (d.order) {\n          let ordering = [];\n\n          for (let order of d.order) {\n            const orderColumn = api.column(order.column).dataSrc().replaceAll('.', '__');\n            ordering.push(`${order.dir === 'desc' ? '-' : ''}${orderColumn}`);\n          }\n\n          params.ordering = ordering.join(',');\n        }\n\n        if (options.date_search_field) {\n          const dateFilterColumn = api.column(options.date_search_field).dataSrc().replaceAll('.', '__');\n\n          if (minDate) {\n            let minDateFormat = minDate.toISOString();\n\n            if (!options.is_datetime_search) {\n              minDateFormat = minDateFormat.split('T')[0];\n            }\n\n            params[`${dateFilterColumn}__gte`] = minDateFormat;\n          }\n\n          if (maxDate) {\n            let maxDateFormat = maxDate.toISOString();\n\n            if (!options.is_datetime_search) {\n              maxDateFormat = maxDateFormat.split('T')[0];\n            }\n\n            params[`${dateFilterColumn}__lte`] = maxDateFormat;\n          }\n        }\n\n        return params;\n      }\n    };\n\n    options.serverSide = true;\n    options.processing = true;\n    options.searchDelay = 500;\n  }\n\n  table = new dt(tableEl, options);\n\n  // Fix invalid aria-role immediately after DataTables creates the controls.\n  fixInvalidAriaRole(tableWrapperEl.parentElement || tableWrapperEl);\n\n  // Fix invalid aria-role again whenever DataTables redraws pagination/search UI.\n  $(tableEl).on('draw.dt', () => {\n    fixInvalidAriaRole(tableWrapperEl.parentElement || tableWrapperEl);\n  });\n\n  return table;\n}\n\nwindow.addEventListener('load', () => {\n  const tableWrappers = document.querySelectorAll(`[${DATA_PREFIX}]`);\n\n  for (let tw of tableWrappers) {\n    createDataTable(tw);\n  }\n});"],"names":["global","factory","$dc57b31f1b066f38$exports","document","w","Error","window","window1","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","this","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rleadingCombinator","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","cssHas","querySelector","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","setMatchers","elementMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","matcherFromGroupMatchers","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","createOptions","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","getData","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","body","showHide","show","values","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","fixInput","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","rcustomProp","getStyles","opener","getComputedStyle","swap","old","rboxStyle","rtrimCSS","curCSS","computed","width","minWidth","maxWidth","isCustomProp","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classNames","curValue","finalValue","removeClass","toggleClass","stateVal","isValidValue","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict","$ade59fb547421c03$var$$","$parcel$interopDefault","$ade59fb547421c03$var$_ext","$ade59fb547421c03$var$_Api","$ade59fb547421c03$var$_api_register","$ade59fb547421c03$var$_api_registerPlural","$ade59fb547421c03$var$DataTable","DataTable","sSelector","oOpts","api","rows","$ade59fb547421c03$var$_fnSettingsFromNode","iApiIndex","fnAddData","redraw","row","draw","flatten","fnAdjustColumnSizing","bRedraw","columns","adjust","scroll","oScroll","sX","sY","$ade59fb547421c03$var$_fnScrollDraw","fnClearTable","clear","fnClose","nTr","child","fnDeleteRow","aoData","fnDestroy","destroy","fnDraw","fnFilter","sInput","iColumn","bRegex","bSmart","bShowGlobal","bCaseInsensitive","search","column","fnGetData","cell","fnGetNodes","iRow","fnGetPosition","columnVisible","fnIsOpen","isShown","fnOpen","mHtml","sClass","fnPageChange","mAction","page","fnSetColumnVis","iCol","bShow","fnSettings","fnSort","aaSort","fnSortListener","nNode","fnCallback","listener","fnUpdate","mData","mRow","bAction","fnVersionCheck","_that","emptyInit","oApi","internal","ext","$ade59fb547421c03$var$_fnExternApiFunc","iLen","oInit","$ade59fb547421c03$var$_fnExtend","sId","bInitHandedOff","defaults","$this","$ade59fb547421c03$var$_fnCompatOpts","$ade59fb547421c03$var$_fnCompatCols","$ade59fb547421c03$var$_fnCamelToHungarian","allSettings","nTable","nTHead","nTFoot","bRetrieve","bDestroy","oInstance","$ade59fb547421c03$var$_fnLog","sTableId","_unique","oSettings","models","sDestroyWidth","sInstance","dataTable","$ade59fb547421c03$var$_fnLanguageCompat","oLanguage","aLengthMenu","iDisplayLength","$ade59fb547421c03$var$_fnMap","oFeatures","$ade59fb547421c03$var$_fnCallbackReg","fnDrawCallback","fnServerParams","fnStateSaveParams","fnStateLoadParams","fnStateLoaded","fnRowCallback","fnCreatedRow","fnHeaderCallback","fnFooterCallback","fnInitComplete","fnPreDrawCallback","rowIdFn","$ade59fb547421c03$var$_fnGetObjectDataFn","rowId","$ade59fb547421c03$var$_fnBrowserDetect","oClasses","classes","sTable","iInitDisplayStart","iDisplayStart","_iDisplayStart","iDeferLoading","bDeferLoading","_iRecordsDisplay","_iRecordsTotal","sUrl","$ade59fb547421c03$var$_fnCallbackFire","$ade59fb547421c03$var$_fnInitialise","asStripeClasses","sStripeOdd","sStripeEven","stripeClasses","rowOne","asDestroyStripes","aoColumnsInit","anThs","nThead","$ade59fb547421c03$var$_fnDetectHeader","aoHeader","$ade59fb547421c03$var$_fnGetUniqueThs","aoColumns","$ade59fb547421c03$var$_fnAddColumn","$ade59fb547421c03$var$_fnApplyColumnDefs","aoColumnDefs","oDef","$ade59fb547421c03$var$_fnColumnOptions","_isArrayHost","features","loadedInit","aaSorting","sorting","asSorting","$ade59fb547421c03$var$_fnSortingClasses","bSort","bSorted","aSort","$ade59fb547421c03$var$_fnSortFlatten","sortedColumns","$ade59fb547421c03$var$_fnSortAria","$ade59fb547421c03$var$_fnDataSource","bDeferRender","captions","_captionSide","nTBody","sNoFooter","aoFooter","aaData","$ade59fb547421c03$var$_fnAddData","$ade59fb547421c03$var$_fnAddTr","aiDisplay","aiDisplayMaster","bInitialised","$ade59fb547421c03$var$_fnSaveState","bStateSave","$ade59fb547421c03$var$_fnLoadState","$ade59fb547421c03$var$_re_dic","$ade59fb547421c03$var$_re_new_lines","$ade59fb547421c03$var$_re_html","$ade59fb547421c03$var$_re_date","$ade59fb547421c03$var$_re_escape_regex","$ade59fb547421c03$var$_re_formatted_numeric","$ade59fb547421c03$var$_empty","d","$ade59fb547421c03$var$_intVal","integer","$ade59fb547421c03$var$_numToDecimal","decimalPoint","$ade59fb547421c03$var$_fnEscapeRegex","$ade59fb547421c03$var$_isNumber","formatted","strType","$ade59fb547421c03$var$_htmlNumeric","$ade59fb547421c03$var$_isHtml","$ade59fb547421c03$var$_stripHtml","$ade59fb547421c03$var$_pluck","prop2","out","ien","$ade59fb547421c03$var$_pluck_order","$ade59fb547421c03$var$_range","$ade59fb547421c03$var$_removeEmpty","$ade59fb547421c03$var$_unique","sorted","$ade59fb547421c03$var$_areAllUnique","k","again","$ade59fb547421c03$var$_flatten","$ade59fb547421c03$var$_includes","$ade59fb547421c03$var$_fnHungarianMap","o","newKey","_hungarianMap","user","force","hungarianKey","charAt","defaultDecimal","sDecimal","$ade59fb547421c03$var$_addNumericSort","zeroRecords","sZeroRecords","sEmptyTable","sLoadingRecords","sInfoThousands","sThousands","decimal","includes","util","throttle","freq","frequency","escapeRegex","meta","setData","arrayNotation","funcNotation","innerSrc","$ade59fb547421c03$var$_fnSplitObjNotation","aLast","$ade59fb547421c03$var$__reArray","$ade59fb547421c03$var$__reFn","jLen","fetchData","substring","$ade59fb547421c03$var$_fnCompatMap","knew","sScrollX","scrollX","searchCols","aoSearchCols","oSearch","dataSort","aDataSort","__browser","browser","outer","inner","barWidth","clientWidth","bScrollOversize","bScrollbarLeft","bBounding","oBrowser","iBarWidth","$ade59fb547421c03$var$_fnReduce","inc","isSet","nTh","oDefaults","oCol","oColumn","sTitle","aoPreSearchCols","oOptions","sWidthOrig","mDataProp","sType","_sManualType","origClass","iDataSort","mDataSrc","mRender","attrTest","_bAttrSrc","_setter","rowData","innerData","fnSetData","$ade59fb547421c03$var$_fnSetObjectDataFn","_rowReadObject","bSortable","sSortableNone","bAsc","bDesc","sSortingClass","sSortableAsc","sSortingClassJUI","sSortJUIAscAllowed","sSortableDesc","sSortJUIDescAllowed","sSortable","sSortJUI","$ade59fb547421c03$var$_fnAdjustColumnSizing","bAutoWidth","$ade59fb547421c03$var$_fnCalculateColumnWidths","sWidth","$ade59fb547421c03$var$_fnVisibleToColumnIndex","iMatch","aiVis","$ade59fb547421c03$var$_fnGetColumns","$ade59fb547421c03$var$_fnColumnIndexToVisible","iPos","$ade59fb547421c03$var$_fnVisbleColumns","vis","bVisible","sParam","$ade59fb547421c03$var$_fnColumnTypes","jen","ken","detectedType","detect","$ade59fb547421c03$var$_fnGetCellData","aoColDefs","aoCols","kLen","def","aTargets","aDataIn","anTds","oData","oRow","_aData","aIds","$ade59fb547421c03$var$_fnCreateTr","trs","$ade59fb547421c03$var$_fnGetRowElements","cells","rowIdx","colIdx","iDraw","defaultContent","sDefaultContent","cellData","iDrawError","fomatters","$ade59fb547421c03$var$_fnSetCellData","str","$ade59fb547421c03$var$_fnGetDataMaster","$ade59fb547421c03$var$_fnClearTable","$ade59fb547421c03$var$_fnDeleteIndex","iTarget","iTargetIndex","$ade59fb547421c03$var$_fnInvalidate","cellWrite","anCells","_aSortData","_aFilterData","cols","$ade59fb547421c03$var$_fnRowAttributes","tds","objectRead","cellProcess","rowNode","nTrIn","nTd","_DT_RowIndex","sCellType","_DT_CellIndex","fnCreatedCell","DT_RowClass","__rowc","DT_RowAttr","DT_RowData","$ade59fb547421c03$var$_fnBuildHead","createHeader","iTabIndex","$ade59fb547421c03$var$_fnSortAttachListener","$ade59fb547421c03$var$_fnRenderer","sHeaderTH","sFooterTH","nTf","$ade59fb547421c03$var$_fnDrawHead","aoSource","bIncludeHidden","nLocalTr","iRowspan","iColspan","aoLocal","aApplied","iColumns","$ade59fb547421c03$var$_fnDraw","ajaxComplete","bServerSide","fnRecordsDisplay","$ade59fb547421c03$var$_fnStart","aPreDraw","anRows","iRowCount","iStripes","oLang","iDisplayEnd","fnDisplayEnd","bDrawing","$ade59fb547421c03$var$_fnProcessingDisplay","bDestroying","$ade59fb547421c03$var$_fnAjaxUpdate","iStart","iEnd","iDataIndex","nRow","sStripe","_sRowStripe","sZero","fnRecordsTotal","valign","colSpan","sRowEmpty","bFiltered","$ade59fb547421c03$var$_fnReDraw","holdPosition","bFilter","$ade59fb547421c03$var$_fnSort","$ade59fb547421c03$var$_fnFilterComplete","oPreviousSearch","_drawHold","$ade59fb547421c03$var$_fnAddOptionsHtml","holding","sWrapper","nHolding","nTableWrapper","nTableReinsertBefore","featureNode","cOption","nNewNode","cNext","sAttr","aDom","sDom","sJUIHeader","sJUIFooter","aSplit","substr","bPaginate","bLengthChange","$ade59fb547421c03$var$_fnFeatureHtmlLength","$ade59fb547421c03$var$_fnFeatureHtmlFilter","bProcessing","$ade59fb547421c03$var$_fnFeatureHtmlProcessing","$ade59fb547421c03$var$_fnFeatureHtmlTable","bInfo","$ade59fb547421c03$var$_fnFeatureHtmlInfo","$ade59fb547421c03$var$_fnFeatureHtmlPaginate","feature","aoFeatures","cFeature","fnInit","aanFeatures","aLayout","nCell","iColShifted","bUnique","nTrs","fnShiftCol","nHeader","aReturn","bSortCellsTop","$ade59fb547421c03$var$_fnBuildAjax","ajaxData","instance","$ade59fb547421c03$var$_fnAjaxDataSrc","sError","newData","baseAjax","sServerMethod","thrown","oAjaxData","fnServerData","sAjaxSource","$ade59fb547421c03$var$_fnAjaxParameters","$ade59fb547421c03$var$_fnAjaxUpdateDraw","dataProp","columnSearch","preSearch","preColSearch","displayStart","displayLength","_iDisplayLength","sSearch","regex","sName","searchable","bSearchable","orderable","legacy","compat","modern","recordsTotal","recordsFiltered","_bInitComplete","$ade59fb547421c03$var$_fnInitComplete","write","dataSrc","sAjaxDataProp","tableId","language","previousSearch","sFilterInput","f","sFilter","searchFn","return","searchDelay","jqFilter","sSearchPlaceholder","$ade59fb547421c03$var$_fnThrottle","ev","oInput","iForce","oPrevSearch","aoPrevSearch","fnSaveFilter","oFilter","fnRegex","bEscapeRegex","$ade59fb547421c03$var$_fnFilter","$ade59fb547421c03$var$_fnFilterColumn","$ade59fb547421c03$var$_fnFilterCustom","displayRows","searchStr","smart","caseInsensitive","rpSearch","$ade59fb547421c03$var$_fnFilterCreateSearch","invalidated","prevSearch","displayMaster","filtered","$ade59fb547421c03$var$_fnFilterData","_sFilterRow","word","$ade59fb547421c03$var$__filter_div","$ade59fb547421c03$var$__filter_div_textContent","filterData","wasInvalidated","innerText","$ade59fb547421c03$var$_fnSearchToCamel","$ade59fb547421c03$var$_fnSearchToHung","tid","sInfo","aoDrawCallback","$ade59fb547421c03$var$_fnUpdateInfo","total","sInfoEmpty","sInfoFiltered","$ade59fb547421c03$var$_fnInfoMacros","sInfoPostFix","fnInfoCallback","formatter","fnFormatNumber","all","iAjaxStart","deferLoading","$ade59fb547421c03$var$_fnStringToCss","aData","$ade59fb547421c03$var$_fnLengthChange","$ade59fb547421c03$var$_fnLengthOverflow","menu","d2","lengths","sLengthSelect","Option","sLength","sLengthMenu","outerHTML","sPaginationType","plugin","pager","sPaging","visRecords","pages","$ade59fb547421c03$var$_fnPageChange","action","records","floor","changed","r","sProcessing","role","scrollY","captionSide","headerClone","footerClone","footer","_div","size","scroller","sScrollWrapper","sScrollHead","sScrollHeadInner","sXInner","sScrollBody","sScrollFoot","sScrollFootInner","scrollHead","scrollBody","scrollFoot","bCollapse","nScrollHead","nScrollBody","nScrollFoot","headerTrgEls","footerTrgEls","headerSrcEls","footerSrcEls","headerCopy","footerCopy","correction","sanityWidth","scrollXInner","divHeader","divHeaderStyle","divHeaderInner","divHeaderInnerStyle","divHeaderTable","divBodyEl","divBody","divBodyStyle","divFooterInner","divFooterTable","tableEl","tableStyle","ie67","headerWidths","footerWidths","headerContent","footerContent","zeroOut","nSizer","paddingTop","paddingBottom","scrollBarVis","scrollHeight","clientHeight","$ade59fb547421c03$var$_fnApplyToChildren","outerWidth","nToSize","iOuterWidth","bScrolling","an1","an2","nNode1","nNode2","$ade59fb547421c03$var$__re_html_remove","columnIdx","visibleColumns","headerCells","tableWidthAttr","tableContainer","userInputs","styleWidth","$ade59fb547421c03$var$_fnConvertToWidth","tmpTable","$ade59fb547421c03$var$_fnGetWidestNode","sContentPadding","holder","bounding","_reszEvt","bindResize","$ade59fb547421c03$var$_fnGetMaxLenString","maxIdx","srcCol","fixed","aaSortingFixed","fixedObj","nestedSort","pre","post","_idx","sortCol","aiOrig","oExtSort","formatters","$ade59fb547421c03$var$_fnSortData","x","y","dataA","dataB","label","nextSort","oAria","ariaTitle","sSortAscending","sSortDescending","$ade59fb547421c03$var$_fnSortListener","nextSortIdx","bSortMulti","sortIdx","attachTo","$ade59fb547421c03$var$_fnBindAction","oldSort","aLastSort","sortClass","sSortColumn","bSortClasses","customData","customSort","sSortDataType","_bLoadingState","oSavedState","fnStateSaveCallback","fnStateLoadCallback","$ade59fb547421c03$var$_fnImplementState","Api","abStateLoad","iStateDuration","oLoadedState","level","tn","log","sErrMode","errMode","alert","mappedName","extender","breakRefs","sStore","callbackArr","eventName","renderer","$ade59fb547421c03$var$__apiStruct","$ade59fb547421c03$var$__arrayProto","ctxSettings","mixed","jq","tables","$ade59fb547421c03$var$_toSettings","any","ctx","alwaysNew","items","apiInst","$ade59fb547421c03$var$_selector_row_indexes","apiSelector","lastIndexOf","pluck","reduce","reduceRight","to$","toJQuery","__dt_wrapper","struct","methodScoping","struc","methodExt","propExt","register","heir","registerPlural","pluralName","singularName","$ade59fb547421c03$var$__table_selector","paging","info","recordsDisplay","serverSide","$ade59fb547421c03$var$__reload","resetPaging","$ade59fb547421c03$var$_selector_run","selectFn","res","selectorType","$ade59fb547421c03$var$_selector_opts","$ade59fb547421c03$var$_selector_first","inst","displayFiltered","displayFilteredMap","selInt","cellIdx","rowObj","$ade59fb547421c03$var$__row_selector","thatIdx","loopRow","loopCells","newRows","modRows","stateSaveParamsEvent","destroyEvent","idFn","ids","_detailsShow","childRows","loaded","every","$ade59fb547421c03$var$__details_state","$ade59fb547421c03$var$__details_remove","_details","$ade59fb547421c03$var$__details_display","$ade59fb547421c03$var$__details_events","drawEvent","colvisEvent","$ade59fb547421c03$var$_child_obj","$ade59fb547421c03$var$_child_mth","klass","addRow","created","$ade59fb547421c03$var$__details_add","$ade59fb547421c03$var$__re_column_selector","$ade59fb547421c03$var$__columnData","r1","r2","names","visColumns","jqResult","$ade59fb547421c03$var$__column_selector","calc","$ade59fb547421c03$var$__setColumnVis","rowSelector","columnSelector","allCells","fnSelector","$ade59fb547421c03$var$__cell_selector","internalOpts","cellsNoOpts","caseInsen","use","module","versionCheck","iThis","iThat","aThis","aThat","isDataTable","fnIsDataTable","foot","fnTables","camelToHungarian","jqRows","jqTable","jqTbody","jqWrapper","removedMethod","arg1","arg2","arg3","arg4","plural","resolved","bScrollCollapse","toFormat","sessionStorage","localStorage","getItem","pathname","setItem","stringify","oPaginate","sFirst","sLast","sNext","sPrevious","sScrollXInner","sScrollY","aoRowCallback","aoHeaderCallback","aoFooterCallback","aoRowCreatedCallback","aoPreDrawCallback","aoInitComplete","aoStateSaveParams","aoStateLoadParams","aoStateLoaded","aoOpenRows","aoStateSave","aoStateLoad","aoServerParams","aoDestroyCallback","paginate","min","oPlugins","builder","pageButton","oJUIClasses","sVersion","afnFiltering","aTypes","ofnSearch","oSort","afnSortData","oStdClasses","oPagination","sPageButton","sPageButtonActive","sPageButtonDisabled","sSortAsc","sSortDesc","sSortJUIAsc","sSortJUIDesc","sSortJUIWrapper","sSortIcon","$ade59fb547421c03$var$extPagination","$ade59fb547421c03$var$_numbers","numbers","numbers_length","half","DT_el","full","simple_numbers","full_numbers","first_last_numbers","_numbers","btnDisplay","btnClass","activeEl","aria","attach","disabledClass","clickHandler","pagingTag","$ade59fb547421c03$var$__numericReplace","decimalPlace","re1","re2","Infinity","ts","jqueryui","$ade59fb547421c03$var$__htmlEscapeEntities","$ade59fb547421c03$var$__mld","dt","momentFn","luxonFn","dateFn","moment","luxon","$ade59fb547421c03$var$__mlWarning","$ade59fb547421c03$var$__mldObj","format","locale","utc","isValid","DateTime","fromFormat","fromISO","setLocale","$ade59fb547421c03$var$__mlHelper","localeString","from","typeName","valueOf","local","UTC","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","$ade59fb547421c03$var$__thousands","$ade59fb547421c03$var$__decimal","Intl","$ade59fb547421c03$var$num","NumberFormat","formatToParts","$ade59fb547421c03$var$i","datetime","render","date","number","thousands","precision","postfix","negative","flo","toFixed","abs","intPart","floatPart","_fnExternApiFunc","_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","_fnImplementState","_fnSettingsFromNode","_fnLog","_fnMap","_fnBindAction","_fnCallbackReg","_fnCallbackFire","_fnLengthOverflow","_fnRenderer","_fnDataSource","_fnRowAttributes","_fnExtend","_fnCalculateEnd","dataTableSettings","dataTableExt","$f67fa3590c71024b$export$2e2bcd8739ae039","$d0e6c103fdd72c14$export$c34bb18505e1e253","$d0e6c103fdd72c14$export$ebe90cb607ad99e","_disable","allowInput","allowInvalidPreload","altFormat","altInput","altInputClass","navigator","userAgent","ariaDateFormat","autoFillDefaultTime","clickOpens","closeOnSelect","conjunction","dateFormat","defaultHour","defaultMinute","defaultSeconds","disableMobile","enableSeconds","enableTime","errorHandler","getWeek","givenDate","getTime","setHours","setDate","getDay","week1","hourIncrement","ignoredFocusElements","inline","minuteIncrement","mode","monthSelectorType","nextArrow","noCalendar","onChange","onClose","onDayCreate","onDestroy","onKeyDown","onMonthChange","onOpen","onParseConfig","onReady","onValueUpdate","onYearChange","onPreCalendarPosition","plugins","positionElement","prevArrow","shorthandCurrentMonth","showMonths","static","time_24hr","weekNumbers","$01c55b35388eeff4$export$33e6c23ebe2ee669","weekdays","shorthand","longhand","months","daysInMonth","firstDayOfWeek","ordinal","nth","rangeSeparator","weekAbbreviation","scrollTitle","toggleTitle","amPM","yearAriaLabel","monthAriaLabel","hourAriaLabel","minuteAriaLabel","$01c55b35388eeff4$export$2e2bcd8739ae039","$7c36d6f76aae5f22$export$5d04458e2a6c373e","$7c36d6f76aae5f22$export$7d260a2a5f8bc19e","$7c36d6f76aae5f22$export$61fc7d43ac8f84b0","_this","$7c36d6f76aae5f22$export$3131421a7d01b4fb","$46627959f4a6cf8e$export$4a80062ca50b57c7","classList","$46627959f4a6cf8e$export$c8a8987d4410bf2d","$46627959f4a6cf8e$export$51cfe97d637c237c","$46627959f4a6cf8e$export$25245567f53f158f","condition","$46627959f4a6cf8e$export$afe9d610a3284048","inputClassName","wrapper","numInput","arrowUp","arrowDown","$46627959f4a6cf8e$export$e58f029f0fbfdb29","composedPath","$bc1b2819a5a95bf4$var$doNothing","$bc1b2819a5a95bf4$export$27a2dd9af757e89c","monthNumber","$bc1b2819a5a95bf4$export$9490b78b888a863f","D","F","dateObj","monthName","setMonth","G","hour","H","J","day","K","M","shortMonth","S","seconds","setSeconds","U","unixSeconds","W","weekNum","weekNumber","Y","year","setFullYear","Z","ISODate","h","minutes","setMinutes","month","u","unixMillSeconds","$bc1b2819a5a95bf4$export$f5a8dc72fbf63af5","$bc1b2819a5a95bf4$export$55069460464ca7a9","toISOString","$68991a5a65b43fc7$export$ff1a0b75284ac636","_a","_b","config","_c","l10n","_d","isMobile","frmt","overrideLocale","formatDate","c","$68991a5a65b43fc7$export$cfa2ef2687faeda2","givenFormat","timeless","customLocale","parsedDate","dateOrig","datestr","parseDate","ops","matchIndex","regexStr","isBackSlash","escaped","forEach","$68991a5a65b43fc7$export$c4c806e061935577","date1","date2","$68991a5a65b43fc7$export$a4d69fb5f2026c35","ts1","ts2","$68991a5a65b43fc7$export$9fafc166baa96839","hours","$68991a5a65b43fc7$export$a4ce0def660bfe9e","secondsSinceMidnight","$68991a5a65b43fc7$export$1f34108aa9eb96ab","DAY","$68991a5a65b43fc7$export$6df0e87d3fffbd14","minDate","minHour","minMinutes","minSeconds","maxDate","maxHr","maxMinutes","assign","_loop_1","args_1","$f56a17c2fb2ad30e$var$__assign","$f56a17c2fb2ad30e$var$__spreadArrays","il","jl","$f56a17c2fb2ad30e$var$DEBOUNCED_CHANGE_MS","$f56a17c2fb2ad30e$var$FlatpickrInstance","element","instanceConfig","$f56a17c2fb2ad30e$var$flatpickr","defaultConfig","getClosestActiveElement","calendarContainer","bindToInstance","setCalendarWidth","daysContainer","daysWidth","days","weekWrapper","removeProperty","updateTime","selectedDates","defaultDate","getMilliseconds","latestSelectedDateObj","isKeyDown","eventTarget","newValue","isHourElem","hourElement","isMinuteElem","minuteElement","incrementNumInput","timeWrapper","prevValue","_input","setHoursFromInputs","updateValue","_debouncedChange","secondElement","limitMinHours","minTime","minDateHasTime","limitMaxHours","maxTime","maxDateHasTime","minBound","maxBound","setHoursFromDate","onYearInput","changeYear","_handlers","triggerChange","triggerEvent","jumpToDate","jumpDate","jumpTo","oldYear","currentYear","oldMonth","currentMonth","buildMonthSwitch","timeIncrement","inputElem","createEvent","dispatchEvent","createDay","_dayNumber","dateIsEnabled","isEnabled","dayElement","$i","todayDateElem","isDateSelected","selectedDateElem","isDateInRange","insertAdjacentHTML","focusOnDayElem","targetNode","onMouseOver","getFirstAvailableDay","startMonth","endMonth","startIndex","endIndex","focusOnDay","dayFocused","isInView","startElem","givenMonth","loopDelta","numMonthDays","changeMonth","getNextAvailableDay","buildMonthDays","firstOfMonth","prevMonthDays","utils","getDaysInMonth","isMultiMonth","prevMonthDayClass","nextMonthDayClass","dayNumber","dayIndex","dayNum","dayContainer","buildDays","frag","shouldBuildMonth","monthsDropdownContainer","buildMonth","monthElement","monthNavFragment","selectedMonth","yearInput","yearElement","buildMonths","monthNav","prevMonthNav","yearElements","monthElements","nextMonthNav","buildWeekdays","weekdayContainer","updateWeekdays","isOffset","_hidePrevMonthArrow","_hideNextMonthArrow","updateNavigationCurrentMonth","isCalendarElem","documentClick","isOpen","eventTarget_1","isCalendarElement","lostFocus","path","isIgnored","some","timeContainer","close","newYear","newYearNum","isNewYear","dateToCheck","enable","onBlur","isInput","valueChanged","trimEnd","getDateStr","allowKeydown","allowInlineKeydown","isTimeObj","focusAndClose","selectDate","delta_1","currentYearElement","pluginElements","cellClass","hoverDate","initialDate","rangeStartDate","rangeEndDate","containsDisabled","minRange","maxRange","rContainer","dayElem","timestamp","outOfRange","onResize","positionCalendar","minMaxDateSetter","inverseDateObj","getInputElem","setupLocale","l10ns","default","dataset","customPositionElement","_positionElement","calendarHeight","acc","calendarWidth","configPos","configPosVertical","configPosHorizontal","inputBounds","distanceFromBottom","innerHeight","bottom","showOnTop","isCenter","isRight","rightMost","centerMost","editableSheet","styleSheets","sheet","cssRules","getDocumentStyleSheet","bodyWidth","centerLeft","centerIndex","centerStyle","insertRule","centerBefore","msMaxTouchPoints","selectedDate","shouldChangeMonth","single","range","loadedPlugins","_bind","_setHoursFromDate","_positionCalendar","triggerChangeEvent","toInitial","mobileInput","_initialDate","_createElement","_type","wasOpen","CALLBACKS","setSelectedDate","updatePositionElement","inputDate","dates","parseDateRules","rule","initEvent","specificFormat","dObj","mobileFormatStr","onMonthNavClick","isPrevMonth","isNextMonth","boolOpts","userConfig","formats","_enable","timeMode","defaultDateFormat","defaultAltFormat","_minDate","_maxDate","minMaxTimeSetter","_minTime","_maxTime","pluginConf","parseConfig","placeholder","required","setupInputs","preloadedDate","setupDates","yr","__hidePrevMonthArrow","__hideNextMonthArrow","innerContainer","buildWeeks","separator","hourInput","minuteInput","military2ampm","secondInput","title","buildTime","customAppend","build","inputType","setupMobile","debouncedResize","ontouchstart","capture","selText","bindEvents","isSafari","$f56a17c2fb2ad30e$var$_flatpickr","nodeList","HTMLElement","instances","_flatpickr","HTMLCollection","NodeList","flatpickr","Node","en","localize","setDefaults","compareDates","fp_incr","$f56a17c2fb2ad30e$export$2e2bcd8739ae039","$aeebcb5cdcd74e05$var$DATA_PREFIX","$aeebcb5cdcd74e05$var$fixInvalidAriaRole","rootEl","ariaRoleValue","hasAttribute","$aeebcb5cdcd74e05$var$createDataTable","tableWrapperEl","responsive","_jagDatatableProfiles","profileName","date_search_field","dateMinFilter","dateMaxFilter","$f56a17c2fb2ad30e$exports","is_datetime_search","dataObj","ajaxUrl","page_size","q","extraQueryParams","ordering","orderColumn","dateFilterColumn","minDateFormat","maxDateFormat","processing","parentElement","tableWrappers","tw"],"version":3,"file":"main.js.map"}