/* * ATTENTION: An "eval-source-map" devtool has been used. * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("jQuery")); else if(typeof define === 'function' && define.amd) define(["jQuery"], factory); else { var a = typeof exports === 'object' ? factory(require("jQuery")) : factory(root["jQuery"]); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(self, function(__WEBPACK_EXTERNAL_MODULE_jquery__) { return /******/ (function() { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./libs/datatables-bs5/datatables-bootstrap5.js": /*!******************************************************!*\ !*** ./libs/datatables-bs5/datatables-bootstrap5.js ***! \******************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jszip */ \"./node_modules/jszip/dist/jszip.min.js\");\n/* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jszip__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var pdfmake__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! pdfmake */ \"./node_modules/pdfmake/build/pdfmake.js\");\n/* harmony import */ var pdfmake__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(pdfmake__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var pdfmake_build_vfs_fonts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! pdfmake/build/vfs_fonts */ \"./node_modules/pdfmake/build/vfs_fonts.js\");\n/* harmony import */ var datatables_net_bs5__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! datatables.net-bs5 */ \"./node_modules/datatables.net-bs5/js/dataTables.bootstrap5.mjs\");\n/* harmony import */ var datatables_net_fixedcolumns_bs5__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! datatables.net-fixedcolumns-bs5 */ \"./node_modules/datatables.net-fixedcolumns-bs5/js/fixedColumns.bootstrap5.mjs\");\n/* harmony import */ var datatables_net_fixedheader_bs5__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! datatables.net-fixedheader-bs5 */ \"./node_modules/datatables.net-fixedheader-bs5/js/fixedHeader.bootstrap5.mjs\");\n/* harmony import */ var datatables_net_select_bs5__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! datatables.net-select-bs5 */ \"./node_modules/datatables.net-select-bs5/js/select.bootstrap5.mjs\");\n/* harmony import */ var datatables_net_buttons__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! datatables.net-buttons */ \"./node_modules/datatables.net-buttons/js/dataTables.buttons.mjs\");\n/* harmony import */ var datatables_net_buttons_bs5__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! datatables.net-buttons-bs5 */ \"./node_modules/datatables.net-buttons-bs5/js/buttons.bootstrap5.mjs\");\n/* harmony import */ var datatables_net_buttons_js_buttons_html5__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! datatables.net-buttons/js/buttons.html5 */ \"./node_modules/datatables.net-buttons/js/buttons.html5.js\");\n/* harmony import */ var datatables_net_buttons_js_buttons_html5__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(datatables_net_buttons_js_buttons_html5__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var datatables_net_buttons_js_buttons_print__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! datatables.net-buttons/js/buttons.print */ \"./node_modules/datatables.net-buttons/js/buttons.print.js\");\n/* harmony import */ var datatables_net_buttons_js_buttons_print__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(datatables_net_buttons_js_buttons_print__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var datatables_net_responsive__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! datatables.net-responsive */ \"./node_modules/datatables.net-responsive/js/dataTables.responsive.mjs\");\n/* harmony import */ var datatables_net_responsive_bs5__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! datatables.net-responsive-bs5 */ \"./node_modules/datatables.net-responsive-bs5/js/responsive.bootstrap5.mjs\");\n/* harmony import */ var datatables_net_rowgroup_bs5__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! datatables.net-rowgroup-bs5 */ \"./node_modules/datatables.net-rowgroup-bs5/js/rowGroup.bootstrap5.mjs\");\n/* harmony import */ var jquery_datatables_checkboxes__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! jquery-datatables-checkboxes */ \"./node_modules/jquery-datatables-checkboxes/js/dataTables.checkboxes.js\");\n/* harmony import */ var jquery_datatables_checkboxes__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(jquery_datatables_checkboxes__WEBPACK_IMPORTED_MODULE_14__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ndatatables_net_bs5__WEBPACK_IMPORTED_MODULE_3__[\"default\"].Buttons.jszip((jszip__WEBPACK_IMPORTED_MODULE_0___default()));\ndatatables_net_bs5__WEBPACK_IMPORTED_MODULE_3__[\"default\"].Buttons.pdfMake((pdfmake__WEBPACK_IMPORTED_MODULE_1___default()));\n(pdfmake__WEBPACK_IMPORTED_MODULE_1___default().vfs) = pdfmake_build_vfs_fonts__WEBPACK_IMPORTED_MODULE_2__.pdfMake.vfs;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9saWJzL2RhdGF0YWJsZXMtYnM1L2RhdGF0YWJsZXMtYm9vdHN0cmFwNS5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBMEI7QUFDSTtBQUNpQjtBQUNKO0FBQ0Y7QUFDRDtBQUNMO0FBQ0g7QUFDSTtBQUNhO0FBQ0E7QUFDZDtBQUNJO0FBQ0Y7QUFDQztBQUV0Q0csd0VBQXVCLENBQUNILDhDQUFLLENBQUM7QUFDOUJHLDBFQUF5QixDQUFDRixnREFBTyxDQUFDO0FBQ2xDQSxvREFBVyxHQUFHQyxnRUFBb0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9WdWV4eS8uL2xpYnMvZGF0YXRhYmxlcy1iczUvZGF0YXRhYmxlcy1ib290c3RyYXA1LmpzP2JjNTYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEpTWmlwIGZyb20gJ2pzemlwJztcclxuaW1wb3J0IHBkZk1ha2UgZnJvbSAncGRmbWFrZSc7XHJcbmltcG9ydCBwZGZGb250cyBmcm9tICdwZGZtYWtlL2J1aWxkL3Zmc19mb250cyc7XHJcbmltcG9ydCBEYXRhVGFibGUgZnJvbSAnZGF0YXRhYmxlcy5uZXQtYnM1JztcclxuaW1wb3J0ICdkYXRhdGFibGVzLm5ldC1maXhlZGNvbHVtbnMtYnM1JztcclxuaW1wb3J0ICdkYXRhdGFibGVzLm5ldC1maXhlZGhlYWRlci1iczUnO1xyXG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LXNlbGVjdC1iczUnO1xyXG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LWJ1dHRvbnMnO1xyXG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LWJ1dHRvbnMtYnM1JztcclxuaW1wb3J0ICdkYXRhdGFibGVzLm5ldC1idXR0b25zL2pzL2J1dHRvbnMuaHRtbDUnO1xyXG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LWJ1dHRvbnMvanMvYnV0dG9ucy5wcmludCc7XHJcbmltcG9ydCAnZGF0YXRhYmxlcy5uZXQtcmVzcG9uc2l2ZSc7XHJcbmltcG9ydCAnZGF0YXRhYmxlcy5uZXQtcmVzcG9uc2l2ZS1iczUnO1xyXG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LXJvd2dyb3VwLWJzNSc7XHJcbmltcG9ydCAnanF1ZXJ5LWRhdGF0YWJsZXMtY2hlY2tib3hlcyc7XHJcblxyXG5EYXRhVGFibGUuQnV0dG9ucy5qc3ppcChKU1ppcCk7XHJcbkRhdGFUYWJsZS5CdXR0b25zLnBkZk1ha2UocGRmTWFrZSk7XHJcbnBkZk1ha2UudmZzID0gcGRmRm9udHMucGRmTWFrZS52ZnM7XHJcbiJdLCJuYW1lcyI6WyJKU1ppcCIsInBkZk1ha2UiLCJwZGZGb250cyIsIkRhdGFUYWJsZSIsIkJ1dHRvbnMiLCJqc3ppcCIsInZmcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./libs/datatables-bs5/datatables-bootstrap5.js\n"); /***/ }), /***/ "./node_modules/datatables.net-buttons/js/buttons.html5.js": /*!*****************************************************************!*\ !*** ./node_modules/datatables.net-buttons/js/buttons.html5.js ***! \*****************************************************************/ /***/ (function(module, exports, __webpack_require__) { eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * HTML5 export buttons for Buttons and DataTables.\n * 2016 SpryMedia Ltd - datatables.net/license\n *\n * FileSaver.js (1.3.3) - MIT license\n * Copyright © 2016 Eli Grey - http://eligrey.com\n */\n\n(function( factory ){\n\tif ( true ) {\n\t\t// AMD\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"jquery\"), __webpack_require__(/*! datatables.net */ \"./node_modules/datatables.net/js/jquery.dataTables.mjs\"), __webpack_require__(/*! datatables.net-buttons */ \"./node_modules/datatables.net-buttons/js/dataTables.buttons.mjs\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ( $ ) {\n\t\t\treturn factory( $, window, document );\n\t\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t}\n\telse {}\n}(function( $, window, document, jszip, pdfmake, undefined ) {\n'use strict';\nvar DataTable = $.fn.dataTable;\n\n\n\n// Allow the constructor to pass in JSZip and PDFMake from external requires.\n// Otherwise, use globally defined variables, if they are available.\nvar useJszip;\nvar usePdfmake;\n\nfunction _jsZip () {\n\treturn useJszip || window.JSZip;\n}\nfunction _pdfMake () {\n\treturn usePdfmake || window.pdfMake;\n}\n\nDataTable.Buttons.pdfMake = function (_) {\n\tif ( ! _ ) {\n\t\treturn _pdfMake();\n\t}\n\tusePdfmake = _;\n}\n\nDataTable.Buttons.jszip = function (_) {\n\tif ( ! _ ) {\n\t\treturn _jsZip();\n\t}\n\tuseJszip = _;\n}\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * FileSaver.js dependency\n */\n\n/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */\n\nvar _saveAs = (function(view) {\n\t\"use strict\";\n\t// IE <10 is explicitly unsupported\n\tif (typeof view === \"undefined\" || typeof navigator !== \"undefined\" && /MSIE [1-9]\\./.test(navigator.userAgent)) {\n\t\treturn;\n\t}\n\tvar\n\t\t doc = view.document\n\t\t // only get URL when necessary in case Blob.js hasn't overridden it yet\n\t\t, get_URL = function() {\n\t\t\treturn view.URL || view.webkitURL || view;\n\t\t}\n\t\t, save_link = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"a\")\n\t\t, can_use_save_link = \"download\" in save_link\n\t\t, click = function(node) {\n\t\t\tvar event = new MouseEvent(\"click\");\n\t\t\tnode.dispatchEvent(event);\n\t\t}\n\t\t, is_safari = /constructor/i.test(view.HTMLElement) || view.safari\n\t\t, is_chrome_ios =/CriOS\\/[\\d]+/.test(navigator.userAgent)\n\t\t, throw_outside = function(ex) {\n\t\t\t(view.setImmediate || view.setTimeout)(function() {\n\t\t\t\tthrow ex;\n\t\t\t}, 0);\n\t\t}\n\t\t, force_saveable_type = \"application/octet-stream\"\n\t\t// the Blob API is fundamentally broken as there is no \"downloadfinished\" event to subscribe to\n\t\t, arbitrary_revoke_timeout = 1000 * 40 // in ms\n\t\t, revoke = function(file) {\n\t\t\tvar revoker = function() {\n\t\t\t\tif (typeof file === \"string\") { // file is an object URL\n\t\t\t\t\tget_URL().revokeObjectURL(file);\n\t\t\t\t} else { // file is a File\n\t\t\t\t\tfile.remove();\n\t\t\t\t}\n\t\t\t};\n\t\t\tsetTimeout(revoker, arbitrary_revoke_timeout);\n\t\t}\n\t\t, dispatch = function(filesaver, event_types, event) {\n\t\t\tevent_types = [].concat(event_types);\n\t\t\tvar i = event_types.length;\n\t\t\twhile (i--) {\n\t\t\t\tvar listener = filesaver[\"on\" + event_types[i]];\n\t\t\t\tif (typeof listener === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlistener.call(filesaver, event || filesaver);\n\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\tthrow_outside(ex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t, auto_bom = function(blob) {\n\t\t\t// prepend BOM for UTF-8 XML and text/* types (including HTML)\n\t\t\t// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n\t\t\tif (/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n\t\t\t\treturn new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});\n\t\t\t}\n\t\t\treturn blob;\n\t\t}\n\t\t, FileSaver = function(blob, name, no_auto_bom) {\n\t\t\tif (!no_auto_bom) {\n\t\t\t\tblob = auto_bom(blob);\n\t\t\t}\n\t\t\t// First try a.download, then web filesystem, then object URLs\n\t\t\tvar\n\t\t\t\t filesaver = this\n\t\t\t\t, type = blob.type\n\t\t\t\t, force = type === force_saveable_type\n\t\t\t\t, object_url\n\t\t\t\t, dispatch_all = function() {\n\t\t\t\t\tdispatch(filesaver, \"writestart progress write writeend\".split(\" \"));\n\t\t\t\t}\n\t\t\t\t// on any filesys errors revert to saving with object URLs\n\t\t\t\t, fs_error = function() {\n\t\t\t\t\tif ((is_chrome_ios || (force && is_safari)) && view.FileReader) {\n\t\t\t\t\t\t// Safari doesn't allow downloading of blob urls\n\t\t\t\t\t\tvar reader = new FileReader();\n\t\t\t\t\t\treader.onloadend = function() {\n\t\t\t\t\t\t\tvar url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');\n\t\t\t\t\t\t\tvar popup = view.open(url, '_blank');\n\t\t\t\t\t\t\tif(!popup) view.location.href = url;\n\t\t\t\t\t\t\turl=undefined; // release reference before dispatching\n\t\t\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\t\t\tdispatch_all();\n\t\t\t\t\t\t};\n\t\t\t\t\t\treader.readAsDataURL(blob);\n\t\t\t\t\t\tfilesaver.readyState = filesaver.INIT;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// don't create more object URLs than needed\n\t\t\t\t\tif (!object_url) {\n\t\t\t\t\t\tobject_url = get_URL().createObjectURL(blob);\n\t\t\t\t\t}\n\t\t\t\t\tif (force) {\n\t\t\t\t\t\tview.location.href = object_url;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar opened = view.open(object_url, \"_blank\");\n\t\t\t\t\t\tif (!opened) {\n\t\t\t\t\t\t\t// Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html\n\t\t\t\t\t\t\tview.location.href = object_url;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\tdispatch_all();\n\t\t\t\t\trevoke(object_url);\n\t\t\t\t}\n\t\t\t;\n\t\t\tfilesaver.readyState = filesaver.INIT;\n\n\t\t\tif (can_use_save_link) {\n\t\t\t\tobject_url = get_URL().createObjectURL(blob);\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tsave_link.href = object_url;\n\t\t\t\t\tsave_link.download = name;\n\t\t\t\t\tclick(save_link);\n\t\t\t\t\tdispatch_all();\n\t\t\t\t\trevoke(object_url);\n\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfs_error();\n\t\t}\n\t\t, FS_proto = FileSaver.prototype\n\t\t, saveAs = function(blob, name, no_auto_bom) {\n\t\t\treturn new FileSaver(blob, name || blob.name || \"download\", no_auto_bom);\n\t\t}\n\t;\n\t// IE 10+ (native saveAs)\n\tif (typeof navigator !== \"undefined\" && navigator.msSaveOrOpenBlob) {\n\t\treturn function(blob, name, no_auto_bom) {\n\t\t\tname = name || blob.name || \"download\";\n\n\t\t\tif (!no_auto_bom) {\n\t\t\t\tblob = auto_bom(blob);\n\t\t\t}\n\t\t\treturn navigator.msSaveOrOpenBlob(blob, name);\n\t\t};\n\t}\n\n\tFS_proto.abort = function(){};\n\tFS_proto.readyState = FS_proto.INIT = 0;\n\tFS_proto.WRITING = 1;\n\tFS_proto.DONE = 2;\n\n\tFS_proto.error =\n\tFS_proto.onwritestart =\n\tFS_proto.onprogress =\n\tFS_proto.onwrite =\n\tFS_proto.onabort =\n\tFS_proto.onerror =\n\tFS_proto.onwriteend =\n\t\tnull;\n\n\treturn saveAs;\n}(\n\t typeof self !== \"undefined\" && self\n\t|| typeof window !== \"undefined\" && window\n\t|| this.content\n));\n\n\n// Expose file saver on the DataTables API. Can't attach to `DataTables.Buttons`\n// since this file can be loaded before Button's core!\nDataTable.fileSave = _saveAs;\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Local (private) functions\n */\n\n/**\n * Get the sheet name for Excel exports.\n *\n * @param {object}\tconfig Button configuration\n */\nvar _sheetname = function ( config )\n{\n\tvar sheetName = 'Sheet1';\n\n\tif ( config.sheetName ) {\n\t\tsheetName = config.sheetName.replace(/[\\[\\]\\*\\/\\\\\\?\\:]/g, '');\n\t}\n\n\treturn sheetName;\n};\n\n/**\n * Get the newline character(s)\n *\n * @param {object}\tconfig Button configuration\n * @return {string}\t\t\t\tNewline character\n */\nvar _newLine = function ( config )\n{\n\treturn config.newline ?\n\t\tconfig.newline :\n\t\tnavigator.userAgent.match(/Windows/) ?\n\t\t\t'\\r\\n' :\n\t\t\t'\\n';\n};\n\n/**\n * Combine the data from the `buttons.exportData` method into a string that\n * will be used in the export file.\n *\n * @param\t{DataTable.Api} dt\t\t DataTables API instance\n * @param\t{object}\t\t\t\tconfig Button configuration\n * @return {object}\t\t\t\t\t\t\t The data to export\n */\nvar _exportData = function ( dt, config )\n{\n\tvar newLine = _newLine( config );\n\tvar data = dt.buttons.exportData( config.exportOptions );\n\tvar boundary = config.fieldBoundary;\n\tvar separator = config.fieldSeparator;\n\tvar reBoundary = new RegExp( boundary, 'g' );\n\tvar escapeChar = config.escapeChar !== undefined ?\n\t\tconfig.escapeChar :\n\t\t'\\\\';\n\tvar join = function ( a ) {\n\t\tvar s = '';\n\n\t\t// If there is a field boundary, then we might need to escape it in\n\t\t// the source data\n\t\tfor ( var i=0, ien=a.length ; i 0 ) {\n\t\t\t\ts += separator;\n\t\t\t}\n\n\t\t\ts += boundary ?\n\t\t\t\tboundary + ('' + a[i]).replace( reBoundary, escapeChar+boundary ) + boundary :\n\t\t\t\ta[i];\n\t\t}\n\n\t\treturn s;\n\t};\n\n\tvar header = config.header ? join( data.header )+newLine : '';\n\tvar footer = config.footer && data.footer ? newLine+join( data.footer ) : '';\n\tvar body = [];\n\n\tfor ( var i=0, ien=data.body.length ; i 1 && version[1]*1 < 603.1 ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n/**\n * Convert from numeric position to letter for column names in Excel\n * @param {int} n Column number\n * @return {string} Column letter(s) name\n */\nfunction createCellPos( n ){\n\tvar ordA = 'A'.charCodeAt(0);\n\tvar ordZ = 'Z'.charCodeAt(0);\n\tvar len = ordZ - ordA + 1;\n\tvar s = \"\";\n\n\twhile( n >= 0 ) {\n\t\ts = String.fromCharCode(n % len + ordA) + s;\n\t\tn = Math.floor(n / len) - 1;\n\t}\n\n\treturn s;\n}\n\ntry {\n\tvar _serialiser = new XMLSerializer();\n\tvar _ieExcel;\n}\ncatch (t) {}\n\n/**\n * Recursively add XML files from an object's structure to a ZIP file. This\n * allows the XSLX file to be easily defined with an object's structure matching\n * the files structure.\n *\n * @param {JSZip} zip ZIP package\n * @param {object} obj Object to add (recursive)\n */\nfunction _addToZip( zip, obj ) {\n\tif ( _ieExcel === undefined ) {\n\t\t// Detect if we are dealing with IE's _awful_ serialiser by seeing if it\n\t\t// drop attributes\n\t\t_ieExcel = _serialiser\n\t\t\t.serializeToString(\n\t\t\t\t( new window.DOMParser() ).parseFromString( excelStrings['xl/worksheets/sheet1.xml'], 'text/xml' )\n\t\t\t)\n\t\t\t.indexOf( 'xmlns:r' ) === -1;\n\t}\n\n\t$.each( obj, function ( name, val ) {\n\t\tif ( $.isPlainObject( val ) ) {\n\t\t\tvar newDir = zip.folder( name );\n\t\t\t_addToZip( newDir, val );\n\t\t}\n\t\telse {\n\t\t\tif ( _ieExcel ) {\n\t\t\t\t// IE's XML serialiser will drop some name space attributes from\n\t\t\t\t// from the root node, so we need to save them. Do this by\n\t\t\t\t// replacing the namespace nodes with a regular attribute that\n\t\t\t\t// we convert back when serialised. Edge does not have this\n\t\t\t\t// issue\n\t\t\t\tvar worksheet = val.childNodes[0];\n\t\t\t\tvar i, ien;\n\t\t\t\tvar attrs = [];\n\n\t\t\t\tfor ( i=worksheet.attributes.length-1 ; i>=0 ; i-- ) {\n\t\t\t\t\tvar attrName = worksheet.attributes[i].nodeName;\n\t\t\t\t\tvar attrValue = worksheet.attributes[i].nodeValue;\n\n\t\t\t\t\tif ( attrName.indexOf( ':' ) !== -1 ) {\n\t\t\t\t\t\tattrs.push( { name: attrName, value: attrValue } );\n\n\t\t\t\t\t\tworksheet.removeAttribute( attrName );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor ( i=0, ien=attrs.length ; i]*?) xmlns=\"\"([^<>]*?)>/g, '<$1 $2>' );\n\n\t\t\tzip.file( name, str );\n\t\t}\n\t} );\n}\n\n/**\n * Create an XML node and add any children, attributes, etc without needing to\n * be verbose in the DOM.\n *\n * @param {object} doc XML document\n * @param {string} nodeName Node name\n * @param {object} opts Options - can be `attr` (attributes), `children`\n * (child nodes) and `text` (text content)\n * @return {node} Created node\n */\nfunction _createNode( doc, nodeName, opts ) {\n\tvar tempNode = doc.createElement( nodeName );\n\n\tif ( opts ) {\n\t\tif ( opts.attr ) {\n\t\t\t$(tempNode).attr( opts.attr );\n\t\t}\n\n\t\tif ( opts.children ) {\n\t\t\t$.each( opts.children, function ( key, value ) {\n\t\t\t\ttempNode.appendChild( value );\n\t\t\t} );\n\t\t}\n\n\t\tif ( opts.text !== null && opts.text !== undefined ) {\n\t\t\ttempNode.appendChild( doc.createTextNode( opts.text ) );\n\t\t}\n\t}\n\n\treturn tempNode;\n}\n\n/**\n * Get the width for an Excel column based on the contents of that column\n * @param {object} data Data for export\n * @param {int} col Column index\n * @return {int} Column width\n */\nfunction _excelColWidth( data, col ) {\n\tvar max = data.header[col].length;\n\tvar len, lineSplit, str;\n\n\tif ( data.footer && data.footer[col].length > max ) {\n\t\tmax = data.footer[col].length;\n\t}\n\n\tfor ( var i=0, ien=data.body.length ; i max ) {\n\t\t\tmax = len;\n\t\t}\n\n\t\t// Max width rather than having potentially massive column widths\n\t\tif ( max > 40 ) {\n\t\t\treturn 54; // 40 * 1.35\n\t\t}\n\t}\n\n\tmax *= 1.35;\n\n\t// And a min width\n\treturn max > 6 ? max : 6;\n}\n\n// Excel - Pre-defined strings to build a basic XLSX file\nvar excelStrings = {\n\t\"_rels/.rels\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t'',\n\n\t\"xl/_rels/workbook.xml.rels\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t'',\n\n\t\"[Content_Types].xml\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t'',\n\n\t\"xl/workbook.xml\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t'',\n\n\t\"xl/worksheets/sheet1.xml\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t'',\n\n\t\"xl/styles.xml\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+ // Excel appears to use this as a dotted background regardless of values but\n\t\t\t\t\t''+ // to be valid to the schema, use a patternFill\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\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\t''+\n\t\t\t\t\t''+\n\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\t''+\n\t\t\t\t\t''+\n\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\t''+\n\t\t\t\t\t''+\n\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\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t''\n};\n// Note we could use 3 `for` loops for the styles, but when gzipped there is\n// virtually no difference in size, since the above can be easily compressed\n\n// Pattern matching for special number formats. Perhaps this should be exposed\n// via an API in future?\n// Ref: section 3.8.30 - built in formatters in open spreadsheet\n// https://www.ecma-international.org/news/TC45_current_work/Office%20Open%20XML%20Part%204%20-%20Markup%20Language%20Reference.pdf\nvar _excelSpecials = [\n\t{ match: /^\\-?\\d+\\.\\d%$/, style: 60, fmt: function (d) { return d/100; } }, // Percent with d.p.\n\t{ match: /^\\-?\\d+\\.?\\d*%$/, style: 56, fmt: function (d) { return d/100; } }, // Percent\n\t{ match: /^\\-?\\$[\\d,]+.?\\d*$/, style: 57 }, // Dollars\n\t{ match: /^\\-?£[\\d,]+.?\\d*$/, style: 58 }, // Pounds\n\t{ match: /^\\-?€[\\d,]+.?\\d*$/, style: 59 }, // Euros\n\t{ match: /^\\-?\\d+$/, style: 65 }, // Numbers without thousand separators\n\t{ match: /^\\-?\\d+\\.\\d{2}$/, style: 66 }, // Numbers 2 d.p. without thousands separators\n\t{ match: /^\\([\\d,]+\\)$/, style: 61, fmt: function (d) { return -1 * d.replace(/[\\(\\)]/g, ''); } }, // Negative numbers indicated by brackets\n\t{ match: /^\\([\\d,]+\\.\\d{2}\\)$/, style: 62, fmt: function (d) { return -1 * d.replace(/[\\(\\)]/g, ''); } }, // Negative numbers indicated by brackets - 2d.p.\n\t{ match: /^\\-?[\\d,]+$/, style: 63 }, // Numbers with thousand separators\n\t{ match: /^\\-?[\\d,]+\\.\\d{2}$/, style: 64 },\n\t{ match: /^[\\d]{4}\\-[01][\\d]\\-[0123][\\d]$/, style: 67, fmt: function (d) {return Math.round(25569 + (Date.parse(d) / (86400 * 1000)));}} //Date yyyy-mm-dd\n];\n\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Buttons\n */\n\n//\n// Copy to clipboard\n//\nDataTable.ext.buttons.copyHtml5 = {\n\tclassName: 'buttons-copy buttons-html5',\n\n\ttext: function ( dt ) {\n\t\treturn dt.i18n( 'buttons.copy', 'Copy' );\n\t},\n\n\taction: function ( e, dt, button, config ) {\n\t\tthis.processing( true );\n\n\t\tvar that = this;\n\t\tvar exportData = _exportData( dt, config );\n\t\tvar info = dt.buttons.exportInfo( config );\n\t\tvar newline = _newLine(config);\n\t\tvar output = exportData.str;\n\t\tvar hiddenDiv = $('
')\n\t\t\t.css( {\n\t\t\t\theight: 1,\n\t\t\t\twidth: 1,\n\t\t\t\toverflow: 'hidden',\n\t\t\t\tposition: 'fixed',\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t} );\n\n\t\tif ( info.title ) {\n\t\t\toutput = info.title + newline + newline + output;\n\t\t}\n\n\t\tif ( info.messageTop ) {\n\t\t\toutput = info.messageTop + newline + newline + output;\n\t\t}\n\n\t\tif ( info.messageBottom ) {\n\t\t\toutput = output + newline + newline + info.messageBottom;\n\t\t}\n\n\t\tif ( config.customize ) {\n\t\t\toutput = config.customize( output, config, dt );\n\t\t}\n\n\t\tvar textarea = $('