一个导出excel文件的样式组件
此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.org/scripts/449207/1079591/xlsxStylecoremin.js
/* xlsx.js (C) 2013-2015 SheetJS -- http://sheetjs.com */ !function (e) { if ("object" == typeof exports && "undefined" != typeof module) module.exports = e(); else if ("function" == typeof define && define.amd) define([], e); else { var f; "undefined" != typeof window ? f = window : "undefined" != typeof global ? f = global : "undefined" != typeof self && (f = self), f.JSZip = e() } } (function () { var define, module, exports; return function e(t, n, r) { function s(o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require == "function" && require; if (!u && a) return a(o, !0); if (i) return i(o, !0); throw new Error("Cannot find module '" + o + "'") } var f = n[o] = { exports: {} }; t[o][0].call(f.exports, function (e) { var n = t[o][1][e]; return s(n ? n : e) }, f, f.exports, e, t, n, r) } return n[o].exports } var i = typeof require == "function" && require; for (var o = 0; o < r.length; o++) s(r[o]); return s } ({ 1: [function (_dereq_, module, exports) { "use strict"; var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; exports.encode = function (input, utf8) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = (chr1 & 3) << 4 | chr2 >> 4; enc3 = (chr2 & 15) << 2 | chr3 >> 6; enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64 } else if (isNaN(chr3)) { enc4 = 64 } output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4) } return output }; exports.decode = function (input, utf8) { var output = ""; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = _keyStr.indexOf(input.charAt(i++)); enc2 = _keyStr.indexOf(input.charAt(i++)); enc3 = _keyStr.indexOf(input.charAt(i++)); enc4 = _keyStr.indexOf(input.charAt(i++)); chr1 = enc1 << 2 | enc2 >> 4; chr2 = (enc2 & 15) << 4 | enc3 >> 2; chr3 = (enc3 & 3) << 6 | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2) } if (enc4 != 64) { output = output + String.fromCharCode(chr3) } } return output } }, {} ], 2: [function (_dereq_, module, exports) { "use strict"; function CompressedObject() { this.compressedSize = 0; this.uncompressedSize = 0; this.crc32 = 0; this.compressionMethod = null; this.compressedContent = null } CompressedObject.prototype = { getContent: function () { return null }, getCompressedContent: function () { return null } }; module.exports = CompressedObject }, {} ], 3: [function (_dereq_, module, exports) { "use strict"; exports.STORE = { magic: "\x00\x00", compress: function (content) { return content }, uncompress: function (content) { return content }, compressInputType: null, uncompressInputType: null }; exports.DEFLATE = _dereq_("./flate") }, { "./flate": 8 } ], 4: [function (_dereq_, module, exports) { "use strict"; var utils = _dereq_("./utils"); var table = [0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918e3, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117]; module.exports = function crc32(input, crc) { if (typeof input === "undefined" || !input.length) { return 0 } var isArray = utils.getTypeOf(input) !== "string"; if (typeof crc == "undefined") { crc = 0 } var x = 0; var y = 0; var b = 0; crc = crc ^ -1; for (var i = 0, iTop = input.length; i < iTop; i++) { b = isArray ? input[i] : input.charCodeAt(i); y = (crc ^ b) & 255; x = table[y]; crc = crc >>> 8 ^ x } return crc ^ -1 } }, { "./utils": 21 } ], 5: [function (_dereq_, module, exports) { "use strict"; var utils = _dereq_("./utils"); function DataReader(data) { this.data = null; this.length = 0; this.index = 0 } DataReader.prototype = { checkOffset: function (offset) { this.checkIndex(this.index + offset) }, checkIndex: function (newIndex) { if (this.length < newIndex || newIndex < 0) { throw new Error("End of data reached (data length = " + this.length + ", asked index = " + newIndex + "). Corrupted zip ?") } }, setIndex: function (newIndex) { this.checkIndex(newIndex); this.index = newIndex }, skip: function (n) { this.setIndex(this.index + n) }, byteAt: function (i) {}, readInt: function (size) { var result = 0, i; this.checkOffset(size); for (i = this.index + size - 1; i >= this.index; i--) { result = (result << 8) + this.byteAt(i) } this.index += size; return result }, readString: function (size) { return utils.transformTo("string", this.readData(size)) }, readData: function (size) {}, lastIndexOfSignature: function (sig) {}, readDate: function () { var dostime = this.readInt(4); return new Date((dostime >> 25 & 127) + 1980, (dostime >> 21 & 15) - 1, dostime >> 16 & 31, dostime >> 11 & 31, dostime >> 5 & 63, (dostime & 31) << 1) } }; module.exports = DataReader }, { "./utils": 21 } ], 6: [function (_dereq_, module, exports) { "use strict"; exports.base64 = false; exports.binary = false; exports.dir = false; exports.createFolders = false; exports.date = null; exports.compression = null; exports.comment = null }, {} ], 7: [function (_dereq_, module, exports) { "use strict"; var utils = _dereq_("./utils"); exports.string2binary = function (str) { return utils.string2binary(str) }; exports.string2Uint8Array = function (str) { return utils.transformTo("uint8array", str) }; exports.uint8Array2String = function (array) { return utils.transformTo("string", array) }; exports.string2Blob = function (str) { var buffer = utils.transformTo("arraybuffer", str); return utils.arrayBuffer2Blob(buffer) }; exports.arrayBuffer2Blob = function (buffer) { return utils.arrayBuffer2Blob(buffer) }; exports.transformTo = function (outputType, input) { return utils.transformTo(outputType, input) }; exports.getTypeOf = function (input) { return utils.getTypeOf(input) }; exports.checkSupport = function (type) { return utils.checkSupport(type) }; exports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS; exports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS; exports.pretty = function (str) { return utils.pretty(str) }; exports.findCompression = function (compressionMethod) { return utils.findCompression(compressionMethod) }; exports.isRegExp = function (object) { return utils.isRegExp(object) } }, { "./utils": 21 } ], 8: [function (_dereq_, module, exports) { "use strict"; var USE_TYPEDARRAY = typeof Uint8Array !== "undefined" && typeof Uint16Array !== "undefined" && typeof Uint32Array !== "undefined"; var pako = _dereq_("pako"); exports.uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array"; exports.compressInputType = USE_TYPEDARRAY ? "uint8array" : "array"; exports.magic = "\b\x00"; exports.compress = function (input) { return pako.deflateRaw(input) }; exports.uncompress = function (input) { return pako.inflateRaw(input) } }, { pako: 24 } ], 9: [function (_dereq_, module, exports) { "use strict"; var base64 = _dereq_("./base64"); function JSZip(data, options) { if (!(this instanceof JSZip)) return new JSZip(data, options); this.files = {}; this.comment = null; this.root = ""; if (data) { this.load(data, options) } this.clone = function () { var newObj = new JSZip; for (var i in this) { if (typeof this[i] !== "function") { newObj[i] = this[i] } } return newObj } } JSZip.prototype = _dereq_("./object"); JSZip.prototype.load = _dereq_("./load"); JSZip.support = _dereq_("./support"); JSZip.defaults = _dereq_("./defaults"); JSZip.utils = _dereq_("./deprecatedPublicUtils"); JSZip.base64 = { encode: function (input) { return base64.encode(input) }, decode: function (input) { return base64.decode(input) } }; JSZip.compressions = _dereq_("./compressions"); module.exports = JSZip }, { "./base64": 1, "./compressions": 3, "./defaults": 6, "./deprecatedPublicUtils": 7, "./load": 10, "./object": 13, "./support": 17 } ], 10: [function (_dereq_, module, exports) { "use strict"; var base64 = _dereq_("./base64"); var ZipEntries = _dereq_("./zipEntries"); module.exports = function (data, options) { var files, zipEntries, i, input; options = options || {}; if (options.base64) { data = base64.decode(data) } zipEntries = new ZipEntries(data, options); files = zipEntries.files; for (i = 0; i < files.length; i++) { input = files[i]; this.file(input.fileName, input.decompressed, { binary: true, optimizedBinaryString: true, date: input.date, dir: input.dir, comment: input.fileComment.length ? input.fileComment : null, createFolders: options.createFolders }) } if (zipEntries.zipComment.length) { this.comment = zipEntries.zipComment } return this } }, { "./base64": 1, "./zipEntries": 22 } ], 11: [function (_dereq_, module, exports) { (function (Buffer) { "use strict"; module.exports = function (data, encoding) { return new Buffer(data, encoding) }; module.exports.test = function (b) { return Buffer.isBuffer(b) } }).call(this, typeof Buffer !== "undefined" ? Buffer : undefined) }, {} ], 12: [function (_dereq_, module, exports) { "use strict"; var Uint8ArrayReader = _dereq_("./uint8ArrayReader"); function NodeBufferReader(data) { this.data = data; this.length = this.data.length; this.index = 0 } NodeBufferReader.prototype = new Uint8ArrayReader; NodeBufferReader.prototype.readData = function (size) { this.checkOffset(size); var result = this.data.slice(this.index, this.index + size); this.index += size; return result }; module.exports = NodeBufferReader }, { "./uint8ArrayReader": 18 } ], 13: [function (_dereq_, module, exports) { "use strict"; var support = _dereq_("./support"); var utils = _dereq_("./utils"); var crc32 = _dereq_("./crc32"); var signature = _dereq_("./signature"); var defaults = _dereq_("./defaults"); var base64 = _dereq_("./base64"); var compressions = _dereq_("./compressions"); var CompressedObject = _dereq_("./compressedObject"); var nodeBuffer = _dereq_("./nodeBuffer"); var utf8 = _dereq_("./utf8"); var StringWriter = _dereq_("./stringWriter"); var Uint8ArrayWriter = _dereq_("./uint8ArrayWriter"); var getRawData = function (file) { if (file._data instanceof CompressedObject) { file._data = file._data.getContent(); file.options.binary = true; file.options.base64 = false; if (utils.getTypeOf(file._data) === "uint8array") { var copy = file._data; file._data = new Uint8Array(copy.length); if (copy.length !== 0) { file._data.set(copy, 0) } } } return file._data }; var getBinaryData = function (file) { var result = getRawData(file), type = utils.getTypeOf(result); if (type === "string") { if (!file.options.binary) { if (support.nodebuffer) { return nodeBuffer(result, "utf-8") } } return file.asBinary() } return result }; var dataToString = function (asUTF8) { var result = getRawData(this); if (result === null || typeof result === "undefined") { return "" } if (this.options.base64) { result = base64.decode(result) } if (asUTF8 && this.options.binary) { result = out.utf8decode(result) } else { result = utils.transformTo("string", result) } if (!asUTF8 && !this.options.binary) { result = utils.transformTo("string", out.utf8encode(result)) } return result }; var ZipObject = function (name, data, options) { this.name = name; this.dir = options.dir; this.date = options.date; this.comment = options.comment; this._data = data; this.options = options; this._initialMetadata = { dir: options.dir, date: options.date } }; ZipObject.prototype = { asText: function () { return dataToString.call(this, true) }, asBinary: function () { return dataToString.call(this, false) }, asNodeBuffer: function () { var result = getBinaryData(this); return utils.transformTo("nodebuffer", result) }, asUint8Array: function () { var result = getBinaryData(this); return utils.transformTo("uint8array", result) }, asArrayBuffer: function () { return this.asUint8Array().buffer } }; var decToHex = function (dec, bytes) { var hex = "", i; for (i = 0; i < bytes; i++) { hex += String.fromCharCode(dec & 255); dec = dec >>> 8 } return hex }; var extend = function () { var result = {}, i, attr; for (i = 0; i < arguments.length; i++) { for (attr in arguments[i]) { if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") { result[attr] = arguments[i][attr] } } } return result }; var prepareFileAttrs = function (o) { o = o || {}; if (o.base64 === true && (o.binary === null || o.binary === undefined)) { o.binary = true } o = extend(o, defaults); o.date = o.date || new Date; if (o.compression !== null) o.compression = o.compression.toUpperCase(); return o }; var fileAdd = function (name, data, o) { var dataType = utils.getTypeOf(data), parent; o = prepareFileAttrs(o); if (o.createFolders && (parent = parentFolder(name))) { folderAdd.call(this, parent, true) } if (o.dir || data === null || typeof data === "undefined") { o.base64 = false; o.binary = false; data = null } else if (dataType === "string") { if (o.binary && !o.base64) { if (o.optimizedBinaryString !== true) { data = utils.string2binary(data) } } } else { o.base64 = false; o.binary = true; if (!dataType && !(data instanceof CompressedObject)) { throw new Error("The data of '" + name + "' is in an unsupported format !") } if (dataType === "arraybuffer") { data = utils.transformTo("uint8array", data) } } var object = new ZipObject(name, data, o); this.files[name] = object; return object }; var parentFolder = function (path) { if (path.slice(-1) == "/") { path = path.substring(0, path.length - 1) } var lastSlash = path.lastIndexOf("/"); return lastSlash > 0 ? path.substring(0, lastSlash) : "" }; var folderAdd = function (name, createFolders) { if (name.slice(-1) != "/") { name += "/" } createFolders = typeof createFolders !== "undefined" ? createFolders : false; if (!this.files[name]) { fileAdd.call(this, name, null, { dir: true, createFolders: createFolders }) } return this.files[name] }; var generateCompressedObjectFrom = function (file, compression) { var result = new CompressedObject, content; if (file._data instanceof CompressedObject) { result.uncompressedSize = file._data.uncompressedSize; result.crc32 = file._data.crc32; if (result.uncompressedSize === 0 || file.dir) { compression = compressions["STORE"]; result.compressedContent = ""; result.crc32 = 0 } else if (file._data.compressionMethod === compression.magic) { result.compressedContent = file._data.getCompressedContent() } else { content = file._data.getContent(); result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content)) } } else { content = getBinaryData(file); if (!content || content.length === 0 || file.dir) { compression = compressions["STORE"]; content = "" } result.uncompressedSize = content.length; result.crc32 = crc32(content); result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content)) } result.compressedSize = result.compressedContent.length; result.compressionMethod = compression.magic; return result }; var generateZipParts = function (name, file, compressedObject, offset) { var data = compressedObject.compressedContent, utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)), comment = file.comment || "", utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)), useUTF8ForFileName = utfEncodedFileName.length !== file.name.length, useUTF8ForComment = utfEncodedComment.length !== comment.length, o = file.options, dosTime, dosDate, extraFields = "", unicodePathExtraField = "", unicodeCommentExtraField = "", dir, date; if (file._initialMetadata.dir !== file.dir) { dir = file.dir } else { dir = o.dir } if (file._initialMetadata.date !== file.date) { date = file.date } else { date = o.date } dosTime = date.getHours(); dosTime = dosTime << 6; dosTime = dosTime | date.getMinutes(); dosTime = dosTime << 5; dosTime = dosTime | date.getSeconds() / 2; dosDate = date.getFullYear() - 1980; dosDate = dosDate << 4; dosDate = dosDate | date.getMonth() + 1; dosDate = dosDate << 5; dosDate = dosDate | date.getDate(); if (useUTF8ForFileName) { unicodePathExtraField = decToHex(1, 1) + decToHex(crc32(utfEncodedFileName), 4) + utfEncodedFileName; extraFields += "up" + decToHex(unicodePathExtraField.length, 2) + unicodePathExtraField } if (useUTF8ForComment) { unicodeCommentExtraField = decToHex(1, 1) + decToHex(this.crc32(utfEncodedComment), 4) + utfEncodedComment; extraFields += "uc" + decToHex(unicodeCommentExtraField.length, 2) + unicodeCommentExtraField } var header = ""; header += "\n\x00"; header += useUTF8ForFileName || useUTF8ForComment ? "\x00\b" : "\x00\x00"; header += compressedObject.compressionMethod; header += decToHex(dosTime, 2); header += decToHex(dosDate, 2); header += decToHex(compressedObject.crc32, 4); header += decToHex(compressedObject.compressedSize, 4); header += decToHex(compressedObject.uncompressedSize, 4); header += decToHex(utfEncodedFileName.length, 2); header += decToHex(extraFields.length, 2); var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields; var dirRecord = signature.CENTRAL_FILE_HEADER + "\x00" + header + decToHex(utfEncodedComment.length, 2) + "\x00\x00" + "\x00\x00" + (dir === true ? "\x00\x00\x00" : "\x00\x00\x00\x00") + decToHex(offset, 4) + utfEncodedFileName + extraFields + utfEncodedComment; return { fileRecord: fileRecord, dirRecord: dirRecord, compressedObject: compressedObject } }; var out = { load: function (stream, options) { throw new Error("Load method is not defined. Is the file jszip-load.js included ?") }, filter: function (search) { var result = [], filename, relativePath, file, fileClone; for (filename in this.files) { if (!this.files.hasOwnProperty(filename)) { continue } file = this.files[filename]; fileClone = new ZipObject(file.name, file._data, extend(file.options)); relativePath = filename.slice(this.root.length, filename.length); if (filename.slice(0, this.root.length) === this.root && search(relativePath, fileClone)) { result.push(fileClone) } } return result }, file: function (name, data, o) { if (arguments.length === 1) { if (utils.isRegExp(name)) { var regexp = name; return this.filter(function (relativePath, file) { return !file.dir && regexp.test(relativePath) }) } else { return this.filter(function (relativePath, file) { return !file.dir && relativePath === name })[0] || null } } else { name = this.root + name; fileAdd.call(this, name, data, o) } return this }, folder: function (arg) { if (!arg) { return this } if (utils.isRegExp(arg)) { return this.filter(function (relativePath, file) { return file.dir && arg.test(relativePath) }) } var name = this.root + arg; var newFolder = folderAdd.call(this, name); var ret = this.clone(); ret.root = newFolder.name; return ret }, remove: function (name) { name = this.root + name; var file = this.files[name]; if (!file) { if (name.slice(-1) != "/") { name += "/" } file = this.files[name] } if (file && !file.dir) { delete this.files[name] } else { var kids = this.filter(function (relativePath, file) { return file.name.slice(0, name.length) === name }); for (var i = 0; i < kids.length; i++) { delete this.files[kids[i].name] } } return this }, generate: function (options) { options = extend(options || {}, { base64: true, compression: "STORE", type: "base64", comment: null }); utils.checkSupport(options.type); var zipData = [], localDirLength = 0, centralDirLength = 0, writer, i, utfEncodedComment = utils.transformTo("string", this.utf8encode(options.comment || this.comment || "")); for (var name in this.files) { if (!this.files.hasOwnProperty(name)) { continue } var file = this.files[name]; var compressionName = file.options.compression || options.compression.toUpperCase(); var compression = compressions[compressionName]; if (!compression) { throw new Error(compressionName + " is not a valid compression method !") } var compressedObject = generateCompressedObjectFrom.call(this, file, compression); var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength); localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize; centralDirLength += zipPart.dirRecord.length; zipData.push(zipPart) } var dirEnd = ""; dirEnd = signature.CENTRAL_DIRECTORY_END + "\x00\x00" + "\x00\x00" + decToHex(zipData.length, 2) + decToHex(zipData.length, 2) + decToHex(centralDirLength, 4) + decToHex(localDirLength, 4) + decToHex(utfEncodedComment.length, 2) + utfEncodedComment; var typeName = options.type.toLowerCase(); if (typeName === "uint8array" || typeName === "arraybuffer" || typeName === "blob" || typeName === "nodebuffer") { writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length) } else { writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length) } for (i = 0; i < zipData.length; i++) { writer.append(zipData[i].fileRecord); writer.append(zipData[i].compressedObject.compressedContent) } for (i = 0; i < zipData.length; i++) { writer.append(zipData[i].dirRecord) } writer.append(dirEnd); var zip = writer.finalize(); switch (options.type.toLowerCase()) { case "uint8array": case "arraybuffer": case "nodebuffer": return utils.transformTo(options.type.toLowerCase(), zip); case "blob": return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip)); case "base64": return options.base64 ? base64.encode(zip) : zip; default: return zip } }, crc32: function (input, crc) { return crc32(input, crc) }, utf8encode: function (string) { return utils.transformTo("string", utf8.utf8encode(string)) }, utf8decode: function (input) { return utf8.utf8decode(input) } }; module.exports = out }, { "./base64": 1, "./compressedObject": 2, "./compressions": 3, "./crc32": 4, "./defaults": 6, "./nodeBuffer": 11, "./signature": 14, "./stringWriter": 16, "./support": 17, "./uint8ArrayWriter": 19, "./utf8": 20, "./utils": 21 } ], 14: [function (_dereq_, module, exports) { "use strict"; exports.LOCAL_FILE_HEADER = "PK"; exports.CENTRAL_FILE_HEADER = "PK"; exports.CENTRAL_DIRECTORY_END = "PK"; exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK"; exports.ZIP64_CENTRAL_DIRECTORY_END = "PK"; exports.DATA_DESCRIPTOR = "PK\b" }, {} ], 15: [function (_dereq_, module, exports) { "use strict"; var DataReader = _dereq_("./dataReader"); var utils = _dereq_("./utils"); function StringReader(data, optimizedBinaryString) { this.data = data; if (!optimizedBinaryString) { this.data = utils.string2binary(this.data) } this.length = this.data.length; this.index = 0 } StringReader.prototype = new DataReader; StringReader.prototype.byteAt = function (i) { return this.data.charCodeAt(i) }; StringReader.prototype.lastIndexOfSignature = function (sig) { return this.data.lastIndexOf(sig) }; StringReader.prototype.readData = function (size) { this.checkOffset(size); var result = this.data.slice(this.index, this.index + size); this.index += size; return result }; module.exports = StringReader }, { "./dataReader": 5, "./utils": 21 } ], 16: [function (_dereq_, module, exports) { "use strict"; var utils = _dereq_("./utils"); var StringWriter = function () { this.data = [] }; StringWriter.prototype = { append: function (input) { input = utils.transformTo("string", input); this.data.push(input) }, finalize: function () { return this.data.join("") } }; module.exports = StringWriter }, { "./utils": 21 } ], 17: [function (_dereq_, module, exports) { (function (Buffer) { "use strict"; exports.base64 = true; exports.array = true; exports.string = true; exports.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined"; exports.nodebuffer = typeof Buffer !== "undefined"; exports.uint8array = typeof Uint8Array !== "undefined"; if (typeof ArrayBuffer === "undefined") { exports.blob = false } else { var buffer = new ArrayBuffer(0); try { exports.blob = new Blob([buffer], { type: "application/zip" }).size === 0 } catch (e) { try { var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; var builder = new Builder; builder.append(buffer); exports.blob = builder.getBlob("application/zip").size === 0 } catch (e) { exports.blob = false } } } }).call(this, typeof Buffer !== "undefined" ? Buffer : undefined) }, {} ], 18: [function (_dereq_, module, exports) { "use strict"; var DataReader = _dereq_("./dataReader"); function Uint8ArrayReader(data) { if (data) { this.data = data; this.length = this.data.length; this.index = 0 } } Uint8ArrayReader.prototype = new DataReader; Uint8ArrayReader.prototype.byteAt = function (i) { return this.data[i] }; Uint8ArrayReader.prototype.lastIndexOfSignature = function (sig) { var sig0 = sig.charCodeAt(0), sig1 = sig.charCodeAt(1), sig2 = sig.charCodeAt(2), sig3 = sig.charCodeAt(3); for (var i = this.length - 4; i >= 0; --i) { if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) { return i } } return -1 }; Uint8ArrayReader.prototype.readData = function (size) { this.checkOffset(size); if (size === 0) { return new Uint8Array(0) } var result = this.data.subarray(this.index, this.index + size); this.index += size; return result }; module.exports = Uint8ArrayReader }, { "./dataReader": 5 } ], 19: [function (_dereq_, module, exports) { "use strict"; var utils = _dereq_("./utils"); var Uint8ArrayWriter = function (length) { this.data = new Uint8Array(length); this.index = 0 }; Uint8ArrayWriter.prototype = { append: function (input) { if (input.length !== 0) { input = utils.transformTo("uint8array", input); this.data.set(input, this.index); this.index += input.length } }, finalize: function () { return this.data } }; module.exports = Uint8ArrayWriter }, { "./utils": 21 } ], 20: [function (_dereq_, module, exports) { "use strict"; var utils = _dereq_("./utils"); var support = _dereq_("./support"); var nodeBuffer = _dereq_("./nodeBuffer"); var _utf8len = new Array(256); for (var i = 0; i < 256; i++) { _utf8len[i] = i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1 } _utf8len[254] = _utf8len[254] = 1; var string2buf = function (str) { var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; for (m_pos = 0; m_pos < str_len; m_pos++) { c = str.charCodeAt(m_pos); if ((c & 64512) === 55296 && m_pos + 1 < str_len) { c2 = str.charCodeAt(m_pos + 1); if ((c2 & 64512) === 56320) { c = 65536 + (c - 55296 << 10) + (c2 - 56320); m_pos++ } } buf_len += c < 128 ? 1 : c < 2048 ? 2 : c < 65536 ? 3 : 4 } if (support.uint8array) { buf = new Uint8Array(buf_len) } else { buf = new Array(buf_len) } for (i = 0, m_pos = 0; i < buf_len; m_pos++) { c = str.charCodeAt(m_pos); if ((c & 64512) === 55296 && m_pos + 1 < str_len) { c2 = str.charCodeAt(m_pos + 1); if ((c2 & 64512) === 56320) { c = 65536 + (c - 55296 << 10) + (c2 - 56320); m_pos++ } } if (c < 128) { buf[i++] = c } else if (c < 2048) { buf[i++] = 192 | c >>> 6; buf[i++] = 128 | c & 63 } else if (c < 65536) { buf[i++] = 224 | c >>> 12; buf[i++] = 128 | c >>> 6 & 63; buf[i++] = 128 | c & 63 } else { buf[i++] = 240 | c >>> 18; buf[i++] = 128 | c >>> 12 & 63; buf[i++] = 128 | c >>> 6 & 63; buf[i++] = 128 | c & 63 } } return buf }; var utf8border = function (buf, max) { var pos; max = max || buf.length; if (max > buf.length) { max = buf.length } pos = max - 1; while (pos >= 0 && (buf[pos] & 192) === 128) { pos-- } if (pos < 0) { return max } if (pos === 0) { return max } return pos + _utf8len[buf[pos]] > max ? pos : max }; var buf2string = function (buf) { var str, i, out, c, c_len; var len = buf.length; var utf16buf = new Array(len * 2); for (out = 0, i = 0; i < len; ) { c = buf[i++]; if (c < 128) { utf16buf[out++] = c; continue } c_len = _utf8len[c]; if (c_len > 4) { utf16buf[out++] = 65533; i += c_len - 1; continue } c &= c_len === 2 ? 31 : c_len === 3 ? 15 : 7; while (c_len > 1 && i < len) { c = c << 6 | buf[i++] & 63; c_len-- } if (c_len > 1) { utf16buf[out++] = 65533; continue } if (c < 65536) { utf16buf[out++] = c } else { c -= 65536; utf16buf[out++] = 55296 | c >> 10 & 1023; utf16buf[out++] = 56320 | c & 1023 } } if (utf16buf.length !== out) { if (utf16buf.subarray) { utf16buf = utf16buf.subarray(0, out) } else { utf16buf.length = out } } return utils.applyFromCharCode(utf16buf) }; exports.utf8encode = function utf8encode(str) { if (support.nodebuffer) { return nodeBuffer(str, "utf-8") } return string2buf(str) }; exports.utf8decode = function utf8decode(buf) { if (support.nodebuffer) { return utils.transformTo("nodebuffer", buf).toString("utf-8") } buf = utils.transformTo(support.uint8array ? "uint8array" : "array", buf); var result = [], k = 0, len = buf.length, chunk = 65536; while (k < len) { var nextBoundary = utf8border(buf, Math.min(k + chunk, len)); if (support.uint8array) { result.push(buf2string(buf.subarray(k, nextBoundary))) } else { result.push(buf2string(buf.slice(k, nextBoundary))) } k = nextBoundary } return result.join("") } }, { "./nodeBuffer": 11, "./support": 17, "./utils": 21 } ], 21: [function (_dereq_, module, exports) { "use strict"; var support = _dereq_("./support"); var compressions = _dereq_("./compressions"); var nodeBuffer = _dereq_("./nodeBuffer"); exports.string2binary = function (str) { var result = ""; for (var i = 0; i < str.length; i++) { result += String.fromCharCode(str.charCodeAt(i) & 255) } return result }; exports.arrayBuffer2Blob = function (buffer) { exports.checkSupport("blob"); try { return new Blob([buffer], { type: "application/zip" }) } catch (e) { try { var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; var builder = new Builder; builder.append(buffer); return builder.getBlob("application/zip") } catch (e) { throw new Error("Bug : can't construct the Blob.") } } }; function identity(input) { return input } function stringToArrayLike(str, array) { for (var i = 0; i < str.length; ++i) { array[i] = str.charCodeAt(i) & 255 } return array } function arrayLikeToString(array) { var chunk = 65536; var result = [], len = array.length, type = exports.getTypeOf(array), k = 0, canUseApply = true; try { switch (type) { case "uint8array": String.fromCharCode.apply(null, new Uint8Array(0)); break; case "nodebuffer": String.fromCharCode.apply(null, nodeBuffer(0)); break } } catch (e) { canUseApply = false } if (!canUseApply) { var resultStr = ""; for (var i = 0; i < array.length; i++) { resultStr += String.fromCharCode(array[i]) } return resultStr } while (k < len && chunk > 1) { try { if (type === "array" || type === "nodebuffer") { result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len)))) } else { result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len)))) } k += chunk } catch (e) { chunk = Math.floor(chunk / 2) } } return result.join("") } exports.applyFromCharCode = arrayLikeToString; function arrayLikeToArrayLike(arrayFrom, arrayTo) { for (var i = 0; i < arrayFrom.length; i++) { arrayTo[i] = arrayFrom[i] } return arrayTo } var transform = {}; transform["string"] = { string: identity, array: function (input) { return stringToArrayLike(input, new Array(input.length)) }, arraybuffer: function (input) { return transform["string"]["uint8array"](input).buffer }, uint8array: function (input) { return stringToArrayLike(input, new Uint8Array(input.length)) }, nodebuffer: function (input) { return stringToArrayLike(input, nodeBuffer(input.length)) } }; transform["array"] = { string: arrayLikeToString, array: identity, arraybuffer: function (input) { return new Uint8Array(input).buffer }, uint8array: function (input) { return new Uint8Array(input) }, nodebuffer: function (input) { return nodeBuffer(input) } }; transform["arraybuffer"] = { string: function (input) { return arrayLikeToString(new Uint8Array(input)) }, array: function (input) { return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength)) }, arraybuffer: identity, uint8array: function (input) { return new Uint8Array(input) }, nodebuffer: function (input) { return nodeBuffer(new Uint8Array(input)) } }; transform["uint8array"] = { string: arrayLikeToString, array: function (input) { return arrayLikeToArrayLike(input, new Array(input.length)) }, arraybuffer: function (input) { return input.buffer }, uint8array: identity, nodebuffer: function (input) { return nodeBuffer(input) } }; transform["nodebuffer"] = { string: arrayLikeToString, array: function (input) { return arrayLikeToArrayLike(input, new Array(input.length)) }, arraybuffer: function (input) { return transform["nodebuffer"]["uint8array"](input).buffer }, uint8array: function (input) { return arrayLikeToArrayLike(input, new Uint8Array(input.length)) }, nodebuffer: identity }; exports.transformTo = function (outputType, input) { if (!input) { input = "" } if (!outputType) { return input } exports.checkSupport(outputType); var inputType = exports.getTypeOf(input); var result = transform[inputType][outputType](input); return result }; exports.getTypeOf = function (input) { if (typeof input === "string") { return "string" } if (Object.prototype.toString.call(input) === "[object Array]") { return "array" } if (support.nodebuffer && nodeBuffer.test(input)) { return "nodebuffer" } if (support.uint8array && input instanceof Uint8Array) { return "uint8array" } if (support.arraybuffer && input instanceof ArrayBuffer) { return "arraybuffer" } }; exports.checkSupport = function (type) { var supported = support[type.toLowerCase()]; if (!supported) { throw new Error(type + " is not supported by this browser") } }; exports.MAX_VALUE_16BITS = 65535; exports.MAX_VALUE_32BITS = -1; exports.pretty = function (str) { var res = "", code, i; for (i = 0; i < (str || "").length; i++) { code = str.charCodeAt(i); res += "\\x" + (code < 16 ? "0" : "") + code.toString(16).toUpperCase(); } return res }; exports.findCompression = function (compressionMethod) { for (var method in compressions) { if (!compressions.hasOwnProperty(method)) { continue } if (compressions[method].magic === compressionMethod) { return compressions[method] } } return null }; exports.isRegExp = function (object) { return Object.prototype.toString.call(object) === "[object RegExp]" } }, { "./compressions": 3, "./nodeBuffer": 11, "./support": 17 } ], 22: [function (_dereq_, module, exports) { "use strict"; var StringReader = _dereq_("./stringReader"); var NodeBufferReader = _dereq_("./nodeBufferReader"); var Uint8ArrayReader = _dereq_("./uint8ArrayReader"); var utils = _dereq_("./utils"); var sig = _dereq_("./signature"); var ZipEntry = _dereq_("./zipEntry"); var support = _dereq_("./support"); var jszipProto = _dereq_("./object"); function ZipEntries(data, loadOptions) { this.files = []; this.loadOptions = loadOptions; if (data) { this.load(data) } } ZipEntries.prototype = { checkSignature: function (expectedSignature) { var signature = this.reader.readString(4); if (signature !== expectedSignature) { throw new Error("Corrupted zip or bug : unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")") } }, readBlockEndOfCentral: function () { this.diskNumber = this.reader.readInt(2); this.diskWithCentralDirStart = this.reader.readInt(2); this.centralDirRecordsOnThisDisk = this.reader.readInt(2); this.centralDirRecords = this.reader.readInt(2); this.centralDirSize = this.reader.readInt(4); this.centralDirOffset = this.reader.readInt(4); this.zipCommentLength = this.reader.readInt(2); this.zipComment = this.reader.readString(this.zipCommentLength); this.zipComment = jszipProto.utf8decode(this.zipComment) }, readBlockZip64EndOfCentral: function () { this.zip64EndOfCentralSize = this.reader.readInt(8); this.versionMadeBy = this.reader.readString(2); this.versionNeeded = this.reader.readInt(2); this.diskNumber = this.reader.readInt(4); this.diskWithCentralDirStart = this.reader.readInt(4); this.centralDirRecordsOnThisDisk = this.reader.readInt(8); this.centralDirRecords = this.reader.readInt(8); this.centralDirSize = this.reader.readInt(8); this.centralDirOffset = this.reader.readInt(8); this.zip64ExtensibleData = {}; var extraDataSize = this.zip64EndOfCentralSize - 44, index = 0, extraFieldId, extraFieldLength, extraFieldValue; while (index < extraDataSize) { extraFieldId = this.reader.readInt(2); extraFieldLength = this.reader.readInt(4); extraFieldValue = this.reader.readString(extraFieldLength); this.zip64ExtensibleData[extraFieldId] = { id: extraFieldId, length: extraFieldLength, value: extraFieldValue } } }, readBlockZip64EndOfCentralLocator: function () { this.diskWithZip64CentralDirStart = this.reader.readInt(4); this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8); this.disksCount = this.reader.readInt(4); if (this.disksCount > 1) { throw new Error("Multi-volumes zip are not supported") } }, readLocalFiles: function () { var i, file; for (i = 0; i < this.files.length; i++) { file = this.files[i]; this.reader.setIndex(file.localHeaderOffset); this.checkSignature(sig.LOCAL_FILE_HEADER); file.readLocalPart(this.reader); file.handleUTF8() } }, readCentralDir: function () { var file; this.reader.setIndex(this.centralDirOffset); while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) { file = new ZipEntry({ zip64: this.zip64 }, this.loadOptions); file.readCentralPart(this.reader); this.files.push(file) } }, readEndOfCentral: function () { var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END); if (offset === -1) { throw new Error("Corrupted zip : can't find end of central directory") } this.reader.setIndex(offset); this.checkSignature(sig.CENTRAL_DIRECTORY_END); this.readBlockEndOfCentral(); if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) { this.zip64 = true; offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR); if (offset === -1) { throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator") } this.reader.setIndex(offset); this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR); this.readBlockZip64EndOfCentralLocator(); this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir); this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END); this.readBlockZip64EndOfCentral() } }, prepareReader: function (data) { var type = utils.getTypeOf(data); if (type === "string" && !support.uint8array) { this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString) } else if (type === "nodebuffer") { this.reader = new NodeBufferReader(data) } else { this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data)) } }, load: function (data) { this.prepareReader(data); this.readEndOfCentral(); this.readCentralDir(); this.readLocalFiles() } }; module.exports = ZipEntries }, { "./nodeBufferReader": 12, "./object": 13, "./signature": 14, "./stringReader": 15, "./support": 17, "./uint8ArrayReader": 18, "./utils": 21, "./zipEntry": 23 } ], 23: [function (_dereq_, module, exports) { "use strict"; var StringReader = _dereq_("./stringReader"); var utils = _dereq_("./utils"); var CompressedObject = _dereq_("./compressedObject"); var jszipProto = _dereq_("./object"); function ZipEntry(options, loadOptions) { this.options = options; this.loadOptions = loadOptions } ZipEntry.prototype = { isEncrypted: function () { return (this.bitFlag & 1) === 1 }, useUTF8: function () { return (this.bitFlag & 2048) === 2048 }, prepareCompressedContent: function (reader, from, length) { return function () { var previousIndex = reader.index; reader.setIndex(from); var compressedFileData = reader.readData(length); reader.setIndex(previousIndex); return compressedFileData } }, prepareContent: function (reader, from, length, compression, uncompressedSize) { return function () { var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent()); var uncompressedFileData = compression.uncompress(compressedFileData); if (uncompressedFileData.length !== uncompressedSize) { throw new Error("Bug : uncompressed data size mismatch") } return uncompressedFileData } }, readLocalPart: function (reader) { var compression, localExtraFieldsLength; reader.skip(22); this.fileNameLength = reader.readInt(2); localExtraFieldsLength = reader.readInt(2); this.fileName = reader.readString(this.fileNameLength); reader.skip(localExtraFieldsLength); if (this.compressedSize == -1 || this.uncompressedSize == -1) { throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize == -1 || uncompressedSize == -1)") } compression = utils.findCompression(this.compressionMethod); if (compression === null) { throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")") } this.decompressed = new CompressedObject; this.decompressed.compressedSize = this.compressedSize; this.decompressed.uncompressedSize = this.uncompressedSize; this.decompressed.crc32 = this.crc32; this.decompressed.compressionMethod = this.compressionMethod; this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression); this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize); if (this.loadOptions.checkCRC32) { this.decompressed = utils.transformTo("string", this.decompressed.getContent()); if (jszipProto.crc32(this.decompressed) !== this.crc32) { throw new Error("Corrupted zip : CRC32 mismatch") } } }, readCentralPart: function (reader) { this.versionMadeBy = reader.readString(2); this.versionNeeded = reader.readInt(2); this.bitFlag = reader.readInt(2); this.compressionMethod = reader.readString(2); this.date = reader.readDate(); this.crc32 = reader.readInt(4); this.compressedSize = reader.readInt(4); this.uncompressedSize = reader.readInt(4); this.fileNameLength = reader.readInt(2); this.extraFieldsLength = reader.readInt(2); this.fileCommentLength = reader.readInt(2); this.diskNumberStart = reader.readInt(2); this.internalFileAttributes = reader.readInt(2); this.externalFileAttributes = reader.readInt(4); this.localHeaderOffset = reader.readInt(4); if (this.isEncrypted()) { throw new Error("Encrypted zip are not supported") } this.fileName = reader.readString(this.fileNameLength); this.readExtraFields(reader); this.parseZIP64ExtraField(reader); this.fileComment = reader.readString(this.fileCommentLength); this.dir = this.externalFileAttributes & 16 ? true : false }, parseZIP64ExtraField: function (reader) { if (!this.extraFields[1]) { return } var extraReader = new StringReader(this.extraFields[1].value); if (this.uncompressedSize === utils.MAX_VALUE_32BITS) { this.uncompressedSize = extraReader.readInt(8) } if (this.compressedSize === utils.MAX_VALUE_32BITS) { this.compressedSize = extraReader.readInt(8) } if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) { this.localHeaderOffset = extraReader.readInt(8) } if (this.diskNumberStart === utils.MAX_VALUE_32BITS) { this.diskNumberStart = extraReader.readInt(4) } }, readExtraFields: function (reader) { var start = reader.index, extraFieldId, extraFieldLength, extraFieldValue; this.extraFields = this.extraFields || {}; while (reader.index < start + this.extraFieldsLength) { extraFieldId = reader.readInt(2); extraFieldLength = reader.readInt(2); extraFieldValue = reader.readString(extraFieldLength); this.extraFields[extraFieldId] = { id: extraFieldId, length: extraFieldLength, value: extraFieldValue } } }, handleUTF8: function () { if (this.useUTF8()) { this.fileName = jszipProto.utf8decode(this.fileName); this.fileComment = jszipProto.utf8decode(this.fileComment) } else { var upath = this.findExtraFieldUnicodePath(); if (upath !== null) { this.fileName = upath } var ucomment = this.findExtraFieldUnicodeComment(); if (ucomment !== null) { this.fileComment = ucomment } } }, findExtraFieldUnicodePath: function () { var upathField = this.extraFields[28789]; if (upathField) { var extraReader = new StringReader(upathField.value); if (extraReader.readInt(1) !== 1) { return null } if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) { return null } return jszipProto.utf8decode(extraReader.readString(upathField.length - 5)) } return null }, findExtraFieldUnicodeComment: function () { var ucommentField = this.extraFields[25461]; if (ucommentField) { var extraReader = new StringReader(ucommentField.value); if (extraReader.readInt(1) !== 1) { return null } if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) { return null } return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5)) } return null } }; module.exports = ZipEntry }, { "./compressedObject": 2, "./object": 13, "./stringReader": 15, "./utils": 21 } ], 24: [function (_dereq_, module, exports) { "use strict"; var assign = _dereq_("./lib/utils/common").assign; var deflate = _dereq_("./lib/deflate"); var inflate = _dereq_("./lib/inflate"); var constants = _dereq_("./lib/zlib/constants"); var pako = {}; assign(pako, deflate, inflate, constants); module.exports = pako }, { "./lib/deflate": 25, "./lib/inflate": 26, "./lib/utils/common": 27, "./lib/zlib/constants": 30 } ], 25: [function (_dereq_, module, exports) { "use strict"; var zlib_deflate = _dereq_("./zlib/deflate.js"); var utils = _dereq_("./utils/common"); var strings = _dereq_("./utils/strings"); var msg = _dereq_("./zlib/messages"); var zstream = _dereq_("./zlib/zstream"); var Z_NO_FLUSH = 0; var Z_FINISH = 4; var Z_OK = 0; var Z_STREAM_END = 1; var Z_DEFAULT_COMPRESSION = -1; var Z_DEFAULT_STRATEGY = 0; var Z_DEFLATED = 8; var Deflate = function (options) { this.options = utils.assign({ level: Z_DEFAULT_COMPRESSION, method: Z_DEFLATED, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: Z_DEFAULT_STRATEGY, to: "" }, options || {}); var opt = this.options; if (opt.raw && opt.windowBits > 0) { opt.windowBits = -opt.windowBits } else if (opt.gzip && opt.windowBits > 0 && opt.windowBits < 16) { opt.windowBits += 16 } this.err = 0; this.msg = ""; this.ended = false; this.chunks = []; this.strm = new zstream; this.strm.avail_out = 0; var status = zlib_deflate.deflateInit2(this.strm, opt.level, opt.method, opt.windowBits, opt.memLevel, opt.strategy); if (status !== Z_OK) { throw new Error(msg[status]) } if (opt.header) { zlib_deflate.deflateSetHeader(this.strm, opt.header) } }; Deflate.prototype.push = function (data, mode) { var strm = this.strm; var chunkSize = this.options.chunkSize; var status, _mode; if (this.ended) { return false } _mode = mode === ~~mode ? mode : mode === true ? Z_FINISH : Z_NO_FLUSH; if (typeof data === "string") { strm.input = strings.string2buf(data) } else { strm.input = data } strm.next_in = 0; strm.avail_in = strm.input.length; do { if (strm.avail_out === 0) { strm.output = new utils.Buf8(chunkSize); strm.next_out = 0; strm.avail_out = chunkSize } status = zlib_deflate.deflate(strm, _mode); if (status !== Z_STREAM_END && status !== Z_OK) { this.onEnd(status); this.ended = true; return false } if (strm.avail_out === 0 || strm.avail_in === 0 && _mode === Z_FINISH) { if (this.options.to === "string") { this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out))) } else { this.onData(utils.shrinkBuf(strm.output, strm.next_out)) } } } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END); if (_mode === Z_FINISH) { status = zlib_deflate.deflateEnd(this.strm); this.onEnd(status); this.ended = true; return status === Z_OK } return true }; Deflate.prototype.onData = function (chunk) { this.chunks.push(chunk) }; Deflate.prototype.onEnd = function (status) { if (status === Z_OK) { if (this.options.to === "string") { this.result = this.chunks.join("") } else { this.result = utils.flattenChunks(this.chunks) } } this.chunks = []; this.err = status; this.msg = this.strm.msg }; function deflate(input, options) { var deflator = new Deflate(options); deflator.push(input, true); if (deflator.err) { throw deflator.msg } return deflator.result } function deflateRaw(input, options) { options = options || {}; options.raw = true; return deflate(input, options) } function gzip(input, options) { options = options || {}; options.gzip = true; return deflate(input, options) } exports.Deflate = Deflate; exports.deflate = deflate; exports.deflateRaw = deflateRaw; exports.gzip = gzip }, { "./utils/common": 27, "./utils/strings": 28, "./zlib/deflate.js": 32, "./zlib/messages": 37, "./zlib/zstream": 39 } ], 26: [function (_dereq_, module, exports) { "use strict"; var zlib_inflate = _dereq_("./zlib/inflate.js"); var utils = _dereq_("./utils/common"); var strings = _dereq_("./utils/strings"); var c = _dereq_("./zlib/constants"); var msg = _dereq_("./zlib/messages"); var zstream = _dereq_("./zlib/zstream"); var gzheader = _dereq_("./zlib/gzheader"); var Inflate = function (options) { this.options = utils.assign({ chunkSize: 16384, windowBits: 0, to: "" }, options || {}); var opt = this.options; if (opt.raw && opt.windowBits >= 0 && opt.windowBits < 16) { opt.windowBits = -opt.windowBits; if (opt.windowBits === 0) { opt.windowBits = -15 } } if (opt.windowBits >= 0 && opt.windowBits < 16 && !(options && options.windowBits)) { opt.windowBits += 32 } if (opt.windowBits > 15 && opt.windowBits < 48) { if ((opt.windowBits & 15) === 0) { opt.windowBits |= 15 } } this.err = 0; this.msg = ""; this.ended = false; this.chunks = []; this.strm = new zstream; this.strm.avail_out = 0; var status = zlib_inflate.inflateInit2(this.strm, opt.windowBits); if (status !== c.Z_OK) { throw new Error(msg[status]) } this.header = new gzheader; zlib_inflate.inflateGetHeader(this.strm, this.header) }; Inflate.prototype.push = function (data, mode) { var strm = this.strm; var chunkSize = this.options.chunkSize; var status, _mode; var next_out_utf8, tail, utf8str; if (this.ended) { return false } _mode = mode === ~~mode ? mode : mode === true ? c.Z_FINISH : c.Z_NO_FLUSH; if (typeof data === "string") { strm.input = strings.binstring2buf(data) } else { strm.input = data } strm.next_in = 0; strm.avail_in = strm.input.length; do { if (strm.avail_out === 0) { strm.output = new utils.Buf8(chunkSize); strm.next_out = 0; strm.avail_out = chunkSize } status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); if (status !== c.Z_STREAM_END && status !== c.Z_OK) { this.onEnd(status); this.ended = true; return false } if (strm.next_out) { if (strm.avail_out === 0 || status === c.Z_STREAM_END || strm.avail_in === 0 && _mode === c.Z_FINISH) { if (this.options.to === "string") { next_out_utf8 = strings.utf8border(strm.output, strm.next_out); tail = strm.next_out - next_out_utf8; utf8str = strings.buf2string(strm.output, next_out_utf8); strm.next_out = tail; strm.avail_out = chunkSize - tail; if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0) } this.onData(utf8str) } else { this.onData(utils.shrinkBuf(strm.output, strm.next_out)) } } } } while (strm.avail_in > 0 && status !== c.Z_STREAM_END); if (status === c.Z_STREAM_END) { _mode = c.Z_FINISH } if (_mode === c.Z_FINISH) { status = zlib_inflate.inflateEnd(this.strm); this.onEnd(status); this.ended = true; return status === c.Z_OK } return true }; Inflate.prototype.onData = function (chunk) { this.chunks.push(chunk) }; Inflate.prototype.onEnd = function (status) { if (status === c.Z_OK) { if (this.options.to === "string") { this.result = this.chunks.join("") } else { this.result = utils.flattenChunks(this.chunks) } } this.chunks = []; this.err = status; this.msg = this.strm.msg }; function inflate(input, options) { var inflator = new Inflate(options); inflator.push(input, true); if (inflator.err) { throw inflator.msg } return inflator.result } function inflateRaw(input, options) { options = options || {}; options.raw = true; return inflate(input, options) } exports.Inflate = Inflate; exports.inflate = inflate; exports.inflateRaw = inflateRaw; exports.ungzip = inflate }, { "./utils/common": 27, "./utils/strings": 28, "./zlib/constants": 30, "./zlib/gzheader": 33, "./zlib/inflate.js": 35, "./zlib/messages": 37, "./zlib/zstream": 39 } ], 27: [function (_dereq_, module, exports) { "use strict"; var TYPED_OK = typeof Uint8Array !== "undefined" && typeof Uint16Array !== "undefined" && typeof Int32Array !== "undefined"; exports.assign = function (obj) { var sources = Array.prototype.slice.call(arguments, 1); while (sources.length) { var source = sources.shift(); if (!source) { continue } if (typeof source !== "object") { throw new TypeError(source + "must be non-object") } for (var p in source) { if (source.hasOwnProperty(p)) { obj[p] = source[p] } } } return obj }; exports.shrinkBuf = function (buf, size) { if (buf.length === size) { return buf } if (buf.subarray) { return buf.subarray(0, size) } buf.length = size; return buf }; var fnTyped = { arraySet: function (dest, src, src_offs, len, dest_offs) { if (src.subarray && dest.subarray) { dest.set(src.subarray(src_offs, src_offs + len), dest_offs); return } for (var i = 0; i < len; i++) { dest[dest_offs + i] = src[src_offs + i] } }, flattenChunks: function (chunks) { var i, l, len, pos, chunk, result; len = 0; for (i = 0, l = chunks.length; i < l; i++) { len += chunks[i].length } result = new Uint8Array(len); pos = 0; for (i = 0, l = chunks.length; i < l; i++) { chunk = chunks[i]; result.set(chunk, pos); pos += chunk.length } return result } }; var fnUntyped = { arraySet: function (dest, src, src_offs, len, dest_offs) { for (var i = 0; i < len; i++) { dest[dest_offs + i] = src[src_offs + i] } }, flattenChunks: function (chunks) { return [].concat.apply([], chunks) } }; exports.setTyped = function (on) { if (on) { exports.Buf8 = Uint8Array; exports.Buf16 = Uint16Array; exports.Buf32 = Int32Array; exports.assign(exports, fnTyped) } else { exports.Buf8 = Array; exports.Buf16 = Array; exports.Buf32 = Array; exports.assign(exports, fnUntyped) } }; exports.setTyped(TYPED_OK) }, {} ], 28: [function (_dereq_, module, exports) { "use strict"; var utils = _dereq_("./common"); var STR_APPLY_OK = true; var STR_APPLY_UIA_OK = true; try { String.fromCharCode.apply(null, [0]) } catch (__) { STR_APPLY_OK = false } try { String.fromCharCode.apply(null, new Uint8Array(1)) } catch (__) { STR_APPLY_UIA_OK = false } var _utf8len = new utils.Buf8(256); for (var i = 0; i < 256; i++) { _utf8len[i] = i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1 } _utf8len[254] = _utf8len[254] = 1; exports.string2buf = function (str) { var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; for (m_pos = 0; m_pos < str_len; m_pos++) { c = str.charCodeAt(m_pos); if ((c & 64512) === 55296 && m_pos + 1 < str_len) { c2 = str.charCodeAt(m_pos + 1); if ((c2 & 64512) === 56320) { c = 65536 + (c - 55296 << 10) + (c2 - 56320); m_pos++ } } buf_len += c < 128 ? 1 : c < 2048 ? 2 : c < 65536 ? 3 : 4 } buf = new utils.Buf8(buf_len); for (i = 0, m_pos = 0; i < buf_len; m_pos++) { c = str.charCodeAt(m_pos); if ((c & 64512) === 55296 && m_pos + 1 < str_len) { c2 = str.charCodeAt(m_pos + 1); if ((c2 & 64512) === 56320) { c = 65536 + (c - 55296 << 10) + (c2 - 56320); m_pos++ } } if (c < 128) { buf[i++] = c } else if (c < 2048) { buf[i++] = 192 | c >>> 6; buf[i++] = 128 | c & 63 } else if (c < 65536) { buf[i++] = 224 | c >>> 12; buf[i++] = 128 | c >>> 6 & 63; buf[i++] = 128 | c & 63 } else { buf[i++] = 240 | c >>> 18; buf[i++] = 128 | c >>> 12 & 63; buf[i++] = 128 | c >>> 6 & 63; buf[i++] = 128 | c & 63 } } return buf }; function buf2binstring(buf, len) { if (len < 65537) { if (buf.subarray && STR_APPLY_UIA_OK || !buf.subarray && STR_APPLY_OK) { return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len)) } } var result = ""; for (var i = 0; i < len; i++) { result += String.fromCharCode(buf[i]) } return result } exports.buf2binstring = function (buf) { return buf2binstring(buf, buf.length) }; exports.binstring2buf = function (str) { var buf = new utils.Buf8(str.length); for (var i = 0, len = buf.length; i < len; i++) { buf[i] = str.charCodeAt(i) } return buf }; exports.buf2string = function (buf, max) { var i, out, c, c_len; var len = max || buf.length; var utf16buf = new Array(len * 2); for (out = 0, i = 0; i < len; ) { c = buf[i++]; if (c < 128) { utf16buf[out++] = c; continue } c_len = _utf8len[c]; if (c_len > 4) { utf16buf[out++] = 65533; i += c_len - 1; continue } c &= c_len === 2 ? 31 : c_len === 3 ? 15 : 7; while (c_len > 1 && i < len) { c = c << 6 | buf[i++] & 63; c_len-- } if (c_len > 1) { utf16buf[out++] = 65533; continue } if (c < 65536) { utf16buf[out++] = c } else { c -= 65536; utf16buf[out++] = 55296 | c >> 10 & 1023; utf16buf[out++] = 56320 | c & 1023 } } return buf2binstring(utf16buf, out) }; exports.utf8border = function (buf, max) { var pos; max = max || buf.length; if (max > buf.length) { max = buf.length } pos = max - 1; while (pos >= 0 && (buf[pos] & 192) === 128) { pos-- } if (pos < 0) { return max } if (pos === 0) { return max } return pos + _utf8len[buf[pos]] > max ? pos : max } }, { "./common": 27 } ], 29: [function (_dereq_, module, exports) { "use strict"; function adler32(adler, buf, len, pos) { var s1 = adler & 65535 | 0, s2 = adler >>> 16 & 65535 | 0, n = 0; while (len !== 0) { n = len > 2e3 ? 2e3 : len; len -= n; do { s1 = s1 + buf[pos++] | 0; s2 = s2 + s1 | 0 } while (--n); s1 %= 65521; s2 %= 65521 } return s1 | s2 << 16 | 0 } module.exports = adler32 }, {} ], 30: [function (_dereq_, module, exports) { module.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 } }, {} ], 31: [function (_dereq_, module, exports) { "use strict"; function makeTable() { var c, table = []; for (var n = 0; n < 256; n++) { c = n; for (var k = 0; k < 8; k++) { c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1 } table[n] = c } return table } var crcTable = makeTable(); function crc32(crc, buf, len, pos) { var t = crcTable, end = pos + len; crc = crc ^ -1; for (var i = pos; i < end; i++) { crc = crc >>> 8 ^ t[(crc ^ buf[i]) & 255] } return crc ^ -1 } module.exports = crc32 }, {} ], 32: [function (_dereq_, module, exports) { "use strict"; var utils = _dereq_("../utils/common"); var trees = _dereq_("./trees"); var adler32 = _dereq_("./adler32"); var crc32 = _dereq_("./crc32"); var msg = _dereq_("./messages"); var Z_NO_FLUSH = 0; var Z_PARTIAL_FLUSH = 1; var Z_FULL_FLUSH = 3; var Z_FINISH = 4; var Z_BLOCK = 5; var Z_OK = 0; var Z_STREAM_END = 1; var Z_STREAM_ERROR = -2; var Z_DATA_ERROR = -3; var Z_BUF_ERROR = -5; var Z_DEFAULT_COMPRESSION = -1; var Z_FILTERED = 1; var Z_HUFFMAN_ONLY = 2; var Z_RLE = 3; var Z_FIXED = 4; var Z_DEFAULT_STRATEGY = 0; var Z_UNKNOWN = 2; var Z_DEFLATED = 8; var MAX_MEM_LEVEL = 9; var MAX_WBITS = 15; var DEF_MEM_LEVEL = 8; var LENGTH_CODES = 29; var LITERALS = 256; var L_CODES = LITERALS + 1 + LENGTH_CODES; var D_CODES = 30; var BL_CODES = 19; var HEAP_SIZE = 2 * L_CODES + 1; var MAX_BITS = 15; var MIN_MATCH = 3; var MAX_MATCH = 258; var MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1; var PRESET_DICT = 32; var INIT_STATE = 42; var EXTRA_STATE = 69; var NAME_STATE = 73; var COMMENT_STATE = 91; var HCRC_STATE = 103; var BUSY_STATE = 113; var FINISH_STATE = 666; var BS_NEED_MORE = 1; var BS_BLOCK_DONE = 2; var BS_FINISH_STARTED = 3; var BS_FINISH_DONE = 4; var OS_CODE = 3; function err(strm, errorCode) { strm.msg = msg[errorCode]; return errorCode } function rank(f) { return (f << 1) - (f > 4 ? 9 : 0) } function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0 } } function flush_pending(strm) { var s = strm.state; var len = s.pending; if (len > strm.avail_out) { len = strm.avail_out } if (len === 0) { return } utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); strm.next_out += len; s.pending_out += len; strm.total_out += len; strm.avail_out -= len; s.pending -= len; if (s.pending === 0) { s.pending_out = 0 } } function flush_block_only(s, last) { trees._tr_flush_block(s, s.block_start >= 0 ? s.block_start : -1, s.strstart - s.block_start, last); s.block_start = s.strstart; flush_pending(s.strm) } function put_byte(s, b) { s.pending_buf[s.pending++] = b } function putShortMSB(s, b) { s.pending_buf[s.pending++] = b >>> 8 & 255; s.pending_buf[s.pending++] = b & 255 } function read_buf(strm, buf, start, size) { var len = strm.avail_in; if (len > size) { len = size } if (len === 0) { return 0 } strm.avail_in -= len; utils.arraySet(buf, strm.input, strm.next_in, len, start); if (strm.state.wrap === 1) { strm.adler = adler32(strm.adler, buf, len, start) } else if (strm.state.wrap === 2) { strm.adler = crc32(strm.adler, buf, len, start) } strm.next_in += len; strm.total_in += len; return len } function longest_match(s, cur_match) { var chain_length = s.max_chain_length; var scan = s.strstart; var match; var len; var best_len = s.prev_length; var nice_match = s.nice_match; var limit = s.strstart > s.w_size - MIN_LOOKAHEAD ? s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0; var _win = s.window; var wmask = s.w_mask; var prev = s.prev; var strend = s.strstart + MAX_MATCH; var scan_end1 = _win[scan + best_len - 1]; var scan_end = _win[scan + best_len]; if (s.prev_length >= s.good_match) { chain_length >>= 2 } if (nice_match > s.lookahead) { nice_match = s.lookahead } do { match = cur_match; if (_win[match + best_len] !== scan_end || _win[match + best_len - 1] !== scan_end1 || _win[match] !== _win[scan] || _win[++match] !== _win[scan + 1]) { continue } scan += 2; match++; do {} while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && scan < strend); len = MAX_MATCH - (strend - scan); scan = strend - MAX_MATCH; if (len > best_len) { s.match_start = cur_match; best_len = len; if (len >= nice_match) { break } scan_end1 = _win[scan + best_len - 1]; scan_end = _win[scan + best_len] } } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); if (best_len <= s.lookahead) { return best_len } return s.lookahead } function fill_window(s) { var _w_size = s.w_size; var p, n, m, more, str; do { more = s.window_size - s.lookahead - s.strstart; if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { utils.arraySet(s.window, s.window, _w_size, _w_size, 0); s.match_start -= _w_size; s.strstart -= _w_size; s.block_start -= _w_size; n = s.hash_size; p = n; do { m = s.head[--p]; s.head[p] = m >= _w_size ? m - _w_size : 0 } while (--n); n = _w_size; p = n; do { m = s.prev[--p]; s.prev[p] = m >= _w_size ? m - _w_size : 0 } while (--n); more += _w_size } if (s.strm.avail_in === 0) { break } n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); s.lookahead += n; if (s.lookahead + s.insert >= MIN_MATCH) { str = s.strstart - s.insert; s.ins_h = s.window[str]; s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + 1]) & s.hash_mask; while (s.insert) { s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; s.prev[str & s.w_mask] = s.head[s.ins_h]; s.head[s.ins_h] = str; str++; s.insert--; if (s.lookahead + s.insert < MIN_MATCH) { break } } } } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0) } function deflate_stored(s, flush) { var max_block_size = 65535; if (max_block_size > s.pending_buf_size - 5) { max_block_size = s.pending_buf_size - 5 } for (; ; ) { if (s.lookahead <= 1) { fill_window(s); if (s.lookahead === 0 && flush === Z_NO_FLUSH) { return BS_NEED_MORE } if (s.lookahead === 0) { break } } s.strstart += s.lookahead; s.lookahead = 0; var max_start = s.block_start + max_block_size; if (s.strstart === 0 || s.strstart >= max_start) { s.lookahead = s.strstart - max_start; s.strstart = max_start; flush_block_only(s, false); if (s.strm.avail_out === 0) { return BS_NEED_MORE } } if (s.strstart - s.block_start >= s.w_size - MIN_LOOKAHEAD) { flush_block_only(s, false); if (s.strm.avail_out === 0) { return BS_NEED_MORE } } } s.insert = 0; if (flush === Z_FINISH) { flush_block_only(s, true); if (s.strm.avail_out === 0) { return BS_FINISH_STARTED } return BS_FINISH_DONE } if (s.strstart > s.block_start) { flush_block_only(s, false); if (s.strm.avail_out === 0) { return BS_NEED_MORE } } return BS_NEED_MORE } function deflate_fast(s, flush) { var hash_head; var bflush; for (; ; ) { if (s.lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { return BS_NEED_MORE } if (s.lookahead === 0) { break } } hash_head = 0; if (s.lookahead >= MIN_MATCH) { s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; s.head[s.ins_h] = s.strstart } if (hash_head !== 0 && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) { s.match_length = longest_match(s, hash_head) } if (s.match_length >= MIN_MATCH) { bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); s.lookahead -= s.match_length; if (s.match_length <= s.max_lazy_match && s.lookahead >= MIN_MATCH) { s.match_length--; do { s.strstart++; s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; s.head[s.ins_h] = s.strstart } while (--s.match_length !== 0); s.strstart++ } else { s.strstart += s.match_length; s.match_length = 0; s.ins_h = s.window[s.strstart]; s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + 1]) & s.hash_mask } } else { bflush = trees._tr_tally(s, 0, s.window[s.strstart]); s.lookahead--; s.strstart++ } if (bflush) { flush_block_only(s, false); if (s.strm.avail_out === 0) { return BS_NEED_MORE } } } s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; if (flush === Z_FINISH) { flush_block_only(s, true); if (s.strm.avail_out === 0) { return BS_FINISH_STARTED } return BS_FINISH_DONE } if (s.last_lit) { flush_block_only(s, false); if (s.strm.avail_out === 0) { return BS_NEED_MORE } } return BS_BLOCK_DONE } function deflate_slow(s, flush) { var hash_head; var bflush; var max_insert; for (; ; ) { if (s.lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { return BS_NEED_MORE } if (s.lookahead === 0) { break } } hash_head = 0; if (s.lookahead >= MIN_MATCH) { s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; s.head[s.ins_h] = s.strstart } s.prev_length = s.match_length; s.prev_match = s.match_start; s.match_length = MIN_MATCH - 1; if (hash_head !== 0 && s.prev_length < s.max_lazy_match && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) { s.match_length = longest_match(s, hash_head); if (s.match_length <= 5 && (s.strategy === Z_FILTERED || s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096)) { s.match_length = MIN_MATCH - 1 } } if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { max_insert = s.strstart + s.lookahead - MIN_MATCH; bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); s.lookahead -= s.prev_length - 1; s.prev_length -= 2; do { if (++s.strstart <= max_insert) { s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; s.head[s.ins_h] = s.strstart } } while (--s.prev_length !== 0); s.match_available = 0; s.match_length = MIN_MATCH - 1; s.strstart++; if (bflush) { flush_block_only(s, false); if (s.strm.avail_out === 0) { return BS_NEED_MORE } } } else if (s.match_available) { bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); if (bflush) { flush_block_only(s, false) } s.strstart++; s.lookahead--; if (s.strm.avail_out === 0) { return BS_NEED_MORE } } else { s.match_available = 1; s.strstart++; s.lookahead-- } } if (s.match_available) { bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); s.match_available = 0 } s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; if (flush === Z_FINISH) { flush_block_only(s, true); if (s.strm.avail_out === 0) { return BS_FINISH_STARTED } return BS_FINISH_DONE } if (s.last_lit) { flush_block_only(s, false); if (s.strm.avail_out === 0) { return BS_NEED_MORE } } return BS_BLOCK_DONE } function deflate_rle(s, flush) { var bflush; var prev; var scan, strend; var _win = s.window; for (; ; ) { if (s.lookahead <= MAX_MATCH) { fill_window(s); if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { return BS_NEED_MORE } if (s.lookahead === 0) { break } } s.match_length = 0; if (s.lookahead >= MIN_MATCH && s.strstart > 0) { scan = s.strstart - 1; prev = _win[scan]; if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { strend = s.strstart + MAX_MATCH; do {} while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && scan < strend); s.match_length = MAX_MATCH - (strend - scan); if (s.match_length > s.lookahead) { s.match_length = s.lookahead } } } if (s.match_length >= MIN_MATCH) { bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH); s.lookahead -= s.match_length; s.strstart += s.match_length; s.match_length = 0 } else { bflush = trees._tr_tally(s, 0, s.window[s.strstart]); s.lookahead--; s.strstart++ } if (bflush) { flush_block_only(s, false); if (s.strm.avail_out === 0) { return BS_NEED_MORE } } } s.insert = 0; if (flush === Z_FINISH) { flush_block_only(s, true); if (s.strm.avail_out === 0) { return BS_FINISH_STARTED } return BS_FINISH_DONE } if (s.last_lit) { flush_block_only(s, false); if (s.strm.avail_out === 0) { return BS_NEED_MORE } } return BS_BLOCK_DONE } function deflate_huff(s, flush) { var bflush; for (; ; ) { if (s.lookahead === 0) { fill_window(s); if (s.lookahead === 0) { if (flush === Z_NO_FLUSH) { return BS_NEED_MORE } break } } s.match_length = 0; bflush = trees._tr_tally(s, 0, s.window[s.strstart]); s.lookahead--; s.strstart++; if (bflush) { flush_block_only(s, false); if (s.strm.avail_out === 0) { return BS_NEED_MORE } } } s.insert = 0; if (flush === Z_FINISH) { flush_block_only(s, true); if (s.strm.avail_out === 0) { return BS_FINISH_STARTED } return BS_FINISH_DONE } if (s.last_lit) { flush_block_only(s, false); if (s.strm.avail_out === 0) { return BS_NEED_MORE } } return BS_BLOCK_DONE } var Config = function (good_length, max_lazy, nice_length, max_chain, func) { this.good_length = good_length; this.max_lazy = max_lazy; this.nice_length = nice_length; this.max_chain = max_chain; this.func = func }; var configuration_table; configuration_table = [new Config(0, 0, 0, 0, deflate_stored), new Config(4, 4, 8, 4, deflate_fast), new Config(4, 5, 16, 8, deflate_fast), new Config(4, 6, 32, 32, deflate_fast), new Config(4, 4, 16, 16, deflate_slow), new Config(8, 16, 32, 32, deflate_slow), new Config(8, 16, 128, 128, deflate_slow), new Config(8, 32, 128, 256, deflate_slow), new Config(32, 128, 258, 1024, deflate_slow), new Config(32, 258, 258, 4096, deflate_slow)]; function lm_init(s) { s.window_size = 2 * s.w_size; zero(s.head); s.max_lazy_match = configuration_table[s.level].max_lazy; s.good_match = configuration_table[s.level].good_length; s.nice_match = configuration_table[s.level].nice_length; s.max_chain_length = configuration_table[s.level].max_chain; s.strstart = 0; s.block_start = 0; s.lookahead = 0; s.insert = 0; s.match_length = s.prev_length = MIN_MATCH - 1; s.match_available = 0; s.ins_h = 0 } function DeflateState() { this.strm = null; this.status = 0; this.pending_buf = null; this.pending_buf_size = 0; this.pending_out = 0; this.pending = 0; this.wrap = 0; this.gzhead = null; this.gzindex = 0; this.method = Z_DEFLATED; this.last_flush = -1; this.w_size = 0; this.w_bits = 0; this.w_mask = 0; this.window = null; this.window_size = 0; this.prev = null; this.head = null; this.ins_h = 0; this.hash_size = 0; this.hash_bits = 0; this.hash_mask = 0; this.hash_shift = 0; this.block_start = 0; this.match_length = 0; this.prev_match = 0; this.match_available = 0; this.strstart = 0; this.match_start = 0; this.lookahead = 0; this.prev_length = 0; this.max_chain_length = 0; this.max_lazy_match = 0; this.level = 0; this.strategy = 0; this.good_match = 0; this.nice_match = 0; this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2); this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2); this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2); zero(this.dyn_ltree); zero(this.dyn_dtree); zero(this.bl_tree); this.l_desc = null; this.d_desc = null; this.bl_desc = null; this.bl_count = new utils.Buf16(MAX_BITS + 1); this.heap = new utils.Buf16(2 * L_CODES + 1); zero(this.heap); this.heap_len = 0; this.heap_max = 0; this.depth = new utils.Buf16(2 * L_CODES + 1); zero(this.depth); this.l_buf = 0; this.lit_bufsize = 0; this.last_lit = 0; this.d_buf = 0; this.opt_len = 0; this.static_len = 0; this.matches = 0; this.insert = 0; this.bi_buf = 0; this.bi_valid = 0 } function deflateResetKeep(strm) { var s; if (!strm || !strm.state) { return err(strm, Z_STREAM_ERROR) } strm.total_in = strm.total_out = 0; strm.data_type = Z_UNKNOWN; s = strm.state; s.pending = 0; s.pending_out = 0; if (s.wrap < 0) { s.wrap = -s.wrap } s.status = s.wrap ? INIT_STATE : BUSY_STATE; strm.adler = s.wrap === 2 ? 0 : 1; s.last_flush = Z_NO_FLUSH; trees._tr_init(s); return Z_OK } function deflateReset(strm) { var ret = deflateResetKeep(strm); if (ret === Z_OK) { lm_init(strm.state) } return ret } function deflateSetHeader(strm, head) { if (!strm || !strm.state) { return Z_STREAM_ERROR } if (strm.state.wrap !== 2) { return Z_STREAM_ERROR } strm.state.gzhead = head; return Z_OK } function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { if (!strm) { return Z_STREAM_ERROR } var wrap = 1; if (level === Z_DEFAULT_COMPRESSION) { level = 6 } if (windowBits < 0) { wrap = 0; windowBits = -windowBits } else if (windowBits > 15) { wrap = 2; windowBits -= 16 } if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return err(strm, Z_STREAM_ERROR) } if (windowBits === 8) { windowBits = 9 } var s = new DeflateState; strm.state = s; s.strm = strm; s.wrap = wrap; s.gzhead = null; s.w_bits = windowBits; s.w_size = 1 << s.w_bits; s.w_mask = s.w_size - 1; s.hash_bits = memLevel + 7; s.hash_size = 1 << s.hash_bits; s.hash_mask = s.hash_size - 1; s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); s.window = new utils.Buf8(s.w_size * 2); s.head = new utils.Buf16(s.hash_size); s.prev = new utils.Buf16(s.w_size); s.lit_bufsize = 1 << memLevel + 6; s.pending_buf_size = s.lit_bufsize * 4; s.pending_buf = new utils.Buf8(s.pending_buf_size); s.d_buf = s.lit_bufsize >> 1; s.l_buf = (1 + 2) * s.lit_bufsize; s.level = level; s.strategy = strategy; s.method = method; return deflateReset(strm) } function deflateInit(strm, level) { return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY) } function deflate(strm, flush) { var old_flush, s; var beg, val; if (!strm || !strm.state || flush > Z_BLOCK || flush < 0) { return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR } s = strm.state; if (!strm.output || !strm.input && strm.avail_in !== 0 || s.status === FINISH_STATE && flush !== Z_FINISH) { return err(strm, strm.avail_out === 0 ? Z_BUF_ERROR : Z_STREAM_ERROR) } s.strm = strm; old_flush = s.last_flush; s.last_flush = flush; if (s.status === INIT_STATE) { if (s.wrap === 2) { strm.adler = 0; put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); if (!s.gzhead) { put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); put_byte(s, OS_CODE); s.status = BUSY_STATE } else { put_byte(s, (s.gzhead.text ? 1 : 0) + (s.gzhead.hcrc ? 2 : 0) + (!s.gzhead.extra ? 0 : 4) + (!s.gzhead.name ? 0 : 8) + (!s.gzhead.comment ? 0 : 16)); put_byte(s, s.gzhead.time & 255); put_byte(s, s.gzhead.time >> 8 & 255); put_byte(s, s.gzhead.time >> 16 & 255); put_byte(s, s.gzhead.time >> 24 & 255); put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); put_byte(s, s.gzhead.os & 255); if (s.gzhead.extra && s.gzhead.extra.length) { put_byte(s, s.gzhead.extra.length & 255); put_byte(s, s.gzhead.extra.length >> 8 & 255) } if (s.gzhead.hcrc) { strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0) } s.gzindex = 0; s.status = EXTRA_STATE } } else { var header = Z_DEFLATED + (s.w_bits - 8 << 4) << 8; var level_flags = -1; if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { level_flags = 0 } else if (s.level < 6) { level_flags = 1 } else if (s.level === 6) { level_flags = 2 } else { level_flags = 3 } header |= level_flags << 6; if (s.strstart !== 0) { header |= PRESET_DICT } header += 31 - header % 31; s.status = BUSY_STATE; putShortMSB(s, header); if (s.strstart !== 0) { putShortMSB(s, strm.adler >>> 16); putShortMSB(s, strm.adler & 65535) } strm.adler = 1 } } if (s.status === EXTRA_STATE) { if (s.gzhead.extra) { beg = s.pending; while (s.gzindex < (s.gzhead.extra.length & 65535)) { if (s.pending === s.pending_buf_size) { if (s.gzhead.hcrc && s.pending > beg) { strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg) } flush_pending(strm); beg = s.pending; if (s.pending === s.pending_buf_size) { break } } put_byte(s, s.gzhead.extra[s.gzindex] & 255); s.gzindex++ } if (s.gzhead.hcrc && s.pending > beg) { strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg) } if (s.gzindex === s.gzhead.extra.length) { s.gzindex = 0; s.status = NAME_STATE } } else { s.status = NAME_STATE } } if (s.status === NAME_STATE) { if (s.gzhead.name) { beg = s.pending; do { if (s.pending === s.pending_buf_size) { if (s.gzhead.hcrc && s.pending > beg) { strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg) } flush_pending(strm); beg = s.pending; if (s.pending === s.pending_buf_size) { val = 1; break } } if (s.gzindex < s.gzhead.name.length) { val = s.gzhead.name.charCodeAt(s.gzindex++) & 255 } else { val = 0 } put_byte(s, val) } while (val !== 0); if (s.gzhead.hcrc && s.pending > beg) { strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg) } if (val === 0) { s.gzindex = 0; s.status = COMMENT_STATE } } else { s.status = COMMENT_STATE } } if (s.status === COMMENT_STATE) { if (s.gzhead.comment) { beg = s.pending; do { if (s.pending === s.pending_buf_size) { if (s.gzhead.hcrc && s.pending > beg) { strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg) } flush_pending(strm); beg = s.pending; if (s.pending === s.pending_buf_size) { val = 1; break } } if (s.gzindex < s.gzhead.comment.length) { val = s.gzhead.comment.charCodeAt(s.gzindex++) & 255 } else { val = 0 } put_byte(s, val) } while (val !== 0); if (s.gzhead.hcrc && s.pending > beg) { strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg) } if (val === 0) { s.status = HCRC_STATE } } else { s.status = HCRC_STATE } } if (s.status === HCRC_STATE) { if (s.gzhead.hcrc) { if (s.pending + 2 > s.pending_buf_size) { flush_pending(strm) } if (s.pending + 2 <= s.pending_buf_size) { put_byte(s, strm.adler & 255); put_byte(s, strm.adler >> 8 & 255); strm.adler = 0; s.status = BUSY_STATE } } else { s.status = BUSY_STATE } } if (s.pending !== 0) { flush_pending(strm); if (strm.avail_out === 0) { s.last_flush = -1; return Z_OK } } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && flush !== Z_FINISH) { return err(strm, Z_BUF_ERROR) } if (s.status === FINISH_STATE && strm.avail_in !== 0) { return err(strm, Z_BUF_ERROR) } if (strm.avail_in !== 0 || s.lookahead !== 0 || flush !== Z_NO_FLUSH && s.status !== FINISH_STATE) { var bstate = s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s.strategy === Z_RLE ? deflate_rle(s, flush) : configuration_table[s.level].func(s, flush); if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { s.status = FINISH_STATE } if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { if (strm.avail_out === 0) { s.last_flush = -1 } return Z_OK } if (bstate === BS_BLOCK_DONE) { if (flush === Z_PARTIAL_FLUSH) { trees._tr_align(s) } else if (flush !== Z_BLOCK) { trees._tr_stored_block(s, 0, 0, false); if (flush === Z_FULL_FLUSH) { zero(s.head); if (s.lookahead === 0) { s.strstart = 0; s.block_start = 0; s.insert = 0 } } } flush_pending(strm); if (strm.avail_out === 0) { s.last_flush = -1; return Z_OK } } } if (flush !== Z_FINISH) { return Z_OK } if (s.wrap <= 0) { return Z_STREAM_END } if (s.wrap === 2) { put_byte(s, strm.adler & 255); put_byte(s, strm.adler >> 8 & 255); put_byte(s, strm.adler >> 16 & 255); put_byte(s, strm.adler >> 24 & 255); put_byte(s, strm.total_in & 255); put_byte(s, strm.total_in >> 8 & 255); put_byte(s, strm.total_in >> 16 & 255); put_byte(s, strm.total_in >> 24 & 255) } else { putShortMSB(s, strm.adler >>> 16); putShortMSB(s, strm.adler & 65535) } flush_pending(strm); if (s.wrap > 0) { s.wrap = -s.wrap } return s.pending !== 0 ? Z_OK : Z_STREAM_END } function deflateEnd(strm) { var status; if (!strm || !strm.state) { return Z_STREAM_ERROR } status = strm.state.status; if (status !== INIT_STATE && status !== EXTRA_STATE && status !== NAME_STATE && status !== COMMENT_STATE && status !== HCRC_STATE && status !== BUSY_STATE && status !== FINISH_STATE) { return err(strm, Z_STREAM_ERROR) } strm.state = null; return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK } exports.deflateInit = deflateInit; exports.deflateInit2 = deflateInit2; exports.deflateReset = deflateReset; exports.deflateResetKeep = deflateResetKeep; exports.deflateSetHeader = deflateSetHeader; exports.deflate = deflate; exports.deflateEnd = deflateEnd; exports.deflateInfo = "pako deflate (from Nodeca project)" }, { "../utils/common": 27, "./adler32": 29, "./crc32": 31, "./messages": 37, "./trees": 38 } ], 33: [function (_dereq_, module, exports) { "use strict"; function GZheader() { this.text = 0; this.time = 0; this.xflags = 0; this.os = 0; this.extra = null; this.extra_len = 0; this.name = ""; this.comment = ""; this.hcrc = 0; this.done = false } module.exports = GZheader }, {} ], 34: [function (_dereq_, module, exports) { "use strict"; var BAD = 30; var TYPE = 12; module.exports = function inflate_fast(strm, start) { var state; var _in; var last; var _out; var beg; var end; var dmax; var wsize; var whave; var wnext; var window; var hold; var bits; var lcode; var dcode; var lmask; var dmask; var here; var op; var len; var dist; var from; var from_source; var input, output; state = strm.state; _in = strm.next_in; input = strm.input; last = _in + (strm.avail_in - 5); _out = strm.next_out; output = strm.output; beg = _out - (start - strm.avail_out); end = _out + (strm.avail_out - 257); dmax = state.dmax; wsize = state.wsize; whave = state.whave; wnext = state.wnext; window = state.window; hold = state.hold; bits = state.bits; lcode = state.lencode; dcode = state.distcode; lmask = (1 << state.lenbits) - 1; dmask = (1 << state.distbits) - 1; top: do { if (bits < 15) { hold += input[_in++] << bits; bits += 8; hold += input[_in++] << bits; bits += 8 } here = lcode[hold & lmask]; dolen: for (; ; ) { op = here >>> 24; hold >>>= op; bits -= op; op = here >>> 16 & 255; if (op === 0) { output[_out++] = here & 65535 } else if (op & 16) { len = here & 65535; op &= 15; if (op) { if (bits < op) { hold += input[_in++] << bits; bits += 8 } len += hold & (1 << op) - 1; hold >>>= op; bits -= op } if (bits < 15) { hold += input[_in++] << bits; bits += 8; hold += input[_in++] << bits; bits += 8 } here = dcode[hold & dmask]; dodist: for (; ; ) { op = here >>> 24; hold >>>= op; bits -= op; op = here >>> 16 & 255; if (op & 16) { dist = here & 65535; op &= 15; if (bits < op) { hold += input[_in++] << bits; bits += 8; if (bits < op) { hold += input[_in++] << bits; bits += 8 } } dist += hold & (1 << op) - 1; if (dist > dmax) { strm.msg = "invalid distance too far back"; state.mode = BAD; break top } hold >>>= op; bits -= op; op = _out - beg; if (dist > op) { op = dist - op; if (op > whave) { if (state.sane) { strm.msg = "invalid distance too far back"; state.mode = BAD; break top } } from = 0; from_source = window; if (wnext === 0) { from += wsize - op; if (op < len) { len -= op; do { output[_out++] = window[from++] } while (--op); from = _out - dist; from_source = output } } else if (wnext < op) { from += wsize + wnext - op; op -= wnext; if (op < len) { len -= op; do { output[_out++] = window[from++] } while (--op); from = 0; if (wnext < len) { op = wnext; len -= op; do { output[_out++] = window[from++] } while (--op); from = _out - dist; from_source = output } } } else { from += wnext - op; if (op < len) { len -= op; do { output[_out++] = window[from++] } while (--op); from = _out - dist; from_source = output } } while (len > 2) { output[_out++] = from_source[from++]; output[_out++] = from_source[from++]; output[_out++] = from_source[from++]; len -= 3 } if (len) { output[_out++] = from_source[from++]; if (len > 1) { output[_out++] = from_source[from++] } } } else { from = _out - dist; do { output[_out++] = output[from++]; output[_out++] = output[from++]; output[_out++] = output[from++]; len -= 3 } while (len > 2); if (len) { output[_out++] = output[from++]; if (len > 1) { output[_out++] = output[from++] } } } } else if ((op & 64) === 0) { here = dcode[(here & 65535) + (hold & (1 << op) - 1)]; continue dodist } else { strm.msg = "invalid distance code"; state.mode = BAD; break top } break } } else if ((op & 64) === 0) { here = lcode[(here & 65535) + (hold & (1 << op) - 1)]; continue dolen } else if (op & 32) { state.mode = TYPE; break top } else { strm.msg = "invalid literal/length code"; state.mode = BAD; break top } break } } while (_in < last && _out < end); len = bits >> 3; _in -= len; bits -= len << 3; hold &= (1 << bits) - 1; strm.next_in = _in; strm.next_out = _out; strm.avail_in = _in < last ? 5 + (last - _in) : 5 - (_in - last); strm.avail_out = _out < end ? 257 + (end - _out) : 257 - (_out - end); state.hold = hold; state.bits = bits; return } }, {} ], 35: [function (_dereq_, module, exports) { "use strict"; var utils = _dereq_("../utils/common"); var adler32 = _dereq_("./adler32"); var crc32 = _dereq_("./crc32"); var inflate_fast = _dereq_("./inffast"); var inflate_table = _dereq_("./inftrees"); var CODES = 0; var LENS = 1; var DISTS = 2; var Z_FINISH = 4; var Z_BLOCK = 5; var Z_TREES = 6; var Z_OK = 0; var Z_STREAM_END = 1; var Z_NEED_DICT = 2; var Z_STREAM_ERROR = -2; var Z_DATA_ERROR = -3; var Z_MEM_ERROR = -4; var Z_BUF_ERROR = -5; var Z_DEFLATED = 8; var HEAD = 1; var FLAGS = 2; var TIME = 3; var OS = 4; var EXLEN = 5; var EXTRA = 6; var NAME = 7; var COMMENT = 8; var HCRC = 9; var DICTID = 10; var DICT = 11; var TYPE = 12; var TYPEDO = 13; var STORED = 14; var COPY_ = 15; var COPY = 16; var TABLE = 17; var LENLENS = 18; var CODELENS = 19; var LEN_ = 20; var LEN = 21; var LENEXT = 22; var DIST = 23; var DISTEXT = 24; var MATCH = 25; var LIT = 26; var CHECK = 27; var LENGTH = 28; var DONE = 29; var BAD = 30; var MEM = 31; var SYNC = 32; var ENOUGH_LENS = 852; var ENOUGH_DISTS = 592; var MAX_WBITS = 15; var DEF_WBITS = MAX_WBITS; function ZSWAP32(q) { return (q >>> 24 & 255) + (q >>> 8 & 65280) + ((q & 65280) << 8) + ((q & 255) << 24) } function InflateState() { this.mode = 0; this.last = false; this.wrap = 0; this.havedict = false; this.flags = 0; this.dmax = 0; this.check = 0; this.total = 0; this.head = null; this.wbits = 0; this.wsize = 0; this.whave = 0; this.wnext = 0; this.window = null; this.hold = 0; this.bits = 0; this.length = 0; this.offset = 0; this.extra = 0; this.lencode = null; this.distcode = null; this.lenbits = 0; this.distbits = 0; this.ncode = 0; this.nlen = 0; this.ndist = 0; this.have = 0; this.next = null; this.lens = new utils.Buf16(320); this.work = new utils.Buf16(288); this.lendyn = null; this.distdyn = null; this.sane = 0; this.back = 0; this.was = 0 } function inflateResetKeep(strm) { var state; if (!strm || !strm.state) { return Z_STREAM_ERROR } state = strm.state; strm.total_in = strm.total_out = state.total = 0; strm.msg = ""; if (state.wrap) { strm.adler = state.wrap & 1 } state.mode = HEAD; state.last = 0; state.havedict = 0; state.dmax = 32768; state.head = null; state.hold = 0; state.bits = 0; state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); state.sane = 1; state.back = -1; return Z_OK } function inflateReset(strm) { var state; if (!strm || !strm.state) { return Z_STREAM_ERROR } state = strm.state; state.wsize = 0; state.whave = 0; state.wnext = 0; return inflateResetKeep(strm) } function inflateReset2(strm, windowBits) { var wrap; var state; if (!strm || !strm.state) { return Z_STREAM_ERROR } state = strm.state; if (windowBits < 0) { wrap = 0; windowBits = -windowBits } else { wrap = (windowBits >> 4) + 1; if (windowBits < 48) { windowBits &= 15 } } if (windowBits && (windowBits < 8 || windowBits > 15)) { return Z_STREAM_ERROR } if (state.window !== null && state.wbits !== windowBits) { state.window = null } state.wrap = wrap; state.wbits = windowBits; return inflateReset(strm) } function inflateInit2(strm, windowBits) { var ret; var state; if (!strm) { return Z_STREAM_ERROR } state = new InflateState; strm.state = state; state.window = null; ret = inflateReset2(strm, windowBits); if (ret !== Z_OK) { strm.state = null } return ret } function inflateInit(strm) { return inflateInit2(strm, DEF_WBITS) } var virgin = true; var lenfix, distfix; function fixedtables(state) { if (virgin) { var sym; lenfix = new utils.Buf32(512); distfix = new utils.Buf32(32); sym = 0; while (sym < 144) { state.lens[sym++] = 8 } while (sym < 256) { state.lens[sym++] = 9 } while (sym < 280) { state.lens[sym++] = 7 } while (sym < 288) { state.lens[sym++] = 8 } inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); sym = 0; while (sym < 32) { state.lens[sym++] = 5 } inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); virgin = false } state.lencode = lenfix; state.lenbits = 9; state.distcode = distfix; state.distbits = 5 } function updatewindow(strm, src, end, copy) { var dist; var state = strm.state; if (state.window === null) { state.wsize = 1 << state.wbits; state.wnext = 0; state.whave = 0; state.window = new utils.Buf8(state.wsize) } if (copy >= state.wsize) { utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0); state.wnext = 0; state.whave = state.wsize } else { dist = state.wsize - state.wnext; if (dist > copy) { dist = copy } utils.arraySet(state.window, src, end - copy, dist, state.wnext); copy -= dist; if (copy) { utils.arraySet(state.window, src, end - copy, copy, 0); state.wnext = copy; state.whave = state.wsize } else { state.wnext += dist; if (state.wnext === state.wsize) { state.wnext = 0 } if (state.whave < state.wsize) { state.whave += dist } } } return 0 } function inflate(strm, flush) { var state; var input, output; var next; var put; var have, left; var hold; var bits; var _in, _out; var copy; var from; var from_source; var here = 0; var here_bits, here_op, here_val; var last_bits, last_op, last_val; var len; var ret; var hbuf = new utils.Buf8(4); var opts; var n; var order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; if (!strm || !strm.state || !strm.output || !strm.input && strm.avail_in !== 0) { return Z_STREAM_ERROR } state = strm.state; if (state.mode === TYPE) { state.mode = TYPEDO } put = strm.next_out; output = strm.output; left = strm.avail_out; next = strm.next_in; input = strm.input; have = strm.avail_in; hold = state.hold; bits = state.bits; _in = have; _out = left; ret = Z_OK; inf_leave: for (; ; ) { switch (state.mode) { case HEAD: if (state.wrap === 0) { state.mode = TYPEDO; break } while (bits < 16) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } if (state.wrap & 2 && hold === 35615) { state.check = 0; hbuf[0] = hold & 255; hbuf[1] = hold >>> 8 & 255; state.check = crc32(state.check, hbuf, 2, 0); hold = 0; bits = 0; state.mode = FLAGS; break } state.flags = 0; if (state.head) { state.head.done = false } if (!(state.wrap & 1) || (((hold & 255) << 8) + (hold >> 8)) % 31) { strm.msg = "incorrect header check"; state.mode = BAD; break } if ((hold & 15) !== Z_DEFLATED) { strm.msg = "unknown compression method"; state.mode = BAD; break } hold >>>= 4; bits -= 4; len = (hold & 15) + 8; if (state.wbits === 0) { state.wbits = len } else if (len > state.wbits) { strm.msg = "invalid window size"; state.mode = BAD; break } state.dmax = 1 << len; strm.adler = state.check = 1; state.mode = hold & 512 ? DICTID : TYPE; hold = 0; bits = 0; break; case FLAGS: while (bits < 16) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } state.flags = hold; if ((state.flags & 255) !== Z_DEFLATED) { strm.msg = "unknown compression method"; state.mode = BAD; break } if (state.flags & 57344) { strm.msg = "unknown header flags set"; state.mode = BAD; break } if (state.head) { state.head.text = hold >> 8 & 1 } if (state.flags & 512) { hbuf[0] = hold & 255; hbuf[1] = hold >>> 8 & 255; state.check = crc32(state.check, hbuf, 2, 0) } hold = 0; bits = 0; state.mode = TIME; case TIME: while (bits < 32) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } if (state.head) { state.head.time = hold } if (state.flags & 512) { hbuf[0] = hold & 255; hbuf[1] = hold >>> 8 & 255; hbuf[2] = hold >>> 16 & 255; hbuf[3] = hold >>> 24 & 255; state.check = crc32(state.check, hbuf, 4, 0) } hold = 0; bits = 0; state.mode = OS; case OS: while (bits < 16) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } if (state.head) { state.head.xflags = hold & 255; state.head.os = hold >> 8 } if (state.flags & 512) { hbuf[0] = hold & 255; hbuf[1] = hold >>> 8 & 255; state.check = crc32(state.check, hbuf, 2, 0) } hold = 0; bits = 0; state.mode = EXLEN; case EXLEN: if (state.flags & 1024) { while (bits < 16) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } state.length = hold; if (state.head) { state.head.extra_len = hold } if (state.flags & 512) { hbuf[0] = hold & 255; hbuf[1] = hold >>> 8 & 255; state.check = crc32(state.check, hbuf, 2, 0) } hold = 0; bits = 0 } else if (state.head) { state.head.extra = null } state.mode = EXTRA; case EXTRA: if (state.flags & 1024) { copy = state.length; if (copy > have) { copy = have } if (copy) { if (state.head) { len = state.head.extra_len - state.length; if (!state.head.extra) { state.head.extra = new Array(state.head.extra_len) } utils.arraySet(state.head.extra, input, next, copy, len) } if (state.flags & 512) { state.check = crc32(state.check, input, copy, next) } have -= copy; next += copy; state.length -= copy } if (state.length) { break inf_leave } } state.length = 0; state.mode = NAME; case NAME: if (state.flags & 2048) { if (have === 0) { break inf_leave } copy = 0; do { len = input[next + copy++]; if (state.head && len && state.length < 65536) { state.head.name += String.fromCharCode(len) } } while (len && copy < have); if (state.flags & 512) { state.check = crc32(state.check, input, copy, next) } have -= copy; next += copy; if (len) { break inf_leave } } else if (state.head) { state.head.name = null } state.length = 0; state.mode = COMMENT; case COMMENT: if (state.flags & 4096) { if (have === 0) { break inf_leave } copy = 0; do { len = input[next + copy++]; if (state.head && len && state.length < 65536) { state.head.comment += String.fromCharCode(len) } } while (len && copy < have); if (state.flags & 512) { state.check = crc32(state.check, input, copy, next) } have -= copy; next += copy; if (len) { break inf_leave } } else if (state.head) { state.head.comment = null } state.mode = HCRC; case HCRC: if (state.flags & 512) { while (bits < 16) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } if (hold !== (state.check & 65535)) { strm.msg = "header crc mismatch"; state.mode = BAD; break } hold = 0; bits = 0 } if (state.head) { state.head.hcrc = state.flags >> 9 & 1; state.head.done = true } strm.adler = state.check = 0; state.mode = TYPE; break; case DICTID: while (bits < 32) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } strm.adler = state.check = ZSWAP32(hold); hold = 0; bits = 0; state.mode = DICT; case DICT: if (state.havedict === 0) { strm.next_out = put; strm.avail_out = left; strm.next_in = next; strm.avail_in = have; state.hold = hold; state.bits = bits; return Z_NEED_DICT } strm.adler = state.check = 1; state.mode = TYPE; case TYPE: if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave } case TYPEDO: if (state.last) { hold >>>= bits & 7; bits -= bits & 7; state.mode = CHECK; break } while (bits < 3) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } state.last = hold & 1; hold >>>= 1; bits -= 1; switch (hold & 3) { case 0: state.mode = STORED; break; case 1: fixedtables(state); state.mode = LEN_; if (flush === Z_TREES) { hold >>>= 2; bits -= 2; break inf_leave } break; case 2: state.mode = TABLE; break; case 3: strm.msg = "invalid block type"; state.mode = BAD } hold >>>= 2; bits -= 2; break; case STORED: hold >>>= bits & 7; bits -= bits & 7; while (bits < 32) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } if ((hold & 65535) !== (hold >>> 16 ^ 65535)) { strm.msg = "invalid stored block lengths"; state.mode = BAD; break } state.length = hold & 65535; hold = 0; bits = 0; state.mode = COPY_; if (flush === Z_TREES) { break inf_leave } case COPY_: state.mode = COPY; case COPY: copy = state.length; if (copy) { if (copy > have) { copy = have } if (copy > left) { copy = left } if (copy === 0) { break inf_leave } utils.arraySet(output, input, next, copy, put); have -= copy; next += copy; left -= copy; put += copy; state.length -= copy; break } state.mode = TYPE; break; case TABLE: while (bits < 14) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } state.nlen = (hold & 31) + 257; hold >>>= 5; bits -= 5; state.ndist = (hold & 31) + 1; hold >>>= 5; bits -= 5; state.ncode = (hold & 15) + 4; hold >>>= 4; bits -= 4; if (state.nlen > 286 || state.ndist > 30) { strm.msg = "too many length or distance symbols"; state.mode = BAD; break } state.have = 0; state.mode = LENLENS; case LENLENS: while (state.have < state.ncode) { while (bits < 3) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } state.lens[order[state.have++]] = hold & 7; hold >>>= 3; bits -= 3 } while (state.have < 19) { state.lens[order[state.have++]] = 0 } state.lencode = state.lendyn; state.lenbits = 7; opts = { bits: state.lenbits }; ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); state.lenbits = opts.bits; if (ret) { strm.msg = "invalid code lengths set"; state.mode = BAD; break } state.have = 0; state.mode = CODELENS; case CODELENS: while (state.have < state.nlen + state.ndist) { for (; ; ) { here = state.lencode[hold & (1 << state.lenbits) - 1]; here_bits = here >>> 24; here_op = here >>> 16 & 255; here_val = here & 65535; if (here_bits <= bits) { break } if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } if (here_val < 16) { hold >>>= here_bits; bits -= here_bits; state.lens[state.have++] = here_val } else { if (here_val === 16) { n = here_bits + 2; while (bits < n) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } hold >>>= here_bits; bits -= here_bits; if (state.have === 0) { strm.msg = "invalid bit length repeat"; state.mode = BAD; break } len = state.lens[state.have - 1]; copy = 3 + (hold & 3); hold >>>= 2; bits -= 2 } else if (here_val === 17) { n = here_bits + 3; while (bits < n) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } hold >>>= here_bits; bits -= here_bits; len = 0; copy = 3 + (hold & 7); hold >>>= 3; bits -= 3 } else { n = here_bits + 7; while (bits < n) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } hold >>>= here_bits; bits -= here_bits; len = 0; copy = 11 + (hold & 127); hold >>>= 7; bits -= 7 } if (state.have + copy > state.nlen + state.ndist) { strm.msg = "invalid bit length repeat"; state.mode = BAD; break } while (copy--) { state.lens[state.have++] = len } } } if (state.mode === BAD) { break } if (state.lens[256] === 0) { strm.msg = "invalid code -- missing end-of-block"; state.mode = BAD; break } state.lenbits = 9; opts = { bits: state.lenbits }; ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); state.lenbits = opts.bits; if (ret) { strm.msg = "invalid literal/lengths set"; state.mode = BAD; break } state.distbits = 6; state.distcode = state.distdyn; opts = { bits: state.distbits }; ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); state.distbits = opts.bits; if (ret) { strm.msg = "invalid distances set"; state.mode = BAD; break } state.mode = LEN_; if (flush === Z_TREES) { break inf_leave } case LEN_: state.mode = LEN; case LEN: if (have >= 6 && left >= 258) { strm.next_out = put; strm.avail_out = left; strm.next_in = next; strm.avail_in = have; state.hold = hold; state.bits = bits; inflate_fast(strm, _out); put = strm.next_out; output = strm.output; left = strm.avail_out; next = strm.next_in; input = strm.input; have = strm.avail_in; hold = state.hold; bits = state.bits; if (state.mode === TYPE) { state.back = -1 } break } state.back = 0; for (; ; ) { here = state.lencode[hold & (1 << state.lenbits) - 1]; here_bits = here >>> 24; here_op = here >>> 16 & 255; here_val = here & 65535; if (here_bits <= bits) { break } if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } if (here_op && (here_op & 240) === 0) { last_bits = here_bits; last_op = here_op; last_val = here_val; for (; ; ) { here = state.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> last_bits)]; here_bits = here >>> 24; here_op = here >>> 16 & 255; here_val = here & 65535; if (last_bits + here_bits <= bits) { break } if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } hold >>>= last_bits; bits -= last_bits; state.back += last_bits } hold >>>= here_bits; bits -= here_bits; state.back += here_bits; state.length = here_val; if (here_op === 0) { state.mode = LIT; break } if (here_op & 32) { state.back = -1; state.mode = TYPE; break } if (here_op & 64) { strm.msg = "invalid literal/length code"; state.mode = BAD; break } state.extra = here_op & 15; state.mode = LENEXT; case LENEXT: if (state.extra) { n = state.extra; while (bits < n) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } state.length += hold & (1 << state.extra) - 1; hold >>>= state.extra; bits -= state.extra; state.back += state.extra } state.was = state.length; state.mode = DIST; case DIST: for (; ; ) { here = state.distcode[hold & (1 << state.distbits) - 1]; here_bits = here >>> 24; here_op = here >>> 16 & 255; here_val = here & 65535; if (here_bits <= bits) { break } if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } if ((here_op & 240) === 0) { last_bits = here_bits; last_op = here_op; last_val = here_val; for (; ; ) { here = state.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> last_bits)]; here_bits = here >>> 24; here_op = here >>> 16 & 255; here_val = here & 65535; if (last_bits + here_bits <= bits) { break } if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } hold >>>= last_bits; bits -= last_bits; state.back += last_bits } hold >>>= here_bits; bits -= here_bits; state.back += here_bits; if (here_op & 64) { strm.msg = "invalid distance code"; state.mode = BAD; break } state.offset = here_val; state.extra = here_op & 15; state.mode = DISTEXT; case DISTEXT: if (state.extra) { n = state.extra; while (bits < n) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } state.offset += hold & (1 << state.extra) - 1; hold >>>= state.extra; bits -= state.extra; state.back += state.extra } if (state.offset > state.dmax) { strm.msg = "invalid distance too far back"; state.mode = BAD; break } state.mode = MATCH; case MATCH: if (left === 0) { break inf_leave } copy = _out - left; if (state.offset > copy) { copy = state.offset - copy; if (copy > state.whave) { if (state.sane) { strm.msg = "invalid distance too far back"; state.mode = BAD; break } } if (copy > state.wnext) { copy -= state.wnext; from = state.wsize - copy } else { from = state.wnext - copy } if (copy > state.length) { copy = state.length } from_source = state.window } else { from_source = output; from = put - state.offset; copy = state.length } if (copy > left) { copy = left } left -= copy; state.length -= copy; do { output[put++] = from_source[from++] } while (--copy); if (state.length === 0) { state.mode = LEN } break; case LIT: if (left === 0) { break inf_leave } output[put++] = state.length; left--; state.mode = LEN; break; case CHECK: if (state.wrap) { while (bits < 32) { if (have === 0) { break inf_leave } have--; hold |= input[next++] << bits; bits += 8 } _out -= left; strm.total_out += _out; state.total += _out; if (_out) { strm.adler = state.check = state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out) } _out = left; if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) { strm.msg = "incorrect data check"; state.mode = BAD; break } hold = 0; bits = 0 } state.mode = LENGTH; case LENGTH: if (state.wrap && state.flags) { while (bits < 32) { if (have === 0) { break inf_leave } have--; hold += input[next++] << bits; bits += 8 } if (hold !== (state.total & 4294967295)) { strm.msg = "incorrect length check"; state.mode = BAD; break } hold = 0; bits = 0 } state.mode = DONE; case DONE: ret = Z_STREAM_END; break inf_leave; case BAD: ret = Z_DATA_ERROR; break inf_leave; case MEM: return Z_MEM_ERROR; case SYNC: default: return Z_STREAM_ERROR } } strm.next_out = put; strm.avail_out = left; strm.next_in = next; strm.avail_in = have; state.hold = hold; state.bits = bits; if (state.wsize || _out !== strm.avail_out && state.mode < BAD && (state.mode < CHECK || flush !== Z_FINISH)) { if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { state.mode = MEM; return Z_MEM_ERROR } } _in -= strm.avail_in; _out -= strm.avail_out; strm.total_in += _in; strm.total_out += _out; state.total += _out; if (state.wrap && _out) { strm.adler = state.check = state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out) } strm.data_type = state.bits + (state.last ? 64 : 0) + (state.mode === TYPE ? 128 : 0) + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); if ((_in === 0 && _out === 0 || flush === Z_FINISH) && ret === Z_OK) { ret = Z_BUF_ERROR } return ret } function inflateEnd(strm) { if (!strm || !strm.state) { return Z_STREAM_ERROR } var state = strm.state; if (state.window) { state.window = null } strm.state = null; return Z_OK } function inflateGetHeader(strm, head) { var state; if (!strm || !strm.state) { return Z_STREAM_ERROR } state = strm.state; if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR } state.head = head; head.done = false; return Z_OK } exports.inflateReset = inflateReset; exports.inflateReset2 = inflateReset2; exports.inflateResetKeep = inflateResetKeep; exports.inflateInit = inflateInit; exports.inflateInit2 = inflateInit2; exports.inflate = inflate; exports.inflateEnd = inflateEnd; exports.inflateGetHeader = inflateGetHeader; exports.inflateInfo = "pako inflate (from Nodeca project)" }, { "../utils/common": 27, "./adler32": 29, "./crc32": 31, "./inffast": 34, "./inftrees": 36 } ], 36: [function (_dereq_, module, exports) { "use strict"; var utils = _dereq_("../utils/common"); var MAXBITS = 15; var ENOUGH_LENS = 852; var ENOUGH_DISTS = 592; var CODES = 0; var LENS = 1; var DISTS = 2; var lbase = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0]; var lext = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78]; var dbase = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0]; var dext = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64]; module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) { var bits = opts.bits; var len = 0; var sym = 0; var min = 0, max = 0; var root = 0; var curr = 0; var drop = 0; var left = 0; var used = 0; var huff = 0; var incr; var fill; var low; var mask; var next; var base = null; var base_index = 0; var end; var count = new utils.Buf16(MAXBITS + 1); var offs = new utils.Buf16(MAXBITS + 1); var extra = null; var extra_index = 0; var here_bits, here_op, here_val; for (len = 0; len <= MAXBITS; len++) { count[len] = 0 } for (sym = 0; sym < codes; sym++) { count[lens[lens_index + sym]]++ } root = bits; for (max = MAXBITS; max >= 1; max--) { if (count[max] !== 0) { break } } if (root > max) { root = max } if (max === 0) { table[table_index++] = 1 << 24 | 64 << 16 | 0; table[table_index++] = 1 << 24 | 64 << 16 | 0; opts.bits = 1; return 0 } for (min = 1; min < max; min++) { if (count[min] !== 0) { break } } if (root < min) { root = min } left = 1; for (len = 1; len <= MAXBITS; len++) { left <<= 1; left -= count[len]; if (left < 0) { return -1 } } if (left > 0 && (type === CODES || max !== 1)) { return -1 } offs[1] = 0; for (len = 1; len < MAXBITS; len++) { offs[len + 1] = offs[len] + count[len] } for (sym = 0; sym < codes; sym++) { if (lens[lens_index + sym] !== 0) { work[offs[lens[lens_index + sym]]++] = sym } } if (type === CODES) { base = extra = work; end = 19 } else if (type === LENS) { base = lbase; base_index -= 257; extra = lext; extra_index -= 257; end = 256 } else { base = dbase; extra = dext; end = -1 } huff = 0; sym = 0; len = min; next = table_index; curr = root; drop = 0; low = -1; used = 1 << root; mask = used - 1; if (type === LENS && used > ENOUGH_LENS || type === DISTS && used > ENOUGH_DISTS) { return 1 } var i = 0; for (; ; ) { i++; here_bits = len - drop; if (work[sym] < end) { here_op = 0; here_val = work[sym] } else if (work[sym] > end) { here_op = extra[extra_index + work[sym]]; here_val = base[base_index + work[sym]] } else { here_op = 32 + 64; here_val = 0 } incr = 1 << len - drop; fill = 1 << curr; min = fill; do { fill -= incr; table[next + (huff >> drop) + fill] = here_bits << 24 | here_op << 16 | here_val | 0 } while (fill !== 0); incr = 1 << len - 1; while (huff & incr) { incr >>= 1 } if (incr !== 0) { huff &= incr - 1; huff += incr } else { huff = 0 } sym++; if (--count[len] === 0) { if (len === max) { break } len = lens[lens_index + work[sym]] } if (len > root && (huff & mask) !== low) { if (drop === 0) { drop = root } next += min; curr = len - drop; left = 1 << curr; while (curr + drop < max) { left -= count[curr + drop]; if (left <= 0) { break } curr++; left <<= 1 } used += 1 << curr; if (type === LENS && used > ENOUGH_LENS || type === DISTS && used > ENOUGH_DISTS) { return 1 } low = huff & mask; table[low] = root << 24 | curr << 16 | next - table_index | 0 } } if (huff !== 0) { table[next + huff] = len - drop << 24 | 64 << 16 | 0 } opts.bits = root; return 0 } }, { "../utils/common": 27 } ], 37: [function (_dereq_, module, exports) { "use strict"; module.exports = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" } }, {} ], 38: [function (_dereq_, module, exports) { "use strict"; var utils = _dereq_("../utils/common"); var Z_FIXED = 4; var Z_BINARY = 0; var Z_TEXT = 1; var Z_UNKNOWN = 2; function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0 } } var STORED_BLOCK = 0; var STATIC_TREES = 1; var DYN_TREES = 2; var MIN_MATCH = 3; var MAX_MATCH = 258; var LENGTH_CODES = 29; var LITERALS = 256; var L_CODES = LITERALS + 1 + LENGTH_CODES; var D_CODES = 30; var BL_CODES = 19; var HEAP_SIZE = 2 * L_CODES + 1; var MAX_BITS = 15; var Buf_size = 16; var MAX_BL_BITS = 7; var END_BLOCK = 256; var REP_3_6 = 16; var REPZ_3_10 = 17; var REPZ_11_138 = 18; var extra_lbits = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]; var extra_dbits = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]; var extra_blbits = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]; var bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; var DIST_CODE_LEN = 512; var static_ltree = new Array((L_CODES + 2) * 2); zero(static_ltree); var static_dtree = new Array(D_CODES * 2); zero(static_dtree); var _dist_code = new Array(DIST_CODE_LEN); zero(_dist_code); var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); zero(_length_code); var base_length = new Array(LENGTH_CODES); zero(base_length); var base_dist = new Array(D_CODES); zero(base_dist); var StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) { this.static_tree = static_tree; this.extra_bits = extra_bits; this.extra_base = extra_base; this.elems = elems; this.max_length = max_length; this.has_stree = static_tree && static_tree.length }; var static_l_desc; var static_d_desc; var static_bl_desc; var TreeDesc = function (dyn_tree, stat_desc) { this.dyn_tree = dyn_tree; this.max_code = 0; this.stat_desc = stat_desc }; function d_code(dist) { return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)] } function put_short(s, w) { s.pending_buf[s.pending++] = w & 255; s.pending_buf[s.pending++] = w >>> 8 & 255 } function send_bits(s, value, length) { if (s.bi_valid > Buf_size - length) { s.bi_buf |= value << s.bi_valid & 65535; put_short(s, s.bi_buf); s.bi_buf = value >> Buf_size - s.bi_valid; s.bi_valid += length - Buf_size } else { s.bi_buf |= value << s.bi_valid & 65535; s.bi_valid += length } } function send_code(s, c, tree) { send_bits(s, tree[c * 2], tree[c * 2 + 1]) } function bi_reverse(code, len) { var res = 0; do { res |= code & 1; code >>>= 1; res <<= 1 } while (--len > 0); return res >>> 1 } function bi_flush(s) { if (s.bi_valid === 16) { put_short(s, s.bi_buf); s.bi_buf = 0; s.bi_valid = 0 } else if (s.bi_valid >= 8) { s.pending_buf[s.pending++] = s.bi_buf & 255; s.bi_buf >>= 8; s.bi_valid -= 8 } } function gen_bitlen(s, desc) { var tree = desc.dyn_tree; var max_code = desc.max_code; var stree = desc.stat_desc.static_tree; var has_stree = desc.stat_desc.has_stree; var extra = desc.stat_desc.extra_bits; var base = desc.stat_desc.extra_base; var max_length = desc.stat_desc.max_length; var h; var n, m; var bits; var xbits; var f; var overflow = 0; for (bits = 0; bits <= MAX_BITS; bits++) { s.bl_count[bits] = 0 } tree[s.heap[s.heap_max] * 2 + 1] = 0; for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { n = s.heap[h]; bits = tree[tree[n * 2 + 1] * 2 + 1] + 1; if (bits > max_length) { bits = max_length; overflow++ } tree[n * 2 + 1] = bits; if (n > max_code) { continue } s.bl_count[bits]++; xbits = 0; if (n >= base) { xbits = extra[n - base] } f = tree[n * 2]; s.opt_len += f * (bits + xbits); if (has_stree) { s.static_len += f * (stree[n * 2 + 1] + xbits) } } if (overflow === 0) { return } do { bits = max_length - 1; while (s.bl_count[bits] === 0) { bits-- } s.bl_count[bits]--; s.bl_count[bits + 1] += 2; s.bl_count[max_length]--; overflow -= 2 } while (overflow > 0); for (bits = max_length; bits !== 0; bits--) { n = s.bl_count[bits]; while (n !== 0) { m = s.heap[--h]; if (m > max_code) { continue } if (tree[m * 2 + 1] !== bits) { s.opt_len += (bits - tree[m * 2 + 1]) * tree[m * 2]; tree[m * 2 + 1] = bits } n-- } } } function gen_codes(tree, max_code, bl_count) { var next_code = new Array(MAX_BITS + 1); var code = 0; var bits; var n; for (bits = 1; bits <= MAX_BITS; bits++) { next_code[bits] = code = code + bl_count[bits - 1] << 1 } for (n = 0; n <= max_code; n++) { var len = tree[n * 2 + 1]; if (len === 0) { continue } tree[n * 2] = bi_reverse(next_code[len]++, len) } } function tr_static_init() { var n; var bits; var length; var code; var dist; var bl_count = new Array(MAX_BITS + 1); length = 0; for (code = 0; code < LENGTH_CODES - 1; code++) { base_length[code] = length; for (n = 0; n < 1 << extra_lbits[code]; n++) { _length_code[length++] = code } } _length_code[length - 1] = code; dist = 0; for (code = 0; code < 16; code++) { base_dist[code] = dist; for (n = 0; n < 1 << extra_dbits[code]; n++) { _dist_code[dist++] = code } } dist >>= 7; for (; code < D_CODES; code++) { base_dist[code] = dist << 7; for (n = 0; n < 1 << extra_dbits[code] - 7; n++) { _dist_code[256 + dist++] = code } } for (bits = 0; bits <= MAX_BITS; bits++) { bl_count[bits] = 0 } n = 0; while (n <= 143) { static_ltree[n * 2 + 1] = 8; n++; bl_count[8]++ } while (n <= 255) { static_ltree[n * 2 + 1] = 9; n++; bl_count[9]++ } while (n <= 279) { static_ltree[n * 2 + 1] = 7; n++; bl_count[7]++ } while (n <= 287) { static_ltree[n * 2 + 1] = 8; n++; bl_count[8]++ } gen_codes(static_ltree, L_CODES + 1, bl_count); for (n = 0; n < D_CODES; n++) { static_dtree[n * 2 + 1] = 5; static_dtree[n * 2] = bi_reverse(n, 5) } static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS) } function init_block(s) { var n; for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2] = 0 } for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2] = 0 } for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2] = 0 } s.dyn_ltree[END_BLOCK * 2] = 1; s.opt_len = s.static_len = 0; s.last_lit = s.matches = 0 } function bi_windup(s) { if (s.bi_valid > 8) { put_short(s, s.bi_buf) } else if (s.bi_valid > 0) { s.pending_buf[s.pending++] = s.bi_buf } s.bi_buf = 0; s.bi_valid = 0 } function copy_block(s, buf, len, header) { bi_windup(s); if (header) { put_short(s, len); put_short(s, ~len) } utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); s.pending += len } function smaller(tree, n, m, depth) { var _n2 = n * 2; var _m2 = m * 2; return tree[_n2] < tree[_m2] || tree[_n2] === tree[_m2] && depth[n] <= depth[m] } function pqdownheap(s, tree, k) { var v = s.heap[k]; var j = k << 1; while (j <= s.heap_len) { if (j < s.heap_len && smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { j++ } if (smaller(tree, v, s.heap[j], s.depth)) { break } s.heap[k] = s.heap[j]; k = j; j <<= 1 } s.heap[k] = v } function compress_block(s, ltree, dtree) { var dist; var lc; var lx = 0; var code; var extra; if (s.last_lit !== 0) { do { dist = s.pending_buf[s.d_buf + lx * 2] << 8 | s.pending_buf[s.d_buf + lx * 2 + 1]; lc = s.pending_buf[s.l_buf + lx]; lx++; if (dist === 0) { send_code(s, lc, ltree) } else { code = _length_code[lc]; send_code(s, code + LITERALS + 1, ltree); extra = extra_lbits[code]; if (extra !== 0) { lc -= base_length[code]; send_bits(s, lc, extra) } dist--; code = d_code(dist); send_code(s, code, dtree); extra = extra_dbits[code]; if (extra !== 0) { dist -= base_dist[code]; send_bits(s, dist, extra) } } } while (lx < s.last_lit) } send_code(s, END_BLOCK, ltree) } function build_tree(s, desc) { var tree = desc.dyn_tree; var stree = desc.stat_desc.static_tree; var has_stree = desc.stat_desc.has_stree; var elems = desc.stat_desc.elems; var n, m; var max_code = -1; var node; s.heap_len = 0; s.heap_max = HEAP_SIZE; for (n = 0; n < elems; n++) { if (tree[n * 2] !== 0) { s.heap[++s.heap_len] = max_code = n; s.depth[n] = 0 } else { tree[n * 2 + 1] = 0 } } while (s.heap_len < 2) { node = s.heap[++s.heap_len] = max_code < 2 ? ++max_code : 0; tree[node * 2] = 1; s.depth[node] = 0; s.opt_len--; if (has_stree) { s.static_len -= stree[node * 2 + 1] } } desc.max_code = max_code; for (n = s.heap_len >> 1; n >= 1; n--) { pqdownheap(s, tree, n) } node = elems; do { n = s.heap[1]; s.heap[1] = s.heap[s.heap_len--]; pqdownheap(s, tree, 1); m = s.heap[1]; s.heap[--s.heap_max] = n; s.heap[--s.heap_max] = m; tree[node * 2] = tree[n * 2] + tree[m * 2]; s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; tree[n * 2 + 1] = tree[m * 2 + 1] = node; s.heap[1] = node++; pqdownheap(s, tree, 1) } while (s.heap_len >= 2); s.heap[--s.heap_max] = s.heap[1]; gen_bitlen(s, desc); gen_codes(tree, max_code, s.bl_count) } function scan_tree(s, tree, max_code) { var n; var prevlen = -1; var curlen; var nextlen = tree[0 * 2 + 1]; var count = 0; var max_count = 7; var min_count = 4; if (nextlen === 0) { max_count = 138; min_count = 3 } tree[(max_code + 1) * 2 + 1] = 65535; for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[(n + 1) * 2 + 1]; if (++count < max_count && curlen === nextlen) { continue } else if (count < min_count) { s.bl_tree[curlen * 2] += count } else if (curlen !== 0) { if (curlen !== prevlen) { s.bl_tree[curlen * 2]++ } s.bl_tree[REP_3_6 * 2]++ } else if (count <= 10) { s.bl_tree[REPZ_3_10 * 2]++ } else { s.bl_tree[REPZ_11_138 * 2]++ } count = 0; prevlen = curlen; if (nextlen === 0) { max_count = 138; min_count = 3 } else if (curlen === nextlen) { max_count = 6; min_count = 3 } else { max_count = 7; min_count = 4 } } } function send_tree(s, tree, max_code) { var n; var prevlen = -1; var curlen; var nextlen = tree[0 * 2 + 1]; var count = 0; var max_count = 7; var min_count = 4; if (nextlen === 0) { max_count = 138; min_count = 3 } for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[(n + 1) * 2 + 1]; if (++count < max_count && curlen === nextlen) { continue } else if (count < min_count) { do { send_code(s, curlen, s.bl_tree) } while (--count !== 0) } else if (curlen !== 0) { if (curlen !== prevlen) { send_code(s, curlen, s.bl_tree); count-- } send_code(s, REP_3_6, s.bl_tree); send_bits(s, count - 3, 2) } else if (count <= 10) { send_code(s, REPZ_3_10, s.bl_tree); send_bits(s, count - 3, 3) } else { send_code(s, REPZ_11_138, s.bl_tree); send_bits(s, count - 11, 7) } count = 0; prevlen = curlen; if (nextlen === 0) { max_count = 138; min_count = 3 } else if (curlen === nextlen) { max_count = 6; min_count = 3 } else { max_count = 7; min_count = 4 } } } function build_bl_tree(s) { var max_blindex; scan_tree(s, s.dyn_ltree, s.l_desc.max_code); scan_tree(s, s.dyn_dtree, s.d_desc.max_code); build_tree(s, s.bl_desc); for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { if (s.bl_tree[bl_order[max_blindex] * 2 + 1] !== 0) { break } } s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; return max_blindex } function send_all_trees(s, lcodes, dcodes, blcodes) { var rank; send_bits(s, lcodes - 257, 5); send_bits(s, dcodes - 1, 5); send_bits(s, blcodes - 4, 4); for (rank = 0; rank < blcodes; rank++) { send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1], 3) } send_tree(s, s.dyn_ltree, lcodes - 1); send_tree(s, s.dyn_dtree, dcodes - 1) } function detect_data_type(s) { var black_mask = 4093624447; var n; for (n = 0; n <= 31; n++, black_mask >>>= 1) { if (black_mask & 1 && s.dyn_ltree[n * 2] !== 0) { return Z_BINARY } } if (s.dyn_ltree[9 * 2] !== 0 || s.dyn_ltree[10 * 2] !== 0 || s.dyn_ltree[13 * 2] !== 0) { return Z_TEXT } for (n = 32; n < LITERALS; n++) { if (s.dyn_ltree[n * 2] !== 0) { return Z_TEXT } } return Z_BINARY } var static_init_done = false; function _tr_init(s) { if (!static_init_done) { tr_static_init(); static_init_done = true } s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); s.bi_buf = 0; s.bi_valid = 0; init_block(s) } function _tr_stored_block(s, buf, stored_len, last) { send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); copy_block(s, buf, stored_len, true) } function _tr_align(s) { send_bits(s, STATIC_TREES << 1, 3); send_code(s, END_BLOCK, static_ltree); bi_flush(s) } function _tr_flush_block(s, buf, stored_len, last) { var opt_lenb, static_lenb; var max_blindex = 0; if (s.level > 0) { if (s.strm.data_type === Z_UNKNOWN) { s.strm.data_type = detect_data_type(s) } build_tree(s, s.l_desc); build_tree(s, s.d_desc); max_blindex = build_bl_tree(s); opt_lenb = s.opt_len + 3 + 7 >>> 3; static_lenb = s.static_len + 3 + 7 >>> 3; if (static_lenb <= opt_lenb) { opt_lenb = static_lenb } } else { opt_lenb = static_lenb = stored_len + 5 } if (stored_len + 4 <= opt_lenb && buf !== -1) { _tr_stored_block(s, buf, stored_len, last) } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); compress_block(s, static_ltree, static_dtree) } else { send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); compress_block(s, s.dyn_ltree, s.dyn_dtree) } init_block(s); if (last) { bi_windup(s) } } function _tr_tally(s, dist, lc) { s.pending_buf[s.d_buf + s.last_lit * 2] = dist >>> 8 & 255; s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 255; s.pending_buf[s.l_buf + s.last_lit] = lc & 255; s.last_lit++; if (dist === 0) { s.dyn_ltree[lc * 2]++ } else { s.matches++; dist--; s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]++; s.dyn_dtree[d_code(dist) * 2]++ } return s.last_lit === s.lit_bufsize - 1 } exports._tr_init = _tr_init; exports._tr_stored_block = _tr_stored_block; exports._tr_flush_block = _tr_flush_block; exports._tr_tally = _tr_tally; exports._tr_align = _tr_align }, { "../utils/common": 27 } ], 39: [function (_dereq_, module, exports) { "use strict"; function ZStream() { this.input = null; this.next_in = 0; this.avail_in = 0; this.total_in = 0; this.output = null; this.next_out = 0; this.avail_out = 0; this.total_out = 0; this.msg = ""; this.state = null; this.data_type = 2; this.adler = 0 } module.exports = ZStream }, {} ] }, {}, [9])(9) }); var xlsxStyle = {}; (function make_xlsx(xlsxStyle) { xlsxStyle.version = "0.8.11"; var current_codepage = 1200, current_cptable; if (typeof module !== "undefined" && typeof require !== "undefined") { if (typeof cptable === "undefined") cptable = require("./dist/cpexcel"); current_cptable = cptable[current_codepage] } function reset_cp() { set_cp(1200) } var set_cp = function (cp) { current_codepage = cp }; function char_codes(data) { var o = []; for (var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o } var debom_xml = function (data) { return data }; var _getchar = function _gc1(x) { return String.fromCharCode(x) }; if (typeof cptable !== "undefined") { set_cp = function (cp) { current_codepage = cp; current_cptable = cptable[cp] }; debom_xml = function (data) { if (data.charCodeAt(0) === 255 && data.charCodeAt(1) === 254) { return cptable.utils.decode(1200, char_codes(data.substr(2))) } return data }; _getchar = function _gc2(x) { if (current_codepage === 1200) return String.fromCharCode(x); return cptable.utils.decode(current_codepage, [x & 255, x >> 8])[0] } } var Base64 = function make_b64() { var map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; return { encode: function (input, utf8) { var o = ""; var c1, c2, c3, e1, e2, e3, e4; for (var i = 0; i < input.length; ) { c1 = input.charCodeAt(i++); c2 = input.charCodeAt(i++); c3 = input.charCodeAt(i++); e1 = c1 >> 2; e2 = (c1 & 3) << 4 | c2 >> 4; e3 = (c2 & 15) << 2 | c3 >> 6; e4 = c3 & 63; if (isNaN(c2)) { e3 = e4 = 64 } else if (isNaN(c3)) { e4 = 64 } o += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4) } return o }, decode: function b64_decode(input, utf8) { var o = ""; var c1, c2, c3; var e1, e2, e3, e4; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); for (var i = 0; i < input.length; ) { e1 = map.indexOf(input.charAt(i++)); e2 = map.indexOf(input.charAt(i++)); e3 = map.indexOf(input.charAt(i++)); e4 = map.indexOf(input.charAt(i++)); c1 = e1 << 2 | e2 >> 4; c2 = (e2 & 15) << 4 | e3 >> 2; c3 = (e3 & 3) << 6 | e4; o += String.fromCharCode(c1); if (e3 != 64) { o += String.fromCharCode(c2) } if (e4 != 64) { o += String.fromCharCode(c3) } } return o } } } (); var has_buf = typeof Buffer !== "undefined"; function new_raw_buf(len) { return new(has_buf ? Buffer : Array)(len) } function s2a(s) { if (has_buf) return new Buffer(s, "binary"); return s.split("").map(function (x) { return x.charCodeAt(0) & 255 }) } var bconcat = function (bufs) { return [].concat.apply([], bufs) }; var chr0 = /\u0000/g, chr1 = /[\u0001-\u0006]/; var SSF = {}; var make_ssf = function make_ssf(SSF) { SSF.version = "0.8.1"; function _strrev(x) { var o = "", i = x.length - 1; while (i >= 0) o += x.charAt(i--); return o } function fill(c, l) { var o = ""; while (o.length < l) o += c; return o } function pad0(v, d) { var t = "" + v; return t.length >= d ? t : fill("0", d - t.length) + t } function pad_(v, d) { var t = "" + v; return t.length >= d ? t : fill(" ", d - t.length) + t } function rpad_(v, d) { var t = "" + v; return t.length >= d ? t : t + fill(" ", d - t.length) } function pad0r1(v, d) { var t = "" + Math.round(v); return t.length >= d ? t : fill("0", d - t.length) + t } function pad0r2(v, d) { var t = "" + v; return t.length >= d ? t : fill("0", d - t.length) + t } var p2_32 = Math.pow(2, 32); function pad0r(v, d) { if (v > p2_32 || v < -p2_32) return pad0r1(v, d); var i = Math.round(v); return pad0r2(i, d) } function isgeneral(s, i) { return s.length >= 7 + i && (s.charCodeAt(i) | 32) === 103 && (s.charCodeAt(i + 1) | 32) === 101 && (s.charCodeAt(i + 2) | 32) === 110 && (s.charCodeAt(i + 3) | 32) === 101 && (s.charCodeAt(i + 4) | 32) === 114 && (s.charCodeAt(i + 5) | 32) === 97 && (s.charCodeAt(i + 6) | 32) === 108 } var opts_fmt = [["date1904", 0], ["output", ""], ["WTF", false]]; function fixopts(o) { for (var y = 0; y != opts_fmt.length; ++y) if (o[opts_fmt[y][0]] === undefined) o[opts_fmt[y][0]] = opts_fmt[y][1] } SSF.opts = opts_fmt; var table_fmt = { 0: "General", 1: "0", 2: "0.00", 3: "#,##0", 4: "#,##0.00", 9: "0%", 10: "0.00%", 11: "0.00E+00", 12: "# ?/?", 13: "# ??/??", 14: "m/d/yy", 15: "d-mmm-yy", 16: "d-mmm", 17: "mmm-yy", 18: "h:mm AM/PM", 19: "h:mm:ss AM/PM", 20: "h:mm", 21: "h:mm:ss", 22: "m/d/yy h:mm", 37: "#,##0 ;(#,##0)", 38: "#,##0 ;[Red](#,##0)", 39: "#,##0.00;(#,##0.00)", 40: "#,##0.00;[Red](#,##0.00)", 45: "mm:ss", 46: "[h]:mm:ss", 47: "mmss.0", 48: "##0.0E+0", 49: "@", 56: '"上午/下午 "hh"時"mm"分"ss"秒 "', 65535: "General" }; var days = [["Sun", "Sunday"], ["Mon", "Monday"], ["Tue", "Tuesday"], ["Wed", "Wednesday"], ["Thu", "Thursday"], ["Fri", "Friday"], ["Sat", "Saturday"]]; var months = [["J", "Jan", "January"], ["F", "Feb", "February"], ["M", "Mar", "March"], ["A", "Apr", "April"], ["M", "May", "May"], ["J", "Jun", "June"], ["J", "Jul", "July"], ["A", "Aug", "August"], ["S", "Sep", "September"], ["O", "Oct", "October"], ["N", "Nov", "November"], ["D", "Dec", "December"]]; function frac(x, D, mixed) { var sgn = x < 0 ? -1 : 1; var B = x * sgn; var P_2 = 0, P_1 = 1, P = 0; var Q_2 = 1, Q_1 = 0, Q = 0; var A = Math.floor(B); while (Q_1 < D) { A = Math.floor(B); P = A * P_1 + P_2; Q = A * Q_1 + Q_2; if (B - A < 5e-10) break; B = 1 / (B - A); P_2 = P_1; P_1 = P; Q_2 = Q_1; Q_1 = Q } if (Q > D) { Q = Q_1; P = P_1 } if (Q > D) { Q = Q_2; P = P_2 } if (!mixed) return [0, sgn * P, Q]; if (Q === 0) throw "Unexpected state: " + P + " " + P_1 + " " + P_2 + " " + Q + " " + Q_1 + " " + Q_2; var q = Math.floor(sgn * P / Q); return [q, sgn * P - q * Q, Q] } function general_fmt_int(v, opts) { return "" + v } SSF._general_int = general_fmt_int; var general_fmt_num = function make_general_fmt_num() { var gnr1 = /\.(\d*[1-9])0+$/, gnr2 = /\.0*$/, gnr4 = /\.(\d*[1-9])0+/, gnr5 = /\.0*[Ee]/, gnr6 = /(E[+-])(\d)$/; function gfn2(v) { var w = v < 0 ? 12 : 11; var o = gfn5(v.toFixed(12)); if (o.length <= w) return o; o = v.toPrecision(10); if (o.length <= w) return o; return v.toExponential(5) } function gfn3(v) { var o = v.toFixed(11).replace(gnr1, ".$1"); if (o.length > (v < 0 ? 12 : 11)) o = v.toPrecision(6); return o } function gfn4(o) { for (var i = 0; i != o.length; ++i) if ((o.charCodeAt(i) | 32) === 101) return o.replace(gnr4, ".$1").replace(gnr5, "E").replace("e", "E").replace(gnr6, "$10$2"); return o } function gfn5(o) { return o.indexOf(".") > -1 ? o.replace(gnr2, "").replace(gnr1, ".$1") : o } return function general_fmt_num(v, opts) { var V = Math.floor(Math.log(Math.abs(v)) * Math.LOG10E), o; if (V >= -4 && V <= -1) o = v.toPrecision(10 + V); else if (Math.abs(V) <= 9) o = gfn2(v); else if (V === 10) o = v.toFixed(10).substr(0, 12); else o = gfn3(v); return gfn5(gfn4(o)) } } (); SSF._general_num = general_fmt_num; function general_fmt(v, opts) { switch (typeof v) { case "string": return v; case "boolean": return v ? "TRUE" : "FALSE"; case "number": return (v | 0) === v ? general_fmt_int(v, opts) : general_fmt_num(v, opts) } throw new Error("unsupported value in General format: " + v) } SSF._general = general_fmt; function fix_hijri(date, o) { return 0 } function parse_date_code(v, opts, b2) { if (v > 2958465 || v < 0) return null; var date = v | 0, time = Math.floor(86400 * (v - date)), dow = 0; var dout = []; var out = { D: date, T: time, u: 86400 * (v - date) - time, y: 0, m: 0, d: 0, H: 0, M: 0, S: 0, q: 0 }; if (Math.abs(out.u) < 1e-6) out.u = 0; fixopts(opts != null ? opts : opts = []); if (opts.date1904) date += 1462; if (out.u > .999) { out.u = 0; if (++time == 86400) { time = 0; ++date } } if (date === 60) { dout = b2 ? [1317, 10, 29] : [1900, 2, 29]; dow = 3 } else if (date === 0) { dout = b2 ? [1317, 8, 29] : [1900, 1, 0]; dow = 6 } else { if (date > 60) --date; var d = new Date(1900, 0, 1); d.setDate(d.getDate() + date - 1); dout = [d.getFullYear(), d.getMonth() + 1, d.getDate()]; dow = d.getDay(); if (date < 60) dow = (dow + 6) % 7; if (b2) dow = fix_hijri(d, dout) } out.y = dout[0]; out.m = dout[1]; out.d = dout[2]; out.S = time % 60; time = Math.floor(time / 60); out.M = time % 60; time = Math.floor(time / 60); out.H = time; out.q = dow; return out } SSF.parse_date_code = parse_date_code; function write_date(type, fmt, val, ss0) { var o = "", ss = 0, tt = 0, y = val.y, out, outl = 0; switch (type) { case 98: y = val.y + 543; case 121: switch (fmt.length) { case 1: case 2: out = y % 100; outl = 2; break; default: out = y % 1e4; outl = 4; break } break; case 109: switch (fmt.length) { case 1: case 2: out = val.m; outl = fmt.length; break; case 3: return months[val.m - 1][1]; case 5: return months[val.m - 1][0]; default: return months[val.m - 1][2] } break; case 100: switch (fmt.length) { case 1: case 2: out = val.d; outl = fmt.length; break; case 3: return days[val.q][0]; default: return days[val.q][1] } break; case 104: switch (fmt.length) { case 1: case 2: out = 1 + (val.H + 11) % 12; outl = fmt.length; break; default: throw "bad hour format: " + fmt } break; case 72: switch (fmt.length) { case 1: case 2: out = val.H; outl = fmt.length; break; default: throw "bad hour format: " + fmt } break; case 77: switch (fmt.length) { case 1: case 2: out = val.M; outl = fmt.length; break; default: throw "bad minute format: " + fmt } break; case 115: if (val.u === 0) switch (fmt) { case "s": case "ss": return pad0(val.S, fmt.length); case ".0": case ".00": case ".000": } switch (fmt) { case "s": case "ss": case ".0": case ".00": case ".000": if (ss0 >= 2) tt = ss0 === 3 ? 1e3 : 100; else tt = ss0 === 1 ? 10 : 1; ss = Math.round(tt * (val.S + val.u)); if (ss >= 60 * tt) ss = 0; if (fmt === "s") return ss === 0 ? "0" : "" + ss / tt; o = pad0(ss, 2 + ss0); if (fmt === "ss") return o.substr(0, 2); return "." + o.substr(2, fmt.length - 1); default: throw "bad second format: " + fmt } case 90: switch (fmt) { case "[h]": case "[hh]": out = val.D * 24 + val.H; break; case "[m]": case "[mm]": out = (val.D * 24 + val.H) * 60 + val.M; break; case "[s]": case "[ss]": out = ((val.D * 24 + val.H) * 60 + val.M) * 60 + Math.round(val.S + val.u); break; default: throw "bad abstime format: " + fmt } outl = fmt.length === 3 ? 1 : 2; break; case 101: out = y; outl = 1 } if (outl > 0) return pad0(out, outl); else return "" } function commaify(s) { if (s.length <= 3) return s; var j = s.length % 3, o = s.substr(0, j); for (; j != s.length; j += 3) o += (o.length > 0 ? "," : "") + s.substr(j, 3); return o } var write_num = function make_write_num() { var pct1 = /%/g; function write_num_pct(type, fmt, val) { var sfmt = fmt.replace(pct1, ""), mul = fmt.length - sfmt.length; return write_num(type, sfmt, val * Math.pow(10, 2 * mul)) + fill("%", mul) } function write_num_cm(type, fmt, val) { var idx = fmt.length - 1; while (fmt.charCodeAt(idx - 1) === 44) --idx; return write_num(type, fmt.substr(0, idx), val / Math.pow(10, 3 * (fmt.length - idx))) } function write_num_exp(fmt, val) { var o; var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; if (fmt.match(/^#+0.0E\+0$/)) { var period = fmt.indexOf("."); if (period === -1) period = fmt.indexOf("E"); var ee = Math.floor(Math.log(Math.abs(val)) * Math.LOG10E) % period; if (ee < 0) ee += period; o = (val / Math.pow(10, ee)).toPrecision(idx + 1 + (period + ee) % period); if (o.indexOf("e") === -1) { var fakee = Math.floor(Math.log(Math.abs(val)) * Math.LOG10E); if (o.indexOf(".") === -1) o = o[0] + "." + o.substr(1) + "E+" + (fakee - o.length + ee); else o += "E+" + (fakee - ee); while (o.substr(0, 2) === "0.") { o = o[0] + o.substr(2, period) + "." + o.substr(2 + period); o = o.replace(/^0+([1-9])/, "$1").replace(/^0+\./, "0.") } o = o.replace(/\+-/, "-") } o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/, function ($$, $1, $2, $3) { return $1 + $2 + $3.substr(0, (period + ee) % period) + "." + $3.substr(ee) + "E" }) } else o = val.toExponential(idx); if (fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0, o.length - 1) + "0" + o[o.length - 1]; if (fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/, "e"); return o.replace("e", "E") } var frac1 = /# (\?+)( ?)\/( ?)(\d+)/; function write_num_f1(r, aval, sign) { var den = parseInt(r[4]), rr = Math.round(aval * den), base = Math.floor(rr / den); var myn = rr - base * den, myd = den; return sign + (base === 0 ? "" : "" + base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn, r[1].length) + r[2] + "/" + r[3] + pad0(myd, r[4].length)) } function write_num_f2(r, aval, sign) { return sign + (aval === 0 ? "" : "" + aval) + fill(" ", r[1].length + 2 + r[4].length) } var dec1 = /^#*0*\.(0+)/; var closeparen = /\).*[0#]/; var phone = /\(###\) ###\\?-####/; function hashq(str) { var o = "", cc; for (var i = 0; i != str.length; ++i) switch (cc = str.charCodeAt(i)) { case 35: break; case 63: o += " "; break; case 48: o += "0"; break; default: o += String.fromCharCode(cc) } return o } function rnd(val, d) { var dd = Math.pow(10, d); return "" + Math.round(val * dd) / dd } function dec(val, d) { return Math.round((val - Math.floor(val)) * Math.pow(10, d)) } function flr(val) { if (val < 2147483647 && val > -2147483648) return "" + (val >= 0 ? val | 0 : val - 1 | 0); return "" + Math.floor(val) } function write_num_flt(type, fmt, val) { if (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) { var ffmt = fmt.replace(/\( */, "").replace(/ \)/, "").replace(/\)/, ""); if (val >= 0) return write_num_flt("n", ffmt, val); return "(" + write_num_flt("n", ffmt, -val) + ")" } if (fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val); if (fmt.indexOf("%") !== -1) return write_num_pct(type, fmt, val); if (fmt.indexOf("E") !== -1) return write_num_exp(fmt, val); if (fmt.charCodeAt(0) === 36) return "$" + write_num_flt(type, fmt.substr(fmt[1] == " " ? 2 : 1), val); var o, oo; var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; if (fmt.match(/^00+$/)) return sign + pad0r(aval, fmt.length); if (fmt.match(/^[#?]+$/)) { o = pad0r(val, 0); if (o === "0") o = ""; return o.length > fmt.length ? o : hashq(fmt.substr(0, fmt.length - o.length)) + o } if ((r = fmt.match(frac1)) !== null) return write_num_f1(r, aval, sign); if (fmt.match(/^#+0+$/) !== null) return sign + pad0r(aval, fmt.length - fmt.indexOf("0")); if ((r = fmt.match(dec1)) !== null) { o = rnd(val, r[1].length).replace(/^([^\.]+)$/, "$1." + r[1]).replace(/\.$/, "." + r[1]).replace(/\.(\d*)$/, function ($$, $1) { return "." + $1 + fill("0", r[1].length - $1.length) }); return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./, ".") } fmt = fmt.replace(/^#+([0.])/, "$1"); if ((r = fmt.match(/^(0*)\.(#*)$/)) !== null) { return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/, ".$1").replace(/^(-?\d*)$/, "$1.").replace(/^0\./, r[1].length ? "0." : ".") } if ((r = fmt.match(/^#,##0(\.?)$/)) !== null) return sign + commaify(pad0r(aval, 0)); if ((r = fmt.match(/^#,##0\.([#0]*0)$/)) !== null) { return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify("" + Math.floor(val)) + "." + pad0(dec(val, r[1].length), r[1].length) } if ((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_flt(type, fmt.replace(/^#,#*,/, ""), val); if ((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/)) !== null) { o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g, ""), val)); ri = 0; return _strrev(_strrev(fmt.replace(/\\/g, "")).replace(/[0#]/g, function (x) { return ri < o.length ? o[ri++] : x === "0" ? "0" : "" })) } if (fmt.match(phone) !== null) { o = write_num_flt(type, "##########", val); return "(" + o.substr(0, 3) + ") " + o.substr(3, 3) + "-" + o.substr(6) } var oa = ""; if ((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) { ri = Math.min(r[4].length, 7); ff = frac(aval, Math.pow(10, ri) - 1, false); o = "" + sign; oa = write_num("n", r[1], ff[1]); if (oa[oa.length - 1] == " ") oa = oa.substr(0, oa.length - 1) + "0"; o += oa + r[2] + "/" + r[3]; oa = rpad_(ff[2], ri); if (oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length - oa.length)) + oa; o += oa; return o } if ((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) { ri = Math.min(Math.max(r[1].length, r[4].length), 7); ff = frac(aval, Math.pow(10, ri) - 1, true); return sign + (ff[0] || (ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1], ri) + r[2] + "/" + r[3] + rpad_(ff[2], ri) : fill(" ", 2 * ri + 1 + r[2].length + r[3].length)) } if ((r = fmt.match(/^[#0?]+$/)) !== null) { o = pad0r(val, 0); if (fmt.length <= o.length) return o; return hashq(fmt.substr(0, fmt.length - o.length)) + o } if ((r = fmt.match(/^([#0?]+)\.([#0]+)$/)) !== null) { o = "" + val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, "$1"); ri = o.indexOf("."); var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres; return hashq(fmt.substr(0, lres) + o + fmt.substr(fmt.length - rres)) } if ((r = fmt.match(/^00,000\.([#0]*0)$/)) !== null) { ri = dec(val, r[1].length); return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/, "0$&").replace(/^\d*$/, function ($$) { return "00," + ($$.length < 3 ? pad0(0, 3 - $$.length) : "") + $$ }) + "." + pad0(ri, r[1].length) } switch (fmt) { case "#,###": var x = commaify(pad0r(aval, 0)); return x !== "0" ? sign + x : ""; default: } throw new Error("unsupported format |" + fmt + "|") } function write_num_cm2(type, fmt, val) { var idx = fmt.length - 1; while (fmt.charCodeAt(idx - 1) === 44) --idx; return write_num(type, fmt.substr(0, idx), val / Math.pow(10, 3 * (fmt.length - idx))) } function write_num_pct2(type, fmt, val) { var sfmt = fmt.replace(pct1, ""), mul = fmt.length - sfmt.length; return write_num(type, sfmt, val * Math.pow(10, 2 * mul)) + fill("%", mul) } function write_num_exp2(fmt, val) { var o; var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; if (fmt.match(/^#+0.0E\+0$/)) { var period = fmt.indexOf("."); if (period === -1) period = fmt.indexOf("E"); var ee = Math.floor(Math.log(Math.abs(val)) * Math.LOG10E) % period; if (ee < 0) ee += period; o = (val / Math.pow(10, ee)).toPrecision(idx + 1 + (period + ee) % period); if (!o.match(/[Ee]/)) { var fakee = Math.floor(Math.log(Math.abs(val)) * Math.LOG10E); if (o.indexOf(".") === -1) o = o[0] + "." + o.substr(1) + "E+" + (fakee - o.length + ee); else o += "E+" + (fakee - ee); o = o.replace(/\+-/, "-") } o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/, function ($$, $1, $2, $3) { return $1 + $2 + $3.substr(0, (period + ee) % period) + "." + $3.substr(ee) + "E" }) } else o = val.toExponential(idx); if (fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0, o.length - 1) + "0" + o[o.length - 1]; if (fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/, "e"); return o.replace("e", "E") } function write_num_int(type, fmt, val) { if (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) { var ffmt = fmt.replace(/\( */, "").replace(/ \)/, "").replace(/\)/, ""); if (val >= 0) return write_num_int("n", ffmt, val); return "(" + write_num_int("n", ffmt, -val) + ")" } if (fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val); if (fmt.indexOf("%") !== -1) return write_num_pct2(type, fmt, val); if (fmt.indexOf("E") !== -1) return write_num_exp2(fmt, val); if (fmt.charCodeAt(0) === 36) return "$" + write_num_int(type, fmt.substr(fmt[1] == " " ? 2 : 1), val); var o; var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : ""; if (fmt.match(/^00+$/)) return sign + pad0(aval, fmt.length); if (fmt.match(/^[#?]+$/)) { o = "" + val; if (val === 0) o = ""; return o.length > fmt.length ? o : hashq(fmt.substr(0, fmt.length - o.length)) + o } if ((r = fmt.match(frac1)) !== null) return write_num_f2(r, aval, sign); if (fmt.match(/^#+0+$/) !== null) return sign + pad0(aval, fmt.length - fmt.indexOf("0")); if ((r = fmt.match(dec1)) !== null) { o = ("" + val).replace(/^([^\.]+)$/, "$1." + r[1]).replace(/\.$/, "." + r[1]).replace(/\.(\d*)$/, function ($$, $1) { return "." + $1 + fill("0", r[1].length - $1.length) }); return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./, "."); } fmt = fmt.replace(/^#+([0.])/, "$1"); if ((r = fmt.match(/^(0*)\.(#*)$/)) !== null) { return sign + ("" + aval).replace(/\.(\d*[1-9])0*$/, ".$1").replace(/^(-?\d*)$/, "$1.").replace(/^0\./, r[1].length ? "0." : ".") } if ((r = fmt.match(/^#,##0(\.?)$/)) !== null) return sign + commaify("" + aval); if ((r = fmt.match(/^#,##0\.([#0]*0)$/)) !== null) { return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify("" + val) + "." + fill("0", r[1].length) } if ((r = fmt.match(/^#,#*,#0/)) !== null) return write_num_int(type, fmt.replace(/^#,#*,/, ""), val); if ((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/)) !== null) { o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g, ""), val)); ri = 0; return _strrev(_strrev(fmt.replace(/\\/g, "")).replace(/[0#]/g, function (x) { return ri < o.length ? o[ri++] : x === "0" ? "0" : "" })) } if (fmt.match(phone) !== null) { o = write_num_int(type, "##########", val); return "(" + o.substr(0, 3) + ") " + o.substr(3, 3) + "-" + o.substr(6) } var oa = ""; if ((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) { ri = Math.min(r[4].length, 7); ff = frac(aval, Math.pow(10, ri) - 1, false); o = "" + sign; oa = write_num("n", r[1], ff[1]); if (oa[oa.length - 1] == " ") oa = oa.substr(0, oa.length - 1) + "0"; o += oa + r[2] + "/" + r[3]; oa = rpad_(ff[2], ri); if (oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length - oa.length)) + oa; o += oa; return o } if ((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) !== null) { ri = Math.min(Math.max(r[1].length, r[4].length), 7); ff = frac(aval, Math.pow(10, ri) - 1, true); return sign + (ff[0] || (ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1], ri) + r[2] + "/" + r[3] + rpad_(ff[2], ri) : fill(" ", 2 * ri + 1 + r[2].length + r[3].length)) } if ((r = fmt.match(/^[#0?]+$/)) !== null) { o = "" + val; if (fmt.length <= o.length) return o; return hashq(fmt.substr(0, fmt.length - o.length)) + o } if ((r = fmt.match(/^([#0]+)\.([#0]+)$/)) !== null) { o = "" + val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, "$1"); ri = o.indexOf("."); var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres; return hashq(fmt.substr(0, lres) + o + fmt.substr(fmt.length - rres)) } if ((r = fmt.match(/^00,000\.([#0]*0)$/)) !== null) { return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify("" + val).replace(/^\d,\d{3}$/, "0$&").replace(/^\d*$/, function ($$) { return "00," + ($$.length < 3 ? pad0(0, 3 - $$.length) : "") + $$ }) + "." + pad0(0, r[1].length) } switch (fmt) { case "#,###": var x = commaify("" + aval); return x !== "0" ? sign + x : ""; default: } throw new Error("unsupported format |" + fmt + "|") } return function write_num(type, fmt, val) { return (val | 0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val) } } (); function split_fmt(fmt) { var out = []; var in_str = false, cc; for (var i = 0, j = 0; i < fmt.length; ++i) switch (cc = fmt.charCodeAt(i)) { case 34: in_str = !in_str; break; case 95: case 42: case 92: ++i; break; case 59: out[out.length] = fmt.substr(j, i - j); j = i + 1 } out[out.length] = fmt.substr(j); if (in_str === true) throw new Error("Format |" + fmt + "| unterminated string "); return out } SSF._split = split_fmt; var abstime = /\[[HhMmSs]*\]/; function eval_fmt(fmt, v, opts, flen) { var out = [], o = "", i = 0, c = "", lst = "t", q, dt, j, cc; var hr = "H"; while (i < fmt.length) { switch (c = fmt[i]) { case "G": if (!isgeneral(fmt, i)) throw new Error("unrecognized character " + c + " in " + fmt); out[out.length] = { t: "G", v: "General" }; i += 7; break; case '"': for (o = ""; (cc = fmt.charCodeAt(++i)) !== 34 && i < fmt.length; ) o += String.fromCharCode(cc); out[out.length] = { t: "t", v: o }; ++i; break; case "\\": var w = fmt[++i], t = w === "(" || w === ")" ? w : "t"; out[out.length] = { t: t, v: w }; ++i; break; case "_": out[out.length] = { t: "t", v: " " }; i += 2; break; case "@": out[out.length] = { t: "T", v: v }; ++i; break; case "B": case "b": if (fmt[i + 1] === "1" || fmt[i + 1] === "2") { if (dt == null) { dt = parse_date_code(v, opts, fmt[i + 1] === "2"); if (dt == null) return "" } out[out.length] = { t: "X", v: fmt.substr(i, 2) }; lst = c; i += 2; break } case "M": case "D": case "Y": case "H": case "S": case "E": c = c.toLowerCase(); case "m": case "d": case "y": case "h": case "s": case "e": case "g": if (v < 0) return ""; if (dt == null) { dt = parse_date_code(v, opts); if (dt == null) return "" } o = c; while (++i < fmt.length && fmt[i].toLowerCase() === c) o += c; if (c === "m" && lst.toLowerCase() === "h") c = "M"; if (c === "h") c = hr; out[out.length] = { t: c, v: o }; lst = c; break; case "A": q = { t: c, v: "A" }; if (dt == null) dt = parse_date_code(v, opts); if (fmt.substr(i, 3) === "A/P") { if (dt != null) q.v = dt.H >= 12 ? "P" : "A"; q.t = "T"; hr = "h"; i += 3 } else if (fmt.substr(i, 5) === "AM/PM") { if (dt != null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = "T"; i += 5; hr = "h" } else { q.t = "t"; ++i } if (dt == null && q.t === "T") return ""; out[out.length] = q; lst = c; break; case "[": o = c; while (fmt[i++] !== "]" && i < fmt.length) o += fmt[i]; if (o.substr(-1) !== "]") throw 'unterminated "[" block: |' + o + "|"; if (o.match(abstime)) { if (dt == null) { dt = parse_date_code(v, opts); if (dt == null) return "" } out[out.length] = { t: "Z", v: o.toLowerCase() } } else { o = "" } break; case ".": if (dt != null) { o = c; while ((c = fmt[++i]) === "0") o += c; out[out.length] = { t: "s", v: o }; break } case "0": case "#": o = c; while ("0#?.,E+-%".indexOf(c = fmt[++i]) > -1 || c == "\\" && fmt[i + 1] == "-" && "0#".indexOf(fmt[i + 2]) > -1) o += c; out[out.length] = { t: "n", v: o }; break; case "?": o = c; while (fmt[++i] === c) o += c; q = { t: c, v: o }; out[out.length] = q; lst = c; break; case "*": ++i; if (fmt[i] == " " || fmt[i] == "*") ++i; break; case "(": case ")": out[out.length] = { t: flen === 1 ? "t" : c, v: c }; ++i; break; case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": o = c; while ("0123456789".indexOf(fmt[++i]) > -1) o += fmt[i]; out[out.length] = { t: "D", v: o }; break; case " ": out[out.length] = { t: c, v: c }; ++i; break; default: if (",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz".indexOf(c) === -1) throw new Error("unrecognized character " + c + " in " + fmt); out[out.length] = { t: "t", v: c }; ++i; break } } var bt = 0, ss0 = 0, ssm; for (i = out.length - 1, lst = "t"; i >= 0; --i) { switch (out[i].t) { case "h": case "H": out[i].t = hr; lst = "h"; if (bt < 1) bt = 1; break; case "s": if (ssm = out[i].v.match(/\.0+$/)) ss0 = Math.max(ss0, ssm[0].length - 1); if (bt < 3) bt = 3; case "d": case "y": case "M": case "e": lst = out[i].t; break; case "m": if (lst === "s") { out[i].t = "M"; if (bt < 2) bt = 2 } break; case "X": if (out[i].v === "B2"); break; case "Z": if (bt < 1 && out[i].v.match(/[Hh]/)) bt = 1; if (bt < 2 && out[i].v.match(/[Mm]/)) bt = 2; if (bt < 3 && out[i].v.match(/[Ss]/)) bt = 3 } } switch (bt) { case 0: break; case 1: if (dt.u >= .5) { dt.u = 0; ++dt.S } if (dt.S >= 60) { dt.S = 0; ++dt.M } if (dt.M >= 60) { dt.M = 0; ++dt.H } break; case 2: if (dt.u >= .5) { dt.u = 0; ++dt.S } if (dt.S >= 60) { dt.S = 0; ++dt.M } break } var nstr = "", jj; for (i = 0; i < out.length; ++i) { switch (out[i].t) { case "t": case "T": case " ": case "D": break; case "X": out[i] = undefined; break; case "d": case "m": case "y": case "h": case "H": case "M": case "s": case "e": case "b": case "Z": out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0); out[i].t = "t"; break; case "n": case "(": case "?": jj = i + 1; while (out[jj] != null && ((c = out[jj].t) === "?" || c === "D" || (c === " " || c === "t") && out[jj + 1] != null && (out[jj + 1].t === "?" || out[jj + 1].t === "t" && out[jj + 1].v === "/") || out[i].t === "(" && (c === " " || c === "n" || c === ")") || c === "t" && (out[jj].v === "/" || "$€".indexOf(out[jj].v) > -1 || out[jj].v === " " && out[jj + 1] != null && out[jj + 1].t == "?"))) { out[i].v += out[jj].v; out[jj] = undefined; ++jj } nstr += out[i].v; i = jj - 1; break; case "G": out[i].t = "t"; out[i].v = general_fmt(v, opts); break } } var vv = "", myv, ostr; if (nstr.length > 0) { myv = v < 0 && nstr.charCodeAt(0) === 45 ? -v : v; ostr = write_num(nstr.charCodeAt(0) === 40 ? "(" : "n", nstr, myv); jj = ostr.length - 1; var decpt = out.length; for (i = 0; i < out.length; ++i) if (out[i] != null && out[i].v.indexOf(".") > -1) { decpt = i; break } var lasti = out.length; if (decpt === out.length && ostr.indexOf("E") === -1) { for (i = out.length - 1; i >= 0; --i) { if (out[i] == null || "n?(".indexOf(out[i].t) === -1) continue; if (jj >= out[i].v.length - 1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj + 1, out[i].v.length) } else if (jj < 0) out[i].v = ""; else { out[i].v = ostr.substr(0, jj + 1); jj = -1 } out[i].t = "t"; lasti = i } if (jj >= 0 && lasti < out.length) out[lasti].v = ostr.substr(0, jj + 1) + out[lasti].v } else if (decpt !== out.length && ostr.indexOf("E") === -1) { jj = ostr.indexOf(".") - 1; for (i = decpt; i >= 0; --i) { if (out[i] == null || "n?(".indexOf(out[i].t) === -1) continue; j = out[i].v.indexOf(".") > -1 && i === decpt ? out[i].v.indexOf(".") - 1 : out[i].v.length - 1; vv = out[i].v.substr(j + 1); for (; j >= 0; --j) { if (jj >= 0 && (out[i].v[j] === "0" || out[i].v[j] === "#")) vv = ostr[jj--] + vv } out[i].v = vv; out[i].t = "t"; lasti = i } if (jj >= 0 && lasti < out.length) out[lasti].v = ostr.substr(0, jj + 1) + out[lasti].v; jj = ostr.indexOf(".") + 1; for (i = decpt; i < out.length; ++i) { if (out[i] == null || "n?(".indexOf(out[i].t) === -1 && i !== decpt) continue; j = out[i].v.indexOf(".") > -1 && i === decpt ? out[i].v.indexOf(".") + 1 : 0; vv = out[i].v.substr(0, j); for (; j < out[i].v.length; ++j) { if (jj < ostr.length) vv += ostr[jj++] } out[i].v = vv; out[i].t = "t"; lasti = i } } } for (i = 0; i < out.length; ++i) if (out[i] != null && "n(?".indexOf(out[i].t) > -1) { myv = flen > 1 && v < 0 && i > 0 && out[i - 1].v === "-" ? -v : v; out[i].v = write_num(out[i].t, out[i].v, myv); out[i].t = "t" } var retval = ""; for (i = 0; i !== out.length; ++i) if (out[i] != null) retval += out[i].v; return retval } SSF._eval = eval_fmt; var cfregex = /\[[=<>]/; var cfregex2 = /\[([=<>]*)(-?\d+\.?\d*)\]/; function chkcond(v, rr) { if (rr == null) return false; var thresh = parseFloat(rr[2]); switch (rr[1]) { case "=": if (v == thresh) return true; break; case ">": if (v > thresh) return true; break; case "<": if (v < thresh) return true; break; case "<>": if (v != thresh) return true; break; case ">=": if (v >= thresh) return true; break; case "<=": if (v <= thresh) return true; break } return false } function choose_fmt(f, v) { var fmt = split_fmt(f); var l = fmt.length, lat = fmt[l - 1].indexOf("@"); if (l < 4 && lat > -1) --l; if (fmt.length > 4) throw "cannot find right format for |" + fmt + "|"; if (typeof v !== "number") return [4, fmt.length === 4 || lat > -1 ? fmt[fmt.length - 1] : "@"]; switch (fmt.length) { case 1: fmt = lat > -1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break; case 2: fmt = lat > -1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break; case 3: fmt = lat > -1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break; case 4: break } var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2]; if (fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff]; if (fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) { var m1 = fmt[0].match(cfregex2); var m2 = fmt[1].match(cfregex2); return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]] } return [l, ff] } function format(fmt, v, o) { fixopts(o != null ? o : o = []); var sfmt = ""; switch (typeof fmt) { case "string": sfmt = fmt; break; case "number": sfmt = (o.table != null ? o.table : table_fmt)[fmt]; break } if (isgeneral(sfmt, 0)) return general_fmt(v, o); var f = choose_fmt(sfmt, v); if (isgeneral(f[1])) return general_fmt(v, o); if (v === true) v = "TRUE"; else if (v === false) v = "FALSE"; else if (v === "" || v == null) return ""; return eval_fmt(f[1], v, o, f[0]) } SSF._table = table_fmt; SSF.load = function load_entry(fmt, idx) { table_fmt[idx] = fmt }; SSF.format = format; SSF.get_table = function get_table() { return table_fmt }; SSF.load_table = function load_table(tbl) { for (var i = 0; i != 392; ++i) if (tbl[i] !== undefined) SSF.load(tbl[i], i) } }; make_ssf(SSF); var XLMLFormatMap = { "General Number": "General", "General Date": SSF._table[22], "Long Date": "dddd, mmmm dd, yyyy", "Medium Date": SSF._table[15], "Short Date": SSF._table[14], "Long Time": SSF._table[19], "Medium Time": SSF._table[18], "Short Time": SSF._table[20], Currency: '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)', Fixed: SSF._table[2], Standard: SSF._table[4], Percent: SSF._table[10], Scientific: SSF._table[11], "Yes/No": '"Yes";"Yes";"No";@', "True/False": '"True";"True";"False";@', "On/Off": '"Yes";"Yes";"No";@' }; var DO_NOT_EXPORT_CFB = true; var CFB = function _CFB() { var exports = {}; exports.version = "0.10.2"; function parse(file) { var mver = 3; var ssz = 512; var nmfs = 0; var ndfs = 0; var dir_start = 0; var minifat_start = 0; var difat_start = 0; var fat_addrs = []; var blob = file.slice(0, 512); prep_blob(blob, 0); var mv = check_get_mver(blob); mver = mv[0]; switch (mver) { case 3: ssz = 512; break; case 4: ssz = 4096; break; default: throw "Major Version: Expected 3 or 4 saw " + mver } if (ssz !== 512) { blob = file.slice(0, ssz); prep_blob(blob, 28) } var header = file.slice(0, ssz); check_shifts(blob, mver); var nds = blob.read_shift(4, "i"); if (mver === 3 && nds !== 0) throw "# Directory Sectors: Expected 0 saw " + nds; blob.l += 4; dir_start = blob.read_shift(4, "i"); blob.l += 4; blob.chk("00100000", "Mini Stream Cutoff Size: "); minifat_start = blob.read_shift(4, "i"); nmfs = blob.read_shift(4, "i"); difat_start = blob.read_shift(4, "i"); ndfs = blob.read_shift(4, "i"); for (var q, j = 0; j < 109; ++j) { q = blob.read_shift(4, "i"); if (q < 0) break; fat_addrs[j] = q } var sectors = sectorify(file, ssz); sleuth_fat(difat_start, ndfs, sectors, ssz, fat_addrs); var sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz); sector_list[dir_start].name = "!Directory"; if (nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = "!MiniFAT"; sector_list[fat_addrs[0]].name = "!FAT"; sector_list.fat_addrs = fat_addrs; sector_list.ssz = ssz; var files = {}, Paths = [], FileIndex = [], FullPaths = [], FullPathDir = {}; read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex); build_full_paths(FileIndex, FullPathDir, FullPaths, Paths); var root_name = Paths.shift(); Paths.root = root_name; var find_path = make_find_path(FullPaths, Paths, FileIndex, files, root_name); return { raw: { header: header, sectors: sectors }, FileIndex: FileIndex, FullPaths: FullPaths, FullPathDir: FullPathDir, find: find_path } } function check_get_mver(blob) { blob.chk(HEADER_SIGNATURE, "Header Signature: "); blob.chk(HEADER_CLSID, "CLSID: "); var mver = blob.read_shift(2, "u"); return [blob.read_shift(2, "u"), mver] } function check_shifts(blob, mver) { var shift = 9; blob.chk("feff", "Byte Order: "); switch (shift = blob.read_shift(2)) { case 9: if (mver !== 3) throw "MajorVersion/SectorShift Mismatch"; break; case 12: if (mver !== 4) throw "MajorVersion/SectorShift Mismatch"; break; default: throw "Sector Shift: Expected 9 or 12 saw " + shift } blob.chk("0600", "Mini Sector Shift: "); blob.chk("000000000000", "Reserved: ") } function sectorify(file, ssz) { var nsectors = Math.ceil(file.length / ssz) - 1; var sectors = new Array(nsectors); for (var i = 1; i < nsectors; ++i) sectors[i - 1] = file.slice(i * ssz, (i + 1) * ssz); sectors[nsectors - 1] = file.slice(nsectors * ssz); return sectors } function build_full_paths(FI, FPD, FP, Paths) { var i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length; var dad = new Array(pl), q = new Array(pl); for (; i < pl; ++i) { dad[i] = q[i] = i; FP[i] = Paths[i] } for (; j < q.length; ++j) { i = q[j]; L = FI[i].L; R = FI[i].R; C = FI[i].C; if (dad[i] === i) { if (L !== -1 && dad[L] !== L) dad[i] = dad[L]; if (R !== -1 && dad[R] !== R) dad[i] = dad[R] } if (C !== -1) dad[C] = i; if (L !== -1) { dad[L] = dad[i]; q.push(L) } if (R !== -1) { dad[R] = dad[i]; q.push(R) } } for (i = 1; i !== pl; ++i) if (dad[i] === i) { if (R !== -1 && dad[R] !== R) dad[i] = dad[R]; else if (L !== -1 && dad[L] !== L) dad[i] = dad[L] } for (i = 1; i < pl; ++i) { if (FI[i].type === 0) continue; j = dad[i]; if (j === 0) FP[i] = FP[0] + "/" + FP[i]; else while (j !== 0) { FP[i] = FP[j] + "/" + FP[i]; j = dad[j] } dad[i] = 0 } FP[0] += "/"; for (i = 1; i < pl; ++i) { if (FI[i].type !== 2) FP[i] += "/"; FPD[FP[i]] = FI[i] } } function make_find_path(FullPaths, Paths, FileIndex, files, root_name) { var UCFullPaths = new Array(FullPaths.length); var UCPaths = new Array(Paths.length), i; for (i = 0; i < FullPaths.length; ++i) UCFullPaths[i] = FullPaths[i].toUpperCase().replace(chr0, "").replace(chr1, "!"); for (i = 0; i < Paths.length; ++i) UCPaths[i] = Paths[i].toUpperCase().replace(chr0, "").replace(chr1, "!"); return function find_path(path) { var k; if (path.charCodeAt(0) === 47) { k = true; path = root_name + path } else k = path.indexOf("/") !== -1; var UCPath = path.toUpperCase().replace(chr0, "").replace(chr1, "!"); var w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath); if (w === -1) return null; return k === true ? FileIndex[w] : files[Paths[w]] } } function sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) { var q; if (idx === ENDOFCHAIN) { if (cnt !== 0) throw "DIFAT chain shorter than expected" } else if (idx !== -1) { var sector = sectors[idx], m = (ssz >>> 2) - 1; for (var i = 0; i < m; ++i) { if ((q = __readInt32LE(sector, i * 4)) === ENDOFCHAIN) break; fat_addrs.push(q) } sleuth_fat(__readInt32LE(sector, ssz - 4), cnt - 1, sectors, ssz, fat_addrs) } } function get_sector_list(sectors, start, fat_addrs, ssz, chkd) { var sl = sectors.length; var buf, buf_chain; if (!chkd) chkd = new Array(sl); var modulus = ssz - 1, j, jj; buf = []; buf_chain = []; for (j = start; j >= 0; ) { chkd[j] = true; buf[buf.length] = j; buf_chain.push(sectors[j]); var addr = fat_addrs[Math.floor(j * 4 / ssz)]; jj = j * 4 & modulus; if (ssz < 4 + jj) throw "FAT boundary crossed: " + j + " 4 " + ssz; j = __readInt32LE(sectors[addr], jj) } return { nodes: buf, data: __toBuffer([buf_chain]) } } function make_sector_list(sectors, dir_start, fat_addrs, ssz) { var sl = sectors.length, sector_list = new Array(sl); var chkd = new Array(sl), buf, buf_chain; var modulus = ssz - 1, i, j, k, jj; for (i = 0; i < sl; ++i) { buf = []; k = i + dir_start; if (k >= sl) k -= sl; if (chkd[k] === true) continue; buf_chain = []; for (j = k; j >= 0; ) { chkd[j] = true; buf[buf.length] = j; buf_chain.push(sectors[j]); var addr = fat_addrs[Math.floor(j * 4 / ssz)]; jj = j * 4 & modulus; if (ssz < 4 + jj) throw "FAT boundary crossed: " + j + " 4 " + ssz; j = __readInt32LE(sectors[addr], jj) } sector_list[k] = { nodes: buf, data: __toBuffer([buf_chain]) } } return sector_list } function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex) { var blob; var minifat_store = 0, pl = Paths.length ? 2 : 0; var sector = sector_list[dir_start].data; var i = 0, namelen = 0, name, o, ctime, mtime; for (; i < sector.length; i += 128) { blob = sector.slice(i, i + 128); prep_blob(blob, 64); namelen = blob.read_shift(2); if (namelen === 0) continue; name = __utf16le(blob, 0, namelen - pl); Paths.push(name); o = { name: name, type: blob.read_shift(1), color: blob.read_shift(1), L: blob.read_shift(4, "i"), R: blob.read_shift(4, "i"), C: blob.read_shift(4, "i"), clsid: blob.read_shift(16), state: blob.read_shift(4, "i") }; ctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2); if (ctime !== 0) { o.ctime = ctime; o.ct = read_date(blob, blob.l - 8) } mtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2); if (mtime !== 0) { o.mtime = mtime; o.mt = read_date(blob, blob.l - 8) } o.start = blob.read_shift(4, "i"); o.size = blob.read_shift(4, "i"); if (o.type === 5) { minifat_store = o.start; if (nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = "!StreamData" } else if (o.size >= 4096) { o.storage = "fat"; if (sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz); sector_list[o.start].name = o.name; o.content = sector_list[o.start].data.slice(0, o.size); prep_blob(o.content, 0) } else { o.storage = "minifat"; if (minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN) { o.content = sector_list[minifat_store].data.slice(o.start * MSSZ, o.start * MSSZ + o.size); prep_blob(o.content, 0) } } files[name] = o; FileIndex.push(o) } } function read_date(blob, offset) { return new Date((__readUInt32LE(blob, offset + 4) / 1e7 * Math.pow(2, 32) + __readUInt32LE(blob, offset) / 1e7 - 11644473600) * 1e3) } var fs; function readFileSync(filename, options) { if (fs === undefined) fs = require("fs"); return parse(fs.readFileSync(filename), options) } function readSync(blob, options) { switch (options !== undefined && options.type !== undefined ? options.type : "base64") { case "file": return readFileSync(blob, options); case "base64": return parse(s2a(Base64.decode(blob)), options); case "binary": return parse(s2a(blob), options) } return parse(blob) } var MSSZ = 64; var ENDOFCHAIN = -2; var HEADER_SIGNATURE = "d0cf11e0a1b11ae1"; var HEADER_CLSID = "00000000000000000000000000000000"; var consts = { MAXREGSECT: -6, DIFSECT: -4, FATSECT: -3, ENDOFCHAIN: ENDOFCHAIN, FREESECT: -1, HEADER_SIGNATURE: HEADER_SIGNATURE, HEADER_MINOR_VERSION: "3e00", MAXREGSID: -6, NOSTREAM: -1, HEADER_CLSID: HEADER_CLSID, EntryTypes: ["unknown", "storage", "stream", "lockbytes", "property", "root"] }; exports.read = readSync; exports.parse = parse; exports.utils = { ReadShift: ReadShift, CheckField: CheckField, prep_blob: prep_blob, bconcat: bconcat, consts: consts }; return exports } (); if (typeof require !== "undefined" && typeof module !== "undefined" && typeof DO_NOT_EXPORT_CFB === "undefined") { module.exports = CFB } function isval(x) { return x !== undefined && x !== null } function keys(o) { return Object.keys(o) } function evert_key(obj, key) { var o = [], K = keys(obj); for (var i = 0; i !== K.length; ++i) o[obj[K[i]][key]] = K[i]; return o } function evert(obj) { var o = [], K = keys(obj); for (var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i]; return o } function evert_num(obj) { var o = [], K = keys(obj); for (var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i], 10); return o } function evert_arr(obj) { var o = [], K = keys(obj); for (var i = 0; i !== K.length; ++i) { if (o[obj[K[i]]] == null) o[obj[K[i]]] = []; o[obj[K[i]]].push(K[i]) } return o } function datenum(v, date1904) { if (date1904) v += 1462; var epoch = Date.parse(v); return (epoch + 22091616e5) / (24 * 60 * 60 * 1e3) } function cc2str(arr) { var o = ""; for (var i = 0; i != arr.length; ++i) o += String.fromCharCode(arr[i]); return o } function getdata(data) { if (!data) return null; if (data.name.substr(-4) === ".bin") { if (data.data) return char_codes(data.data); if (data.asNodeBuffer && has_buf) return data.asNodeBuffer(); if (data._data && data._data.getContent) return Array.prototype.slice.call(data._data.getContent()) } else { if (data.data) return data.name.substr(-4) !== ".bin" ? debom_xml(data.data) : char_codes(data.data); if (data.asNodeBuffer && has_buf) return debom_xml(data.asNodeBuffer().toString("binary")); if (data.asBinary) return debom_xml(data.asBinary()); if (data._data && data._data.getContent) return debom_xml(cc2str(Array.prototype.slice.call(data._data.getContent(), 0))) } return null } function safegetzipfile(zip, file) { var f = file; if (zip.files[f]) return zip.files[f]; f = file.toLowerCase(); if (zip.files[f]) return zip.files[f]; f = f.replace(/\//g, "\\"); if (zip.files[f]) return zip.files[f]; return null } function getzipfile(zip, file) { var o = safegetzipfile(zip, file); if (o == null) throw new Error("Cannot find file " + file + " in zip"); return o } function getzipdata(zip, file, safe) { if (!safe) return getdata(getzipfile(zip, file)); if (!file) return null; try { return getzipdata(zip, file) } catch (e) { return null } } var _fs, jszip; if (typeof JSZip !== "undefined") jszip = JSZip; if (typeof exports !== "undefined") { if (typeof module !== "undefined" && module.exports) { if (has_buf && typeof jszip === "undefined") jszip = require("js" + "zip"); if (typeof jszip === "undefined") jszip = require("./js" + "zip").JSZip; _fs = require("f" + "s") } } var attregexg = /([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g; var tagregex = /<[^>]*>/g; var nsregex = /<\w*:/, nsregex2 = /<(\/?)\w+:/; function parsexmltag(tag, skip_root) { var z = []; var eq = 0, c = 0; for (; eq !== tag.length; ++eq) if ((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break; if (!skip_root) z[0] = tag.substr(0, eq); if (eq === tag.length) return z; var m = tag.match(attregexg), j = 0, w = "", v = "", i = 0, q = "", cc = ""; if (m) for (i = 0; i != m.length; ++i) { cc = m[i]; for (c = 0; c != cc.length; ++c) if (cc.charCodeAt(c) === 61) break; q = cc.substr(0, c); v = cc.substring(c + 2, cc.length - 1); for (j = 0; j != q.length; ++j) if (q.charCodeAt(j) === 58) break; if (j === q.length) z[q] = v; else z[(j === 5 && q.substr(0, 5) === "xmlns" ? "xmlns" : "") + q.substr(j + 1)] = v } return z } function strip_ns(x) { return x.replace(nsregex2, "<$1") } var encodings = { """: '"', "'": "'", ">": ">", "<": "<", "&": "&" }; var rencoding = evert(encodings); var rencstr = "&<>'\"".split(""); var unescapexml = function () { var encregex = /&[a-z]*;/g, coderegex = /_x([\da-fA-F]+)_/g; return function unescapexml(text) { var s = text + ""; return s.replace(encregex, function ($$) { return encodings[$$] }).replace(coderegex, function (m, c) { return String.fromCharCode(parseInt(c, 16)) }) } } (); var decregex = /[&<>'"]/g, charegex = /[\u0000-\u0008\u000b-\u001f]/g; function escapexml(text) { var s = text + ""; return s.replace(decregex, function (y) { return rencoding[y] }).replace(charegex, function (s) { return "_x" + ("000" + s.charCodeAt(0).toString(16)).substr(-4) + "_" }) } var xlml_fixstr = function () { var entregex = /&#(\d+);/g; function entrepl($$, $1) { return String.fromCharCode(parseInt($1, 10)) } return function xlml_fixstr(str) { return str.replace(entregex, entrepl) } } (); function parsexmlbool(value, tag) { switch (value) { case "1": case "true": case "TRUE": return true; default: return false } } var utf8read = function utf8reada(orig) { var out = "", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0; while (i < orig.length) { c = orig.charCodeAt(i++); if (c < 128) { out += String.fromCharCode(c); continue } d = orig.charCodeAt(i++); if (c > 191 && c < 224) { out += String.fromCharCode((c & 31) << 6 | d & 63); continue } e = orig.charCodeAt(i++); if (c < 240) { out += String.fromCharCode((c & 15) << 12 | (d & 63) << 6 | e & 63); continue } f = orig.charCodeAt(i++); w = ((c & 7) << 18 | (d & 63) << 12 | (e & 63) << 6 | f & 63) - 65536; out += String.fromCharCode(55296 + (w >>> 10 & 1023)); out += String.fromCharCode(56320 + (w & 1023)) } return out }; if (has_buf) { var utf8readb = function utf8readb(data) { var out = new Buffer(2 * data.length), w, i, j = 1, k = 0, ww = 0, c; for (i = 0; i < data.length; i += j) { j = 1; if ((c = data.charCodeAt(i)) < 128) w = c; else if (c < 224) { w = (c & 31) * 64 + (data.charCodeAt(i + 1) & 63); j = 2 } else if (c < 240) { w = (c & 15) * 4096 + (data.charCodeAt(i + 1) & 63) * 64 + (data.charCodeAt(i + 2) & 63); j = 3 } else { j = 4; w = (c & 7) * 262144 + (data.charCodeAt(i + 1) & 63) * 4096 + (data.charCodeAt(i + 2) & 63) * 64 + (data.charCodeAt(i + 3) & 63); w -= 65536; ww = 55296 + (w >>> 10 & 1023); w = 56320 + (w & 1023) } if (ww !== 0) { out[k++] = ww & 255; out[k++] = ww >>> 8; ww = 0 } out[k++] = w % 256; out[k++] = w >>> 8 } out.length = k; return out.toString("ucs2") }; var corpus = "foo bar bazâð£"; if (utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb; var utf8readc = function utf8readc(data) { return Buffer(data, "binary").toString("utf8") }; if (utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc } var matchtag = function () { var mtcache = {}; return function matchtag(f, g) { var t = f + "|" + g; if (mtcache[t] !== undefined) return mtcache[t]; return mtcache[t] = new RegExp("<(?:\\w+:)?" + f + '(?: xml:space="preserve")?(?:[^>]*)>([^☃]*)</(?:\\w+:)?' + f + ">", g || "") } } (); var vtregex = function () { var vt_cache = {}; return function vt_regex(bt) { if (vt_cache[bt] !== undefined) return vt_cache[bt]; return vt_cache[bt] = new RegExp("<vt:" + bt + ">(.*?)</vt:" + bt + ">", "g") } } (); var vtvregex = /<\/?vt:variant>/g, vtmregex = /<vt:([^>]*)>(.*)</; function parseVector(data) { var h = parsexmltag(data); var matches = data.match(vtregex(h.baseType)) || []; if (matches.length != h.size) throw "unexpected vector length " + matches.length + " != " + h.size; var res = []; matches.forEach(function (x) { var v = x.replace(vtvregex, "").match(vtmregex); res.push({ v: v[2], t: v[1] }) }); return res } var wtregex = /(^\s|\s$|\n)/; function writetag(f, g) { return "<" + f + (g.match(wtregex) ? ' xml:space="preserve"' : "") + ">" + g + "</" + f + ">" } function wxt_helper(h) { return keys(h).map(function (k) { return " " + k + '="' + h[k] + '"' }).join("") } function writextag(f, g, h) { return "<" + f + (isval(h) ? wxt_helper(h) : "") + (isval(g) ? (g.match(wtregex) ? ' xml:space="preserve"' : "") + ">" + g + "</" + f : "/") + ">" } function write_w3cdtf(d, t) { try { return d.toISOString().replace(/\.\d*/, "") } catch (e) { if (t) throw e } } function write_vt(s) { switch (typeof s) { case "string": return writextag("vt:lpwstr", s); case "number": return writextag((s | 0) == s ? "vt:i4" : "vt:r8", String(s)); case "boolean": return writextag("vt:bool", s ? "true" : "false") } if (s instanceof Date) return writextag("vt:filetime", write_w3cdtf(s)); throw new Error("Unable to serialize " + s) } var XML_HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n'; var XMLNS = { dc: "http://purl.org/dc/elements/1.1/", dcterms: "http://purl.org/dc/terms/", dcmitype: "http://purl.org/dc/dcmitype/", mx: "http://schemas.microsoft.com/office/mac/excel/2008/main", r: "http://schemas.openxmlformats.org/officeDocument/2006/relationships", sjs: "http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties", vt: "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes", xsi: "http://www.w3.org/2001/XMLSchema-instance", xsd: "http://www.w3.org/2001/XMLSchema" }; XMLNS.main = ["http://schemas.openxmlformats.org/spreadsheetml/2006/main", "http://purl.oclc.org/ooxml/spreadsheetml/main", "http://schemas.microsoft.com/office/excel/2006/main", "http://schemas.microsoft.com/office/excel/2006/2"]; function readIEEE754(buf, idx, isLE, nl, ml) { if (isLE === undefined) isLE = true; if (!nl) nl = 8; if (!ml && nl === 8) ml = 52; var e, m, el = nl * 8 - ml - 1, eMax = (1 << el) - 1, eBias = eMax >> 1; var bits = -7, d = isLE ? -1 : 1, i = isLE ? nl - 1 : 0, s = buf[idx + i]; i += d; e = s & (1 << -bits) - 1; s >>>= -bits; bits += el; for (; bits > 0; e = e * 256 + buf[idx + i], i += d, bits -= 8); m = e & (1 << -bits) - 1; e >>>= -bits; bits += ml; for (; bits > 0; m = m * 256 + buf[idx + i], i += d, bits -= 8); if (e === eMax) return m ? NaN : (s ? -1 : 1) * Infinity; else if (e === 0) e = 1 - eBias; else { m = m + Math.pow(2, ml); e = e - eBias } return (s ? -1 : 1) * m * Math.pow(2, e - ml) } var __toBuffer, ___toBuffer; __toBuffer = ___toBuffer = function toBuffer_(bufs) { var x = []; for (var i = 0; i < bufs[0].length; ++i) { x.push.apply(x, bufs[0][i]) } return x }; var __utf16le, ___utf16le; __utf16le = ___utf16le = function utf16le_(b, s, e) { var ss = []; for (var i = s; i < e; i += 2) ss.push(String.fromCharCode(__readUInt16LE(b, i))); return ss.join("") }; var __hexlify, ___hexlify; __hexlify = ___hexlify = function hexlify_(b, s, l) { return b.slice(s, s + l).map(function (x) { return (x < 16 ? "0" : "") + x.toString(16) }).join("") }; var __utf8, ___utf8; __utf8 = ___utf8 = function (b, s, e) { var ss = []; for (var i = s; i < e; i++) ss.push(String.fromCharCode(__readUInt8(b, i))); return ss.join("") }; var __lpstr, ___lpstr; __lpstr = ___lpstr = function lpstr_(b, i) { var len = __readUInt32LE(b, i); return len > 0 ? __utf8(b, i + 4, i + 4 + len - 1) : "" }; var __lpwstr, ___lpwstr; __lpwstr = ___lpwstr = function lpwstr_(b, i) { var len = 2 * __readUInt32LE(b, i); return len > 0 ? __utf8(b, i + 4, i + 4 + len - 1) : "" }; var __double, ___double; __double = ___double = function (b, idx) { return readIEEE754(b, idx) }; var is_buf = function is_buf_a(a) { return Array.isArray(a) }; if (has_buf) { __utf16le = function utf16le_b(b, s, e) { if (!Buffer.isBuffer(b)) return ___utf16le(b, s, e); return b.toString("utf16le", s, e) }; __hexlify = function (b, s, l) { return Buffer.isBuffer(b) ? b.toString("hex", s, s + l) : ___hexlify(b, s, l) }; __lpstr = function lpstr_b(b, i) { if (!Buffer.isBuffer(b)) return ___lpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString("utf8", i + 4, i + 4 + len - 1) : "" }; __lpwstr = function lpwstr_b(b, i) { if (!Buffer.isBuffer(b)) return ___lpwstr(b, i); var len = 2 * b.readUInt32LE(i); return b.toString("utf16le", i + 4, i + 4 + len - 1) }; __utf8 = function utf8_b(s, e) { return this.toString("utf8", s, e) }; __toBuffer = function (bufs) { return bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0]) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs) }; bconcat = function (bufs) { return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : [].concat.apply([], bufs) }; __double = function double_(b, i) { if (Buffer.isBuffer(b)) return b.readDoubleLE(i); return ___double(b, i) }; is_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a) } } if (typeof cptable !== "undefined") { __utf16le = function (b, s, e) { return cptable.utils.decode(1200, b.slice(s, e)) }; __utf8 = function (b, s, e) { return cptable.utils.decode(65001, b.slice(s, e)) }; __lpstr = function (b, i) { var len = __readUInt32LE(b, i); return len > 0 ? cptable.utils.decode(current_codepage, b.slice(i + 4, i + 4 + len - 1)) : "" }; __lpwstr = function (b, i) { var len = 2 * __readUInt32LE(b, i); return len > 0 ? cptable.utils.decode(1200, b.slice(i + 4, i + 4 + len - 1)) : "" } } var __readUInt8 = function (b, idx) { return b[idx] }; var __readUInt16LE = function (b, idx) { return b[idx + 1] * (1 << 8) + b[idx] }; var __readInt16LE = function (b, idx) { var u = b[idx + 1] * (1 << 8) + b[idx]; return u < 32768 ? u : (65535 - u + 1) * -1 }; var __readUInt32LE = function (b, idx) { return b[idx + 3] * (1 << 24) + (b[idx + 2] << 16) + (b[idx + 1] << 8) + b[idx] }; var __readInt32LE = function (b, idx) { return b[idx + 3] << 24 | b[idx + 2] << 16 | b[idx + 1] << 8 | b[idx] }; var ___unhexlify = function (s) { return s.match(/../g).map(function (x) { return parseInt(x, 16) }) }; var __unhexlify = typeof Buffer !== "undefined" ? function (s) { return Buffer.isBuffer(s) ? new Buffer(s, "hex") : ___unhexlify(s) } : ___unhexlify; function ReadShift(size, t) { var o = "", oI, oR, oo = [], w, vv, i, loc; switch (t) { case "dbcs": loc = this.l; if (has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l + 2 * size).toString("utf16le"); else for (i = 0; i != size; ++i) { o += String.fromCharCode(__readUInt16LE(this, loc)); loc += 2 } size *= 2; break; case "utf8": o = __utf8(this, this.l, this.l + size); break; case "utf16le": size *= 2; o = __utf16le(this, this.l, this.l + size); break; case "lpstr": o = __lpstr(this, this.l); size = 5 + o.length; break; case "lpwstr": o = __lpwstr(this, this.l); size = 5 + o.length; if (o[o.length - 1] == "\x00") size += 2; break; case "cstr": size = 0; o = ""; while ((w = __readUInt8(this, this.l + size++)) !== 0) oo.push(_getchar(w)); o = oo.join(""); break; case "wstr": size = 0; o = ""; while ((w = __readUInt16LE(this, this.l + size)) !== 0) { oo.push(_getchar(w)); size += 2 } size += 2; o = oo.join(""); break; case "dbcs-cont": o = ""; loc = this.l; for (i = 0; i != size; ++i) { if (this.lens && this.lens.indexOf(loc) !== -1) { w = __readUInt8(this, loc); this.l = loc + 1; vv = ReadShift.call(this, size - i, w ? "dbcs-cont" : "sbcs-cont"); return oo.join("") + vv } oo.push(_getchar(__readUInt16LE(this, loc))); loc += 2 } o = oo.join(""); size *= 2; break; case "sbcs-cont": o = ""; loc = this.l; for (i = 0; i != size; ++i) { if (this.lens && this.lens.indexOf(loc) !== -1) { w = __readUInt8(this, loc); this.l = loc + 1; vv = ReadShift.call(this, size - i, w ? "dbcs-cont" : "sbcs-cont"); return oo.join("") + vv } oo.push(_getchar(__readUInt8(this, loc))); loc += 1 } o = oo.join(""); break; default: switch (size) { case 1: oI = __readUInt8(this, this.l); this.l++; return oI; case 2: oI = (t === "i" ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI; case 4: if (t === "i" || (this[this.l + 3] & 128) === 0) { oI = __readInt32LE(this, this.l); this.l += 4; return oI } else { oR = __readUInt32LE(this, this.l); this.l += 4; return oR } break; case 8: if (t === "f") { oR = __double(this, this.l); this.l += 8; return oR } case 16: o = __hexlify(this, this.l, size); break } } this.l += size; return o } function WriteShift(t, val, f) { var size, i; if (f === "dbcs") { for (i = 0; i != val.length; ++i) this.writeUInt16LE(val.charCodeAt(i), this.l + 2 * i); size = 2 * val.length } else switch (t) { case 1: size = 1; this[this.l] = val & 255; break; case 3: size = 3; this[this.l + 2] = val & 255; val >>>= 8; this[this.l + 1] = val & 255; val >>>= 8; this[this.l] = val & 255; break; case 4: size = 4; this.writeUInt32LE(val, this.l); break; case 8: size = 8; if (f === "f") { this.writeDoubleLE(val, this.l); break } case 16: break; case -4: size = 4; this.writeInt32LE(val, this.l); break } this.l += size; return this } function CheckField(hexstr, fld) { var m = __hexlify(this, this.l, hexstr.length >> 1); if (m !== hexstr) throw fld + "Expected " + hexstr + " saw " + m; this.l += hexstr.length >> 1 } function prep_blob(blob, pos) { blob.l = pos; blob.read_shift = ReadShift; blob.chk = CheckField; blob.write_shift = WriteShift } function parsenoop(blob, length) { blob.l += length } function writenoop(blob, length) { blob.l += length } function new_buf(sz) { var o = new_raw_buf(sz); prep_blob(o, 0); return o } function recordhopper(data, cb, opts) { var tmpbyte, cntbyte, length; prep_blob(data, data.l || 0); while (data.l < data.length) { var RT = data.read_shift(1); if (RT & 128) RT = (RT & 127) + ((data.read_shift(1) & 127) << 7); var R = XLSBRecordEnum[RT] || XLSBRecordEnum[65535]; tmpbyte = data.read_shift(1); length = tmpbyte & 127; for (cntbyte = 1; cntbyte < 4 && tmpbyte & 128; ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 127) << 7 * cntbyte; var d = R.f(data, length, opts); if (cb(d, R, RT)) return } } function buf_array() { var bufs = [], blksz = 2048; var newblk = function ba_newblk(sz) { var o = new_buf(sz); prep_blob(o, 0); return o }; var curbuf = newblk(blksz); var endbuf = function ba_endbuf() { curbuf.length = curbuf.l; if (curbuf.length > 0) bufs.push(curbuf); curbuf = null }; var next = function ba_next(sz) { if (sz < curbuf.length - curbuf.l) return curbuf; endbuf(); return curbuf = newblk(Math.max(sz + 1, blksz)) }; var end = function ba_end() { endbuf(); return __toBuffer([bufs]) }; var push = function ba_push(buf) { endbuf(); curbuf = buf; next(blksz) }; return { next: next, push: push, end: end, _bufs: bufs } } function write_record(ba, type, payload, length) { var t = evert_RE[type], l; if (!length) length = XLSBRecordEnum[t].p || (payload || []).length || 0; l = 1 + (t >= 128 ? 1 : 0) + 1 + length; if (length >= 128) ++l; if (length >= 16384) ++l; if (length >= 2097152) ++l; var o = ba.next(l); if (t <= 127) o.write_shift(1, t); else { o.write_shift(1, (t & 127) + 128); o.write_shift(1, t >> 7) } for (var i = 0; i != 4; ++i) { if (length >= 128) { o.write_shift(1, (length & 127) + 128); length >>= 7 } else { o.write_shift(1, length); break } } if (length > 0 && is_buf(payload)) ba.push(payload) } function shift_cell_xls(cell, tgt) { if (tgt.s) { if (cell.cRel) cell.c += tgt.s.c; if (cell.rRel) cell.r += tgt.s.r } else { cell.c += tgt.c; cell.r += tgt.r } cell.cRel = cell.rRel = 0; while (cell.c >= 256) cell.c -= 256; while (cell.r >= 65536) cell.r -= 65536; return cell } function shift_range_xls(cell, range) { cell.s = shift_cell_xls(cell.s, range.s); cell.e = shift_cell_xls(cell.e, range.s); return cell } var OFFCRYPTO = {}; var make_offcrypto = function (O, _crypto) { var crypto; if (typeof _crypto !== "undefined") crypto = _crypto; else if (typeof require !== "undefined") { try { crypto = require("cry" + "pto") } catch (e) { crypto = null } } O.rc4 = function (key, data) { var S = new Array(256); var c = 0, i = 0, j = 0, t = 0; for (i = 0; i != 256; ++i) S[i] = i; for (i = 0; i != 256; ++i) { j = j + S[i] + key[i % key.length].charCodeAt(0) & 255; t = S[i]; S[i] = S[j]; S[j] = t } i = j = 0; out = Buffer(data.length); for (c = 0; c != data.length; ++c) { i = i + 1 & 255; j = (j + S[i]) % 256; t = S[i]; S[i] = S[j]; S[j] = t; out[c] = data[c] ^ S[S[i] + S[j] & 255] } return out }; if (crypto) { O.md5 = function (hex) { return crypto.createHash("md5").update(hex).digest("hex") } } else { O.md5 = function (hex) { throw "unimplemented" } } }; make_offcrypto(OFFCRYPTO, typeof crypto !== "undefined" ? crypto : undefined); function parse_StrRun(data, length) { return { ich: data.read_shift(2), ifnt: data.read_shift(2) } } function parse_RichStr(data, length) { var start = data.l; var flags = data.read_shift(1); var str = parse_XLWideString(data); var rgsStrRun = []; var z = { t: str, h: str }; if ((flags & 1) !== 0) { var dwSizeStrRun = data.read_shift(4); for (var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data)); z.r = rgsStrRun } else z.r = "<t>" + escapexml(str) + "</t>"; if ((flags & 2) !== 0) {} data.l = start + length; return z } function write_RichStr(str, o) { if (o == null) o = new_buf(5 + 2 * str.t.length); o.write_shift(1, 0); write_XLWideString(str.t, o); return o } function parse_XLSBCell(data) { var col = data.read_shift(4); var iStyleRef = data.read_shift(2); iStyleRef += data.read_shift(1) << 16; var fPhShow = data.read_shift(1); return { c: col, iStyleRef: iStyleRef } } function write_XLSBCell(cell, o) { if (o == null) o = new_buf(8); o.write_shift(-4, cell.c); o.write_shift(3, cell.iStyleRef === undefined ? cell.iStyleRef : cell.s); o.write_shift(1, 0); return o } function parse_XLSBCodeName(data, length) { return parse_XLWideString(data, length) } function parse_XLNullableWideString(data) { var cchCharacters = data.read_shift(4); return cchCharacters === 0 || cchCharacters === 4294967295 ? "" : data.read_shift(cchCharacters, "dbcs") } function write_XLNullableWideString(data, o) { if (!o) o = new_buf(127); o.write_shift(4, data.length > 0 ? data.length : 4294967295); if (data.length > 0) o.write_shift(0, data, "dbcs"); return o } function parse_XLWideString(data) { var cchCharacters = data.read_shift(4); return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, "dbcs") } function write_XLWideString(data, o) { if (o == null) o = new_buf(4 + 2 * data.length); o.write_shift(4, data.length); if (data.length > 0) o.write_shift(0, data, "dbcs"); return o } var parse_RelID = parse_XLNullableWideString; var write_RelID = write_XLNullableWideString; function parse_RkNumber(data) { var b = data.slice(data.l, data.l + 4); var fX100 = b[0] & 1, fInt = b[0] & 2; data.l += 4; b[0] &= 252; var RK = fInt === 0 ? __double([0, 0, 0, 0, b[0], b[1], b[2], b[3]], 0) : __readInt32LE(b, 0) >> 2; return fX100 ? RK / 100 : RK } function parse_UncheckedRfX(data) { var cell = { s: {}, e: {} }; cell.s.r = data.read_shift(4); cell.e.r = data.read_shift(4); cell.s.c = data.read_shift(4); cell.e.c = data.read_shift(4); return cell } function write_UncheckedRfX(r, o) { if (!o) o = new_buf(16); o.write_shift(4, r.s.r); o.write_shift(4, r.e.r); o.write_shift(4, r.s.c); o.write_shift(4, r.e.c); return o } function parse_Xnum(data, length) { return data.read_shift(8, "f") } function write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, "f", data) } var BErr = { 0: "#NULL!", 7: "#DIV/0!", 15: "#VALUE!", 23: "#REF!", 29: "#NAME?", 36: "#NUM!", 42: "#N/A", 43: "#GETTING_DATA", 255: "#WTF?" }; var RBErr = evert_num(BErr); function parse_BrtColor(data, length) { var out = {}; var d = data.read_shift(1); out.fValidRGB = d & 1; out.xColorType = d >>> 1; out.index = data.read_shift(1); out.nTintAndShade = data.read_shift(2, "i"); out.bRed = data.read_shift(1); out.bGreen = data.read_shift(1); out.bBlue = data.read_shift(1); out.bAlpha = data.read_shift(1) } function parse_FontFlags(data, length) { var d = data.read_shift(1); data.l++; var out = { fItalic: d & 2, fStrikeout: d & 8, fOutline: d & 16, fShadow: d & 32, fCondense: d & 64, fExtend: d & 128 }; return out } { var VT_EMPTY = 0; var VT_NULL = 1; var VT_I2 = 2; var VT_I4 = 3; var VT_R4 = 4; var VT_R8 = 5; var VT_CY = 6; var VT_DATE = 7; var VT_BSTR = 8; var VT_ERROR = 10; var VT_BOOL = 11; var VT_VARIANT = 12; var VT_DECIMAL = 14; var VT_I1 = 16; var VT_UI1 = 17; var VT_UI2 = 18; var VT_UI4 = 19; var VT_I8 = 20; var VT_UI8 = 21; var VT_INT = 22; var VT_UINT = 23; var VT_LPSTR = 30; var VT_LPWSTR = 31; var VT_FILETIME = 64; var VT_BLOB = 65; var VT_STREAM = 66; var VT_STORAGE = 67; var VT_STREAMED_Object = 68; var VT_STORED_Object = 69; var VT_BLOB_Object = 70; var VT_CF = 71; var VT_CLSID = 72; var VT_VERSIONED_STREAM = 73; var VT_VECTOR = 4096; var VT_ARRAY = 8192; var VT_STRING = 80; var VT_USTR = 81; var VT_CUSTOM = [VT_STRING, VT_USTR] } var DocSummaryPIDDSI = { 1: { n: "CodePage", t: VT_I2 }, 2: { n: "Category", t: VT_STRING }, 3: { n: "PresentationFormat", t: VT_STRING }, 4: { n: "ByteCount", t: VT_I4 }, 5: { n: "LineCount", t: VT_I4 }, 6: { n: "ParagraphCount", t: VT_I4 }, 7: { n: "SlideCount", t: VT_I4 }, 8: { n: "NoteCount", t: VT_I4 }, 9: { n: "HiddenCount", t: VT_I4 }, 10: { n: "MultimediaClipCount", t: VT_I4 }, 11: { n: "Scale", t: VT_BOOL }, 12: { n: "HeadingPair", t: VT_VECTOR | VT_VARIANT }, 13: { n: "DocParts", t: VT_VECTOR | VT_LPSTR }, 14: { n: "Manager", t: VT_STRING }, 15: { n: "Company", t: VT_STRING }, 16: { n: "LinksDirty", t: VT_BOOL }, 17: { n: "CharacterCount", t: VT_I4 }, 19: { n: "SharedDoc", t: VT_BOOL }, 22: { n: "HLinksChanged", t: VT_BOOL }, 23: { n: "AppVersion", t: VT_I4, p: "version" }, 26: { n: "ContentType", t: VT_STRING }, 27: { n: "ContentStatus", t: VT_STRING }, 28: { n: "Language", t: VT_STRING }, 29: { n: "Version", t: VT_STRING }, 255: {} }; var SummaryPIDSI = { 1: { n: "CodePage", t: VT_I2 }, 2: { n: "Title", t: VT_STRING }, 3: { n: "Subject", t: VT_STRING }, 4: { n: "Author", t: VT_STRING }, 5: { n: "Keywords", t: VT_STRING }, 6: { n: "Comments", t: VT_STRING }, 7: { n: "Template", t: VT_STRING }, 8: { n: "LastAuthor", t: VT_STRING }, 9: { n: "RevNumber", t: VT_STRING }, 10: { n: "EditTime", t: VT_FILETIME }, 11: { n: "LastPrinted", t: VT_FILETIME }, 12: { n: "CreatedDate", t: VT_FILETIME }, 13: { n: "ModifiedDate", t: VT_FILETIME }, 14: { n: "PageCount", t: VT_I4 }, 15: { n: "WordCount", t: VT_I4 }, 16: { n: "CharCount", t: VT_I4 }, 17: { n: "Thumbnail", t: VT_CF }, 18: { n: "ApplicationName", t: VT_LPSTR }, 19: { n: "DocumentSecurity", t: VT_I4 }, 255: {} }; var SpecialProperties = { 2147483648: { n: "Locale", t: VT_UI4 }, 2147483651: { n: "Behavior", t: VT_UI4 }, 1919054434: {} }; (function () { for (var y in SpecialProperties) if (SpecialProperties.hasOwnProperty(y)) DocSummaryPIDDSI[y] = SummaryPIDSI[y] = SpecialProperties[y] })(); var CountryEnum = { 1: "US", 2: "CA", 3: "", 7: "RU", 20: "EG", 30: "GR", 31: "NL", 32: "BE", 33: "FR", 34: "ES", 36: "HU", 39: "IT", 41: "CH", 43: "AT", 44: "GB", 45: "DK", 46: "SE", 47: "NO", 48: "PL", 49: "DE", 52: "MX", 55: "BR", 61: "AU", 64: "NZ", 66: "TH", 81: "JP", 82: "KR", 84: "VN", 86: "CN", 90: "TR", 105: "JS", 213: "DZ", 216: "MA", 218: "LY", 351: "PT", 354: "IS", 358: "FI", 420: "CZ", 886: "TW", 961: "LB", 962: "JO", 963: "SY", 964: "IQ", 965: "KW", 966: "SA", 971: "AE", 972: "IL", 974: "QA", 981: "IR", 65535: "US" }; var XLSFillPattern = [null, "solid", "mediumGray", "darkGray", "lightGray", "darkHorizontal", "darkVertical", "darkDown", "darkUp", "darkGrid", "darkTrellis", "lightHorizontal", "lightVertical", "lightDown", "lightUp", "lightGrid", "lightTrellis", "gray125", "gray0625"]; function rgbify(arr) { return arr.map(function (x) { return [x >> 16 & 255, x >> 8 & 255, x & 255] }) } var XLSIcv = rgbify([0, 16777215, 16711680, 65280, 255, 16776960, 16711935, 65535, 0, 16777215, 16711680, 65280, 255, 16776960, 16711935, 65535, 8388608, 32768, 128, 8421376, 8388736, 32896, 12632256, 8421504, 10066431, 10040166, 16777164, 13434879, 6684774, 16744576, 26316, 13421823, 128, 16711935, 16776960, 65535, 8388736, 8388608, 32896, 255, 52479, 13434879, 13434828, 16777113, 10079487, 16751052, 13408767, 16764057, 3368703, 3394764, 10079232, 16763904, 16750848, 16737792, 6710937, 9868950, 13158, 3381606, 13056, 3355392, 10040064, 10040166, 3355545, 3355443, 16777215, 0]); var ct2type = { "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": "workbooks", "application/vnd.ms-excel.binIndexWs": "TODO", "application/vnd.ms-excel.chartsheet": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": "TODO", "application/vnd.ms-excel.dialogsheet": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": "TODO", "application/vnd.ms-excel.macrosheet": "TODO", "application/vnd.ms-excel.macrosheet+xml": "TODO", "application/vnd.ms-excel.intlmacrosheet": "TODO", "application/vnd.ms-excel.binIndexMs": "TODO", "application/vnd.openxmlformats-package.core-properties+xml": "coreprops", "application/vnd.openxmlformats-officedocument.custom-properties+xml": "custprops", "application/vnd.openxmlformats-officedocument.extended-properties+xml": "extprops", "application/vnd.openxmlformats-officedocument.customXmlProperties+xml": "TODO", "application/vnd.ms-excel.comments": "comments", "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": "comments", "application/vnd.ms-excel.pivotTable": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml": "TODO", "application/vnd.ms-excel.calcChain": "calcchains", "application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml": "calcchains", "application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings": "TODO", "application/vnd.ms-office.activeX": "TODO", "application/vnd.ms-office.activeX+xml": "TODO", "application/vnd.ms-excel.attachedToolbars": "TODO", "application/vnd.ms-excel.connections": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": "TODO", "application/vnd.ms-excel.externalLink": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml": "TODO", "application/vnd.ms-excel.sheetMetadata": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml": "TODO", "application/vnd.ms-excel.pivotCacheDefinition": "TODO", "application/vnd.ms-excel.pivotCacheRecords": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml": "TODO", "application/vnd.ms-excel.queryTable": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml": "TODO", "application/vnd.ms-excel.userNames": "TODO", "application/vnd.ms-excel.revisionHeaders": "TODO", "application/vnd.ms-excel.revisionLog": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml": "TODO", "application/vnd.ms-excel.tableSingleCells": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml": "TODO", "application/vnd.ms-excel.slicer": "TODO", "application/vnd.ms-excel.slicerCache": "TODO", "application/vnd.ms-excel.slicer+xml": "TODO", "application/vnd.ms-excel.slicerCache+xml": "TODO", "application/vnd.ms-excel.wsSortMap": "TODO", "application/vnd.ms-excel.table": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": "TODO", "application/vnd.openxmlformats-officedocument.theme+xml": "themes", "application/vnd.ms-excel.Timeline+xml": "TODO", "application/vnd.ms-excel.TimelineCache+xml": "TODO", "application/vnd.ms-office.vbaProject": "vba", "application/vnd.ms-office.vbaProjectSignature": "vba", "application/vnd.ms-office.volatileDependencies": "TODO", "application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml": "TODO", "application/vnd.ms-excel.controlproperties+xml": "TODO", "application/vnd.openxmlformats-officedocument.model+data": "TODO", "application/vnd.ms-excel.Survey+xml": "TODO", "application/vnd.openxmlformats-officedocument.drawing+xml": "TODO", "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": "TODO", "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": "TODO", "application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml": "TODO", "application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml": "TODO", "application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml": "TODO", "application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml": "TODO", "application/vnd.openxmlformats-officedocument.vmlDrawing": "TODO", "application/vnd.openxmlformats-package.relationships+xml": "rels", "application/vnd.openxmlformats-officedocument.oleObject": "TODO", sheet: "js" }; var CT_LIST = function () { var o = { workbooks: { xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml", xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main", xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" }, strs: { xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml", xlsb: "application/vnd.ms-excel.sharedStrings" }, sheets: { xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml", xlsb: "application/vnd.ms-excel.worksheet" }, styles: { xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml", xlsb: "application/vnd.ms-excel.styles" } }; keys(o).forEach(function (k) { if (!o[k].xlsm) o[k].xlsm = o[k].xlsx }); keys(o).forEach(function (k) { keys(o[k]).forEach(function (v) { ct2type[o[k][v]] = k }) }); return o } (); var type2ct = evert_arr(ct2type); XMLNS.CT = "http://schemas.openxmlformats.org/package/2006/content-types"; function parse_ct(data, opts) { var ctext = {}; if (!data || !data.match) return data; var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [], coreprops: [], extprops: [], custprops: [], strs: [], comments: [], vba: [], TODO: [], rels: [], xmlns: "" }; (data.match(tagregex) || []).forEach(function (x) { var y = parsexmltag(x); switch (y[0].replace(nsregex, "<")) { case "<?xml": break; case "<Types": ct.xmlns = y["xmlns" + (y[0].match(/<(\w+):/) || ["", ""])[1]]; break; case "<Default": ctext[y.Extension] = y.ContentType; break; case "<Override": if (ct[ct2type[y.ContentType]] !== undefined) ct[ct2type[y.ContentType]].push(y.PartName); else if (opts.WTF) console.error(y); break } }); if (ct.xmlns !== XMLNS.CT) throw new Error("Unknown Namespace: " + ct.xmlns); ct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : ""; ct.sst = ct.strs.length > 0 ? ct.strs[0] : ""; ct.style = ct.styles.length > 0 ? ct.styles[0] : ""; ct.defaults = ctext; delete ct.calcchains; return ct } var CTYPE_XML_ROOT = writextag("Types", null, { xmlns: XMLNS.CT, "xmlns:xsd": XMLNS.xsd, "xmlns:xsi": XMLNS.xsi }); var CTYPE_DEFAULTS = [["xml", "application/xml"], ["bin", "application/vnd.ms-excel.sheet.binary.macroEnabled.main"], ["rels", type2ct.rels[0]]].map(function (x) { return writextag("Default", null, { Extension: x[0], ContentType: x[1] }) }); function write_ct(ct, opts) { var o = [], v; o[o.length] = XML_HEADER; o[o.length] = CTYPE_XML_ROOT; o = o.concat(CTYPE_DEFAULTS); var f1 = function (w) { if (ct[w] && ct[w].length > 0) { v = ct[w][0]; o[o.length] = writextag("Override", null, { PartName: (v[0] == "/" ? "" : "/") + v, ContentType: CT_LIST[w][opts.bookType || "xlsx"] }) } }; var f2 = function (w) { ct[w].forEach(function (v) { o[o.length] = writextag("Override", null, { PartName: (v[0] == "/" ? "" : "/") + v, ContentType: CT_LIST[w][opts.bookType || "xlsx"] }) }) }; var f3 = function (t) { (ct[t] || []).forEach(function (v) { o[o.length] = writextag("Override", null, { PartName: (v[0] == "/" ? "" : "/") + v, ContentType: type2ct[t][0] }) }) }; f1("workbooks"); f2("sheets"); f3("themes"); ["strs", "styles"].forEach(f1); ["coreprops", "extprops", "custprops"].forEach(f3); if (o.length > 2) { o[o.length] = "</Types>"; o[1] = o[1].replace("/>", ">") } return o.join("") } var RELS = { WB: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", SHEET: "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument" }; function parse_rels(data, currentFilePath) { if (!data) return data; if (currentFilePath.charAt(0) !== "/") { currentFilePath = "/" + currentFilePath } var rels = {}; var hash = {}; var resolveRelativePathIntoAbsolute = function (to) { var toksFrom = currentFilePath.split("/"); toksFrom.pop(); var toksTo = to.split("/"); var reversed = []; while (toksTo.length !== 0) { var tokTo = toksTo.shift(); if (tokTo === "..") { toksFrom.pop() } else if (tokTo !== ".") { toksFrom.push(tokTo) } } return toksFrom.join("/") }; data.match(tagregex).forEach(function (x) { var y = parsexmltag(x); if (y[0] === "<Relationship") { var rel = {}; rel.Type = y.Type; rel.Target = y.Target; rel.Id = y.Id; rel.TargetMode = y.TargetMode; var canonictarget = y.TargetMode === "External" ? y.Target : resolveRelativePathIntoAbsolute(y.Target); rels[canonictarget] = rel; hash[y.Id] = rel } }); rels["!id"] = hash; return rels } XMLNS.RELS = "http://schemas.openxmlformats.org/package/2006/relationships"; var RELS_ROOT = writextag("Relationships", null, { xmlns: XMLNS.RELS }); function write_rels(rels) { var o = []; o[o.length] = XML_HEADER; o[o.length] = RELS_ROOT; keys(rels["!id"]).forEach(function (rid) { var rel = rels["!id"][rid]; o[o.length] = writextag("Relationship", null, rel) }); if (o.length > 2) { o[o.length] = "</Relationships>"; o[1] = o[1].replace("/>", ">") } return o.join("") } var CORE_PROPS = [["cp:category", "Category"], ["cp:contentStatus", "ContentStatus"], ["cp:keywords", "Keywords"], ["cp:lastModifiedBy", "LastAuthor"], ["cp:lastPrinted", "LastPrinted"], ["cp:revision", "RevNumber"], ["cp:version", "Version"], ["dc:creator", "Author"], ["dc:description", "Comments"], ["dc:identifier", "Identifier"], ["dc:language", "Language"], ["dc:subject", "Subject"], ["dc:title", "Title"], ["dcterms:created", "CreatedDate", "date"], ["dcterms:modified", "ModifiedDate", "date"]]; XMLNS.CORE_PROPS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"; RELS.CORE_PROPS = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"; var CORE_PROPS_REGEX = function () { var r = new Array(CORE_PROPS.length); for (var i = 0; i < CORE_PROPS.length; ++i) { var f = CORE_PROPS[i]; var g = "(?:" + f[0].substr(0, f[0].indexOf(":")) + ":)" + f[0].substr(f[0].indexOf(":") + 1); r[i] = new RegExp("<" + g + "[^>]*>(.*)</" + g + ">") } return r } (); function parse_core_props(data) { var p = {}; for (var i = 0; i < CORE_PROPS.length; ++i) { var f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]); if (cur != null && cur.length > 0) p[f[1]] = cur[1]; if (f[2] === "date" && p[f[1]]) p[f[1]] = new Date(p[f[1]]) } return p } var CORE_PROPS_XML_ROOT = writextag("cp:coreProperties", null, { "xmlns:cp": XMLNS.CORE_PROPS, "xmlns:dc": XMLNS.dc, "xmlns:dcterms": XMLNS.dcterms, "xmlns:dcmitype": XMLNS.dcmitype, "xmlns:xsi": XMLNS.xsi }); function cp_doit(f, g, h, o, p) { if (p[f] != null || g == null || g === "") return; p[f] = g; o[o.length] = h ? writextag(f, g, h) : writetag(f, g) } function write_core_props(cp, opts) { var o = [XML_HEADER, CORE_PROPS_XML_ROOT], p = {}; if (opts && opts.Props) { if (opts.Props.title) o[o.length] = "<dc:title>" + opts.Props.title + "</dc:title>"; if (opts.Props.subject) o[o.length] = "<dc:subject>" + opts.Props.subject + "</dc:subject>"; if (opts.Props.creator) o[o.length] = "<dc:creator>" + opts.Props.creator + "</dc:creator>"; if (opts.Props.keywords) o[o.length] = "<cp:keywords>" + opts.Props.keywords + "</cp:keywords>"; if (opts.Props.description) o[o.length] = "<dc:description>" + opts.Props.description + "</dc:description>" } if (cp) { if (cp.CreatedDate != null) cp_doit("dcterms:created", typeof cp.CreatedDate === "string" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), { "xsi:type": "dcterms:W3CDTF" }, o, p); if (cp.ModifiedDate != null) cp_doit("dcterms:modified", typeof cp.ModifiedDate === "string" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), { "xsi:type": "dcterms:W3CDTF" }, o, p); for (var i = 0; i != CORE_PROPS.length; ++i) { var f = CORE_PROPS[i]; cp_doit(f[0], cp[f[1]], null, o, p) } } if (o.length > 2) { o[o.length] = "</cp:coreProperties>"; o[1] = o[1].replace("/>", ">") } return o.join("") } var EXT_PROPS = [["Application", "Application", "string"], ["AppVersion", "AppVersion", "string"], ["Company", "Company", "string"], ["DocSecurity", "DocSecurity", "string"], ["Manager", "Manager", "string"], ["HyperlinksChanged", "HyperlinksChanged", "bool"], ["SharedDoc", "SharedDoc", "bool"], ["LinksUpToDate", "LinksUpToDate", "bool"], ["ScaleCrop", "ScaleCrop", "bool"], ["HeadingPairs", "HeadingPairs", "raw"], ["TitlesOfParts", "TitlesOfParts", "raw"]]; XMLNS.EXT_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"; RELS.EXT_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"; function parse_ext_props(data, p) { var q = {}; if (!p) p = {}; EXT_PROPS.forEach(function (f) { switch (f[2]) { case "string": p[f[1]] = (data.match(matchtag(f[0])) || [])[1]; break; case "bool": p[f[1]] = (data.match(matchtag(f[0])) || [])[1] === "true"; break; case "raw": var cur = data.match(new RegExp("<" + f[0] + "[^>]*>(.*)</" + f[0] + ">")); if (cur && cur.length > 0) q[f[1]] = cur[1]; break } }); if (q.HeadingPairs && q.TitlesOfParts) { var v = parseVector(q.HeadingPairs); var j = 0, widx = 0; for (var i = 0; i !== v.length; ++i) { switch (v[i].v) { case "Worksheets": widx = j; p.Worksheets = +v[++i].v; break; case "Named Ranges": ++i; break } } var parts = parseVector(q.TitlesOfParts).map(function (x) { return utf8read(x.v) }); p.SheetNames = parts.slice(widx, widx + p.Worksheets) } return p } var EXT_PROPS_XML_ROOT = writextag("Properties", null, { xmlns: XMLNS.EXT_PROPS, "xmlns:vt": XMLNS.vt }); function write_ext_props(cp, opts) { var o = [], p = {}, W = writextag; if (!cp) cp = {}; cp.Application = "SheetJS"; o[o.length] = XML_HEADER; o[o.length] = EXT_PROPS_XML_ROOT; EXT_PROPS.forEach(function (f) { if (cp[f[1]] === undefined) return; var v; switch (f[2]) { case "string": v = cp[f[1]]; break; case "bool": v = cp[f[1]] ? "true" : "false"; break } if (v !== undefined) o[o.length] = W(f[0], v) }); o[o.length] = W("HeadingPairs", W("vt:vector", W("vt:variant", "<vt:lpstr>Worksheets</vt:lpstr>") + W("vt:variant", W("vt:i4", String(cp.Worksheets))), { size: 2, baseType: "variant" })); o[o.length] = W("TitlesOfParts", W("vt:vector", cp.SheetNames.map(function (s) { return "<vt:lpstr>" + s + "</vt:lpstr>" }).join(""), { size: cp.Worksheets, baseType: "lpstr" })); if (o.length > 2) { o[o.length] = "</Properties>"; o[1] = o[1].replace("/>", ">") } return o.join("") } XMLNS.CUST_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"; RELS.CUST_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties"; var custregex = /<[^>]+>[^<]*/g; function parse_cust_props(data, opts) { var p = {}, name; var m = data.match(custregex); if (m) for (var i = 0; i != m.length; ++i) { var x = m[i], y = parsexmltag(x); switch (y[0]) { case "<?xml": break; case "<Properties": if (y.xmlns !== XMLNS.CUST_PROPS) throw "unrecognized xmlns " + y.xmlns; if (y.xmlnsvt && y.xmlnsvt !== XMLNS.vt) throw "unrecognized vt " + y.xmlnsvt; break; case "<property": name = y.name; break; case "</property>": name = null; break; default: if (x.indexOf("<vt:") === 0) { var toks = x.split(">"); var type = toks[0].substring(4), text = toks[1]; switch (type) { case "lpstr": case "lpwstr": case "bstr": case "lpwstr": p[name] = unescapexml(text); break; case "bool": p[name] = parsexmlbool(text, "<vt:bool>"); break; case "i1": case "i2": case "i4": case "i8": case "int": case "uint": p[name] = parseInt(text, 10); break; case "r4": case "r8": case "decimal": p[name] = parseFloat(text); break; case "filetime": case "date": p[name] = new Date(text); break; case "cy": case "error": p[name] = unescapexml(text); break; default: if (typeof console !== "undefined") console.warn("Unexpected", x, type, toks) } } else if (x.substr(0, 2) === "</") {} else if (opts.WTF) throw new Error(x) } } return p } var CUST_PROPS_XML_ROOT = writextag("Properties", null, { xmlns: XMLNS.CUST_PROPS, "xmlns:vt": XMLNS.vt }); function write_cust_props(cp, opts) { var o = [XML_HEADER, CUST_PROPS_XML_ROOT]; if (!cp) return o.join(""); var pid = 1; keys(cp).forEach(function custprop(k) { ++pid; o[o.length] = writextag("property", write_vt(cp[k]), { fmtid: "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}", pid: pid, name: k }) }); if (o.length > 2) { o[o.length] = "</Properties>"; o[1] = o[1].replace("/>", ">") } return o.join("") } function xlml_set_prop(Props, tag, val) { switch (tag) { case "Description": tag = "Comments"; break } Props[tag] = val } function parse_FILETIME(blob) { var dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4); return new Date((dwHighDateTime / 1e7 * Math.pow(2, 32) + dwLowDateTime / 1e7 - 11644473600) * 1e3).toISOString().replace(/\.000/, "") } function parse_lpstr(blob, type, pad) { var str = blob.read_shift(0, "lpstr"); if (pad) blob.l += 4 - (str.length + 1 & 3) & 3; return str } function parse_lpwstr(blob, type, pad) { var str = blob.read_shift(0, "lpwstr"); if (pad) blob.l += 4 - (str.length + 1 & 3) & 3; return str } function parse_VtStringBase(blob, stringType, pad) { if (stringType === 31) return parse_lpwstr(blob); return parse_lpstr(blob, stringType, pad) } function parse_VtString(blob, t, pad) { return parse_VtStringBase(blob, t, pad === false ? 0 : 4) } function parse_VtUnalignedString(blob, t) { if (!t) throw new Error("dafuq?"); return parse_VtStringBase(blob, t, 0) } function parse_VtVecUnalignedLpstrValue(blob) { var length = blob.read_shift(4); var ret = []; for (var i = 0; i != length; ++i) ret[i] = blob.read_shift(0, "lpstr"); return ret } function parse_VtVecUnalignedLpstr(blob) { return parse_VtVecUnalignedLpstrValue(blob) } function parse_VtHeadingPair(blob) { var headingString = parse_TypedPropertyValue(blob, VT_USTR); var headerParts = parse_TypedPropertyValue(blob, VT_I4); return [headingString, headerParts] } function parse_VtVecHeadingPairValue(blob) { var cElements = blob.read_shift(4); var out = []; for (var i = 0; i != cElements / 2; ++i) out.push(parse_VtHeadingPair(blob)); return out } function parse_VtVecHeadingPair(blob) { return parse_VtVecHeadingPairValue(blob) } function parse_dictionary(blob, CodePage) { var cnt = blob.read_shift(4); var dict = {}; for (var j = 0; j != cnt; ++j) { var pid = blob.read_shift(4); var len = blob.read_shift(4); dict[pid] = blob.read_shift(len, CodePage === 1200 ? "utf16le" : "utf8").replace(chr0, "").replace(chr1, "!") } if (blob.l & 3) blob.l = blob.l >> 2 + 1 << 2; return dict } function parse_BLOB(blob) { var size = blob.read_shift(4); var bytes = blob.slice(blob.l, blob.l + size); if (size & 3 > 0) blob.l += 4 - (size & 3) & 3; return bytes } function parse_ClipboardData(blob) { var o = {}; o.Size = blob.read_shift(4); blob.l += o.Size; return o } function parse_VtVector(blob, cb) {} function parse_TypedPropertyValue(blob, type, _opts) { var t = blob.read_shift(2), ret, opts = _opts || {}; blob.l += 2; if (type !== VT_VARIANT) if (t !== type && VT_CUSTOM.indexOf(type) === -1) throw new Error("Expected type " + type + " saw " + t); switch (type === VT_VARIANT ? t : type) { case 2: ret = blob.read_shift(2, "i"); if (!opts.raw) blob.l += 2; return ret; case 3: ret = blob.read_shift(4, "i"); return ret; case 11: return blob.read_shift(4) !== 0; case 19: ret = blob.read_shift(4); return ret; case 30: return parse_lpstr(blob, t, 4).replace(chr0, ""); case 31: return parse_lpwstr(blob); case 64: return parse_FILETIME(blob); case 65: return parse_BLOB(blob); case 71: return parse_ClipboardData(blob); case 80: return parse_VtString(blob, t, !opts.raw && 4).replace(chr0, ""); case 81: return parse_VtUnalignedString(blob, t, 4).replace(chr0, ""); case 4108: return parse_VtVecHeadingPair(blob); case 4126: return parse_VtVecUnalignedLpstr(blob); default: throw new Error("TypedPropertyValue unrecognized type " + type + " " + t) } } function parse_PropertySet(blob, PIDSI) { var start_addr = blob.l; var size = blob.read_shift(4); var NumProps = blob.read_shift(4); var Props = [], i = 0; var CodePage = 0; var Dictionary = -1, DictObj; for (i = 0; i != NumProps; ++i) { var PropID = blob.read_shift(4); var Offset = blob.read_shift(4); Props[i] = [PropID, Offset + start_addr] } var PropH = {}; for (i = 0; i != NumProps; ++i) { if (blob.l !== Props[i][1]) { var fail = true; if (i > 0 && PIDSI) switch (PIDSI[Props[i - 1][0]].t) { case 2: if (blob.l + 2 === Props[i][1]) { blob.l += 2; fail = false } break; case 80: if (blob.l <= Props[i][1]) { blob.l = Props[i][1]; fail = false } break; case 4108: if (blob.l <= Props[i][1]) { blob.l = Props[i][1]; fail = false } break } if (!PIDSI && blob.l <= Props[i][1]) { fail = false; blob.l = Props[i][1] } if (fail) throw new Error("Read Error: Expected address " + Props[i][1] + " at " + blob.l + " :" + i) } if (PIDSI) { var piddsi = PIDSI[Props[i][0]]; PropH[piddsi.n] = parse_TypedPropertyValue(blob, piddsi.t, { raw: true }); if (piddsi.p === "version") PropH[piddsi.n] = String(PropH[piddsi.n] >> 16) + "." + String(PropH[piddsi.n] & 65535); if (piddsi.n == "CodePage") switch (PropH[piddsi.n]) { case 0: PropH[piddsi.n] = 1252; case 1e4: case 1252: case 874: case 1250: case 1251: case 1253: case 1254: case 1255: case 1256: case 1257: case 1258: case 932: case 936: case 949: case 950: case 1200: case 1201: case 65e3: case -536: case 65001: case -535: set_cp(CodePage = PropH[piddsi.n]); break; default: throw new Error("Unsupported CodePage: " + PropH[piddsi.n]) } } else { if (Props[i][0] === 1) { CodePage = PropH.CodePage = parse_TypedPropertyValue(blob, VT_I2); set_cp(CodePage); if (Dictionary !== -1) { var oldpos = blob.l; blob.l = Props[Dictionary][1]; DictObj = parse_dictionary(blob, CodePage); blob.l = oldpos } } else if (Props[i][0] === 0) { if (CodePage === 0) { Dictionary = i; blob.l = Props[i + 1][1]; continue } DictObj = parse_dictionary(blob, CodePage) } else { var name = DictObj[Props[i][0]]; var val; switch (blob[blob.l]) { case 65: blob.l += 4; val = parse_BLOB(blob); break; case 30: blob.l += 4; val = parse_VtString(blob, blob[blob.l - 4]); break; case 31: blob.l += 4; val = parse_VtString(blob, blob[blob.l - 4]); break; case 3: blob.l += 4; val = blob.read_shift(4, "i"); break; case 19: blob.l += 4; val = blob.read_shift(4); break; case 5: blob.l += 4; val = blob.read_shift(8, "f"); break; case 11: blob.l += 4; val = parsebool(blob, 4); break; case 64: blob.l += 4; val = new Date(parse_FILETIME(blob)); break; default: throw new Error("unparsed value: " + blob[blob.l]) } PropH[name] = val } } } blob.l = start_addr + size; return PropH } function parse_PropertySetStream(file, PIDSI) { var blob = file.content; prep_blob(blob, 0); var NumSets, FMTID0, FMTID1, Offset0, Offset1; blob.chk("feff", "Byte Order: "); var vers = blob.read_shift(2); var SystemIdentifier = blob.read_shift(4); blob.chk(CFB.utils.consts.HEADER_CLSID, "CLSID: "); NumSets = blob.read_shift(4); if (NumSets !== 1 && NumSets !== 2) throw "Unrecognized #Sets: " + NumSets; FMTID0 = blob.read_shift(16); Offset0 = blob.read_shift(4); if (NumSets === 1 && Offset0 !== blob.l) throw "Length mismatch"; else if (NumSets === 2) { FMTID1 = blob.read_shift(16); Offset1 = blob.read_shift(4) } var PSet0 = parse_PropertySet(blob, PIDSI); var rval = { SystemIdentifier: SystemIdentifier }; for (var y in PSet0) rval[y] = PSet0[y]; rval.FMTID = FMTID0; if (NumSets === 1) return rval; if (blob.l !== Offset1) throw "Length mismatch 2: " + blob.l + " !== " + Offset1; var PSet1; try { PSet1 = parse_PropertySet(blob, null) } catch (e) {} for (y in PSet1) rval[y] = PSet1[y]; rval.FMTID = [FMTID0, FMTID1]; return rval } function parsenoop2(blob, length) { blob.read_shift(length); return null } function parslurp(blob, length, cb) { var arr = [], target = blob.l + length; while (blob.l < target) arr.push(cb(blob, target - blob.l)); if (target !== blob.l) throw new Error("Slurp error"); return arr } function parslurp2(blob, length, cb) { var arr = [], target = blob.l + length, len = blob.read_shift(2); while (len-- !== 0) arr.push(cb(blob, target - blob.l)); if (target !== blob.l) throw new Error("Slurp error"); return arr } function parsebool(blob, length) { return blob.read_shift(length) === 1 } function parseuint16(blob) { return blob.read_shift(2, "u") } function parseuint16a(blob, length) { return parslurp(blob, length, parseuint16) } var parse_Boolean = parsebool; function parse_Bes(blob) { var v = blob.read_shift(1), t = blob.read_shift(1); return t === 1 ? v : v === 1 } function parse_ShortXLUnicodeString(blob, length, opts) { var cch = blob.read_shift(1); var width = 1, encoding = "sbcs-cont"; var cp = current_codepage; if (opts && opts.biff >= 8) current_codepage = 1200; if (opts === undefined || opts.biff !== 5) { var fHighByte = blob.read_shift(1); if (fHighByte) { width = 2; encoding = "dbcs-cont" } } var o = cch ? blob.read_shift(cch, encoding) : ""; current_codepage = cp; return o } function parse_XLUnicodeRichExtendedString(blob) { var cp = current_codepage; current_codepage = 1200; var cch = blob.read_shift(2), flags = blob.read_shift(1); var fHighByte = flags & 1, fExtSt = flags & 4, fRichSt = flags & 8; var width = 1 + (flags & 1); var cRun, cbExtRst; var z = {}; if (fRichSt) cRun = blob.read_shift(2); if (fExtSt) cbExtRst = blob.read_shift(4); var encoding = flags & 1 ? "dbcs-cont" : "sbcs-cont"; var msg = cch === 0 ? "" : blob.read_shift(cch, encoding); if (fRichSt) blob.l += 4 * cRun; if (fExtSt) blob.l += cbExtRst; z.t = msg; if (!fRichSt) { z.raw = "<t>" + z.t + "</t>"; z.r = z.t } current_codepage = cp; return z } function parse_XLUnicodeStringNoCch(blob, cch, opts) { var retval; var fHighByte = blob.read_shift(1); if (fHighByte === 0) { retval = blob.read_shift(cch, "sbcs-cont") } else { retval = blob.read_shift(cch, "dbcs-cont") } return retval } function parse_XLUnicodeString(blob, length, opts) { var cch = blob.read_shift(opts !== undefined && opts.biff > 0 && opts.biff < 8 ? 1 : 2); if (cch === 0) { blob.l++; return "" } return parse_XLUnicodeStringNoCch(blob, cch, opts) } function parse_XLUnicodeString2(blob, length, opts) { if (opts.biff !== 5 && opts.biff !== 2) return parse_XLUnicodeString(blob, length, opts); var cch = blob.read_shift(1); if (cch === 0) { blob.l++; return "" } return blob.read_shift(cch, "sbcs-cont") } var parse_ControlInfo = parsenoop; var parse_URLMoniker = function (blob, length) { var len = blob.read_shift(4), start = blob.l; var extra = false; if (len > 24) { blob.l += len - 24; if (blob.read_shift(16) === "795881f43b1d7f48af2c825dc4852763") extra = true; blob.l = start } var url = blob.read_shift((extra ? len - 24 : len) >> 1, "utf16le").replace(chr0, ""); if (extra) blob.l += 24; return url }; var parse_FileMoniker = function (blob, length) { var cAnti = blob.read_shift(2); var ansiLength = blob.read_shift(4); var ansiPath = blob.read_shift(ansiLength, "cstr"); var endServer = blob.read_shift(2); var versionNumber = blob.read_shift(2); var cbUnicodePathSize = blob.read_shift(4); if (cbUnicodePathSize === 0) return ansiPath.replace(/\\/g, "/"); var cbUnicodePathBytes = blob.read_shift(4); var usKeyValue = blob.read_shift(2); var unicodePath = blob.read_shift(cbUnicodePathBytes >> 1, "utf16le").replace(chr0, ""); return unicodePath }; var parse_HyperlinkMoniker = function (blob, length) { var clsid = blob.read_shift(16); length -= 16; switch (clsid) { case "e0c9ea79f9bace118c8200aa004ba90b": return parse_URLMoniker(blob, length); case "0303000000000000c000000000000046": return parse_FileMoniker(blob, length); default: throw "unsupported moniker " + clsid } }; var parse_HyperlinkString = function (blob, length) { var len = blob.read_shift(4); var o = blob.read_shift(len, "utf16le").replace(chr0, ""); return o }; var parse_Hyperlink = function (blob, length) { var end = blob.l + length; var sVer = blob.read_shift(4); if (sVer !== 2) throw new Error("Unrecognized streamVersion: " + sVer); var flags = blob.read_shift(2); blob.l += 2; var displayName, targetFrameName, moniker, oleMoniker, location, guid, fileTime; if (flags & 16) displayName = parse_HyperlinkString(blob, end - blob.l); if (flags & 128) targetFrameName = parse_HyperlinkString(blob, end - blob.l); if ((flags & 257) === 257) moniker = parse_HyperlinkString(blob, end - blob.l); if ((flags & 257) === 1) oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l); if (flags & 8) location = parse_HyperlinkString(blob, end - blob.l); if (flags & 32) guid = blob.read_shift(16); if (flags & 64) fileTime = parse_FILETIME(blob, 8); blob.l = end; var target = targetFrameName || moniker || oleMoniker; if (location) target += "#" + location; return { Target: target } }; function parse_LongRGBA(blob, length) { var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1); return [r, g, b, a] } function parse_LongRGB(blob, length) { var x = parse_LongRGBA(blob, length); x[3] = 0; return x } function parse_XLSCell(blob, length) { var rw = blob.read_shift(2); var col = blob.read_shift(2); var ixfe = blob.read_shift(2); return { r: rw, c: col, ixfe: ixfe } } function parse_frtHeader(blob) { var rt = blob.read_shift(2); var flags = blob.read_shift(2); blob.l += 8; return { type: rt, flags: flags } } function parse_OptXLUnicodeString(blob, length, opts) { return length === 0 ? "" : parse_XLUnicodeString2(blob, length, opts) } var HIDEOBJENUM = ["SHOWALL", "SHOWPLACEHOLDER", "HIDEALL"]; var parse_HideObjEnum = parseuint16; function parse_XTI(blob, length) { var iSupBook = blob.read_shift(2), itabFirst = blob.read_shift(2, "i"), itabLast = blob.read_shift(2, "i"); return [iSupBook, itabFirst, itabLast] } function parse_RkRec(blob, length) { var ixfe = blob.read_shift(2); var RK = parse_RkNumber(blob); return [ixfe, RK] } function parse_AddinUdf(blob, length) { blob.l += 4; length -= 4; var l = blob.l + length; var udfName = parse_ShortXLUnicodeString(blob, length); var cb = blob.read_shift(2); l -= blob.l; if (cb !== l) throw "Malformed AddinUdf: padding = " + l + " != " + cb; blob.l += cb; return udfName } function parse_Ref8U(blob, length) { var rwFirst = blob.read_shift(2); var rwLast = blob.read_shift(2); var colFirst = blob.read_shift(2); var colLast = blob.read_shift(2); return { s: { c: colFirst, r: rwFirst }, e: { c: colLast, r: rwLast } } } function parse_RefU(blob, length) { var rwFirst = blob.read_shift(2); var rwLast = blob.read_shift(2); var colFirst = blob.read_shift(1); var colLast = blob.read_shift(1); return { s: { c: colFirst, r: rwFirst }, e: { c: colLast, r: rwLast } } } var parse_Ref = parse_RefU; function parse_FtCmo(blob, length) { blob.l += 4; var ot = blob.read_shift(2); var id = blob.read_shift(2); var flags = blob.read_shift(2); blob.l += 12; return [id, ot, flags] } function parse_FtNts(blob, length) { var out = {}; blob.l += 4; blob.l += 16; out.fSharedNote = blob.read_shift(2); blob.l += 4; return out } function parse_FtCf(blob, length) { var out = {}; blob.l += 4; blob.cf = blob.read_shift(2); return out } var FtTab = { 21: parse_FtCmo, 19: parsenoop, 18: function (blob, length) { blob.l += 12 }, 17: function (blob, length) { blob.l += 8 }, 16: parsenoop, 15: parsenoop, 13: parse_FtNts, 12: function (blob, length) { blob.l += 24 }, 11: function (blob, length) { blob.l += 10 }, 10: function (blob, length) { blob.l += 16 }, 9: parsenoop, 8: function (blob, length) { blob.l += 6 }, 7: parse_FtCf, 6: function (blob, length) { blob.l += 6 }, 4: parsenoop, 0: function (blob, length) { blob.l += 4 } }; function parse_FtArray(blob, length, ot) { var s = blob.l; var fts = []; while (blob.l < s + length) { var ft = blob.read_shift(2); blob.l -= 2; try { fts.push(FtTab[ft](blob, s + length - blob.l)) } catch (e) { blob.l = s + length; return fts } } if (blob.l != s + length) blob.l = s + length; return fts } var parse_FontIndex = parseuint16; function parse_BOF(blob, length) { var o = {}; o.BIFFVer = blob.read_shift(2); length -= 2; switch (o.BIFFVer) { case 1536: case 1280: case 2: case 7: break; default: throw "Unexpected BIFF Ver " + o.BIFFVer } blob.read_shift(length); return o } function parse_InterfaceHdr(blob, length) { if (length === 0) return 1200; var q; if ((q = blob.read_shift(2)) !== 1200) throw "InterfaceHdr codePage " + q; return 1200 } function parse_WriteAccess(blob, length, opts) { if (opts.enc) { blob.l += length; return "" } var l = blob.l; var UserName = parse_XLUnicodeString(blob, 0, opts); blob.read_shift(length + l - blob.l); return UserName } function parse_BoundSheet8(blob, length, opts) { var pos = blob.read_shift(4); var hidden = blob.read_shift(1) >> 6; var dt = blob.read_shift(1); switch (dt) { case 0: dt = "Worksheet"; break; case 1: dt = "Macrosheet"; break; case 2: dt = "Chartsheet"; break; case 6: dt = "VBAModule"; break } var name = parse_ShortXLUnicodeString(blob, 0, opts); if (name.length === 0) name = "Sheet1"; return { pos: pos, hs: hidden, dt: dt, name: name } } function parse_SST(blob, length) { var cnt = blob.read_shift(4); var ucnt = blob.read_shift(4); var strs = []; for (var i = 0; i != ucnt; ++i) { strs.push(parse_XLUnicodeRichExtendedString(blob)) } strs.Count = cnt; strs.Unique = ucnt; return strs } function parse_ExtSST(blob, length) { var extsst = {}; extsst.dsst = blob.read_shift(2); blob.l += length - 2; return extsst } function parse_Row(blob, length) { var rw = blob.read_shift(2), col = blob.read_shift(2), Col = blob.read_shift(2), rht = blob.read_shift(2); blob.read_shift(4); var flags = blob.read_shift(1); blob.read_shift(1); blob.read_shift(2); return { r: rw, c: col, cnt: Col - col } } function parse_ForceFullCalculation(blob, length) { var header = parse_frtHeader(blob); if (header.type != 2211) throw "Invalid Future Record " + header.type; var fullcalc = blob.read_shift(4); return fullcalc !== 0 } var parse_CompressPictures = parsenoop2; function parse_RecalcId(blob, length) { blob.read_shift(2); return blob.read_shift(4) } function parse_DefaultRowHeight(blob, length) { var f = blob.read_shift(2), miyRw; miyRw = blob.read_shift(2); var fl = { Unsynced: f & 1, DyZero: (f & 2) >> 1, ExAsc: (f & 4) >> 2, ExDsc: (f & 8) >> 3 }; return [fl, miyRw] } function parse_Window1(blob, length) { var xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2); var flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2); var ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2); return { Pos: [xWn, yWn], Dim: [dxWn, dyWn], Flags: flags, CurTab: iTabCur, FirstTab: iTabFirst, Selected: ctabSel, TabRatio: wTabRatio } } function parse_Font(blob, length, opts) { blob.l += 14; var name = parse_ShortXLUnicodeString(blob, 0, opts); return name } function parse_LabelSst(blob, length) { var cell = parse_XLSCell(blob); cell.isst = blob.read_shift(4); return cell } function parse_Label(blob, length, opts) { var cell = parse_XLSCell(blob, 6); var str = parse_XLUnicodeString(blob, length - 6, opts); cell.val = str; return cell } function parse_Format(blob, length, opts) { var ifmt = blob.read_shift(2); var fmtstr = parse_XLUnicodeString2(blob, 0, opts); return [ifmt, fmtstr] } function parse_Dimensions(blob, length) { var w = length === 10 ? 2 : 4; var r = blob.read_shift(w), R = blob.read_shift(w), c = blob.read_shift(2), C = blob.read_shift(2); blob.l += 2; return { s: { r: r, c: c }, e: { r: R, c: C } } } function parse_RK(blob, length) { var rw = blob.read_shift(2), col = blob.read_shift(2); var rkrec = parse_RkRec(blob); return { r: rw, c: col, ixfe: rkrec[0], rknum: rkrec[1] } } function parse_MulRk(blob, length) { var target = blob.l + length - 2; var rw = blob.read_shift(2), col = blob.read_shift(2); var rkrecs = []; while (blob.l < target) rkrecs.push(parse_RkRec(blob)); if (blob.l !== target) throw "MulRK read error"; var lastcol = blob.read_shift(2); if (rkrecs.length != lastcol - col + 1) throw "MulRK length mismatch"; return { r: rw, c: col, C: lastcol, rkrec: rkrecs } } function parse_CellStyleXF(blob, length, style) { var o = {}; var a = blob.read_shift(4), b = blob.read_shift(4); var c = blob.read_shift(4), d = blob.read_shift(2); o.patternType = XLSFillPattern[c >> 26]; o.icvFore = d & 127; o.icvBack = d >> 7 & 127; return o } function parse_CellXF(blob, length) { return parse_CellStyleXF(blob, length, 0) } function parse_StyleXF(blob, length) { return parse_CellStyleXF(blob, length, 1) } function parse_XF(blob, length) { var o = {}; o.ifnt = blob.read_shift(2); o.ifmt = blob.read_shift(2); o.flags = blob.read_shift(2); o.fStyle = o.flags >> 2 & 1; length -= 6; o.data = parse_CellStyleXF(blob, length, o.fStyle); return o } function parse_Guts(blob, length) { blob.l += 4; var out = [blob.read_shift(2), blob.read_shift(2)]; if (out[0] !== 0) out[0]--; if (out[1] !== 0) out[1]--; if (out[0] > 7 || out[1] > 7) throw "Bad Gutters: " + out; return out } function parse_BoolErr(blob, length) { var cell = parse_XLSCell(blob, 6); var val = parse_Bes(blob, 2); cell.val = val; cell.t = val === true || val === false ? "b" : "e"; return cell } function parse_Number(blob, length) { var cell = parse_XLSCell(blob, 6); var xnum = parse_Xnum(blob, 8); cell.val = xnum; return cell } var parse_XLHeaderFooter = parse_OptXLUnicodeString; function parse_SupBook(blob, length, opts) { var end = blob.l + length; var ctab = blob.read_shift(2); var cch = blob.read_shift(2); var virtPath; if (cch >= 1 && cch <= 255) virtPath = parse_XLUnicodeStringNoCch(blob, cch); var rgst = blob.read_shift(end - blob.l); opts.sbcch = cch; return [cch, ctab, virtPath, rgst] } function parse_ExternName(blob, length, opts) { var flags = blob.read_shift(2); var body; var o = { fBuiltIn: flags & 1, fWantAdvise: flags >>> 1 & 1, fWantPict: flags >>> 2 & 1, fOle: flags >>> 3 & 1, fOleLink: flags >>> 4 & 1, cf: flags >>> 5 & 1023, fIcon: flags >>> 15 & 1 }; if (opts.sbcch === 14849) body = parse_AddinUdf(blob, length - 2); o.body = body || blob.read_shift(length - 2); return o } function parse_Lbl(blob, length, opts) { if (opts.biff < 8) return parse_Label(blob, length, opts); var target = blob.l + length; var flags = blob.read_shift(2); var chKey = blob.read_shift(1); var cch = blob.read_shift(1); var cce = blob.read_shift(2); blob.l += 2; var itab = blob.read_shift(2); blob.l += 4; var name = parse_XLUnicodeStringNoCch(blob, cch, opts); var rgce = parse_NameParsedFormula(blob, target - blob.l, opts, cce); return { chKey: chKey, Name: name, rgce: rgce } } function parse_ExternSheet(blob, length, opts) { if (opts.biff < 8) return parse_ShortXLUnicodeString(blob, length, opts); var o = parslurp2(blob, length, parse_XTI); var oo = []; if (opts.sbcch === 1025) { for (var i = 0; i != o.length; ++i) oo.push(opts.snames[o[i][1]]); return oo } else return o } function parse_ShrFmla(blob, length, opts) { var ref = parse_RefU(blob, 6); blob.l++; var cUse = blob.read_shift(1); length -= 8; return [parse_SharedParsedFormula(blob, length, opts), cUse] } function parse_Array(blob, length, opts) { var ref = parse_Ref(blob, 6); blob.l += 6; length -= 12; return [ref, parse_ArrayParsedFormula(blob, length, opts, ref)] } function parse_MTRSettings(blob, length) { var fMTREnabled = blob.read_shift(4) !== 0; var fUserSetThreadCount = blob.read_shift(4) !== 0; var cUserThreadCount = blob.read_shift(4); return [fMTREnabled, fUserSetThreadCount, cUserThreadCount] } function parse_NoteSh(blob, length, opts) { if (opts.biff < 8) return; var row = blob.read_shift(2), col = blob.read_shift(2); var flags = blob.read_shift(2), idObj = blob.read_shift(2); var stAuthor = parse_XLUnicodeString2(blob, 0, opts); if (opts.biff < 8) blob.read_shift(1); return [{ r: row, c: col }, stAuthor, idObj, flags] } function parse_Note(blob, length, opts) { return parse_NoteSh(blob, length, opts) } function parse_MergeCells(blob, length) { var merges = []; var cmcs = blob.read_shift(2); while (cmcs--) merges.push(parse_Ref8U(blob, length)); return merges } function parse_Obj(blob, length) { var cmo = parse_FtCmo(blob, 22); var fts = parse_FtArray(blob, length - 22, cmo[1]); return { cmo: cmo, ft: fts } } function parse_TxO(blob, length, opts) { var s = blob.l; try { blob.l += 4; var ot = (opts.lastobj || { cmo: [0, 0] }).cmo[1]; var controlInfo; if ([0, 5, 7, 11, 12, 14].indexOf(ot) == -1) blob.l += 6; else controlInfo = parse_ControlInfo(blob, 6, opts); var cchText = blob.read_shift(2); var cbRuns = blob.read_shift(2); var ifntEmpty = parse_FontIndex(blob, 2); var len = blob.read_shift(2); blob.l += len; var texts = ""; for (var i = 1; i < blob.lens.length - 1; ++i) { if (blob.l - s != blob.lens[i]) throw "TxO: bad continue record"; var hdr = blob[blob.l]; var t = parse_XLUnicodeStringNoCch(blob, blob.lens[i + 1] - blob.lens[i] - 1); texts += t; if (texts.length >= (hdr ? cchText : 2 * cchText)) break } if (texts.length !== cchText && texts.length !== cchText * 2) { throw "cchText: " + cchText + " != " + texts.length } blob.l = s + length; return { t: texts } } catch (e) { blob.l = s + length; return { t: texts || "" } } } var parse_HLink = function (blob, length) { var ref = parse_Ref8U(blob, 8); blob.l += 16; var hlink = parse_Hyperlink(blob, length - 24); return [ref, hlink] }; var parse_HLinkTooltip = function (blob, length) { var end = blob.l + length; blob.read_shift(2); var ref = parse_Ref8U(blob, 8); var wzTooltip = blob.read_shift((length - 10) / 2, "dbcs-cont"); wzTooltip = wzTooltip.replace(chr0, ""); return [ref, wzTooltip] }; function parse_Country(blob, length) { var o = [], d; d = blob.read_shift(2); o[0] = CountryEnum[d] || d; d = blob.read_shift(2); o[1] = CountryEnum[d] || d; return o } function parse_ClrtClient(blob, length) { var ccv = blob.read_shift(2); var o = []; while (ccv-- > 0) o.push(parse_LongRGB(blob, 8)); return o } function parse_Palette(blob, length) { var ccv = blob.read_shift(2); var o = []; while (ccv-- > 0) o.push(parse_LongRGB(blob, 8)); return o } function parse_XFCRC(blob, length) { blob.l += 2; var o = { cxfs: 0, crc: 0 }; o.cxfs = blob.read_shift(2); o.crc = blob.read_shift(4); return o } var parse_Style = parsenoop; var parse_StyleExt = parsenoop; var parse_ColInfo = parsenoop; var parse_Window2 = parsenoop; var parse_Backup = parsebool; var parse_Blank = parse_XLSCell; var parse_BottomMargin = parse_Xnum; var parse_BuiltInFnGroupCount = parseuint16; var parse_CalcCount = parseuint16; var parse_CalcDelta = parse_Xnum; var parse_CalcIter = parsebool; var parse_CalcMode = parseuint16; var parse_CalcPrecision = parsebool; var parse_CalcRefMode = parsenoop2; var parse_CalcSaveRecalc = parsebool; var parse_CodePage = parseuint16; var parse_Compat12 = parsebool; var parse_Date1904 = parsebool; var parse_DefColWidth = parseuint16; var parse_DSF = parsenoop2; var parse_EntExU2 = parsenoop2; var parse_EOF = parsenoop2; var parse_Excel9File = parsenoop2; var parse_FeatHdr = parsenoop2; var parse_FontX = parseuint16; var parse_Footer = parse_XLHeaderFooter; var parse_GridSet = parseuint16; var parse_HCenter = parsebool; var parse_Header = parse_XLHeaderFooter; var parse_HideObj = parse_HideObjEnum; var parse_InterfaceEnd = parsenoop2; var parse_LeftMargin = parse_Xnum; var parse_Mms = parsenoop2; var parse_ObjProtect = parsebool; var parse_Password = parseuint16; var parse_PrintGrid = parsebool; var parse_PrintRowCol = parsebool; var parse_PrintSize = parseuint16; var parse_Prot4Rev = parsebool; var parse_Prot4RevPass = parseuint16; var parse_Protect = parsebool; var parse_RefreshAll = parsebool; var parse_RightMargin = parse_Xnum; var parse_RRTabId = parseuint16a; var parse_ScenarioProtect = parsebool; var parse_Scl = parseuint16a; var parse_String = parse_XLUnicodeString; var parse_SxBool = parsebool; var parse_TopMargin = parse_Xnum; var parse_UsesELFs = parsebool; var parse_VCenter = parsebool; var parse_WinProtect = parsebool; var parse_WriteProtect = parsenoop; var parse_VerticalPageBreaks = parsenoop; var parse_HorizontalPageBreaks = parsenoop; var parse_Selection = parsenoop; var parse_Continue = parsenoop; var parse_Pane = parsenoop; var parse_Pls = parsenoop; var parse_DCon = parsenoop; var parse_DConRef = parsenoop; var parse_DConName = parsenoop; var parse_XCT = parsenoop; var parse_CRN = parsenoop; var parse_FileSharing = parsenoop; var parse_Uncalced = parsenoop; var parse_Template = parsenoop; var parse_Intl = parsenoop; var parse_WsBool = parsenoop; var parse_Sort = parsenoop; var parse_Sync = parsenoop; var parse_LPr = parsenoop; var parse_DxGCol = parsenoop; var parse_FnGroupName = parsenoop; var parse_FilterMode = parsenoop; var parse_AutoFilterInfo = parsenoop; var parse_AutoFilter = parsenoop; var parse_Setup = parsenoop; var parse_ScenMan = parsenoop; var parse_SCENARIO = parsenoop; var parse_SxView = parsenoop; var parse_Sxvd = parsenoop; var parse_SXVI = parsenoop; var parse_SxIvd = parsenoop; var parse_SXLI = parsenoop; var parse_SXPI = parsenoop; var parse_DocRoute = parsenoop; var parse_RecipName = parsenoop; var parse_MulBlank = parsenoop; var parse_SXDI = parsenoop; var parse_SXDB = parsenoop; var parse_SXFDB = parsenoop; var parse_SXDBB = parsenoop; var parse_SXNum = parsenoop; var parse_SxErr = parsenoop; var parse_SXInt = parsenoop; var parse_SXString = parsenoop; var parse_SXDtr = parsenoop; var parse_SxNil = parsenoop; var parse_SXTbl = parsenoop; var parse_SXTBRGIITM = parsenoop; var parse_SxTbpg = parsenoop; var parse_ObProj = parsenoop; var parse_SXStreamID = parsenoop; var parse_DBCell = parsenoop; var parse_SXRng = parsenoop; var parse_SxIsxoper = parsenoop; var parse_BookBool = parsenoop; var parse_DbOrParamQry = parsenoop; var parse_OleObjectSize = parsenoop; var parse_SXVS = parsenoop; var parse_BkHim = parsenoop; var parse_MsoDrawingGroup = parsenoop; var parse_MsoDrawing = parsenoop; var parse_MsoDrawingSelection = parsenoop; var parse_PhoneticInfo = parsenoop; var parse_SxRule = parsenoop; var parse_SXEx = parsenoop; var parse_SxFilt = parsenoop; var parse_SxDXF = parsenoop; var parse_SxItm = parsenoop; var parse_SxName = parsenoop; var parse_SxSelect = parsenoop; var parse_SXPair = parsenoop; var parse_SxFmla = parsenoop; var parse_SxFormat = parsenoop; var parse_SXVDEx = parsenoop; var parse_SXFormula = parsenoop; var parse_SXDBEx = parsenoop; var parse_RRDInsDel = parsenoop; var parse_RRDHead = parsenoop; var parse_RRDChgCell = parsenoop; var parse_RRDRenSheet = parsenoop; var parse_RRSort = parsenoop; var parse_RRDMove = parsenoop; var parse_RRFormat = parsenoop; var parse_RRAutoFmt = parsenoop; var parse_RRInsertSh = parsenoop; var parse_RRDMoveBegin = parsenoop; var parse_RRDMoveEnd = parsenoop; var parse_RRDInsDelBegin = parsenoop; var parse_RRDInsDelEnd = parsenoop; var parse_RRDConflict = parsenoop; var parse_RRDDefName = parsenoop; var parse_RRDRstEtxp = parsenoop; var parse_LRng = parsenoop; var parse_CUsr = parsenoop; var parse_CbUsr = parsenoop; var parse_UsrInfo = parsenoop; var parse_UsrExcl = parsenoop; var parse_FileLock = parsenoop; var parse_RRDInfo = parsenoop; var parse_BCUsrs = parsenoop; var parse_UsrChk = parsenoop; var parse_UserBView = parsenoop; var parse_UserSViewBegin = parsenoop; var parse_UserSViewEnd = parsenoop; var parse_RRDUserView = parsenoop; var parse_Qsi = parsenoop; var parse_CondFmt = parsenoop; var parse_CF = parsenoop; var parse_DVal = parsenoop; var parse_DConBin = parsenoop; var parse_Lel = parsenoop; var parse_XLSCodeName = parse_XLUnicodeString; var parse_SXFDBType = parsenoop; var parse_ObNoMacros = parsenoop; var parse_Dv = parsenoop; var parse_Index = parsenoop; var parse_Table = parsenoop; var parse_BigName = parsenoop; var parse_ContinueBigName = parsenoop; var parse_WebPub = parsenoop; var parse_QsiSXTag = parsenoop; var parse_DBQueryExt = parsenoop; var parse_ExtString = parsenoop; var parse_TxtQry = parsenoop; var parse_Qsir = parsenoop; var parse_Qsif = parsenoop; var parse_RRDTQSIF = parsenoop; var parse_OleDbConn = parsenoop; var parse_WOpt = parsenoop; var parse_SXViewEx = parsenoop; var parse_SXTH = parsenoop; var parse_SXPIEx = parsenoop; var parse_SXVDTEx = parsenoop; var parse_SXViewEx9 = parsenoop; var parse_ContinueFrt = parsenoop; var parse_RealTimeData = parsenoop; var parse_ChartFrtInfo = parsenoop; var parse_FrtWrapper = parsenoop; var parse_StartBlock = parsenoop; var parse_EndBlock = parsenoop; var parse_StartObject = parsenoop; var parse_EndObject = parsenoop; var parse_CatLab = parsenoop; var parse_YMult = parsenoop; var parse_SXViewLink = parsenoop; var parse_PivotChartBits = parsenoop; var parse_FrtFontList = parsenoop; var parse_SheetExt = parsenoop; var parse_BookExt = parsenoop; var parse_SXAddl = parsenoop; var parse_CrErr = parsenoop; var parse_HFPicture = parsenoop; var parse_Feat = parsenoop; var parse_DataLabExt = parsenoop; var parse_DataLabExtContents = parsenoop; var parse_CellWatch = parsenoop; var parse_FeatHdr11 = parsenoop; var parse_Feature11 = parsenoop; var parse_DropDownObjIds = parsenoop; var parse_ContinueFrt11 = parsenoop; var parse_DConn = parsenoop; var parse_List12 = parsenoop; var parse_Feature12 = parsenoop; var parse_CondFmt12 = parsenoop; var parse_CF12 = parsenoop; var parse_CFEx = parsenoop; var parse_AutoFilter12 = parsenoop; var parse_ContinueFrt12 = parsenoop; var parse_MDTInfo = parsenoop; var parse_MDXStr = parsenoop; var parse_MDXTuple = parsenoop; var parse_MDXSet = parsenoop; var parse_MDXProp = parsenoop; var parse_MDXKPI = parsenoop; var parse_MDB = parsenoop; var parse_PLV = parsenoop; var parse_DXF = parsenoop; var parse_TableStyles = parsenoop; var parse_TableStyle = parsenoop; var parse_TableStyleElement = parsenoop; var parse_NamePublish = parsenoop; var parse_NameCmt = parsenoop; var parse_SortData = parsenoop; var parse_GUIDTypeLib = parsenoop; var parse_FnGrp12 = parsenoop; var parse_NameFnGrp12 = parsenoop; var parse_HeaderFooter = parsenoop; var parse_CrtLayout12 = parsenoop; var parse_CrtMlFrt = parsenoop; var parse_CrtMlFrtContinue = parsenoop; var parse_ShapePropsStream = parsenoop; var parse_TextPropsStream = parsenoop; var parse_RichTextStream = parsenoop; var parse_CrtLayout12A = parsenoop; var parse_Units = parsenoop; var parse_Chart = parsenoop; var parse_Series = parsenoop; var parse_DataFormat = parsenoop; var parse_LineFormat = parsenoop; var parse_MarkerFormat = parsenoop; var parse_AreaFormat = parsenoop; var parse_PieFormat = parsenoop; var parse_AttachedLabel = parsenoop; var parse_SeriesText = parsenoop; var parse_ChartFormat = parsenoop; var parse_Legend = parsenoop; var parse_SeriesList = parsenoop; var parse_Bar = parsenoop; var parse_Line = parsenoop; var parse_Pie = parsenoop; var parse_Area = parsenoop; var parse_Scatter = parsenoop; var parse_CrtLine = parsenoop; var parse_Axis = parsenoop; var parse_Tick = parsenoop; var parse_ValueRange = parsenoop; var parse_CatSerRange = parsenoop; var parse_AxisLine = parsenoop; var parse_CrtLink = parsenoop; var parse_DefaultText = parsenoop; var parse_Text = parsenoop; var parse_ObjectLink = parsenoop; var parse_Frame = parsenoop; var parse_Begin = parsenoop; var parse_End = parsenoop; var parse_PlotArea = parsenoop; var parse_Chart3d = parsenoop; var parse_PicF = parsenoop; var parse_DropBar = parsenoop; var parse_Radar = parsenoop; var parse_Surf = parsenoop; var parse_RadarArea = parsenoop; var parse_AxisParent = parsenoop; var parse_LegendException = parsenoop; var parse_ShtProps = parsenoop; var parse_SerToCrt = parsenoop; var parse_AxesUsed = parsenoop; var parse_SBaseRef = parsenoop; var parse_SerParent = parsenoop; var parse_SerAuxTrend = parsenoop; var parse_IFmtRecord = parsenoop; var parse_Pos = parsenoop; var parse_AlRuns = parsenoop; var parse_BRAI = parsenoop; var parse_SerAuxErrBar = parsenoop; var parse_SerFmt = parsenoop; var parse_Chart3DBarShape = parsenoop; var parse_Fbi = parsenoop; var parse_BopPop = parsenoop; var parse_AxcExt = parsenoop; var parse_Dat = parsenoop; var parse_PlotGrowth = parsenoop; var parse_SIIndex = parsenoop; var parse_GelFrame = parsenoop; var parse_BopPopCustom = parsenoop; var parse_Fbi2 = parsenoop; function parse_BIFF5String(blob) { var len = blob.read_shift(1); return blob.read_shift(len, "sbcs-cont") } function parse_BIFF2STR(blob, length, opts) { var cell = parse_XLSCell(blob, 6); ++blob.l; var str = parse_XLUnicodeString2(blob, length - 7, opts); cell.val = str; return cell } function parse_BIFF2NUM(blob, length, opts) { var cell = parse_XLSCell(blob, 6); ++blob.l; var num = parse_Xnum(blob, 8); cell.val = num; return cell } var CS2CP = { 0: 1252, 1: 65001, 2: 65001, 77: 1e4, 128: 932, 129: 949, 130: 1361, 134: 936, 136: 950, 161: 1253, 162: 1254, 163: 1258, 177: 1255, 178: 1256, 186: 1257, 204: 1251, 222: 874, 238: 1250, 255: 1252, 69: 6969 }; var parse_rs = function parse_rs_factory() { var tregex = matchtag("t"), rpregex = matchtag("rPr"), rregex = /<r>/g, rend = /<\/r>/, nlregex = /\r\n/g; var parse_rpr = function parse_rpr(rpr, intro, outro) { var font = {}, cp = 65001; var m = rpr.match(tagregex), i = 0; if (m) for (; i != m.length; ++i) { var y = parsexmltag(m[i]); switch (y[0]) { case "<condense": break; case "<extend": break; case "<shadow": case "<shadow/>": break; case "<charset": if (y.val == "1") break; cp = CS2CP[parseInt(y.val, 10)]; break; case "<outline": case "<outline/>": break; case "<rFont": font.name = y.val; break; case "<sz": font.sz = y.val; break; case "<strike": if (!y.val) break; case "<strike/>": font.strike = 1; break; case "</strike>": break; case "<u": if (!y.val) break; case "<u/>": font.u = 1; break; case "</u>": break; case "<b": if (!y.val) break; case "<b/>": font.b = 1; break; case "</b>": break; case "<i": if (!y.val) break; case "<i/>": font.i = 1; break; case "</i>": break; case "<color": if (y.rgb) font.color = y.rgb.substr(2, 6); break; case "<family": font.family = y.val; break; case "<vertAlign": break; case "<scheme": break; default: if (y[0].charCodeAt(1) !== 47) throw "Unrecognized rich format " + y[0] } } var style = []; if (font.b) style.push("font-weight: bold;"); if (font.i) style.push("font-style: italic;"); intro.push('<span style="' + style.join("") + '">'); outro.push("</span>"); return cp }; function parse_r(r) { var terms = [[], "", []]; var t = r.match(tregex), cp = 65001; if (!isval(t)) return ""; terms[1] = t[1]; var rpr = r.match(rpregex); if (isval(rpr)) cp = parse_rpr(rpr[1], terms[0], terms[2]); return terms[0].join("") + terms[1].replace(nlregex, "<br/>") + terms[2].join("") } return function parse_rs(rs) { return rs.replace(rregex, "").split(rend).map(parse_r).join("") } } (); var sitregex = /<t[^>]*>([^<]*)<\/t>/g, sirregex = /<r>/; function parse_si(x, opts) { var html = opts ? opts.cellHTML : true; var z = {}; if (!x) return null; var y; if (x.charCodeAt(1) === 116) { z.t = utf8read(unescapexml(x.substr(x.indexOf(">") + 1).split(/<\/t>/)[0])); z.r = x; if (html) z.h = z.t } else if (y = x.match(sirregex)) { z.r = x; z.t = utf8read(unescapexml(x.match(sitregex).join("").replace(tagregex, ""))); if (html) z.h = parse_rs(x) } return z } var sstr0 = /<sst([^>]*)>([\s\S]*)<\/sst>/; var sstr1 = /<(?:si|sstItem)>/g; var sstr2 = /<\/(?:si|sstItem)>/; function parse_sst_xml(data, opts) { var s = [], ss; var sst = data.match(sstr0); if (isval(sst)) { ss = sst[2].replace(sstr1, "").split(sstr2); for (var i = 0; i != ss.length; ++i) { var o = parse_si(ss[i], opts); if (o != null) s[s.length] = o } sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount } return s } RELS.SST = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"; var straywsregex = /^\s|\s$|[\t\n\r]/; function write_sst_xml(sst, opts) { if (!opts.bookSST) return ""; var o = [XML_HEADER]; o[o.length] = writextag("sst", null, { xmlns: XMLNS.main[0], count: sst.Count, uniqueCount: sst.Unique }); for (var i = 0; i != sst.length; ++i) { if (sst[i] == null) continue; var s = sst[i]; var sitag = "<si>"; if (s.r) sitag += s.r; else { sitag += "<t"; if (s.t.match(straywsregex)) sitag += ' xml:space="preserve"'; sitag += ">" + escapexml(s.t) + "</t>" } sitag += "</si>"; o[o.length] = sitag } if (o.length > 2) { o[o.length] = "</sst>"; o[1] = o[1].replace("/>", ">") } return o.join("") } function parse_BrtBeginSst(data, length) { return [data.read_shift(4), data.read_shift(4)] } function parse_sst_bin(data, opts) { var s = []; var pass = false; recordhopper(data, function hopper_sst(val, R, RT) { switch (R.n) { case "BrtBeginSst": s.Count = val[0]; s.Unique = val[1]; break; case "BrtSSTItem": s.push(val); break; case "BrtEndSst": return true; case "BrtFRTBegin": pass = true; break; case "BrtFRTEnd": pass = false; break; default: if (!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n) } }); return s } function write_BrtBeginSst(sst, o) { if (!o) o = new_buf(8); o.write_shift(4, sst.Count); o.write_shift(4, sst.Unique); return o } var write_BrtSSTItem = write_RichStr; function write_sst_bin(sst, opts) { var ba = buf_array(); write_record(ba, "BrtBeginSst", write_BrtBeginSst(sst)); for (var i = 0; i < sst.length; ++i) write_record(ba, "BrtSSTItem", write_BrtSSTItem(sst[i])); write_record(ba, "BrtEndSst"); return ba.end() } function _JS2ANSI(str) { if (typeof cptable !== "undefined") return cptable.utils.encode(1252, str); return str.split("").map(function (x) { return x.charCodeAt(0) }) } function parse_Version(blob, length) { var o = {}; o.Major = blob.read_shift(2); o.Minor = blob.read_shift(2); return o } function parse_EncryptionHeader(blob, length) { var o = {}; o.Flags = blob.read_shift(4); var tmp = blob.read_shift(4); if (tmp !== 0) throw "Unrecognized SizeExtra: " + tmp; o.AlgID = blob.read_shift(4); switch (o.AlgID) { case 0: case 26625: case 26126: case 26127: case 26128: break; default: throw "Unrecognized encryption algorithm: " + o.AlgID } parsenoop(blob, length - 12); return o } function parse_EncryptionVerifier(blob, length) { return parsenoop(blob, length) } function parse_RC4CryptoHeader(blob, length) { var o = {}; var vers = o.EncryptionVersionInfo = parse_Version(blob, 4); length -= 4; if (vers.Minor != 2) throw "unrecognized minor version code: " + vers.Minor; if (vers.Major > 4 || vers.Major < 2) throw "unrecognized major version code: " + vers.Major; o.Flags = blob.read_shift(4); length -= 4; var sz = blob.read_shift(4); length -= 4; o.EncryptionHeader = parse_EncryptionHeader(blob, sz); length -= sz; o.EncryptionVerifier = parse_EncryptionVerifier(blob, length); return o } function parse_RC4Header(blob, length) { var o = {}; var vers = o.EncryptionVersionInfo = parse_Version(blob, 4); length -= 4; if (vers.Major != 1 || vers.Minor != 1) throw "unrecognized version code " + vers.Major + " : " + vers.Minor; o.Salt = blob.read_shift(16); o.EncryptedVerifier = blob.read_shift(16); o.EncryptedVerifierHash = blob.read_shift(16); return o } function crypto_CreatePasswordVerifier_Method1(Password) { var Verifier = 0, PasswordArray; var PasswordDecoded = _JS2ANSI(Password); var len = PasswordDecoded.length + 1, i, PasswordByte; var Intermediate1, Intermediate2, Intermediate3; PasswordArray = new_raw_buf(len); PasswordArray[0] = PasswordDecoded.length; for (i = 1; i != len; ++i) PasswordArray[i] = PasswordDecoded[i - 1]; for (i = len - 1; i >= 0; --i) { PasswordByte = PasswordArray[i]; Intermediate1 = (Verifier & 16384) === 0 ? 0 : 1; Intermediate2 = Verifier << 1 & 32767; Intermediate3 = Intermediate1 | Intermediate2; Verifier = Intermediate3 ^ PasswordByte } return Verifier ^ 52811 } var crypto_CreateXorArray_Method1 = function () { var PadArray = [187, 255, 255, 186, 255, 255, 185, 128, 0, 190, 15, 0, 191, 15, 0]; var InitialCode = [57840, 7439, 52380, 33984, 4364, 3600, 61902, 12606, 6258, 57657, 54287, 34041, 10252, 43370, 20163]; var XorMatrix = [44796, 19929, 39858, 10053, 20106, 40212, 10761, 31585, 63170, 64933, 60267, 50935, 40399, 11199, 17763, 35526, 1453, 2906, 5812, 11624, 23248, 885, 1770, 3540, 7080, 14160, 28320, 56640, 55369, 41139, 20807, 41614, 21821, 43642, 17621, 28485, 56970, 44341, 19019, 38038, 14605, 29210, 60195, 50791, 40175, 10751, 21502, 43004, 24537, 18387, 36774, 3949, 7898, 15796, 31592, 63184, 47201, 24803, 49606, 37805, 14203, 28406, 56812, 17824, 35648, 1697, 3394, 6788, 13576, 27152, 43601, 17539, 35078, 557, 1114, 2228, 4456, 30388, 60776, 51953, 34243, 7079, 14158, 28316, 14128, 28256, 56512, 43425, 17251, 34502, 7597, 13105, 26210, 52420, 35241, 883, 1766, 3532, 4129, 8258, 16516, 33032, 4657, 9314, 18628]; var Ror = function (Byte) { return (Byte / 2 | Byte * 128) & 255 }; var XorRor = function (byte1, byte2) { return Ror(byte1 ^ byte2) }; var CreateXorKey_Method1 = function (Password) { var XorKey = InitialCode[Password.length - 1]; var CurrentElement = 104; for (var i = Password.length - 1; i >= 0; --i) { var Char = Password[i]; for (var j = 0; j != 7; ++j) { if (Char & 64) XorKey ^= XorMatrix[CurrentElement]; Char *= 2; --CurrentElement } } return XorKey }; return function (password) { var Password = _JS2ANSI(password); var XorKey = CreateXorKey_Method1(Password); var Index = Password.length; var ObfuscationArray = new_raw_buf(16); for (var i = 0; i != 16; ++i) ObfuscationArray[i] = 0; var Temp, PasswordLastChar, PadIndex; if ((Index & 1) === 1) { Temp = XorKey >> 8; ObfuscationArray[Index] = XorRor(PadArray[0], Temp); --Index; Temp = XorKey & 255; PasswordLastChar = Password[Password.length - 1]; ObfuscationArray[Index] = XorRor(PasswordLastChar, Temp) } while (Index > 0) { --Index; Temp = XorKey >> 8; ObfuscationArray[Index] = XorRor(Password[Index], Temp); --Index; Temp = XorKey & 255; ObfuscationArray[Index] = XorRor(Password[Index], Temp) } Index = 15; PadIndex = 15 - Password.length; while (PadIndex > 0) { Temp = XorKey >> 8; ObfuscationArray[Index] = XorRor(PadArray[PadIndex], Temp); --Index; --PadIndex; Temp = XorKey & 255; ObfuscationArray[Index] = XorRor(Password[Index], Temp); --Index; --PadIndex } return ObfuscationArray } } (); var crypto_DecryptData_Method1 = function (password, Data, XorArrayIndex, XorArray, O) { if (!O) O = Data; if (!XorArray) XorArray = crypto_CreateXorArray_Method1(password); var Index, Value; for (Index = 0; Index != Data.length; ++Index) { Value = Data[Index]; Value ^= XorArray[XorArrayIndex]; Value = (Value >> 5 | Value << 3) & 255; O[Index] = Value; ++XorArrayIndex } return [O, XorArrayIndex, XorArray] }; var crypto_MakeXorDecryptor = function (password) { var XorArrayIndex = 0, XorArray = crypto_CreateXorArray_Method1(password); return function (Data) { var O = crypto_DecryptData_Method1(null, Data, XorArrayIndex, XorArray); XorArrayIndex = O[1]; return O[0] } }; function parse_XORObfuscation(blob, length, opts, out) { var o = { key: parseuint16(blob), verificationBytes: parseuint16(blob) }; if (opts.password) o.verifier = crypto_CreatePasswordVerifier_Method1(opts.password); out.valid = o.verificationBytes === o.verifier; if (out.valid) out.insitu_decrypt = crypto_MakeXorDecryptor(opts.password); return o } function parse_FilePassHeader(blob, length, oo) { var o = oo || {}; o.Info = blob.read_shift(2); blob.l -= 2; if (o.Info === 1) o.Data = parse_RC4Header(blob, length); else o.Data = parse_RC4CryptoHeader(blob, length); return o } function parse_FilePass(blob, length, opts) { var o = { Type: blob.read_shift(2) }; if (o.Type) parse_FilePassHeader(blob, length - 2, o); else parse_XORObfuscation(blob, length - 2, opts, o); return o } function hex2RGB(h) { var o = h.substr(h[0] === "#" ? 1 : 0, 6); return [parseInt(o.substr(0, 2), 16), parseInt(o.substr(2, 2), 16), parseInt(o.substr(4, 2), 16)] } function rgb2Hex(rgb) { for (var i = 0, o = 1; i != 3; ++i) o = o * 256 + (rgb[i] > 255 ? 255 : rgb[i] < 0 ? 0 : rgb[i]); return o.toString(16).toUpperCase().substr(1) } function rgb2HSL(rgb) { var R = rgb[0] / 255, G = rgb[1] / 255, B = rgb[2] / 255; var M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m; if (C === 0) return [0, 0, R]; var H6 = 0, S = 0, L2 = M + m; S = C / (L2 > 1 ? 2 - L2 : L2); switch (M) { case R: H6 = ((G - B) / C + 6) % 6; break; case G: H6 = (B - R) / C + 2; break; case B: H6 = (R - G) / C + 4; break } return [H6 / 6, S, L2 / 2] } function hsl2RGB(hsl) { var H = hsl[0], S = hsl[1], L = hsl[2]; var C = S * 2 * (L < .5 ? L : 1 - L), m = L - C / 2; var rgb = [m, m, m], h6 = 6 * H; var X; if (S !== 0) switch (h6 | 0) { case 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break; case 1: X = C * (2 - h6); rgb[0] += X; rgb[1] += C; break; case 2: X = C * (h6 - 2); rgb[1] += C; rgb[2] += X; break; case 3: X = C * (4 - h6); rgb[1] += X; rgb[2] += C; break; case 4: X = C * (h6 - 4); rgb[2] += C; rgb[0] += X; break; case 5: X = C * (6 - h6); rgb[2] += X; rgb[0] += C; break } for (var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i] * 255); return rgb } function rgb_tint(hex, tint) { if (tint == 0) return hex; var hsl = rgb2HSL(hex2RGB(hex)); if (tint < 0) hsl[2] = hsl[2] * (1 + tint); else hsl[2] = 1 - (1 - hsl[2]) * (1 - tint); var rev = rgb2Hex(hsl2RGB(hsl)); return rev } var DEF_MDW = 7, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW; function width2px(width) { return (width + (128 / MDW | 0) / 256) * MDW | 0 } function px2char(px) { return ((px - 5) / MDW * 100 + .5 | 0) / 100 } function char2width(chr) { return ((chr * MDW + 5) / MDW * 256 | 0) / 256 } function cycle_width(collw) { return char2width(px2char(width2px(collw))) } function find_mdw(collw, coll) { if (cycle_width(collw) != collw) { for (MDW = DEF_MDW; MDW > MIN_MDW; --MDW) if (cycle_width(collw) === collw) break; if (MDW === MIN_MDW) for (MDW = DEF_MDW + 1; MDW < MAX_MDW; ++MDW) if (cycle_width(collw) === collw) break; if (MDW === MAX_MDW) MDW = DEF_MDW } } var XLMLPatternTypeMap = { None: "none", Solid: "solid", Gray50: "mediumGray", Gray75: "darkGray", Gray25: "lightGray", HorzStripe: "darkHorizontal", VertStripe: "darkVertical", ReverseDiagStripe: "darkDown", DiagStripe: "darkUp", DiagCross: "darkGrid", ThickDiagCross: "darkTrellis", ThinHorzStripe: "lightHorizontal", ThinVertStripe: "lightVertical", ThinReverseDiagStripe: "lightDown", ThinHorzCross: "lightGrid" }; var styles = {}; var themes = {}; function parse_fills(t, opts) { styles.Fills = []; var fill = {}; t[0].match(tagregex).forEach(function (x) { var y = parsexmltag(x); switch (y[0]) { case "<fills": case "<fills>": case "</fills>": break; case "<fill>": break; case "</fill>": styles.Fills.push(fill); fill = {}; break; case "<patternFill": if (y.patternType) fill.patternType = y.patternType; break; case "<patternFill/>": case "</patternFill>": break; case "<bgColor": if (!fill.bgColor) fill.bgColor = {}; if (y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10); if (y.theme) fill.bgColor.theme = parseInt(y.theme, 10); if (y.tint) fill.bgColor.tint = parseFloat(y.tint); if (y.theme && themes.themeElements && themes.themeElements.clrScheme) { fill.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[fill.bgColor.theme].rgb, fill.bgColor.tint || 0); if (opts.WTF) fill.bgColor.raw_rgb = rgb_tint(themes.themeElements.clrScheme[fill.bgColor.theme].rgb, 0) } if (y.rgb) fill.bgColor.rgb = y.rgb; break; case "<bgColor/>": case "</bgColor>": break; case "<fgColor": if (!fill.fgColor) fill.fgColor = {}; if (y.theme) fill.fgColor.theme = parseInt(y.theme, 10); if (y.tint) fill.fgColor.tint = parseFloat(y.tint); if (y.theme && themes.themeElements && themes.themeElements.clrScheme) { fill.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[fill.fgColor.theme].rgb, fill.fgColor.tint || 0); if (opts.WTF) fill.fgColor.raw_rgb = rgb_tint(themes.themeElements.clrScheme[fill.fgColor.theme].rgb, 0) } if (y.rgb) fill.fgColor.rgb = y.rgb; break; case "<fgColor/>": case "</fgColor>": break; default: if (opts.WTF) throw "unrecognized " + y[0] + " in fills" } }) } function parse_fonts(t, opts) { styles.Fonts = []; var font = {}; t[0].match(tagregex).forEach(function (x) { var y = parsexmltag(x); switch (y[0]) { case "<fonts": case "<fonts>": case "</fonts>": break; case "<font": break; case "</font>": styles.Fonts.push(font); font = {}; break; case "<name": if (y.val) font.name = y.val; break; case "<name/>": case "</name>": break; case "<b/>": font.bold = true; break; case "<u/>": font.underline = true; break; case "<i/>": font.italic = true; break; case "<strike/>": font.strike = true; break; case "<outline/>": font.outline = true; break; case "<shadow/>": font.shadow = true; break; case "<sz": if (y.val) font.sz = y.val; break; case "<sz/>": case "</sz>": break; case "<vertAlign": if (y.val) font.vertAlign = y.val; break; case "<vertAlign/>": case "</vertAlign>": break; case "<color": if (!font.color) font.color = {}; if (y.theme) font.color.theme = y.theme; if (y.tint) font.color.tint = y.tint; if (y.theme && themes.themeElements && themes.themeElements.clrScheme) { font.color.rgb = rgb_tint(themes.themeElements.clrScheme[font.color.theme].rgb, font.color.tint || 0) } if (y.rgb) font.color.rgb = y.rgb; break; case "<color/>": case "</color>": break } }) } function parse_borders(t, opts) { styles.Borders = []; var border = {}, sub_border = {}; t[0].match(tagregex).forEach(function (x) { var y = parsexmltag(x); switch (y[0]) { case "<borders": case "<borders>": case "</borders>": break; case "<border": case "<border>": border = {}; if (y.diagonalUp) { border.diagonalUp = y.diagonalUp } if (y.diagonalDown) { border.diagonalDown = y.diagonalDown } styles.Borders.push(border); break; break; case "</border>": break; case "<left": sub_border = border.left = {}; if (y.style) { sub_border.style = y.style } break; case "<right": sub_border = border.right = {}; if (y.style) { sub_border.style = y.style } break; case "<top": sub_border = border.top = {}; if (y.style) { sub_border.style = y.style } break; case "<bottom": sub_border = border.bottom = {}; if (y.style) { sub_border.style = y.style } break; case "<diagonal": sub_border = border.diagonal = {}; if (y.style) { sub_border.style = y.style } break; case "<color": sub_border.color = {}; if (y.theme) sub_border.color.theme = y.theme; if (y.theme && themes.themeElements && themes.themeElements.clrScheme) { sub_border.color.rgb = rgb_tint(themes.themeElements.clrScheme[sub_border.color.theme].rgb, sub_border.color.tint || 0) } if (y.tint) sub_border.color.tint = y.tint; if (y.rgb) sub_border.color.rgb = y.rgb; if (y.auto) sub_border.color.auto = y.auto; break; case "<name/>": case "</name>": break; default: break } }) } function parse_numFmts(t, opts) { styles.NumberFmt = []; var k = keys(SSF._table); for (var i = 0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]]; var m = t[0].match(tagregex); for (i = 0; i < m.length; ++i) { var y = parsexmltag(m[i]); switch (y[0]) { case "<numFmts": case "</numFmts>": case "<numFmts/>": case "<numFmts>": break; case "<numFmt": { var f = unescapexml(utf8read(y.formatCode)), j = parseInt(y.numFmtId, 10); styles.NumberFmt[j] = f; if (j > 0) SSF.load(f, j) } break; default: if (opts.WTF) throw "unrecognized " + y[0] + " in numFmts" } } } function write_numFmts(NF, opts) { var o = ["<numFmts>"]; [[5, 8], [23, 26], [41, 44], [63, 66], [164, 392]].forEach(function (r) { for (var i = r[0]; i <= r[1]; ++i) if (NF[i] !== undefined) o[o.length] = writextag("numFmt", null, { numFmtId: i, formatCode: escapexml(NF[i]) }) }); if (o.length === 1) return ""; o[o.length] = "</numFmts>"; o[0] = writextag("numFmts", null, { count: o.length - 2 }).replace("/>", ">"); return o.join("") } function parse_cellXfs(t, opts) { styles.CellXf = []; var xf; t[0].match(tagregex).forEach(function (x) { var y = parsexmltag(x); switch (y[0]) { case "<cellXfs": case "<cellXfs>": case "<cellXfs/>": case "</cellXfs>": break; case "<xf": xf = y; delete xf[0]; delete y[0]; if (xf.numFmtId) xf.numFmtId = parseInt(xf.numFmtId, 10); if (xf.fillId) xf.fillId = parseInt(xf.fillId, 10); styles.CellXf.push(xf); break; case "</xf>": break; case "<alignment": case "<alignment/>": var alignment = {}; if (y.vertical) { alignment.vertical = y.vertical } if (y.horizontal) { alignment.horizontal = y.horizontal } if (y.textRotation != undefined) { alignment.textRotation = y.textRotation } if (y.indent) { alignment.indent = y.indent } if (y.wrapText) { alignment.wrapText = y.wrapText } xf.alignment = alignment; break; case "<protection": case "</protection>": case "<protection/>": break; case "<extLst": case "</extLst>": break; case "<ext": break; default: if (opts.WTF) throw "unrecognized " + y[0] + " in cellXfs" } }) } function write_cellXfs(cellXfs) { var o = []; o[o.length] = writextag("cellXfs", null); cellXfs.forEach(function (c) { o[o.length] = writextag("xf", null, c) }); o[o.length] = "</cellXfs>"; if (o.length === 2) return ""; o[0] = writextag("cellXfs", null, { count: o.length - 2 }).replace("/>", ">"); return o.join("") } var parse_sty_xml = function make_pstyx() { var numFmtRegex = /<numFmts([^>]*)>.*<\/numFmts>/; var cellXfRegex = /<cellXfs([^>]*)>.*<\/cellXfs>/; var fillsRegex = /<fills([^>]*)>.*<\/fills>/; var bordersRegex = /<borders([^>]*)>.*<\/borders>/; return function parse_sty_xml(data, opts) { var t; if (t = data.match(numFmtRegex)) parse_numFmts(t, opts); if (t = data.match(/<fonts([^>]*)>.*<\/fonts>/)) parse_fonts(t, opts); if (t = data.match(fillsRegex)) parse_fills(t, opts); if (t = data.match(bordersRegex)) parse_borders(t, opts); if (t = data.match(cellXfRegex)) parse_cellXfs(t, opts); return styles } } (); var STYLES_XML_ROOT = writextag("styleSheet", null, { xmlns: XMLNS.main[0], "xmlns:vt": XMLNS.vt }); RELS.STY = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"; function write_sty_xml(wb, opts) { if (typeof style_builder != "undefined" && typeof "require" != "undefined") { return style_builder.toXml() } var o = [XML_HEADER, STYLES_XML_ROOT], w; if ((w = write_numFmts(wb.SSF)) != null) o[o.length] = w; o[o.length] = '<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>'; o[o.length] = '<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>'; o[o.length] = '<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>'; o[o.length] = '<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>'; if (w = write_cellXfs(opts.cellXfs)) o[o.length] = w; o[o.length] = '<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>'; o[o.length] = '<dxfs count="0"/>'; o[o.length] = '<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>'; if (o.length > 2) { o[o.length] = "</styleSheet>"; o[1] = o[1].replace("/>", ">") } return o.join("") } function parse_BrtFmt(data, length) { var ifmt = data.read_shift(2); var stFmtCode = parse_XLWideString(data, length - 2); return [ifmt, stFmtCode] } function parse_BrtFont(data, length) { var out = { flags: {} }; out.dyHeight = data.read_shift(2); out.grbit = parse_FontFlags(data, 2); out.bls = data.read_shift(2); out.sss = data.read_shift(2); out.uls = data.read_shift(1); out.bFamily = data.read_shift(1); out.bCharSet = data.read_shift(1); data.l++; out.brtColor = parse_BrtColor(data, 8); out.bFontScheme = data.read_shift(1); out.name = parse_XLWideString(data, length - 21); out.flags.Bold = out.bls === 700; out.flags.Italic = out.grbit.fItalic; out.flags.Strikeout = out.grbit.fStrikeout; out.flags.Outline = out.grbit.fOutline; out.flags.Shadow = out.grbit.fShadow; out.flags.Condense = out.grbit.fCondense; out.flags.Extend = out.grbit.fExtend; out.flags.Sub = out.sss & 2; out.flags.Sup = out.sss & 1; return out } function parse_BrtXF(data, length) { var ixfeParent = data.read_shift(2); var ifmt = data.read_shift(2); parsenoop(data, length - 4); return { ixfe: ixfeParent, ifmt: ifmt } } function parse_sty_bin(data, opts) { styles.NumberFmt = []; for (var y in SSF._table) styles.NumberFmt[y] = SSF._table[y]; styles.CellXf = []; var state = ""; var pass = false; recordhopper(data, function hopper_sty(val, R, RT) { switch (R.n) { case "BrtFmt": styles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]); break; case "BrtFont": break; case "BrtKnownFonts": break; case "BrtFill": break; case "BrtBorder": break; case "BrtXF": if (state === "CELLXFS") { styles.CellXf.push(val) } break; case "BrtStyle": break; case "BrtDXF": break; case "BrtMRUColor": break; case "BrtIndexedColor": break; case "BrtBeginStyleSheet": break; case "BrtEndStyleSheet": break; case "BrtBeginTableStyle": break; case "BrtTableStyleElement": break; case "BrtEndTableStyle": break; case "BrtBeginFmts": state = "FMTS"; break; case "BrtEndFmts": state = ""; break; case "BrtBeginFonts": state = "FONTS"; break; case "BrtEndFonts": state = ""; break; case "BrtACBegin": state = "ACFONTS"; break; case "BrtACEnd": state = ""; break; case "BrtBeginFills": state = "FILLS"; break; case "BrtEndFills": state = ""; break; case "BrtBeginBorders": state = "BORDERS"; break; case "BrtEndBorders": state = ""; break; case "BrtBeginCellStyleXFs": state = "CELLSTYLEXFS"; break; case "BrtEndCellStyleXFs": state = ""; break; case "BrtBeginCellXFs": state = "CELLXFS"; break; case "BrtEndCellXFs": state = ""; break; case "BrtBeginStyles": state = "STYLES"; break; case "BrtEndStyles": state = ""; break; case "BrtBeginDXFs": state = "DXFS"; break; case "BrtEndDXFs": state = ""; break; case "BrtBeginTableStyles": state = "TABLESTYLES"; break; case "BrtEndTableStyles": state = ""; break; case "BrtBeginColorPalette": state = "COLORPALETTE"; break; case "BrtEndColorPalette": state = ""; break; case "BrtBeginIndexedColors": state = "INDEXEDCOLORS"; break; case "BrtEndIndexedColors": state = ""; break; case "BrtBeginMRUColors": state = "MRUCOLORS"; break; case "BrtEndMRUColors": state = ""; break; case "BrtFRTBegin": pass = true; break; case "BrtFRTEnd": pass = false; break; case "BrtBeginStyleSheetExt14": break; case "BrtBeginSlicerStyles": break; case "BrtEndSlicerStyles": break; case "BrtBeginTimelineStylesheetExt15": break; case "BrtEndTimelineStylesheetExt15": break; case "BrtBeginTimelineStyles": break; case "BrtEndTimelineStyles": break; case "BrtEndStyleSheetExt14": break; default: if (!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n) } }); return styles } function write_sty_bin(data, opts) { var ba = buf_array(); write_record(ba, "BrtBeginStyleSheet"); write_record(ba, "BrtEndStyleSheet"); return ba.end() } RELS.THEME = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"; function parse_clrScheme(t, opts) { themes.themeElements.clrScheme = []; var color = {}; t[0].match(tagregex).forEach(function (x) { var y = parsexmltag(x); switch (y[0]) { case "<a:clrScheme": case "</a:clrScheme>": break; case "<a:srgbClr": color.rgb = y.val; break; case "<a:sysClr": color.rgb = y.lastClr; break; case "<a:dk1>": case "</a:dk1>": case "<a:dk2>": case "</a:dk2>": case "<a:lt1>": case "</a:lt1>": case "<a:lt2>": case "</a:lt2>": case "<a:accent1>": case "</a:accent1>": case "<a:accent2>": case "</a:accent2>": case "<a:accent3>": case "</a:accent3>": case "<a:accent4>": case "</a:accent4>": case "<a:accent5>": case "</a:accent5>": case "<a:accent6>": case "</a:accent6>": case "<a:hlink>": case "</a:hlink>": case "<a:folHlink>": case "</a:folHlink>": if (y[0][1] === "/") { themes.themeElements.clrScheme.push(color); color = {} } else { color.name = y[0].substring(3, y[0].length - 1) } break; default: if (opts.WTF) throw "unrecognized " + y[0] + " in clrScheme" } }) } function parse_fontScheme(t, opts) {} function parse_fmtScheme(t, opts) {} var clrsregex = /<a:clrScheme([^>]*)>[^\u2603]*<\/a:clrScheme>/; var fntsregex = /<a:fontScheme([^>]*)>[^\u2603]*<\/a:fontScheme>/; var fmtsregex = /<a:fmtScheme([^>]*)>[^\u2603]*<\/a:fmtScheme>/; function parse_themeElements(data, opts) { themes.themeElements = {}; var t; [["clrScheme", clrsregex, parse_clrScheme], ["fontScheme", fntsregex, parse_fontScheme], ["fmtScheme", fmtsregex, parse_fmtScheme]].forEach(function (m) { if (!(t = data.match(m[1]))) throw m[0] + " not found in themeElements"; m[2](t, opts) }) } var themeltregex = /<a:themeElements([^>]*)>[^\u2603]*<\/a:themeElements>/; function parse_theme_xml(data, opts) { if (!data || data.length === 0) return themes; var t; if (!(t = data.match(themeltregex))) throw "themeElements not found in theme"; parse_themeElements(t[0], opts); return themes } function write_theme(opts) { if (opts.themeXml) { return opts.themeXml } return '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Geor" typeface="Sylfaen"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/><a:font script="Geor" typeface="Sylfaen"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="100000"/><a:shade val="100000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="50000"/><a:shade val="100000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults><a:spDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="3"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="2"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></a:style></a:spDef><a:lnDef><a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="2"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="1"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></a:style></a:lnDef></a:objectDefaults><a:extraClrSchemeLst/></a:theme>' } function parse_Theme(blob, length) { var dwThemeVersion = blob.read_shift(4); if (dwThemeVersion === 124226) return; blob.l += length - 4 } function parse_ColorTheme(blob, length) { return blob.read_shift(4) } function parse_FullColorExt(blob, length) { var o = {}; o.xclrType = blob.read_shift(2); o.nTintShade = blob.read_shift(2); switch (o.xclrType) { case 0: blob.l += 4; break; case 1: o.xclrValue = parse_IcvXF(blob, 4); break; case 2: o.xclrValue = parse_LongRGBA(blob, 4); break; case 3: o.xclrValue = parse_ColorTheme(blob, 4); break; case 4: blob.l += 4; break } blob.l += 8; return o } function parse_IcvXF(blob, length) { return parsenoop(blob, length) } function parse_XFExtGradient(blob, length) { return parsenoop(blob, length) } function parse_ExtProp(blob, length) { var extType = blob.read_shift(2); var cb = blob.read_shift(2); var o = [extType]; switch (extType) { case 4: case 5: case 7: case 8: case 9: case 10: case 11: case 13: o[1] = parse_FullColorExt(blob, cb); break; case 6: o[1] = parse_XFExtGradient(blob, cb); break; case 14: case 15: o[1] = blob.read_shift(cb === 5 ? 1 : 2); break; default: throw new Error("Unrecognized ExtProp type: " + extType + " " + cb) } return o } function parse_XFExt(blob, length) { var end = blob.l + length; blob.l += 2; var ixfe = blob.read_shift(2); blob.l += 2; var cexts = blob.read_shift(2); var ext = []; while (cexts-- > 0) ext.push(parse_ExtProp(blob, end - blob.l)); return { ixfe: ixfe, ext: ext } } function update_xfext(xf, xfext) { xfext.forEach(function (xfe) { switch (xfe[0]) { case 4: break; case 5: break; case 7: case 8: case 9: case 10: break; case 13: break; case 14: break; default: throw "bafuq" + xfe[0].toString(16) } }) } function parse_cc_xml(data, opts) { var d = []; var l = 0, i = 1; (data.match(tagregex) || []).forEach(function (x) { var y = parsexmltag(x); switch (y[0]) { case "<?xml": break; case "<calcChain": case "<calcChain>": case "</calcChain>": break; case "<c": delete y[0]; if (y.i) i = y.i; else y.i = i; d.push(y); break } }); return d } function write_cc_xml(data, opts) {} function parse_BrtCalcChainItem$(data, length) { var out = {}; out.i = data.read_shift(4); var cell = {}; cell.r = data.read_shift(4); cell.c = data.read_shift(4); out.r = encode_cell(cell); var flags = data.read_shift(1); if (flags & 2) out.l = "1"; if (flags & 8) out.a = "1"; return out } function parse_cc_bin(data, opts) { var out = []; var pass = false; recordhopper(data, function hopper_cc(val, R, RT) { switch (R.n) { case "BrtCalcChainItem$": out.push(val); break; case "BrtBeginCalcChain$": break; case "BrtEndCalcChain$": break; default: if (!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n) } }); return out } function write_cc_bin(data, opts) {} function parse_comments(zip, dirComments, sheets, sheetRels, opts) { for (var i = 0; i != dirComments.length; ++i) { var canonicalpath = dirComments[i]; var comments = parse_cmnt(getzipdata(zip, canonicalpath.replace(/^\//, ""), true), canonicalpath, opts); if (!comments || !comments.length) continue; var sheetNames = keys(sheets); for (var j = 0; j != sheetNames.length; ++j) { var sheetName = sheetNames[j]; var rels = sheetRels[sheetName]; if (rels) { var rel = rels[canonicalpath]; if (rel) insertCommentsIntoSheet(sheetName, sheets[sheetName], comments) } } } } function insertCommentsIntoSheet(sheetName, sheet, comments) { comments.forEach(function (comment) { var cell = sheet[comment.ref]; if (!cell) { cell = {}; sheet[comment.ref] = cell; var range = safe_decode_range(sheet["!ref"] || "BDWGO1000001:A1"); var thisCell = decode_cell(comment.ref); if (range.s.r > thisCell.r) range.s.r = thisCell.r; if (range.e.r < thisCell.r) range.e.r = thisCell.r; if (range.s.c > thisCell.c) range.s.c = thisCell.c; if (range.e.c < thisCell.c) range.e.c = thisCell.c; var encoded = encode_range(range); if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded } if (!cell.c) cell.c = []; var o = { a: comment.author, t: comment.t, r: comment.r }; if (comment.h) o.h = comment.h; cell.c.push(o) }) } function parse_comments_xml(data, opts) { if (data.match(/<(?:\w+:)?comments *\/>/)) return []; var authors = []; var commentList = []; data.match(/<(?:\w+:)?authors>([^\u2603]*)<\/(?:\w+:)?authors>/)[1].split(/<\/\w*:?author>/).forEach(function (x) { if (x === "" || x.trim() === "") return; authors.push(x.match(/<(?:\w+:)?author[^>]*>(.*)/)[1]) }); (data.match(/<(?:\w+:)?commentList>([^\u2603]*)<\/(?:\w+:)?commentList>/) || ["", ""])[1].split(/<\/\w*:?comment>/).forEach(function (x, index) { if (x === "" || x.trim() === "") return; var y = parsexmltag(x.match(/<(?:\w+:)?comment[^>]*>/)[0]); var comment = { author: y.authorId && authors[y.authorId] ? authors[y.authorId] : undefined, ref: y.ref, guid: y.guid }; var cell = decode_cell(y.ref); if (opts.sheetRows && opts.sheetRows <= cell.r) return; var textMatch = x.match(/<text>([^\u2603]*)<\/text>/); if (!textMatch || !textMatch[1]) return; var rt = parse_si(textMatch[1]); comment.r = rt.r; comment.t = rt.t; if (opts.cellHTML) comment.h = rt.h; commentList.push(comment) }); return commentList } function write_comments_xml(data, opts) {} function parse_BrtBeginComment(data, length) { var out = {}; out.iauthor = data.read_shift(4); var rfx = parse_UncheckedRfX(data, 16); out.rfx = rfx.s; out.ref = encode_cell(rfx.s); data.l += 16; return out } var parse_BrtCommentAuthor = parse_XLWideString; var parse_BrtCommentText = parse_RichStr; function parse_comments_bin(data, opts) { var out = []; var authors = []; var c = {}; var pass = false; recordhopper(data, function hopper_cmnt(val, R, RT) { switch (R.n) { case "BrtCommentAuthor": authors.push(val); break; case "BrtBeginComment": c = val; break; case "BrtCommentText": c.t = val.t; c.h = val.h; c.r = val.r; break; case "BrtEndComment": c.author = authors[c.iauthor]; delete c.iauthor; if (opts.sheetRows && opts.sheetRows <= c.rfx.r) break; delete c.rfx; out.push(c); break; case "BrtBeginComments": break; case "BrtEndComments": break; case "BrtBeginCommentAuthors": break; case "BrtEndCommentAuthors": break; case "BrtBeginCommentList": break; case "BrtEndCommentList": break; default: if (!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R.n) } }); return out } function write_comments_bin(data, opts) {} var rc_to_a1 = function () { var rcregex = /(^|[^A-Za-z])R(\[?)(-?\d+|)\]?C(\[?)(-?\d+|)\]?/g; var rcbase; function rcfunc($$, $1, $2, $3, $4, $5) { var R = $3.length > 0 ? parseInt($3, 10) | 0 : 0, C = $5.length > 0 ? parseInt($5, 10) | 0 : 0; if (C < 0 && $4.length === 0) C = 0; if ($4.length > 0) C += rcbase.c; if ($2.length > 0) R += rcbase.r; return $1 + encode_col(C) + encode_row(R) } return function rc_to_a1(fstr, base) { rcbase = base; return fstr.replace(rcregex, rcfunc) } } (); function parseread(l) { return function (blob, length) { blob.l += l; return } } function parseread1(blob, length) { blob.l += 1; return } function parse_ColRelU(blob, length) { var c = blob.read_shift(2); return [c & 16383, c >> 14 & 1, c >> 15 & 1] } function parse_RgceArea(blob, length) { var r = blob.read_shift(2), R = blob.read_shift(2); var c = parse_ColRelU(blob, 2); var C = parse_ColRelU(blob, 2); return { s: { r: r, c: c[0], cRel: c[1], rRel: c[2] }, e: { r: R, c: C[0], cRel: C[1], rRel: C[2] } } } function parse_RgceAreaRel(blob, length) { var r = blob.read_shift(2), R = blob.read_shift(2); var c = parse_ColRelU(blob, 2); var C = parse_ColRelU(blob, 2); return { s: { r: r, c: c[0], cRel: c[1], rRel: c[2] }, e: { r: R, c: C[0], cRel: C[1], rRel: C[2] } } } function parse_RgceLoc(blob, length) { var r = blob.read_shift(2); var c = parse_ColRelU(blob, 2); return { r: r, c: c[0], cRel: c[1], rRel: c[2] } } function parse_RgceLocRel(blob, length) { var r = blob.read_shift(2); var cl = blob.read_shift(2); var cRel = (cl & 32768) >> 15, rRel = (cl & 16384) >> 14; cl &= 16383; if (cRel !== 0) while (cl >= 256) cl -= 256; return { r: r, c: cl, cRel: cRel, rRel: rRel } } function parse_PtgArea(blob, length) { var type = (blob[blob.l++] & 96) >> 5; var area = parse_RgceArea(blob, 8); return [type, area] } function parse_PtgArea3d(blob, length) { var type = (blob[blob.l++] & 96) >> 5; var ixti = blob.read_shift(2); var area = parse_RgceArea(blob, 8); return [type, ixti, area] } function parse_PtgAreaErr(blob, length) { var type = (blob[blob.l++] & 96) >> 5; blob.l += 8; return [type] } function parse_PtgAreaErr3d(blob, length) { var type = (blob[blob.l++] & 96) >> 5; var ixti = blob.read_shift(2); blob.l += 8; return [type, ixti] } function parse_PtgAreaN(blob, length) { var type = (blob[blob.l++] & 96) >> 5; var area = parse_RgceAreaRel(blob, 8); return [type, area] } function parse_PtgArray(blob, length) { var type = (blob[blob.l++] & 96) >> 5; blob.l += 7; return [type] } function parse_PtgAttrBaxcel(blob, length) { var bitSemi = blob[blob.l + 1] & 1; var bitBaxcel = 1; blob.l += 4; return [bitSemi, bitBaxcel] } function parse_PtgAttrChoose(blob, length) { blob.l += 2; var offset = blob.read_shift(2); var o = []; for (var i = 0; i <= offset; ++i) o.push(blob.read_shift(2)); return o } function parse_PtgAttrGoto(blob, length) { var bitGoto = blob[blob.l + 1] & 255 ? 1 : 0; blob.l += 2; return [bitGoto, blob.read_shift(2)] } function parse_PtgAttrIf(blob, length) { var bitIf = blob[blob.l + 1] & 255 ? 1 : 0; blob.l += 2; return [bitIf, blob.read_shift(2)] } function parse_PtgAttrSemi(blob, length) { var bitSemi = blob[blob.l + 1] & 255 ? 1 : 0; blob.l += 4; return [bitSemi] } function parse_PtgAttrSpaceType(blob, length) { var type = blob.read_shift(1), cch = blob.read_shift(1); return [type, cch] } function parse_PtgAttrSpace(blob, length) { blob.read_shift(2); return parse_PtgAttrSpaceType(blob, 2) } function parse_PtgAttrSpaceSemi(blob, length) { blob.read_shift(2); return parse_PtgAttrSpaceType(blob, 2) } function parse_PtgRef(blob, length) { var ptg = blob[blob.l] & 31; var type = (blob[blob.l] & 96) >> 5; blob.l += 1; var loc = parse_RgceLoc(blob, 4); return [type, loc] } function parse_PtgRefN(blob, length) { var ptg = blob[blob.l] & 31; var type = (blob[blob.l] & 96) >> 5; blob.l += 1; var loc = parse_RgceLocRel(blob, 4); return [type, loc] } function parse_PtgRef3d(blob, length) { var ptg = blob[blob.l] & 31; var type = (blob[blob.l] & 96) >> 5; blob.l += 1; var ixti = blob.read_shift(2); var loc = parse_RgceLoc(blob, 4); return [type, ixti, loc] } function parse_PtgFunc(blob, length) { var ptg = blob[blob.l] & 31; var type = (blob[blob.l] & 96) >> 5; blob.l += 1; var iftab = blob.read_shift(2); return [FtabArgc[iftab], Ftab[iftab]] } function parse_PtgFuncVar(blob, length) { blob.l++; var cparams = blob.read_shift(1), tab = parsetab(blob); return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]] } function parsetab(blob, length) { return [blob[blob.l + 1] >> 7, blob.read_shift(2) & 32767] } var parse_PtgAttrSum = parseread(4); var parse_PtgConcat = parseread1; function parse_PtgExp(blob, length) { blob.l++; var row = blob.read_shift(2); var col = blob.read_shift(2); return [row, col] } function parse_PtgErr(blob, length) { blob.l++; return BErr[blob.read_shift(1)] } function parse_PtgInt(blob, length) { blob.l++; return blob.read_shift(2) } function parse_PtgBool(blob, length) { blob.l++; return blob.read_shift(1) !== 0 } function parse_PtgNum(blob, length) { blob.l++; return parse_Xnum(blob, 8) } function parse_PtgStr(blob, length) { blob.l++; return parse_ShortXLUnicodeString(blob) } function parse_SerAr(blob) { var val = []; switch (val[0] = blob.read_shift(1)) { case 4: val[1] = parsebool(blob, 1) ? "TRUE" : "FALSE"; blob.l += 7; break; case 16: val[1] = BErr[blob[blob.l]]; blob.l += 8; break; case 0: blob.l += 8; break; case 1: val[1] = parse_Xnum(blob, 8); break; case 2: val[1] = parse_XLUnicodeString(blob); break } return val } function parse_PtgExtraMem(blob, cce) { var count = blob.read_shift(2); var out = []; for (var i = 0; i != count; ++i) out.push(parse_Ref8U(blob, 8)); return out } function parse_PtgExtraArray(blob) { var cols = 1 + blob.read_shift(1); var rows = 1 + blob.read_shift(2); for (var i = 0, o = []; i != rows && (o[i] = []); ++i) for (var j = 0; j != cols; ++j) o[i][j] = parse_SerAr(blob); return o } function parse_PtgName(blob, length) { var type = blob.read_shift(1) >>> 5 & 3; var nameindex = blob.read_shift(4); return [type, 0, nameindex] } function parse_PtgNameX(blob, length) { var type = blob.read_shift(1) >>> 5 & 3; var ixti = blob.read_shift(2); var nameindex = blob.read_shift(4); return [type, ixti, nameindex] } function parse_PtgMemArea(blob, length) { var type = blob.read_shift(1) >>> 5 & 3; blob.l += 4; var cce = blob.read_shift(2); return [type, cce] } function parse_PtgMemFunc(blob, length) { var type = blob.read_shift(1) >>> 5 & 3; var cce = blob.read_shift(2); return [type, cce] } function parse_PtgRefErr(blob, length) { var type = blob.read_shift(1) >>> 5 & 3; blob.l += 4; return [type] } var parse_PtgAdd = parseread1; var parse_PtgDiv = parseread1; var parse_PtgEq = parseread1; var parse_PtgGe = parseread1; var parse_PtgGt = parseread1; var parse_PtgIsect = parseread1; var parse_PtgLe = parseread1; var parse_PtgLt = parseread1; var parse_PtgMissArg = parseread1; var parse_PtgMul = parseread1; var parse_PtgNe = parseread1; var parse_PtgParen = parseread1; var parse_PtgPercent = parseread1; var parse_PtgPower = parseread1; var parse_PtgRange = parseread1; var parse_PtgSub = parseread1; var parse_PtgUminus = parseread1; var parse_PtgUnion = parseread1; var parse_PtgUplus = parseread1; var parse_PtgMemErr = parsenoop; var parse_PtgMemNoMem = parsenoop; var parse_PtgRefErr3d = parsenoop; var parse_PtgTbl = parsenoop; var PtgTypes = { 1: { n: "PtgExp", f: parse_PtgExp }, 2: { n: "PtgTbl", f: parse_PtgTbl }, 3: { n: "PtgAdd", f: parse_PtgAdd }, 4: { n: "PtgSub", f: parse_PtgSub }, 5: { n: "PtgMul", f: parse_PtgMul }, 6: { n: "PtgDiv", f: parse_PtgDiv }, 7: { n: "PtgPower", f: parse_PtgPower }, 8: { n: "PtgConcat", f: parse_PtgConcat }, 9: { n: "PtgLt", f: parse_PtgLt }, 10: { n: "PtgLe", f: parse_PtgLe }, 11: { n: "PtgEq", f: parse_PtgEq }, 12: { n: "PtgGe", f: parse_PtgGe }, 13: { n: "PtgGt", f: parse_PtgGt }, 14: { n: "PtgNe", f: parse_PtgNe }, 15: { n: "PtgIsect", f: parse_PtgIsect }, 16: { n: "PtgUnion", f: parse_PtgUnion }, 17: { n: "PtgRange", f: parse_PtgRange }, 18: { n: "PtgUplus", f: parse_PtgUplus }, 19: { n: "PtgUminus", f: parse_PtgUminus }, 20: { n: "PtgPercent", f: parse_PtgPercent }, 21: { n: "PtgParen", f: parse_PtgParen }, 22: { n: "PtgMissArg", f: parse_PtgMissArg }, 23: { n: "PtgStr", f: parse_PtgStr }, 28: { n: "PtgErr", f: parse_PtgErr }, 29: { n: "PtgBool", f: parse_PtgBool }, 30: { n: "PtgInt", f: parse_PtgInt }, 31: { n: "PtgNum", f: parse_PtgNum }, 32: { n: "PtgArray", f: parse_PtgArray }, 33: { n: "PtgFunc", f: parse_PtgFunc }, 34: { n: "PtgFuncVar", f: parse_PtgFuncVar }, 35: { n: "PtgName", f: parse_PtgName }, 36: { n: "PtgRef", f: parse_PtgRef }, 37: { n: "PtgArea", f: parse_PtgArea }, 38: { n: "PtgMemArea", f: parse_PtgMemArea }, 39: { n: "PtgMemErr", f: parse_PtgMemErr }, 40: { n: "PtgMemNoMem", f: parse_PtgMemNoMem }, 41: { n: "PtgMemFunc", f: parse_PtgMemFunc }, 42: { n: "PtgRefErr", f: parse_PtgRefErr }, 43: { n: "PtgAreaErr", f: parse_PtgAreaErr }, 44: { n: "PtgRefN", f: parse_PtgRefN }, 45: { n: "PtgAreaN", f: parse_PtgAreaN }, 57: { n: "PtgNameX", f: parse_PtgNameX }, 58: { n: "PtgRef3d", f: parse_PtgRef3d }, 59: { n: "PtgArea3d", f: parse_PtgArea3d }, 60: { n: "PtgRefErr3d", f: parse_PtgRefErr3d }, 61: { n: "PtgAreaErr3d", f: parse_PtgAreaErr3d }, 255: {} }; var PtgDupes = { 64: 32, 96: 32, 65: 33, 97: 33, 66: 34, 98: 34, 67: 35, 99: 35, 68: 36, 100: 36, 69: 37, 101: 37, 70: 38, 102: 38, 71: 39, 103: 39, 72: 40, 104: 40, 73: 41, 105: 41, 74: 42, 106: 42, 75: 43, 107: 43, 76: 44, 108: 44, 77: 45, 109: 45, 89: 57, 121: 57, 90: 58, 122: 58, 91: 59, 123: 59, 92: 60, 124: 60, 93: 61, 125: 61 }; (function () { for (var y in PtgDupes) PtgTypes[y] = PtgTypes[PtgDupes[y]] })(); var Ptg18 = {}; var Ptg19 = { 1: { n: "PtgAttrSemi", f: parse_PtgAttrSemi }, 2: { n: "PtgAttrIf", f: parse_PtgAttrIf }, 4: { n: "PtgAttrChoose", f: parse_PtgAttrChoose }, 8: { n: "PtgAttrGoto", f: parse_PtgAttrGoto }, 16: { n: "PtgAttrSum", f: parse_PtgAttrSum }, 32: { n: "PtgAttrBaxcel", f: parse_PtgAttrBaxcel }, 64: { n: "PtgAttrSpace", f: parse_PtgAttrSpace }, 65: { n: "PtgAttrSpaceSemi", f: parse_PtgAttrSpaceSemi }, 255: {} }; function parse_Formula(blob, length, opts) { var cell = parse_XLSCell(blob, 6); var val = parse_FormulaValue(blob, 8); var flags = blob.read_shift(1); blob.read_shift(1); var chn = blob.read_shift(4); var cbf = ""; if (opts.biff === 5) blob.l += length - 20; else cbf = parse_XLSCellParsedFormula(blob, length - 20, opts); return { cell: cell, val: val[0], formula: cbf, shared: flags >> 3 & 1, tt: val[1] } } function parse_FormulaValue(blob) { var b; if (__readUInt16LE(blob, blob.l + 6) !== 65535) return [parse_Xnum(blob), "n"]; switch (blob[blob.l]) { case 0: blob.l += 8; return ["String", "s"]; case 1: b = blob[blob.l + 2] === 1; blob.l += 8; return [b, "b"]; case 2: b = blob[blob.l + 2]; blob.l += 8; return [b, "e"]; case 3: blob.l += 8; return ["", "s"] } } function parse_RgbExtra(blob, length, rgce, opts) { if (opts.biff < 8) return parsenoop(blob, length); var target = blob.l + length; var o = []; for (var i = 0; i !== rgce.length; ++i) { switch (rgce[i][0]) { case "PtgArray": rgce[i][1] = parse_PtgExtraArray(blob); o.push(rgce[i][1]); break; case "PtgMemArea": rgce[i][2] = parse_PtgExtraMem(blob, rgce[i][1]); o.push(rgce[i][2]); break; default: break } } length = target - blob.l; if (length !== 0) o.push(parsenoop(blob, length)); return o } function parse_NameParsedFormula(blob, length, opts, cce) { var target = blob.l + length; var rgce = parse_Rgce(blob, cce); var rgcb; if (target !== blob.l) rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts); return [rgce, rgcb] } function parse_XLSCellParsedFormula(blob, length, opts) { var target = blob.l + length; var rgcb, cce = blob.read_shift(2); if (cce == 65535) return [[], parsenoop(blob, length - 2)]; var rgce = parse_Rgce(blob, cce); if (length !== cce + 2) rgcb = parse_RgbExtra(blob, length - cce - 2, rgce, opts); return [rgce, rgcb] } function parse_SharedParsedFormula(blob, length, opts) { var target = blob.l + length; var rgcb, cce = blob.read_shift(2); var rgce = parse_Rgce(blob, cce); if (cce == 65535) return [[], parsenoop(blob, length - 2)]; if (length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts); return [rgce, rgcb] } function parse_ArrayParsedFormula(blob, length, opts, ref) { var target = blob.l + length; var rgcb, cce = blob.read_shift(2); if (cce == 65535) return [[], parsenoop(blob, length - 2)]; var rgce = parse_Rgce(blob, cce); if (length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts); return [rgce, rgcb] } function parse_Rgce(blob, length) { var target = blob.l + length; var R, id, ptgs = []; while (target != blob.l) { length = target - blob.l; id = blob[blob.l]; R = PtgTypes[id]; if (id === 24 || id === 25) { id = blob[blob.l + 1]; R = (id === 24 ? Ptg18 : Ptg19)[id] } if (!R || !R.f) { ptgs.push(parsenoop(blob, length)) } else { ptgs.push([R.n, R.f(blob, length)]) } } return ptgs } function mapper(x) { return x.map(function f2(y) { return y[1] }).join(",") } function stringify_formula(formula, range, cell, supbooks, opts) { if (opts !== undefined && opts.biff === 5) return "BIFF5??"; var _range = range !== undefined ? range : { s: { c: 0, r: 0 } }; var stack = [], e1, e2, type, c, ixti, nameidx, r; if (!formula[0] || !formula[0][0]) return ""; for (var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) { var f = formula[0][ff]; switch (f[0]) { case "PtgUminus": stack.push("-" + stack.pop()); break; case "PtgUplus": stack.push("+" + stack.pop()); break; case "PtgPercent": stack.push(stack.pop() + "%"); break; case "PtgAdd": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + "+" + e1); break; case "PtgSub": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + "-" + e1); break; case "PtgMul": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + "*" + e1); break; case "PtgDiv": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + "/" + e1); break; case "PtgPower": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + "^" + e1); break; case "PtgConcat": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + "&" + e1); break; case "PtgLt": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + "<" + e1); break; case "PtgLe": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + "<=" + e1); break; case "PtgEq": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + "=" + e1); break; case "PtgGe": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + ">=" + e1); break; case "PtgGt": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + ">" + e1); break; case "PtgNe": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + "<>" + e1); break; case "PtgIsect": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + " " + e1); break; case "PtgUnion": e1 = stack.pop(); e2 = stack.pop(); stack.push(e2 + "," + e1); break; case "PtgRange": break; case "PtgAttrChoose": break; case "PtgAttrGoto": break; case "PtgAttrIf": break; case "PtgRef": type = f[1][0]; c = shift_cell_xls(decode_cell(encode_cell(f[1][1])), _range); stack.push(encode_cell(c)); break; case "PtgRefN": type = f[1][0]; c = shift_cell_xls(decode_cell(encode_cell(f[1][1])), cell); stack.push(encode_cell(c)); break; case "PtgRef3d": type = f[1][0]; ixti = f[1][1]; c = shift_cell_xls(f[1][2], _range); stack.push(supbooks[1][ixti + 1] + "!" + encode_cell(c)); break; case "PtgFunc": case "PtgFuncVar": var argc = f[1][0], func = f[1][1]; if (!argc) argc = 0; var args = stack.slice(-argc); stack.length -= argc; if (func === "User") func = args.shift(); stack.push(func + "(" + args.join(",") + ")"); break; case "PtgBool": stack.push(f[1] ? "TRUE" : "FALSE"); break; case "PtgInt": stack.push(f[1]); break; case "PtgNum": stack.push(String(f[1])); break; case "PtgStr": stack.push('"' + f[1] + '"'); break; case "PtgErr": stack.push(f[1]); break; case "PtgArea": type = f[1][0]; r = shift_range_xls(f[1][1], _range); stack.push(encode_range(r)); break; case "PtgArea3d": type = f[1][0]; ixti = f[1][1]; r = f[1][2]; stack.push(supbooks[1][ixti + 1] + "!" + encode_range(r)); break; case "PtgAttrSum": stack.push("SUM(" + stack.pop() + ")"); break; case "PtgAttrSemi": break; case "PtgName": nameidx = f[1][2]; var lbl = supbooks[0][nameidx]; var name = lbl.Name; if (name in XLSXFutureFunctions) name = XLSXFutureFunctions[name]; stack.push(name); break; case "PtgNameX": var bookidx = f[1][1]; nameidx = f[1][2]; var externbook; if (supbooks[bookidx + 1]) externbook = supbooks[bookidx + 1][nameidx]; else if (supbooks[bookidx - 1]) externbook = supbooks[bookidx - 1][nameidx]; if (!externbook) externbook = { body: "??NAMEX??" }; stack.push(externbook.body); break; case "PtgParen": stack.push("(" + stack.pop() + ")"); break; case "PtgRefErr": stack.push("#REF!"); break; case "PtgExp": c = { c: f[1][1], r: f[1][0] }; var q = { c: cell.c, r: cell.r }; if (supbooks.sharedf[encode_cell(c)]) { var parsedf = supbooks.sharedf[encode_cell(c)]; stack.push(stringify_formula(parsedf, _range, q, supbooks, opts)) } else { var fnd = false; for (e1 = 0; e1 != supbooks.arrayf.length; ++e1) { e2 = supbooks.arrayf[e1]; if (c.c < e2[0].s.c || c.c > e2[0].e.c) continue; if (c.r < e2[0].s.r || c.r > e2[0].e.r) continue; stack.push(stringify_formula(e2[1], _range, q, supbooks, opts)) } if (!fnd) stack.push(f[1]) } break; case "PtgArray": stack.push("{" + f[1].map(mapper).join(";") + "}"); break; case "PtgMemArea": break; case "PtgAttrSpace": break; case "PtgTbl": break; case "PtgMemErr": break; case "PtgMissArg": stack.push(""); break; case "PtgAreaErr": break; case "PtgAreaN": stack.push(""); break; case "PtgRefErr3d": break; case "PtgMemFunc": break; default: throw "Unrecognized Formula Token: " + f } } return stack[0] } function parse_XLSBCellParsedFormula(data, length) { var cce = data.read_shift(4); return parsenoop(data, length - 4) } var PtgDataType = { 1: "REFERENCE", 2: "VALUE", 3: "ARRAY" }; var Cetab = { 0: "BEEP", 1: "OPEN", 2: "OPEN.LINKS", 3: "CLOSE.ALL", 4: "SAVE", 5: "SAVE.AS", 6: "FILE.DELETE", 7: "PAGE.SETUP", 8: "PRINT", 9: "PRINTER.SETUP", 10: "QUIT", 11: "NEW.WINDOW", 12: "ARRANGE.ALL", 13: "WINDOW.SIZE", 14: "WINDOW.MOVE", 15: "FULL", 16: "CLOSE", 17: "RUN", 22: "SET.PRINT.AREA", 23: "SET.PRINT.TITLES", 24: "SET.PAGE.BREAK", 25: "REMOVE.PAGE.BREAK", 26: "FONT", 27: "DISPLAY", 28: "PROTECT.DOCUMENT", 29: "PRECISION", 30: "A1.R1C1", 31: "CALCULATE.NOW", 32: "CALCULATION", 34: "DATA.FIND", 35: "EXTRACT", 36: "DATA.DELETE", 37: "SET.DATABASE", 38: "SET.CRITERIA", 39: "SORT", 40: "DATA.SERIES", 41: "TABLE", 42: "FORMAT.NUMBER", 43: "ALIGNMENT", 44: "STYLE", 45: "BORDER", 46: "CELL.PROTECTION", 47: "COLUMN.WIDTH", 48: "UNDO", 49: "CUT", 50: "COPY", 51: "PASTE", 52: "CLEAR", 53: "PASTE.SPECIAL", 54: "EDIT.DELETE", 55: "INSERT", 56: "FILL.RIGHT", 57: "FILL.DOWN", 61: "DEFINE.NAME", 62: "CREATE.NAMES", 63: "FORMULA.GOTO", 64: "FORMULA.FIND", 65: "SELECT.LAST.CELL", 66: "SHOW.ACTIVE.CELL", 67: "GALLERY.AREA", 68: "GALLERY.BAR", 69: "GALLERY.COLUMN", 70: "GALLERY.LINE", 71: "GALLERY.PIE", 72: "GALLERY.SCATTER", 73: "COMBINATION", 74: "PREFERRED", 75: "ADD.OVERLAY", 76: "GRIDLINES", 77: "SET.PREFERRED", 78: "AXES", 79: "LEGEND", 80: "ATTACH.TEXT", 81: "ADD.ARROW", 82: "SELECT.CHART", 83: "SELECT.PLOT.AREA", 84: "PATTERNS", 85: "MAIN.CHART", 86: "OVERLAY", 87: "SCALE", 88: "FORMAT.LEGEND", 89: "FORMAT.TEXT", 90: "EDIT.REPEAT", 91: "PARSE", 92: "JUSTIFY", 93: "HIDE", 94: "UNHIDE", 95: "WORKSPACE", 96: "FORMULA", 97: "FORMULA.FILL", 98: "FORMULA.ARRAY", 99: "DATA.FIND.NEXT", 100: "DATA.FIND.PREV", 101: "FORMULA.FIND.NEXT", 102: "FORMULA.FIND.PREV", 103: "ACTIVATE", 104: "ACTIVATE.NEXT", 105: "ACTIVATE.PREV", 106: "UNLOCKED.NEXT", 107: "UNLOCKED.PREV", 108: "COPY.PICTURE", 109: "SELECT", 110: "DELETE.NAME", 111: "DELETE.FORMAT", 112: "VLINE", 113: "HLINE", 114: "VPAGE", 115: "HPAGE", 116: "VSCROLL", 117: "HSCROLL", 118: "ALERT", 119: "NEW", 120: "CANCEL.COPY", 121: "SHOW.CLIPBOARD", 122: "MESSAGE", 124: "PASTE.LINK", 125: "APP.ACTIVATE", 126: "DELETE.ARROW", 127: "ROW.HEIGHT", 128: "FORMAT.MOVE", 129: "FORMAT.SIZE", 130: "FORMULA.REPLACE", 131: "SEND.KEYS", 132: "SELECT.SPECIAL", 133: "APPLY.NAMES", 134: "REPLACE.FONT", 135: "FREEZE.PANES", 136: "SHOW.INFO", 137: "SPLIT", 138: "ON.WINDOW", 139: "ON.DATA", 140: "DISABLE.INPUT", 142: "OUTLINE", 143: "LIST.NAMES", 144: "FILE.CLOSE", 145: "SAVE.WORKBOOK", 146: "DATA.FORM", 147: "COPY.CHART", 148: "ON.TIME", 149: "WAIT", 150: "FORMAT.FONT", 151: "FILL.UP", 152: "FILL.LEFT", 153: "DELETE.OVERLAY", 155: "SHORT.MENUS", 159: "SET.UPDATE.STATUS", 161: "COLOR.PALETTE", 162: "DELETE.STYLE", 163: "WINDOW.RESTORE", 164: "WINDOW.MAXIMIZE", 166: "CHANGE.LINK", 167: "CALCULATE.DOCUMENT", 168: "ON.KEY", 169: "APP.RESTORE", 170: "APP.MOVE", 171: "APP.SIZE", 172: "APP.MINIMIZE", 173: "APP.MAXIMIZE", 174: "BRING.TO.FRONT", 175: "SEND.TO.BACK", 185: "MAIN.CHART.TYPE", 186: "OVERLAY.CHART.TYPE", 187: "SELECT.END", 188: "OPEN.MAIL", 189: "SEND.MAIL", 190: "STANDARD.FONT", 191: "CONSOLIDATE", 192: "SORT.SPECIAL", 193: "GALLERY.3D.AREA", 194: "GALLERY.3D.COLUMN", 195: "GALLERY.3D.LINE", 196: "GALLERY.3D.PIE", 197: "VIEW.3D", 198: "GOAL.SEEK", 199: "WORKGROUP", 200: "FILL.GROUP", 201: "UPDATE.LINK", 202: "PROMOTE", 203: "DEMOTE", 204: "SHOW.DETAIL", 206: "UNGROUP", 207: "OBJECT.PROPERTIES", 208: "SAVE.NEW.OBJECT", 209: "SHARE", 210: "SHARE.NAME", 211: "DUPLICATE", 212: "APPLY.STYLE", 213: "ASSIGN.TO.OBJECT", 214: "OBJECT.PROTECTION", 215: "HIDE.OBJECT", 216: "SET.EXTRACT", 217: "CREATE.PUBLISHER", 218: "SUBSCRIBE.TO", 219: "ATTRIBUTES", 220: "SHOW.TOOLBAR", 222: "PRINT.PREVIEW", 223: "EDIT.COLOR", 224: "SHOW.LEVELS", 225: "FORMAT.MAIN", 226: "FORMAT.OVERLAY", 227: "ON.RECALC", 228: "EDIT.SERIES", 229: "DEFINE.STYLE", 240: "LINE.PRINT", 243: "ENTER.DATA", 249: "GALLERY.RADAR", 250: "MERGE.STYLES", 251: "EDITION.OPTIONS", 252: "PASTE.PICTURE", 253: "PASTE.PICTURE.LINK", 254: "SPELLING", 256: "ZOOM", 259: "INSERT.OBJECT", 260: "WINDOW.MINIMIZE", 265: "SOUND.NOTE", 266: "SOUND.PLAY", 267: "FORMAT.SHAPE", 268: "EXTEND.POLYGON", 269: "FORMAT.AUTO", 272: "GALLERY.3D.BAR", 273: "GALLERY.3D.SURFACE", 274: "FILL.AUTO", 276: "CUSTOMIZE.TOOLBAR", 277: "ADD.TOOL", 278: "EDIT.OBJECT", 279: "ON.DOUBLECLICK", 280: "ON.ENTRY", 281: "WORKBOOK.ADD", 282: "WORKBOOK.MOVE", 283: "WORKBOOK.COPY", 284: "WORKBOOK.OPTIONS", 285: "SAVE.WORKSPACE", 288: "CHART.WIZARD", 289: "DELETE.TOOL", 290: "MOVE.TOOL", 291: "WORKBOOK.SELECT", 292: "WORKBOOK.ACTIVATE", 293: "ASSIGN.TO.TOOL", 295: "COPY.TOOL", 296: "RESET.TOOL", 297: "CONSTRAIN.NUMERIC", 298: "PASTE.TOOL", 302: "WORKBOOK.NEW", 305: "SCENARIO.CELLS", 306: "SCENARIO.DELETE", 307: "SCENARIO.ADD", 308: "SCENARIO.EDIT", 309: "SCENARIO.SHOW", 310: "SCENARIO.SHOW.NEXT", 311: "SCENARIO.SUMMARY", 312: "PIVOT.TABLE.WIZARD", 313: "PIVOT.FIELD.PROPERTIES", 314: "PIVOT.FIELD", 315: "PIVOT.ITEM", 316: "PIVOT.ADD.FIELDS", 318: "OPTIONS.CALCULATION", 319: "OPTIONS.EDIT", 320: "OPTIONS.VIEW", 321: "ADDIN.MANAGER", 322: "MENU.EDITOR", 323: "ATTACH.TOOLBARS", 324: "VBAActivate", 325: "OPTIONS.CHART", 328: "VBA.INSERT.FILE", 330: "VBA.PROCEDURE.DEFINITION", 336: "ROUTING.SLIP", 338: "ROUTE.DOCUMENT", 339: "MAIL.LOGON", 342: "INSERT.PICTURE", 343: "EDIT.TOOL", 344: "GALLERY.DOUGHNUT", 350: "CHART.TREND", 352: "PIVOT.ITEM.PROPERTIES", 354: "WORKBOOK.INSERT", 355: "OPTIONS.TRANSITION", 356: "OPTIONS.GENERAL", 370: "FILTER.ADVANCED", 373: "MAIL.ADD.MAILER", 374: "MAIL.DELETE.MAILER", 375: "MAIL.REPLY", 376: "MAIL.REPLY.ALL", 377: "MAIL.FORWARD", 378: "MAIL.NEXT.LETTER", 379: "DATA.LABEL", 380: "INSERT.TITLE", 381: "FONT.PROPERTIES", 382: "MACRO.OPTIONS", 383: "WORKBOOK.HIDE", 384: "WORKBOOK.UNHIDE", 385: "WORKBOOK.DELETE", 386: "WORKBOOK.NAME", 388: "GALLERY.CUSTOM", 390: "ADD.CHART.AUTOFORMAT", 391: "DELETE.CHART.AUTOFORMAT", 392: "CHART.ADD.DATA", 393: "AUTO.OUTLINE", 394: "TAB.ORDER", 395: "SHOW.DIALOG", 396: "SELECT.ALL", 397: "UNGROUP.SHEETS", 398: "SUBTOTAL.CREATE", 399: "SUBTOTAL.REMOVE", 400: "RENAME.OBJECT", 412: "WORKBOOK.SCROLL", 413: "WORKBOOK.NEXT", 414: "WORKBOOK.PREV", 415: "WORKBOOK.TAB.SPLIT", 416: "FULL.SCREEN", 417: "WORKBOOK.PROTECT", 420: "SCROLLBAR.PROPERTIES", 421: "PIVOT.SHOW.PAGES", 422: "TEXT.TO.COLUMNS", 423: "FORMAT.CHARTTYPE", 424: "LINK.FORMAT", 425: "TRACER.DISPLAY", 430: "TRACER.NAVIGATE", 431: "TRACER.CLEAR", 432: "TRACER.ERROR", 433: "PIVOT.FIELD.GROUP", 434: "PIVOT.FIELD.UNGROUP", 435: "CHECKBOX.PROPERTIES", 436: "LABEL.PROPERTIES", 437: "LISTBOX.PROPERTIES", 438: "EDITBOX.PROPERTIES", 439: "PIVOT.REFRESH", 440: "LINK.COMBO", 441: "OPEN.TEXT", 442: "HIDE.DIALOG", 443: "SET.DIALOG.FOCUS", 444: "ENABLE.OBJECT", 445: "PUSHBUTTON.PROPERTIES", 446: "SET.DIALOG.DEFAULT", 447: "FILTER", 448: "FILTER.SHOW.ALL", 449: "CLEAR.OUTLINE", 450: "FUNCTION.WIZARD", 451: "ADD.LIST.ITEM", 452: "SET.LIST.ITEM", 453: "REMOVE.LIST.ITEM", 454: "SELECT.LIST.ITEM", 455: "SET.CONTROL.VALUE", 456: "SAVE.COPY.AS", 458: "OPTIONS.LISTS.ADD", 459: "OPTIONS.LISTS.DELETE", 460: "SERIES.AXES", 461: "SERIES.X", 462: "SERIES.Y", 463: "ERRORBAR.X", 464: "ERRORBAR.Y", 465: "FORMAT.CHART", 466: "SERIES.ORDER", 467: "MAIL.LOGOFF", 468: "CLEAR.ROUTING.SLIP", 469: "APP.ACTIVATE.MICROSOFT", 470: "MAIL.EDIT.MAILER", 471: "ON.SHEET", 472: "STANDARD.WIDTH", 473: "SCENARIO.MERGE", 474: "SUMMARY.INFO", 475: "FIND.FILE", 476: "ACTIVE.CELL.FONT", 477: "ENABLE.TIPWIZARD", 478: "VBA.MAKE.ADDIN", 480: "INSERTDATATABLE", 481: "WORKGROUP.OPTIONS", 482: "MAIL.SEND.MAILER", 485: "AUTOCORRECT", 489: "POST.DOCUMENT", 491: "PICKLIST", 493: "VIEW.SHOW", 494: "VIEW.DEFINE", 495: "VIEW.DELETE", 509: "SHEET.BACKGROUND", 510: "INSERT.MAP.OBJECT", 511: "OPTIONS.MENONO", 517: "MSOCHECKS", 518: "NORMAL", 519: "LAYOUT", 520: "RM.PRINT.AREA", 521: "CLEAR.PRINT.AREA", 522: "ADD.PRINT.AREA", 523: "MOVE.BRK", 545: "HIDECURR.NOTE", 546: "HIDEALL.NOTES", 547: "DELETE.NOTE", 548: "TRAVERSE.NOTES", 549: "ACTIVATE.NOTES", 620: "PROTECT.REVISIONS", 621: "UNPROTECT.REVISIONS", 647: "OPTIONS.ME", 653: "WEB.PUBLISH", 667: "NEWWEBQUERY", 673: "PIVOT.TABLE.CHART", 753: "OPTIONS.SAVE", 755: "OPTIONS.SPELL", 808: "HIDEALL.INKANNOTS" }; var Ftab = { 0: "COUNT", 1: "IF", 2: "ISNA", 3: "ISERROR", 4: "SUM", 5: "AVERAGE", 6: "MIN", 7: "MAX", 8: "ROW", 9: "COLUMN", 10: "NA", 11: "NPV", 12: "STDEV", 13: "DOLLAR", 14: "FIXED", 15: "SIN", 16: "COS", 17: "TAN", 18: "ATAN", 19: "PI", 20: "SQRT", 21: "EXP", 22: "LN", 23: "LOG10", 24: "ABS", 25: "INT", 26: "SIGN", 27: "ROUND", 28: "LOOKUP", 29: "INDEX", 30: "REPT", 31: "MID", 32: "LEN", 33: "VALUE", 34: "TRUE", 35: "FALSE", 36: "AND", 37: "OR", 38: "NOT", 39: "MOD", 40: "DCOUNT", 41: "DSUM", 42: "DAVERAGE", 43: "DMIN", 44: "DMAX", 45: "DSTDEV", 46: "VAR", 47: "DVAR", 48: "TEXT", 49: "LINEST", 50: "TREND", 51: "LOGEST", 52: "GROWTH", 53: "GOTO", 54: "HALT", 55: "RETURN", 56: "PV", 57: "FV", 58: "NPER", 59: "PMT", 60: "RATE", 61: "MIRR", 62: "IRR", 63: "RAND", 64: "MATCH", 65: "DATE", 66: "TIME", 67: "DAY", 68: "MONTH", 69: "YEAR", 70: "WEEKDAY", 71: "HOUR", 72: "MINUTE", 73: "SECOND", 74: "NOW", 75: "AREAS", 76: "ROWS", 77: "COLUMNS", 78: "OFFSET", 79: "ABSREF", 80: "RELREF", 81: "ARGUMENT", 82: "SEARCH", 83: "TRANSPOSE", 84: "ERROR", 85: "STEP", 86: "TYPE", 87: "ECHO", 88: "SET.NAME", 89: "CALLER", 90: "DEREF", 91: "WINDOWS", 92: "SERIES", 93: "DOCUMENTS", 94: "ACTIVE.CELL", 95: "SELECTION", 96: "RESULT", 97: "ATAN2", 98: "ASIN", 99: "ACOS", 100: "CHOOSE", 101: "HLOOKUP", 102: "VLOOKUP", 103: "LINKS", 104: "INPUT", 105: "ISREF", 106: "GET.FORMULA", 107: "GET.NAME", 108: "SET.VALUE", 109: "LOG", 110: "EXEC", 111: "CHAR", 112: "LOWER", 113: "UPPER", 114: "PROPER", 115: "LEFT", 116: "RIGHT", 117: "EXACT", 118: "TRIM", 119: "REPLACE", 120: "SUBSTITUTE", 121: "CODE", 122: "NAMES", 123: "DIRECTORY", 124: "FIND", 125: "CELL", 126: "ISERR", 127: "ISTEXT", 128: "ISNUMBER", 129: "ISBLANK", 130: "T", 131: "N", 132: "FOPEN", 133: "FCLOSE", 134: "FSIZE", 135: "FREADLN", 136: "FREAD", 137: "FWRITELN", 138: "FWRITE", 139: "FPOS", 140: "DATEVALUE", 141: "TIMEVALUE", 142: "SLN", 143: "SYD", 144: "DDB", 145: "GET.DEF", 146: "REFTEXT", 147: "TEXTREF", 148: "INDIRECT", 149: "REGISTER", 150: "CALL", 151: "ADD.BAR", 152: "ADD.MENU", 153: "ADD.COMMAND", 154: "ENABLE.COMMAND", 155: "CHECK.COMMAND", 156: "RENAME.COMMAND", 157: "SHOW.BAR", 158: "DELETE.MENU", 159: "DELETE.COMMAND", 160: "GET.CHART.ITEM", 161: "DIALOG.BOX", 162: "CLEAN", 163: "MDETERM", 164: "MINVERSE", 165: "MMULT", 166: "FILES", 167: "IPMT", 168: "PPMT", 169: "COUNTA", 170: "CANCEL.KEY", 171: "FOR", 172: "WHILE", 173: "BREAK", 174: "NEXT", 175: "INITIATE", 176: "REQUEST", 177: "POKE", 178: "EXECUTE", 179: "TERMINATE", 180: "RESTART", 181: "HELP", 182: "GET.BAR", 183: "PRODUCT", 184: "FACT", 185: "GET.CELL", 186: "GET.WORKSPACE", 187: "GET.WINDOW", 188: "GET.DOCUMENT", 189: "DPRODUCT", 190: "ISNONTEXT", 191: "GET.NOTE", 192: "NOTE", 193: "STDEVP", 194: "VARP", 195: "DSTDEVP", 196: "DVARP", 197: "TRUNC", 198: "ISLOGICAL", 199: "DCOUNTA", 200: "DELETE.BAR", 201: "UNREGISTER", 204: "USDOLLAR", 205: "FINDB", 206: "SEARCHB", 207: "REPLACEB", 208: "LEFTB", 209: "RIGHTB", 210: "MIDB", 211: "LENB", 212: "ROUNDUP", 213: "ROUNDDOWN", 214: "ASC", 215: "DBCS", 216: "RANK", 219: "ADDRESS", 220: "DAYS360", 221: "TODAY", 222: "VDB", 223: "ELSE", 224: "ELSE.IF", 225: "END.IF", 226: "FOR.CELL", 227: "MEDIAN", 228: "SUMPRODUCT", 229: "SINH", 230: "COSH", 231: "TANH", 232: "ASINH", 233: "ACOSH", 234: "ATANH", 235: "DGET", 236: "CREATE.OBJECT", 237: "VOLATILE", 238: "LAST.ERROR", 239: "CUSTOM.UNDO", 240: "CUSTOM.REPEAT", 241: "FORMULA.CONVERT", 242: "GET.LINK.INFO", 243: "TEXT.BOX", 244: "INFO", 245: "GROUP", 246: "GET.OBJECT", 247: "DB", 248: "PAUSE", 251: "RESUME", 252: "FREQUENCY", 253: "ADD.TOOLBAR", 254: "DELETE.TOOLBAR", 255: "User", 256: "RESET.TOOLBAR", 257: "EVALUATE", 258: "GET.TOOLBAR", 259: "GET.TOOL", 260: "SPELLING.CHECK", 261: "ERROR.TYPE", 262: "APP.TITLE", 263: "WINDOW.TITLE", 264: "SAVE.TOOLBAR", 265: "ENABLE.TOOL", 266: "PRESS.TOOL", 267: "REGISTER.ID", 268: "GET.WORKBOOK", 269: "AVEDEV", 270: "BETADIST", 271: "GAMMALN", 272: "BETAINV", 273: "BINOMDIST", 274: "CHIDIST", 275: "CHIINV", 276: "COMBIN", 277: "CONFIDENCE", 278: "CRITBINOM", 279: "EVEN", 280: "EXPONDIST", 281: "FDIST", 282: "FINV", 283: "FISHER", 284: "FISHERINV", 285: "FLOOR", 286: "GAMMADIST", 287: "GAMMAINV", 288: "CEILING", 289: "HYPGEOMDIST", 290: "LOGNORMDIST", 291: "LOGINV", 292: "NEGBINOMDIST", 293: "NORMDIST", 294: "NORMSDIST", 295: "NORMINV", 296: "NORMSINV", 297: "STANDARDIZE", 298: "ODD", 299: "PERMUT", 300: "POISSON", 301: "TDIST", 302: "WEIBULL", 303: "SUMXMY2", 304: "SUMX2MY2", 305: "SUMX2PY2", 306: "CHITEST", 307: "CORREL", 308: "COVAR", 309: "FORECAST", 310: "FTEST", 311: "INTERCEPT", 312: "PEARSON", 313: "RSQ", 314: "STEYX", 315: "SLOPE", 316: "TTEST", 317: "PROB", 318: "DEVSQ", 319: "GEOMEAN", 320: "HARMEAN", 321: "SUMSQ", 322: "KURT", 323: "SKEW", 324: "ZTEST", 325: "LARGE", 326: "SMALL", 327: "QUARTILE", 328: "PERCENTILE", 329: "PERCENTRANK", 330: "MODE", 331: "TRIMMEAN", 332: "TINV", 334: "MOVIE.COMMAND", 335: "GET.MOVIE", 336: "CONCATENATE", 337: "POWER", 338: "PIVOT.ADD.DATA", 339: "GET.PIVOT.TABLE", 340: "GET.PIVOT.FIELD", 341: "GET.PIVOT.ITEM", 342: "RADIANS", 343: "DEGREES", 344: "SUBTOTAL", 345: "SUMIF", 346: "COUNTIF", 347: "COUNTBLANK", 348: "SCENARIO.GET", 349: "OPTIONS.LISTS.GET", 350: "ISPMT", 351: "DATEDIF", 352: "DATESTRING", 353: "NUMBERSTRING", 354: "ROMAN", 355: "OPEN.DIALOG", 356: "SAVE.DIALOG", 357: "VIEW.GET", 358: "GETPIVOTDATA", 359: "HYPERLINK", 360: "PHONETIC", 361: "AVERAGEA", 362: "MAXA", 363: "MINA", 364: "STDEVPA", 365: "VARPA", 366: "STDEVA", 367: "VARA", 368: "BAHTTEXT", 369: "THAIDAYOFWEEK", 370: "THAIDIGIT", 371: "THAIMONTHOFYEAR", 372: "THAINUMSOUND", 373: "THAINUMSTRING", 374: "THAISTRINGLENGTH", 375: "ISTHAIDIGIT", 376: "ROUNDBAHTDOWN", 377: "ROUNDBAHTUP", 378: "THAIYEAR", 379: "RTD" }; var FtabArgc = { 2: 1, 3: 1, 15: 1, 16: 1, 17: 1, 18: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 2, 30: 2, 31: 3, 32: 1, 33: 1, 38: 1, 39: 2, 40: 3, 41: 3, 42: 3, 43: 3, 44: 3, 45: 3, 47: 3, 48: 2, 53: 1, 61: 3, 65: 3, 66: 3, 67: 1, 68: 1, 69: 1, 71: 1, 72: 1, 73: 1, 75: 1, 76: 1, 77: 1, 79: 2, 80: 2, 83: 1, 86: 1, 90: 1, 97: 2, 98: 1, 99: 1, 105: 1, 111: 1, 112: 1, 113: 1, 114: 1, 117: 2, 118: 1, 119: 4, 121: 1, 126: 1, 127: 1, 128: 1, 129: 1, 130: 1, 131: 1, 133: 1, 134: 1, 135: 1, 136: 2, 137: 2, 138: 2, 140: 1, 141: 1, 142: 3, 143: 4, 162: 1, 163: 1, 164: 1, 165: 2, 172: 1, 175: 2, 176: 2, 177: 3, 178: 2, 179: 1, 184: 1, 189: 3, 190: 1, 195: 3, 196: 3, 198: 1, 199: 3, 201: 1, 207: 4, 210: 3, 211: 1, 212: 2, 213: 2, 214: 1, 215: 1, 229: 1, 230: 1, 231: 1, 232: 1, 233: 1, 234: 1, 235: 3, 244: 1, 252: 2, 257: 1, 261: 1, 271: 1, 273: 4, 274: 2, 275: 2, 276: 2, 277: 3, 278: 3, 279: 1, 280: 3, 281: 3, 282: 3, 283: 1, 284: 1, 285: 2, 286: 4, 287: 3, 288: 2, 289: 4, 290: 3, 291: 3, 292: 3, 293: 4, 294: 1, 295: 3, 296: 1, 297: 3, 298: 1, 299: 2, 300: 3, 301: 3, 302: 4, 303: 2, 304: 2, 305: 2, 306: 2, 307: 2, 308: 2, 309: 3, 310: 2, 311: 2, 312: 2, 313: 2, 314: 2, 315: 2, 316: 4, 325: 2, 326: 2, 327: 2, 328: 2, 331: 2, 332: 2, 337: 2, 342: 1, 343: 1, 346: 2, 347: 1, 350: 4, 351: 3, 352: 1, 353: 2, 360: 1, 368: 1, 369: 1, 370: 1, 371: 1, 372: 1, 373: 1, 374: 1, 375: 1, 376: 1, 377: 1, 378: 1, 65535: 0 }; var XLSXFutureFunctions = { "_xlfn.ACOT": "ACOT", "_xlfn.ACOTH": "ACOTH", "_xlfn.AGGREGATE": "AGGREGATE", "_xlfn.ARABIC": "ARABIC", "_xlfn.AVERAGEIF": "AVERAGEIF", "_xlfn.AVERAGEIFS": "AVERAGEIFS", "_xlfn.BASE": "BASE", "_xlfn.BETA.DIST": "BETA.DIST", "_xlfn.BETA.INV": "BETA.INV", "_xlfn.BINOM.DIST": "BINOM.DIST", "_xlfn.BINOM.DIST.RANGE": "BINOM.DIST.RANGE", "_xlfn.BINOM.INV": "BINOM.INV", "_xlfn.BITAND": "BITAND", "_xlfn.BITLSHIFT": "BITLSHIFT", "_xlfn.BITOR": "BITOR", "_xlfn.BITRSHIFT": "BITRSHIFT", "_xlfn.BITXOR": "BITXOR", "_xlfn.CEILING.MATH": "CEILING.MATH", "_xlfn.CEILING.PRECISE": "CEILING.PRECISE", "_xlfn.CHISQ.DIST": "CHISQ.DIST", "_xlfn.CHISQ.DIST.RT": "CHISQ.DIST.RT", "_xlfn.CHISQ.INV": "CHISQ.INV", "_xlfn.CHISQ.INV.RT": "CHISQ.INV.RT", "_xlfn.CHISQ.TEST": "CHISQ.TEST", "_xlfn.COMBINA": "COMBINA", "_xlfn.CONFIDENCE.NORM": "CONFIDENCE.NORM", "_xlfn.CONFIDENCE.T": "CONFIDENCE.T", "_xlfn.COT": "COT", "_xlfn.COTH": "COTH", "_xlfn.COUNTIFS": "COUNTIFS", "_xlfn.COVARIANCE.P": "COVARIANCE.P", "_xlfn.COVARIANCE.S": "COVARIANCE.S", "_xlfn.CSC": "CSC", "_xlfn.CSCH": "CSCH", "_xlfn.DAYS": "DAYS", "_xlfn.DECIMAL": "DECIMAL", "_xlfn.ECMA.CEILING": "ECMA.CEILING", "_xlfn.ERF.PRECISE": "ERF.PRECISE", "_xlfn.ERFC.PRECISE": "ERFC.PRECISE", "_xlfn.EXPON.DIST": "EXPON.DIST", "_xlfn.F.DIST": "F.DIST", "_xlfn.F.DIST.RT": "F.DIST.RT", "_xlfn.F.INV": "F.INV", "_xlfn.F.INV.RT": "F.INV.RT", "_xlfn.F.TEST": "F.TEST", "_xlfn.FILTERXML": "FILTERXML", "_xlfn.FLOOR.MATH": "FLOOR.MATH", "_xlfn.FLOOR.PRECISE": "FLOOR.PRECISE", "_xlfn.FORMULATEXT": "FORMULATEXT", "_xlfn.GAMMA": "GAMMA", "_xlfn.GAMMA.DIST": "GAMMA.DIST", "_xlfn.GAMMA.INV": "GAMMA.INV", "_xlfn.GAMMALN.PRECISE": "GAMMALN.PRECISE", "_xlfn.GAUSS": "GAUSS", "_xlfn.HYPGEOM.DIST": "HYPGEOM.DIST", "_xlfn.IFNA": "IFNA", "_xlfn.IFERROR": "IFERROR", "_xlfn.IMCOSH": "IMCOSH", "_xlfn.IMCOT": "IMCOT", "_xlfn.IMCSC": "IMCSC", "_xlfn.IMCSCH": "IMCSCH", "_xlfn.IMSEC": "IMSEC", "_xlfn.IMSECH": "IMSECH", "_xlfn.IMSINH": "IMSINH", "_xlfn.IMTAN": "IMTAN", "_xlfn.ISFORMULA": "ISFORMULA", "_xlfn.ISO.CEILING": "ISO.CEILING", "_xlfn.ISOWEEKNUM": "ISOWEEKNUM", "_xlfn.LOGNORM.DIST": "LOGNORM.DIST", "_xlfn.LOGNORM.INV": "LOGNORM.INV", "_xlfn.MODE.MULT": "MODE.MULT", "_xlfn.MODE.SNGL": "MODE.SNGL", "_xlfn.MUNIT": "MUNIT", "_xlfn.NEGBINOM.DIST": "NEGBINOM.DIST", "_xlfn.NETWORKDAYS.INTL": "NETWORKDAYS.INTL", "_xlfn.NIGBINOM": "NIGBINOM", "_xlfn.NORM.DIST": "NORM.DIST", "_xlfn.NORM.INV": "NORM.INV", "_xlfn.NORM.S.DIST": "NORM.S.DIST", "_xlfn.NORM.S.INV": "NORM.S.INV", "_xlfn.NUMBERVALUE": "NUMBERVALUE", "_xlfn.PDURATION": "PDURATION", "_xlfn.PERCENTILE.EXC": "PERCENTILE.EXC", "_xlfn.PERCENTILE.INC": "PERCENTILE.INC", "_xlfn.PERCENTRANK.EXC": "PERCENTRANK.EXC", "_xlfn.PERCENTRANK.INC": "PERCENTRANK.INC", "_xlfn.PERMUTATIONA": "PERMUTATIONA", "_xlfn.PHI": "PHI", "_xlfn.POISSON.DIST": "POISSON.DIST", "_xlfn.QUARTILE.EXC": "QUARTILE.EXC", "_xlfn.QUARTILE.INC": "QUARTILE.INC", "_xlfn.QUERYSTRING": "QUERYSTRING", "_xlfn.RANK.AVG": "RANK.AVG", "_xlfn.RANK.EQ": "RANK.EQ", "_xlfn.RRI": "RRI", "_xlfn.SEC": "SEC", "_xlfn.SECH": "SECH", "_xlfn.SHEET": "SHEET", "_xlfn.SHEETS": "SHEETS", "_xlfn.SKEW.P": "SKEW.P", "_xlfn.STDEV.P": "STDEV.P", "_xlfn.STDEV.S": "STDEV.S", "_xlfn.SUMIFS": "SUMIFS", "_xlfn.T.DIST": "T.DIST", "_xlfn.T.DIST.2T": "T.DIST.2T", "_xlfn.T.DIST.RT": "T.DIST.RT", "_xlfn.T.INV": "T.INV", "_xlfn.T.INV.2T": "T.INV.2T", "_xlfn.T.TEST": "T.TEST", "_xlfn.UNICHAR": "UNICHAR", "_xlfn.UNICODE": "UNICODE", "_xlfn.VAR.P": "VAR.P", "_xlfn.VAR.S": "VAR.S", "_xlfn.WEBSERVICE": "WEBSERVICE", "_xlfn.WEIBULL.DIST": "WEIBULL.DIST", "_xlfn.WORKDAY.INTL": "WORKDAY.INTL", "_xlfn.XOR": "XOR", "_xlfn.Z.TEST": "Z.TEST" }; var strs = {}; var _ssfopts = {}; RELS.WS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"; function get_sst_id(sst, str) { for (var i = 0, len = sst.length; i < len; ++i) if (sst[i].t === str) { sst.Count++; return i } sst[len] = { t: str }; sst.Count++; sst.Unique++; return len } function get_cell_style(styles, cell, opts) { if (typeof style_builder != "undefined") { if (/^\d+$/.exec(cell.s)) { return cell.s } if (cell.s && cell.s == +cell.s) { return cell.s } var s = cell.s || {}; if (cell.z) s.numFmt = cell.z; return style_builder.addStyle(s) } else { var z = opts.revssf[cell.z != null ? cell.z : "General"]; for (var i = 0, len = styles.length; i != len; ++i) if (styles[i].numFmtId === z) return i; styles[len] = { numFmtId: z, fontId: 0, fillId: 0, borderId: 0, xfId: 0, applyNumberFormat: 1 }; return len } } function get_cell_style_csf(cellXf) { if (cellXf) { var s = {}; if (typeof cellXf.numFmtId != undefined) { s.numFmt = SSF._table[cellXf.numFmtId] } if (cellXf.fillId) { s.fill = styles.Fills[cellXf.fillId] } if (cellXf.fontId) { s.font = styles.Fonts[cellXf.fontId] } if (cellXf.borderId) { s.border = styles.Borders[cellXf.borderId]; } if (cellXf.applyAlignment == 1) { s.alignment = cellXf.alignment } return JSON.parse(JSON.stringify(s)) } return null } function safe_format(p, fmtid, fillid, opts) { try { if (p.t === "e") p.w = p.w || BErr[p.v]; else if (fmtid === 0) { if (p.t === "n") { if ((p.v | 0) === p.v) p.w = SSF._general_int(p.v, _ssfopts); else p.w = SSF._general_num(p.v, _ssfopts) } else if (p.t === "d") { var dd = datenum(p.v); if ((dd | 0) === dd) p.w = SSF._general_int(dd, _ssfopts); else p.w = SSF._general_num(dd, _ssfopts) } else if (p.v === undefined) return ""; else p.w = SSF._general(p.v, _ssfopts) } else if (p.t === "d") p.w = SSF.format(fmtid, datenum(p.v), _ssfopts); else p.w = SSF.format(fmtid, p.v, _ssfopts); if (opts.cellNF) p.z = SSF._table[fmtid] } catch (e) { if (opts.WTF) throw e } } function parse_ws_xml_dim(ws, s) { var d = safe_decode_range(s); if (d.s.r <= d.e.r && d.s.c <= d.e.c && d.s.r >= 0 && d.s.c >= 0) ws["!ref"] = encode_range(d) } var mergecregex = /<mergeCell ref="[A-Z0-9:]+"\s*\/>/g; var sheetdataregex = /<(?:\w+:)?sheetData>([^\u2603]*)<\/(?:\w+:)?sheetData>/; var hlinkregex = /<hyperlink[^>]*\/>/g; var dimregex = /"(\w*:\w*)"/; var colregex = /<col[^>]*\/>/g; function parse_ws_xml(data, opts, rels) { if (!data) return data; var s = {}; var ridx = data.indexOf("<dimension"); if (ridx > 0) { var ref = data.substr(ridx, 50).match(dimregex); if (ref != null) parse_ws_xml_dim(s, ref[1]) } var mergecells = []; if (data.indexOf("</mergeCells>") !== -1) { var merges = data.match(mergecregex); for (ridx = 0; ridx != merges.length; ++ridx) mergecells[ridx] = safe_decode_range(merges[ridx].substr(merges[ridx].indexOf('"') + 1)) } var columns = []; if (opts.cellStyles && data.indexOf("</cols>") !== -1) { var cols = data.match(colregex); parse_ws_xml_cols(columns, cols) } var refguess = { s: { r: 1e6, c: 1e6 }, e: { r: 0, c: 0 } }; var mtch = data.match(sheetdataregex); if (mtch) parse_ws_xml_data(mtch[1], s, opts, refguess); if (data.indexOf("</hyperlinks>") !== -1) parse_ws_xml_hlinks(s, data.match(hlinkregex), rels); if (!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess); if (opts.sheetRows > 0 && s["!ref"]) { var tmpref = safe_decode_range(s["!ref"]); if (opts.sheetRows < +tmpref.e.r) { tmpref.e.r = opts.sheetRows - 1; if (tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r; if (tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r; if (tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c; if (tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c; s["!fullref"] = s["!ref"]; s["!ref"] = encode_range(tmpref) } } if (mergecells.length > 0) s["!merges"] = mergecells; if (columns.length > 0) s["!cols"] = columns; return s } function write_ws_xml_merges(merges) { if (merges.length == 0) return ""; var o = '<mergeCells count="' + merges.length + '">'; for (var i = 0; i != merges.length; ++i) o += '<mergeCell ref="' + encode_range(merges[i]) + '"/>'; return o + "</mergeCells>" } function write_ws_xml_pagesetup(setup) { var pageSetup = writextag("pageSetup", null, { scale: setup.scale || "100", orientation: setup.orientation || "portrait", horizontalDpi: setup.horizontalDpi || "4294967292", verticalDpi: setup.verticalDpi || "4294967292" }); return pageSetup } function parse_ws_xml_hlinks(s, data, rels) { for (var i = 0; i != data.length; ++i) { var val = parsexmltag(data[i], true); if (!val.ref) return; var rel = rels ? rels["!id"][val.id] : null; if (rel) { val.Target = rel.Target; if (val.location) val.Target += "#" + val.location; val.Rel = rel } else { val.Target = val.location; rel = { Target: val.location, TargetMode: "Internal" }; val.Rel = rel } var rng = safe_decode_range(val.ref); for (var R = rng.s.r; R <= rng.e.r; ++R) for (var C = rng.s.c; C <= rng.e.c; ++C) { var addr = encode_cell({ c: C, r: R }); if (!s[addr]) s[addr] = { t: "stub", v: undefined }; s[addr].l = val } } } function parse_ws_xml_cols(columns, cols) { var seencol = false; for (var coli = 0; coli != cols.length; ++coli) { var coll = parsexmltag(cols[coli], true); var colm = parseInt(coll.min, 10) - 1, colM = parseInt(coll.max, 10) - 1; delete coll.min; delete coll.max; if (!seencol && coll.width) { seencol = true; find_mdw(+coll.width, coll) } if (coll.width) { coll.wpx = width2px(+coll.width); coll.wch = px2char(coll.wpx); coll.MDW = MDW } while (colm <= colM) columns[colm++] = coll } } function write_ws_xml_cols(ws, cols) { var o = ["<cols>"], col, width; for (var i = 0; i != cols.length; ++i) { if (!(col = cols[i])) continue; var p = { min: i + 1, max: i + 1 }; width = -1; if (col.wpx) width = px2char(col.wpx); else if (col.wch) width = col.wch; if (width > -1) { p.width = char2width(width); p.customWidth = 1 } o[o.length] = writextag("col", null, p) } o[o.length] = "</cols>"; return o.join("") } function write_ws_xml_cell(cell, ref, ws, opts, idx, wb) { if (cell.v === undefined && cell.s === undefined) return ""; var vv = ""; var oldt = cell.t, oldv = cell.v; switch (cell.t) { case "b": vv = cell.v ? "1" : "0"; break; case "n": vv = "" + cell.v; break; case "e": vv = BErr[cell.v]; break; case "d": if (opts.cellDates) vv = new Date(cell.v).toISOString(); else { cell.t = "n"; vv = "" + (cell.v = datenum(cell.v)); if (typeof cell.z === "undefined") cell.z = SSF._table[14] } break; default: vv = cell.v; break } var v = writetag("v", escapexml(vv)), o = { r: ref }; var os = get_cell_style(opts.cellXfs, cell, opts); if (os !== 0) o.s = os; switch (cell.t) { case "n": break; case "d": o.t = "d"; break; case "b": o.t = "b"; break; case "e": o.t = "e"; break; default: if (opts.bookSST) { v = writetag("v", "" + get_sst_id(opts.Strings, cell.v)); o.t = "s"; break } o.t = "str"; break } if (cell.t != oldt) { cell.t = oldt; cell.v = oldv } return writextag("c", v, o) } var parse_ws_xml_data = function parse_ws_xml_data_factory() { var cellregex = /<(?:\w+:)?c[ >]/, rowregex = /<\/(?:\w+:)?row>/; var rregex = /r=["']([^"']*)["']/, isregex = /<is>([\S\s]*?)<\/is>/; var match_v = matchtag("v"), match_f = matchtag("f"); return function parse_ws_xml_data(sdata, s, opts, guess) { var ri = 0, x = "", cells = [], cref = [], idx = 0, i = 0, cc = 0, d = "", p; var tag, tagr = 0, tagc = 0; var sstr; var fmtid = 0, fillid = 0, do_format = Array.isArray(styles.CellXf), cf; for (var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) { x = marr[mt].trim(); var xlen = x.length; if (xlen === 0) continue; for (ri = 0; ri < xlen; ++ri) if (x.charCodeAt(ri) === 62) break; ++ri; tag = parsexmltag(x.substr(0, ri), true); tagr = typeof tag.r !== "undefined" ? parseInt(tag.r, 10) : tagr + 1; tagc = -1; if (opts.sheetRows && opts.sheetRows < tagr) continue; if (guess.s.r > tagr - 1) guess.s.r = tagr - 1; if (guess.e.r < tagr - 1) guess.e.r = tagr - 1; cells = x.substr(ri).split(cellregex); for (ri = typeof tag.r === "undefined" ? 0 : 1; ri != cells.length; ++ri) { x = cells[ri].trim(); if (x.length === 0) continue; cref = x.match(rregex); idx = ri; i = 0; cc = 0; x = "<c " + (x.substr(0, 1) == "<" ? ">" : "") + x; if (cref !== null && cref.length === 2) { idx = 0; d = cref[1]; for (i = 0; i != d.length; ++i) { if ((cc = d.charCodeAt(i) - 64) < 1 || cc > 26) break; idx = 26 * idx + cc } --idx; tagc = idx } else ++tagc; for (i = 0; i != x.length; ++i) if (x.charCodeAt(i) === 62) break; ++i; tag = parsexmltag(x.substr(0, i), true); if (!tag.r) tag.r = utils.encode_cell({ r: tagr - 1, c: tagc }); d = x.substr(i); p = { t: "" }; if ((cref = d.match(match_v)) !== null && cref[1] !== "") p.v = unescapexml(cref[1]); if (opts.cellFormula && (cref = d.match(match_f)) !== null) p.f = unescapexml(cref[1]); if (tag.t === undefined && tag.s === undefined && p.v === undefined) { if (!opts.sheetStubs) continue; p.t = "stub" } else p.t = tag.t || "n"; if (guess.s.c > idx) guess.s.c = idx; if (guess.e.c < idx) guess.e.c = idx; switch (p.t) { case "n": p.v = parseFloat(p.v); if (isNaN(p.v)) p.v = ""; break; case "s": sstr = strs[parseInt(p.v, 10)]; p.v = sstr.t; p.r = sstr.r; if (opts.cellHTML) p.h = sstr.h; break; case "str": p.t = "s"; p.v = p.v != null ? utf8read(p.v) : ""; if (opts.cellHTML) p.h = p.v; break; case "inlineStr": cref = d.match(isregex); p.t = "s"; if (cref !== null) { sstr = parse_si(cref[1]); p.v = sstr.t } else p.v = ""; break; case "b": p.v = parsexmlbool(p.v); break; case "d": if (!opts.cellDates) { p.v = datenum(p.v); p.t = "n" } break; case "e": p.w = p.v; p.v = RBErr[p.v]; break } fmtid = fillid = 0; if (do_format && tag.s !== undefined) { cf = styles.CellXf[tag.s]; if (opts.cellStyles) { p.s = get_cell_style_csf(cf) } if (cf != null) { if (cf.numFmtId != null) fmtid = cf.numFmtId; if (opts.cellStyles && cf.fillId != null) fillid = cf.fillId } } safe_format(p, fmtid, fillid, opts); s[tag.r] = p } } } } (); function write_ws_xml_data(ws, opts, idx, wb) { var o = [], r = [], range = safe_decode_range(ws["!ref"]), cell, ref, rr = "", cols = [], R, C; for (C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C); for (R = range.s.r; R <= range.e.r; ++R) { r = []; rr = encode_row(R); for (C = range.s.c; C <= range.e.c; ++C) { ref = cols[C] + rr; if (ws[ref] === undefined) continue; if ((cell = write_ws_xml_cell(ws[ref], ref, ws, opts, idx, wb)) != null) r.push(cell) } if (r.length > 0) o[o.length] = writextag("row", r.join(""), { r: rr }) } return o.join("") } var WS_XML_ROOT = writextag("worksheet", null, { xmlns: XMLNS.main[0], "xmlns:r": XMLNS.r }); function write_ws_xml(idx, opts, wb) { var o = [XML_HEADER, WS_XML_ROOT]; var s = wb.SheetNames[idx], sidx = 0, rdata = ""; var ws = wb.Sheets[s]; if (ws === undefined) ws = {}; var ref = ws["!ref"]; if (ref === undefined) ref = "A1"; o[o.length] = writextag("dimension", null, { ref: ref }); var sheetView = writextag("sheetView", null, { showGridLines: opts.showGridLines == false ? "0" : "1", tabSelected: opts.tabSelected === undefined ? "0" : opts.tabSelected, workbookViewId: opts.workbookViewId === undefined ? "0" : opts.workbookViewId }); o[o.length] = writextag("sheetViews", sheetView); if (ws["!cols"] !== undefined && ws["!cols"].length > 0) o[o.length] = write_ws_xml_cols(ws, ws["!cols"]); o[sidx = o.length] = "<sheetData/>"; if (ws["!ref"] !== undefined) { rdata = write_ws_xml_data(ws, opts, idx, wb); if (rdata.length > 0) o[o.length] = rdata } if (o.length > sidx + 1) { o[o.length] = "</sheetData>"; o[sidx] = o[sidx].replace("/>", ">") } if (ws["!merges"] !== undefined && ws["!merges"].length > 0) o[o.length] = write_ws_xml_merges(ws["!merges"]); if (ws["!pageSetup"] !== undefined) o[o.length] = write_ws_xml_pagesetup(ws["!pageSetup"]); if (ws["!rowBreaks"] !== undefined) o[o.length] = write_ws_xml_row_breaks(ws["!rowBreaks"]); if (ws["!colBreaks"] !== undefined) o[o.length] = write_ws_xml_col_breaks(ws["!colBreaks"]); if (o.length > 2) { o[o.length] = "</worksheet>"; o[1] = o[1].replace("/>", ">") } return o.join("") } function write_ws_xml_row_breaks(breaks) { console.log("Writing breaks"); var brk = []; for (var i = 0; i < breaks.length; i++) { var thisBreak = "" + breaks[i]; var nextBreak = "" + (breaks[i + 1] || "16383"); brk.push(writextag("brk", null, { id: thisBreak, max: nextBreak, man: "1" })) } return writextag("rowBreaks", brk.join(" "), { count: brk.length, manualBreakCount: brk.length }) } function write_ws_xml_col_breaks(breaks) { console.log("Writing breaks"); var brk = []; for (var i = 0; i < breaks.length; i++) { var thisBreak = "" + breaks[i]; var nextBreak = "" + (breaks[i + 1] || "1048575"); brk.push(writextag("brk", null, { id: thisBreak, max: nextBreak, man: "1" })) } return writextag("colBreaks", brk.join(" "), { count: brk.length, manualBreakCount: brk.length }) } function parse_BrtRowHdr(data, length) { var z = []; z.r = data.read_shift(4); data.l += length - 4; return z } var parse_BrtWsDim = parse_UncheckedRfX; var write_BrtWsDim = write_UncheckedRfX; function parse_BrtWsProp(data, length) { var z = {}; data.l += 19; z.name = parse_XLSBCodeName(data, length - 19); return z } function parse_BrtCellBlank(data, length) { var cell = parse_XLSBCell(data); return [cell] } function write_BrtCellBlank(cell, val, o) { if (o == null) o = new_buf(8); return write_XLSBCell(val, o) } function parse_BrtCellBool(data, length) { var cell = parse_XLSBCell(data); var fBool = data.read_shift(1); return [cell, fBool, "b"] } function parse_BrtCellError(data, length) { var cell = parse_XLSBCell(data); var fBool = data.read_shift(1); return [cell, fBool, "e"] } function parse_BrtCellIsst(data, length) { var cell = parse_XLSBCell(data); var isst = data.read_shift(4); return [cell, isst, "s"] } function parse_BrtCellReal(data, length) { var cell = parse_XLSBCell(data); var value = parse_Xnum(data); return [cell, value, "n"] } function parse_BrtCellRk(data, length) { var cell = parse_XLSBCell(data); var value = parse_RkNumber(data); return [cell, value, "n"] } function parse_BrtCellSt(data, length) { var cell = parse_XLSBCell(data); var value = parse_XLWideString(data); return [cell, value, "str"] } function parse_BrtFmlaBool(data, length, opts) { var cell = parse_XLSBCell(data); var value = data.read_shift(1); var o = [cell, value, "b"]; if (opts.cellFormula) { var formula = parse_XLSBCellParsedFormula(data, length - 9); o[3] = "" } else data.l += length - 9; return o } function parse_BrtFmlaError(data, length, opts) { var cell = parse_XLSBCell(data); var value = data.read_shift(1); var o = [cell, value, "e"]; if (opts.cellFormula) { var formula = parse_XLSBCellParsedFormula(data, length - 9); o[3] = "" } else data.l += length - 9; return o } function parse_BrtFmlaNum(data, length, opts) { var cell = parse_XLSBCell(data); var value = parse_Xnum(data); var o = [cell, value, "n"]; if (opts.cellFormula) { var formula = parse_XLSBCellParsedFormula(data, length - 16); o[3] = "" } else data.l += length - 16; return o } function parse_BrtFmlaString(data, length, opts) { var start = data.l; var cell = parse_XLSBCell(data); var value = parse_XLWideString(data); var o = [cell, value, "str"]; if (opts.cellFormula) { var formula = parse_XLSBCellParsedFormula(data, start + length - data.l) } else data.l = start + length; return o } var parse_BrtMergeCell = parse_UncheckedRfX; function parse_BrtHLink(data, length, opts) { var end = data.l + length; var rfx = parse_UncheckedRfX(data, 16); var relId = parse_XLNullableWideString(data); var loc = parse_XLWideString(data); var tooltip = parse_XLWideString(data); var display = parse_XLWideString(data); data.l = end; return { rfx: rfx, relId: relId, loc: loc, tooltip: tooltip, display: display } } function parse_ws_bin(data, opts, rels) { if (!data) return data; if (!rels) rels = { "!id": {} }; var s = {}; var ref; var refguess = { s: { r: 1e6, c: 1e6 }, e: { r: 0, c: 0 } }; var pass = false, end = false; var row, p, cf, R, C, addr, sstr, rr; var mergecells = []; recordhopper(data, function ws_parse(val, R) { if (end) return; switch (R.n) { case "BrtWsDim": ref = val; break; case "BrtRowHdr": row = val; if (opts.sheetRows && opts.sheetRows <= row.r) end = true; rr = encode_row(row.r); break; case "BrtFmlaBool": case "BrtFmlaError": case "BrtFmlaNum": case "BrtFmlaString": case "BrtCellBool": case "BrtCellError": case "BrtCellIsst": case "BrtCellReal": case "BrtCellRk": case "BrtCellSt": p = { t: val[2] }; switch (val[2]) { case "n": p.v = val[1]; break; case "s": sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break; case "b": p.v = val[1] ? true : false; break; case "e": p.v = val[1]; p.w = BErr[p.v]; break; case "str": p.t = "s"; p.v = utf8read(val[1]); break } if (opts.cellFormula && val.length > 3) p.f = val[3]; if (cf = styles.CellXf[val[0].iStyleRef]) safe_format(p, cf.ifmt, null, opts); s[encode_col(C = val[0].c) + rr] = p; if (refguess.s.r > row.r) refguess.s.r = row.r; if (refguess.s.c > C) refguess.s.c = C; if (refguess.e.r < row.r) refguess.e.r = row.r; if (refguess.e.c < C) refguess.e.c = C; break; case "BrtCellBlank": if (!opts.sheetStubs) break; p = { t: "s", v: undefined }; s[encode_col(C = val[0].c) + rr] = p; if (refguess.s.r > row.r) refguess.s.r = row.r; if (refguess.s.c > C) refguess.s.c = C; if (refguess.e.r < row.r) refguess.e.r = row.r; if (refguess.e.c < C) refguess.e.c = C; break; case "BrtBeginMergeCells": break; case "BrtEndMergeCells": break; case "BrtMergeCell": mergecells.push(val); break; case "BrtHLink": var rel = rels["!id"][val.relId]; if (rel) { val.Target = rel.Target; if (val.loc) val.Target += "#" + val.loc; val.Rel = rel } for (R = val.rfx.s.r; R <= val.rfx.e.r; ++R) for (C = val.rfx.s.c; C <= val.rfx.e.c; ++C) { addr = encode_cell({ c: C, r: R }); if (!s[addr]) s[addr] = { t: "s", v: undefined }; s[addr].l = val } break; case "BrtArrFmla": break; case "BrtShrFmla": break; case "BrtBeginSheet": break; case "BrtWsProp": break; case "BrtSheetCalcProp": break; case "BrtBeginWsViews": break; case "BrtBeginWsView": break; case "BrtPane": break; case "BrtSel": break; case "BrtEndWsView": break; case "BrtEndWsViews": break; case "BrtACBegin": break; case "BrtRwDescent": break; case "BrtACEnd": break; case "BrtWsFmtInfoEx14": break; case "BrtWsFmtInfo": break; case "BrtBeginColInfos": break; case "BrtColInfo": break; case "BrtEndColInfos": break; case "BrtBeginSheetData": break; case "BrtEndSheetData": break; case "BrtSheetProtection": break; case "BrtPrintOptions": break; case "BrtMargins": break; case "BrtPageSetup": break; case "BrtFRTBegin": pass = true; break; case "BrtFRTEnd": pass = false; break; case "BrtEndSheet": break; case "BrtDrawing": break; case "BrtLegacyDrawing": break; case "BrtLegacyDrawingHF": break; case "BrtPhoneticInfo": break; case "BrtBeginHeaderFooter": break; case "BrtEndHeaderFooter": break; case "BrtBrk": break; case "BrtBeginRwBrk": break; case "BrtEndRwBrk": break; case "BrtBeginColBrk": break; case "BrtEndColBrk": break; case "BrtBeginUserShViews": break; case "BrtBeginUserShView": break; case "BrtEndUserShView": break; case "BrtEndUserShViews": break; case "BrtBkHim": break; case "BrtBeginOleObjects": break; case "BrtOleObject": break; case "BrtEndOleObjects": break; case "BrtBeginListParts": break; case "BrtListPart": break; case "BrtEndListParts": break; case "BrtBeginSortState": break; case "BrtBeginSortCond": break; case "BrtEndSortCond": break; case "BrtEndSortState": break; case "BrtBeginConditionalFormatting": break; case "BrtEndConditionalFormatting": break; case "BrtBeginCFRule": break; case "BrtEndCFRule": break; case "BrtBeginDVals": break; case "BrtDVal": break; case "BrtEndDVals": break; case "BrtRangeProtection": break; case "BrtBeginDCon": break; case "BrtEndDCon": break; case "BrtBeginDRefs": break; case "BrtDRef": break; case "BrtEndDRefs": break; case "BrtBeginActiveXControls": break; case "BrtActiveX": break; case "BrtEndActiveXControls": break; case "BrtBeginAFilter": break; case "BrtEndAFilter": break; case "BrtBeginFilterColumn": break; case "BrtBeginFilters": break; case "BrtFilter": break; case "BrtEndFilters": break; case "BrtEndFilterColumn": break; case "BrtDynamicFilter": break; case "BrtTop10Filter": break; case "BrtBeginCustomFilters": break; case "BrtCustomFilter": break; case "BrtEndCustomFilters": break; case "BrtBeginSmartTags": break; case "BrtBeginCellSmartTags": break; case "BrtBeginCellSmartTag": break; case "BrtCellSmartTagProperty": break; case "BrtEndCellSmartTag": break; case "BrtEndCellSmartTags": break; case "BrtEndSmartTags": break; case "BrtBeginCellWatches": break; case "BrtCellWatch": break; case "BrtEndCellWatches": break; case "BrtTable": break; case "BrtBeginCellIgnoreECs": break; case "BrtCellIgnoreEC": break; case "BrtEndCellIgnoreECs": break; default: if (!pass || opts.WTF) throw new Error("Unexpected record " + R.n) } }, opts); if (!s["!ref"] && (refguess.s.r < 1e6 || ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0)) s["!ref"] = encode_range(ref); if (opts.sheetRows && s["!ref"]) { var tmpref = safe_decode_range(s["!ref"]); if (opts.sheetRows < +tmpref.e.r) { tmpref.e.r = opts.sheetRows - 1; if (tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r; if (tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r; if (tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c; if (tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c; s["!fullref"] = s["!ref"]; s["!ref"] = encode_range(tmpref) } } if (mergecells.length > 0) s["!merges"] = mergecells; return s } function write_ws_bin_cell(ba, cell, R, C, opts) { if (cell.v === undefined) return ""; var vv = ""; switch (cell.t) { case "b": vv = cell.v ? "1" : "0"; break; case "n": case "e": vv = "" + cell.v; break; default: vv = cell.v; break } var o = { r: R, c: C }; o.s = get_cell_style(opts.cellXfs, cell, opts); switch (cell.t) { case "s": case "str": if (opts.bookSST) { vv = get_sst_id(opts.Strings, cell.v); o.t = "s"; break } o.t = "str"; break; case "n": break; case "b": o.t = "b"; break; case "e": o.t = "e"; break } write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o)) } function write_CELLTABLE(ba, ws, idx, opts, wb) { var range = safe_decode_range(ws["!ref"] || "A1"), ref, rr = "", cols = []; write_record(ba, "BrtBeginSheetData"); for (var R = range.s.r; R <= range.e.r; ++R) { rr = encode_row(R); for (var C = range.s.c; C <= range.e.c; ++C) { if (R === range.s.r) cols[C] = encode_col(C); ref = cols[C] + rr; if (!ws[ref]) continue; write_ws_bin_cell(ba, ws[ref], R, C, opts) } } write_record(ba, "BrtEndSheetData") } function write_ws_bin(idx, opts, wb) { var ba = buf_array(); var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {}; var r = safe_decode_range(ws["!ref"] || "A1"); write_record(ba, "BrtBeginSheet"); write_record(ba, "BrtWsDim", write_BrtWsDim(r)); write_CELLTABLE(ba, ws, idx, opts, wb); write_record(ba, "BrtEndSheet"); return ba.end() } var WBPropsDef = [["allowRefreshQuery", "0"], ["autoCompressPictures", "1"], ["backupFile", "0"], ["checkCompatibility", "0"], ["codeName", ""], ["date1904", "0"], ["dateCompatibility", "1"], ["filterPrivacy", "0"], ["hidePivotFieldList", "0"], ["promptedSolutions", "0"], ["publishItems", "0"], ["refreshAllConnections", false], ["saveExternalLinkValues", "1"], ["showBorderUnselectedTables", "1"], ["showInkAnnotation", "1"], ["showObjects", "all"], ["showPivotChartFilter", "0"]]; var WBViewDef = [["activeTab", "0"], ["autoFilterDateGrouping", "1"], ["firstSheet", "0"], ["minimized", "0"], ["showHorizontalScroll", "1"], ["showSheetTabs", "1"], ["showVerticalScroll", "1"], ["tabRatio", "600"], ["visibility", "visible"]]; var SheetDef = [["state", "visible"]]; var CalcPrDef = [["calcCompleted", "true"], ["calcMode", "auto"], ["calcOnSave", "true"], ["concurrentCalc", "true"], ["fullCalcOnLoad", "false"], ["fullPrecision", "true"], ["iterate", "false"], ["iterateCount", "100"], ["iterateDelta", "0.001"], ["refMode", "A1"]]; var CustomWBViewDef = [["autoUpdate", "false"], ["changesSavedWin", "false"], ["includeHiddenRowCol", "true"], ["includePrintSettings", "true"], ["maximized", "false"], ["minimized", "false"], ["onlySync", "false"], ["personalView", "false"], ["showComments", "commIndicator"], ["showFormulaBar", "true"], ["showHorizontalScroll", "true"], ["showObjects", "all"], ["showSheetTabs", "true"], ["showStatusbar", "true"], ["showVerticalScroll", "true"], ["tabRatio", "600"], ["xWindow", "0"], ["yWindow", "0"]]; function push_defaults_array(target, defaults) { for (var j = 0; j != target.length; ++j) { var w = target[j]; for (var i = 0; i != defaults.length; ++i) { var z = defaults[i]; if (w[z[0]] == null) w[z[0]] = z[1] } } } function push_defaults(target, defaults) { for (var i = 0; i != defaults.length; ++i) { var z = defaults[i]; if (target[z[0]] == null) target[z[0]] = z[1] } } function parse_wb_defaults(wb) { push_defaults(wb.WBProps, WBPropsDef); push_defaults(wb.CalcPr, CalcPrDef); push_defaults_array(wb.WBView, WBViewDef); push_defaults_array(wb.Sheets, SheetDef); _ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, "date1904") } var wbnsregex = /<\w+:workbook/; function parse_wb_xml(data, opts) { var wb = { AppVersion: {}, WBProps: {}, WBView: [], Sheets: [], CalcPr: {}, xmlns: "" }; var pass = false, xmlns = "xmlns"; data.match(tagregex).forEach(function xml_wb(x) { var y = parsexmltag(x); switch (strip_ns(y[0])) { case "<?xml": break; case "<workbook": if (x.match(wbnsregex)) xmlns = "xmlns" + x.match(/<(\w+):/)[1]; wb.xmlns = y[xmlns]; break; case "</workbook>": break; case "<fileVersion": delete y[0]; wb.AppVersion = y; break; case "<fileVersion/>": break; case "<fileSharing": case "<fileSharing/>": break; case "<workbookPr": delete y[0]; wb.WBProps = y; break; case "<workbookPr/>": delete y[0]; wb.WBProps = y; break; case "<workbookProtection": break; case "<workbookProtection/>": break; case "<bookViews>": case "</bookViews>": break; case "<workbookView": delete y[0]; wb.WBView.push(y); break; case "<sheets>": case "</sheets>": break; case "<sheet": delete y[0]; y.name = utf8read(y.name); wb.Sheets.push(y); break; case "<functionGroups": case "<functionGroups/>": break; case "<functionGroup": break; case "<externalReferences": case "</externalReferences>": case "<externalReferences>": break; case "<externalReference": break; case "<definedNames/>": break; case "<definedNames>": case "<definedNames": pass = true; break; case "</definedNames>": pass = false; break; case "<definedName": case "<definedName/>": case "</definedName>": break; case "<calcPr": delete y[0]; wb.CalcPr = y; break; case "<calcPr/>": delete y[0]; wb.CalcPr = y; break; case "<oleSize": break; case "<customWorkbookViews>": case "</customWorkbookViews>": case "<customWorkbookViews": break; case "<customWorkbookView": case "</customWorkbookView>": break; case "<pivotCaches>": case "</pivotCaches>": case "<pivotCaches": break; case "<pivotCache": break; case "<smartTagPr": case "<smartTagPr/>": break; case "<smartTagTypes": case "<smartTagTypes>": case "</smartTagTypes>": break; case "<smartTagType": break; case "<webPublishing": case "<webPublishing/>": break; case "<fileRecoveryPr": case "<fileRecoveryPr/>": break; case "<webPublishObjects>": case "<webPublishObjects": case "</webPublishObjects>": break; case "<webPublishObject": break; case "<extLst>": case "</extLst>": case "<extLst/>": break; case "<ext": pass = true; break; case "</ext>": pass = false; break; case "<ArchID": break; case "<AlternateContent": pass = true; break; case "</AlternateContent>": pass = false; break; default: if (!pass && opts.WTF) throw "unrecognized " + y[0] + " in workbook" } }); if (XMLNS.main.indexOf(wb.xmlns) === -1) throw new Error("Unknown Namespace: " + wb.xmlns); parse_wb_defaults(wb); return wb } var WB_XML_ROOT = writextag("workbook", null, { xmlns: XMLNS.main[0], "xmlns:r": XMLNS.r }); function safe1904(wb) { try { return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false" } catch (e) { return "false" } } function write_wb_xml(wb, opts) { var o = [XML_HEADER]; o[o.length] = WB_XML_ROOT; o[o.length] = writextag("workbookPr", null, { date1904: safe1904(wb) }); o[o.length] = "<sheets>"; for (var i = 0; i != wb.SheetNames.length; ++i) o[o.length] = writextag("sheet", null, { name: wb.SheetNames[i].substr(0, 31), sheetId: "" + (i + 1), "r:id": "rId" + (i + 1) }); o[o.length] = "</sheets>"; var hasPrintHeaders = false; for (var i = 0; i != wb.SheetNames.length; ++i) { var sheetName = wb.SheetNames[i]; var sheet = wb.Sheets[sheetName]; if (sheet["!printHeader"]) { if (sheet["!printHeader"].length !== 2) { throw "!printHeaders must be an array of length 2: " + sheet["!printHeader"] } hasPrintHeaders = true } } if (hasPrintHeaders) { o[o.length] = "<definedNames>"; for (var i = 0; i != wb.SheetNames.length; ++i) { var sheetName = wb.SheetNames[i]; var sheet = wb.Sheets[sheetName]; if (sheet["!printHeader"]) var range = "'" + sheetName + "'!" + sheet["!printHeader"]; console.log("!!!!" + range); o[o.length] = writextag("definedName", range, { name: "_xlnm.Print_Titles", localSheetId: "" + i }) } o[o.length] = "</definedNames>" } if (o.length > 2) { o[o.length] = "</workbook>"; o[1] = o[1].replace("/>", ">") } return o.join("") } function parse_BrtBundleSh(data, length) { var z = {}; z.hsState = data.read_shift(4); z.iTabID = data.read_shift(4); z.strRelID = parse_RelID(data, length - 8); z.name = parse_XLWideString(data); return z } function write_BrtBundleSh(data, o) { if (!o) o = new_buf(127); o.write_shift(4, data.hsState); o.write_shift(4, data.iTabID); write_RelID(data.strRelID, o); write_XLWideString(data.name.substr(0, 31), o); return o } function parse_BrtWbProp(data, length) { data.read_shift(4); var dwThemeVersion = data.read_shift(4); var strName = length > 8 ? parse_XLWideString(data) : ""; return [dwThemeVersion, strName] } function write_BrtWbProp(data, o) { if (!o) o = new_buf(8); o.write_shift(4, 0); o.write_shift(4, 0); return o } function parse_BrtFRTArchID$(data, length) { var o = {}; data.read_shift(4); o.ArchID = data.read_shift(4); data.l += length - 8; return o } function parse_wb_bin(data, opts) { var wb = { AppVersion: {}, WBProps: {}, WBView: [], Sheets: [], CalcPr: {}, xmlns: "" }; var pass = false, z; recordhopper(data, function hopper_wb(val, R) { switch (R.n) { case "BrtBundleSh": wb.Sheets.push(val); break; case "BrtBeginBook": break; case "BrtFileVersion": break; case "BrtWbProp": break; case "BrtACBegin": break; case "BrtAbsPath15": break; case "BrtACEnd": break; case "BrtWbFactoid": break; case "BrtBookProtection": break; case "BrtBeginBookViews": break; case "BrtBookView": break; case "BrtEndBookViews": break; case "BrtBeginBundleShs": break; case "BrtEndBundleShs": break; case "BrtBeginFnGroup": break; case "BrtEndFnGroup": break; case "BrtBeginExternals": break; case "BrtSupSelf": break; case "BrtSupBookSrc": break; case "BrtExternSheet": break; case "BrtEndExternals": break; case "BrtName": break; case "BrtCalcProp": break; case "BrtUserBookView": break; case "BrtBeginPivotCacheIDs": break; case "BrtBeginPivotCacheID": break; case "BrtEndPivotCacheID": break; case "BrtEndPivotCacheIDs": break; case "BrtWebOpt": break; case "BrtFileRecover": break; case "BrtFileSharing": break; case "BrtBeginSmartTagTypes": break; case "BrtSmartTagType": break; case "BrtEndSmartTagTypes": break; case "BrtFRTBegin": pass = true; break; case "BrtFRTArchID$": break; case "BrtWorkBookPr15": break; case "BrtFRTEnd": pass = false; break; case "BrtEndBook": break; default: if (!pass || opts.WTF) throw new Error("Unexpected record " + R.n) } }); parse_wb_defaults(wb); return wb } function write_BUNDLESHS(ba, wb, opts) { write_record(ba, "BrtBeginBundleShs"); for (var idx = 0; idx != wb.SheetNames.length; ++idx) { var d = { hsState: 0, iTabID: idx + 1, strRelID: "rId" + (idx + 1), name: wb.SheetNames[idx] }; write_record(ba, "BrtBundleSh", write_BrtBundleSh(d)) } write_record(ba, "BrtEndBundleShs") } function write_BrtFileVersion(data, o) { if (!o) o = new_buf(127); for (var i = 0; i != 4; ++i) o.write_shift(4, 0); write_XLWideString("SheetJS", o); write_XLWideString(xlsxStyle.version, o); write_XLWideString(xlsxStyle.version, o); write_XLWideString("7262", o); o.length = o.l; return o } function write_BOOKVIEWS(ba, wb, opts) { write_record(ba, "BrtBeginBookViews"); write_record(ba, "BrtEndBookViews") } function write_BrtCalcProp(data, o) { if (!o) o = new_buf(26); o.write_shift(4, 0); o.write_shift(4, 1); o.write_shift(4, 0); write_Xnum(0, o); o.write_shift(-4, 1023); o.write_shift(1, 51); o.write_shift(1, 0); return o } function write_BrtFileRecover(data, o) { if (!o) o = new_buf(1); o.write_shift(1, 0); return o } function write_wb_bin(wb, opts) { var ba = buf_array(); write_record(ba, "BrtBeginBook"); write_record(ba, "BrtFileVersion", write_BrtFileVersion()); write_record(ba, "BrtWbProp", write_BrtWbProp()); write_BOOKVIEWS(ba, wb, opts); write_BUNDLESHS(ba, wb, opts); write_record(ba, "BrtCalcProp", write_BrtCalcProp()); write_record(ba, "BrtFileRecover", write_BrtFileRecover()); write_record(ba, "BrtEndBook"); return ba.end() } function parse_wb(data, name, opts) { return (name.substr(-4) === ".bin" ? parse_wb_bin : parse_wb_xml)(data, opts) } function parse_ws(data, name, opts, rels) { return (name.substr(-4) === ".bin" ? parse_ws_bin : parse_ws_xml)(data, opts, rels) } function parse_sty(data, name, opts) { return (name.substr(-4) === ".bin" ? parse_sty_bin : parse_sty_xml)(data, opts) } function parse_theme(data, name, opts) { return parse_theme_xml(data, opts) } function parse_sst(data, name, opts) { return (name.substr(-4) === ".bin" ? parse_sst_bin : parse_sst_xml)(data, opts) } function parse_cmnt(data, name, opts) { return (name.substr(-4) === ".bin" ? parse_comments_bin : parse_comments_xml)(data, opts) } function parse_cc(data, name, opts) { return (name.substr(-4) === ".bin" ? parse_cc_bin : parse_cc_xml)(data, opts) } function write_wb(wb, name, opts) { return (name.substr(-4) === ".bin" ? write_wb_bin : write_wb_xml)(wb, opts) } function write_ws(data, name, opts, wb) { return (name.substr(-4) === ".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb) } function write_sty(data, name, opts) { return (name.substr(-4) === ".bin" ? write_sty_bin : write_sty_xml)(data, opts) } function write_sst(data, name, opts) { return (name.substr(-4) === ".bin" ? write_sst_bin : write_sst_xml)(data, opts) } var attregexg2 = /([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g; var attregex2 = /([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/; var _chr = function (c) { return String.fromCharCode(c) }; function xlml_parsexmltag(tag, skip_root) { var words = tag.split(/\s+/); var z = []; if (!skip_root) z[0] = words[0]; if (words.length === 1) return z; var m = tag.match(attregexg2), y, j, w, i; if (m) for (i = 0; i != m.length; ++i) { y = m[i].match(attregex2); if ((j = y[1].indexOf(":")) === -1) z[y[1]] = y[2].substr(1, y[2].length - 2); else { if (y[1].substr(0, 6) === "xmlns:") w = "xmlns" + y[1].substr(6); else w = y[1].substr(j + 1); z[w] = y[2].substr(1, y[2].length - 2) } } return z } function xlml_parsexmltagobj(tag) { var words = tag.split(/\s+/); var z = {}; if (words.length === 1) return z; var m = tag.match(attregexg2), y, j, w, i; if (m) for (i = 0; i != m.length; ++i) { y = m[i].match(attregex2); if ((j = y[1].indexOf(":")) === -1) z[y[1]] = y[2].substr(1, y[2].length - 2); else { if (y[1].substr(0, 6) === "xmlns:") w = "xmlns" + y[1].substr(6); else w = y[1].substr(j + 1); z[w] = y[2].substr(1, y[2].length - 2) } } return z } function xlml_format(format, value) { var fmt = XLMLFormatMap[format] || unescapexml(format); if (fmt === "General") return SSF._general(value); return SSF.format(fmt, value) } function xlml_set_custprop(Custprops, Rn, cp, val) { switch ((cp[0].match(/dt:dt="([\w.]+)"/) || ["", ""])[1]) { case "boolean": val = parsexmlbool(val); break; case "i2": case "int": val = parseInt(val, 10); break; case "r4": case "float": val = parseFloat(val); break; case "date": case "dateTime.tz": val = new Date(val); break; case "i8": case "string": case "fixed": case "uuid": case "bin.base64": break; default: throw "bad custprop:" + cp[0] } Custprops[unescapexml(Rn[3])] = val } function safe_format_xlml(cell, nf, o) { try { if (cell.t === "e") { cell.w = cell.w || BErr[cell.v] } else if (nf === "General") { if (cell.t === "n") { if ((cell.v | 0) === cell.v) cell.w = SSF._general_int(cell.v); else cell.w = SSF._general_num(cell.v) } else cell.w = SSF._general(cell.v) } else cell.w = xlml_format(nf || "General", cell.v); if (o.cellNF) cell.z = XLMLFormatMap[nf] || nf || "General" } catch (e) { if (o.WTF) throw e } } function process_style_xlml(styles, stag, opts) { if (opts.cellStyles) { if (stag.Interior) { var I = stag.Interior; if (I.Pattern) I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern } } styles[stag.ID] = stag } function parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, o) { var nf = "General", sid = cell.StyleID, S = {}; o = o || {}; var interiors = []; if (sid === undefined && row) sid = row.StyleID; if (sid === undefined && csty) sid = csty.StyleID; while (styles[sid] !== undefined) { if (styles[sid].nf) nf = styles[sid].nf; if (styles[sid].Interior) interiors.push(styles[sid].Interior); if (!styles[sid].Parent) break; sid = styles[sid].Parent } switch (data.Type) { case "Boolean": cell.t = "b"; cell.v = parsexmlbool(xml); break; case "String": cell.t = "s"; cell.r = xlml_fixstr(unescapexml(xml)); cell.v = xml.indexOf("<") > -1 ? ss : cell.r; break; case "DateTime": cell.v = (Date.parse(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1e3); if (cell.v !== cell.v) cell.v = unescapexml(xml); else if (cell.v >= 1 && cell.v < 60) cell.v = cell.v - 1; if (!nf || nf == "General") nf = "yyyy-mm-dd"; case "Number": if (cell.v === undefined) cell.v = +xml; if (!cell.t) cell.t = "n"; break; case "Error": cell.t = "e"; cell.v = RBErr[xml]; cell.w = xml; break; default: cell.t = "s"; cell.v = xlml_fixstr(ss); break } safe_format_xlml(cell, nf, o); if (o.cellFormula != null && cell.Formula) { cell.f = rc_to_a1(unescapexml(cell.Formula), base); cell.Formula = undefined } if (o.cellStyles) { interiors.forEach(function (x) { if (!S.patternType && x.patternType) S.patternType = x.patternType }); cell.s = S } cell.ixfe = cell.StyleID !== undefined ? cell.StyleID : "Default" } function xlml_clean_comment(comment) { comment.t = comment.v; comment.v = comment.w = comment.ixfe = undefined } function xlml_normalize(d) { if (has_buf && Buffer.isBuffer(d)) return d.toString("utf8"); if (typeof d === "string") return d; throw "badf" } var xlmlregex = /<(\/?)([a-z0-9]*:|)(\w+)[^>]*>/gm; function parse_xlml_xml(d, opts) { var str = xlml_normalize(d); var Rn; var state = [], tmp; var sheets = {}, sheetnames = [], cursheet = {}, sheetname = ""; var table = {}, cell = {}, row = {}, dtag, didx; var c = 0, r = 0; var refguess = { s: { r: 1e6, c: 1e6 }, e: { r: 0, c: 0 } }; var styles = {}, stag = {}; var ss = "", fidx = 0; var mergecells = []; var Props = {}, Custprops = {}, pidx = 0, cp = {}; var comments = [], comment = {}; var cstys = [], csty; xlmlregex.lastIndex = 0; while (Rn = xlmlregex.exec(str)) switch (Rn[3]) { case "Data": if (state[state.length - 1][1]) break; if (Rn[1] === "/") parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, state[state.length - 1][0] == "Comment" ? comment : cell, { c: c, r: r }, styles, cstys[c], row, opts); else { ss = ""; dtag = xlml_parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length } break; case "Cell": if (Rn[1] === "/") { if (comments.length > 0) cell.c = comments; if ((!opts.sheetRows || opts.sheetRows > r) && cell.v !== undefined) cursheet[encode_col(c) + encode_row(r)] = cell; if (cell.HRef) { cell.l = { Target: cell.HRef, tooltip: cell.HRefScreenTip }; cell.HRef = cell.HRefScreenTip = undefined } if (cell.MergeAcross || cell.MergeDown) { var cc = c + (parseInt(cell.MergeAcross, 10) | 0); var rr = r + (parseInt(cell.MergeDown, 10) | 0); mergecells.push({ s: { c: c, r: r }, e: { c: cc, r: rr } }) } ++c; if (cell.MergeAcross) c += +cell.MergeAcross } else { cell = xlml_parsexmltagobj(Rn[0]); if (cell.Index) c = +cell.Index - 1; if (c < refguess.s.c) refguess.s.c = c; if (c > refguess.e.c) refguess.e.c = c; if (Rn[0].substr(-2) === "/>") ++c; comments = [] } break; case "Row": if (Rn[1] === "/" || Rn[0].substr(-2) === "/>") { if (r < refguess.s.r) refguess.s.r = r; if (r > refguess.e.r) refguess.e.r = r; if (Rn[0].substr(-2) === "/>") { row = xlml_parsexmltag(Rn[0]); if (row.Index) r = +row.Index - 1 } c = 0; ++r } else { row = xlml_parsexmltag(Rn[0]); if (row.Index) r = +row.Index - 1 } break; case "Worksheet": if (Rn[1] === "/") { if ((tmp = state.pop())[0] !== Rn[3]) throw "Bad state: " + tmp; sheetnames.push(sheetname); if (refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) cursheet["!ref"] = encode_range(refguess); if (mergecells.length) cursheet["!merges"] = mergecells; sheets[sheetname] = cursheet } else { refguess = { s: { r: 1e6, c: 1e6 }, e: { r: 0, c: 0 } }; r = c = 0; state.push([Rn[3], false]); tmp = xlml_parsexmltag(Rn[0]); sheetname = tmp.Name; cursheet = {}; mergecells = [] } break; case "Table": if (Rn[1] === "/") { if ((tmp = state.pop())[0] !== Rn[3]) throw "Bad state: " + tmp } else if (Rn[0].slice(-2) == "/>") break; else { table = xlml_parsexmltag(Rn[0]); state.push([Rn[3], false]); cstys = [] } break; case "Style": if (Rn[1] === "/") process_style_xlml(styles, stag, opts); else stag = xlml_parsexmltag(Rn[0]); break; case "NumberFormat": stag.nf = xlml_parsexmltag(Rn[0]).Format || "General"; break; case "Column": if (state[state.length - 1][0] !== "Table") break; csty = xlml_parsexmltag(Rn[0]); cstys[csty.Index - 1 || cstys.length] = csty; for (var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = csty; break; case "NamedRange": break; case "NamedCell": break; case "B": break; case "I": break; case "U": break; case "S": break; case "Sub": break; case "Sup": break; case "Span": break; case "Border": break; case "Alignment": break; case "Borders": break; case "Font": if (Rn[0].substr(-2) === "/>") break; else if (Rn[1] === "/") ss += str.slice(fidx, Rn.index); else fidx = Rn.index + Rn[0].length; break; case "Interior": if (!opts.cellStyles) break; stag.Interior = xlml_parsexmltag(Rn[0]); break; case "Protection": break; case "Author": case "Title": case "Description": case "Created": case "Keywords": case "Subject": case "Category": case "Company": case "LastAuthor": case "LastSaved": case "LastPrinted": case "Version": case "Revision": case "TotalTime": case "HyperlinkBase": case "Manager": if (Rn[0].substr(-2) === "/>") break; else if (Rn[1] === "/") xlml_set_prop(Props, Rn[3], str.slice(pidx, Rn.index)); else pidx = Rn.index + Rn[0].length; break; case "Paragraphs": break; case "Styles": case "Workbook": if (Rn[1] === "/") { if ((tmp = state.pop())[0] !== Rn[3]) throw "Bad state: " + tmp } else state.push([Rn[3], false]); break; case "Comment": if (Rn[1] === "/") { if ((tmp = state.pop())[0] !== Rn[3]) throw "Bad state: " + tmp; xlml_clean_comment(comment); comments.push(comment) } else { state.push([Rn[3], false]); tmp = xlml_parsexmltag(Rn[0]); comment = { a: tmp.Author } } break; case "Name": break; case "ComponentOptions": case "DocumentProperties": case "CustomDocumentProperties": case "OfficeDocumentSettings": case "PivotTable": case "PivotCache": case "Names": case "MapInfo": case "PageBreaks": case "QueryTable": case "DataValidation": case "AutoFilter": case "Sorting": case "Schema": case "data": case "ConditionalFormatting": case "SmartTagType": case "SmartTags": case "ExcelWorkbook": case "WorkbookOptions": case "WorksheetOptions": if (Rn[1] === "/") { if ((tmp = state.pop())[0] !== Rn[3]) throw "Bad state: " + tmp } else if (Rn[0].charAt(Rn[0].length - 2) !== "/") state.push([Rn[3], true]); break; default: var seen = true; switch (state[state.length - 1][0]) { case "OfficeDocumentSettings": switch (Rn[3]) { case "AllowPNG": break; case "RemovePersonalInformation": break; case "DownloadComponents": break; case "LocationOfComponents": break; case "Colors": break; case "Color": break; case "Index": break; case "RGB": break; case "PixelsPerInch": break; case "TargetScreenSize": break; case "ReadOnlyRecommended": break; default: seen = false } break; case "ComponentOptions": switch (Rn[3]) { case "Toolbar": break; case "HideOfficeLogo": break; case "SpreadsheetAutoFit": break; case "Label": break; case "Caption": break; case "MaxHeight": break; case "MaxWidth": break; case "NextSheetNumber": break; default: seen = false } break; case "ExcelWorkbook": switch (Rn[3]) { case "WindowHeight": break; case "WindowWidth": break; case "WindowTopX": break; case "WindowTopY": break; case "TabRatio": break; case "ProtectStructure": break; case "ProtectWindows": break; case "ActiveSheet": break; case "DisplayInkNotes": break; case "FirstVisibleSheet": break; case "SupBook": break; case "SheetName": break; case "SheetIndex": break; case "SheetIndexFirst": break; case "SheetIndexLast": break; case "Dll": break; case "AcceptLabelsInFormulas": break; case "DoNotSaveLinkValues": break; case "Date1904": break; case "Iteration": break; case "MaxIterations": break; case "MaxChange": break; case "Path": break; case "Xct": break; case "Count": break; case "SelectedSheets": break; case "Calculation": break; case "Uncalced": break; case "StartupPrompt": break; case "Crn": break; case "ExternName": break; case "Formula": break; case "ColFirst": break; case "ColLast": break; case "WantAdvise": break; case "Boolean": break; case "Error": break; case "Text": break; case "OLE": break; case "NoAutoRecover": break; case "PublishObjects": break; case "DoNotCalculateBeforeSave": break; case "Number": break; case "RefModeR1C1": break; case "EmbedSaveSmartTags": break; default: seen = false } break; case "WorkbookOptions": switch (Rn[3]) { case "OWCVersion": break; case "Height": break; case "Width": break; default: seen = false } break; case "WorksheetOptions": switch (Rn[3]) { case "Unsynced": break; case "Visible": break; case "Print": break; case "Panes": break; case "Scale": break; case "Pane": break; case "Number": break; case "Layout": break; case "Header": break; case "Footer": break; case "PageSetup": break; case "PageMargins": break; case "Selected": break; case "ProtectObjects": break; case "EnableSelection": break; case "ProtectScenarios": break; case "ValidPrinterInfo": break; case "HorizontalResolution": break; case "VerticalResolution": break; case "NumberofCopies": break; case "ActiveRow": break; case "ActiveCol": break; case "ActivePane": break; case "TopRowVisible": break; case "TopRowBottomPane": break; case "LeftColumnVisible": break; case "LeftColumnRightPane": break; case "FitToPage": break; case "RangeSelection": break; case "PaperSizeIndex": break; case "PageLayoutZoom": break; case "PageBreakZoom": break; case "FilterOn": break; case "DoNotDisplayGridlines": break; case "SplitHorizontal": break; case "SplitVertical": break; case "FreezePanes": break; case "FrozenNoSplit": break; case "FitWidth": break; case "FitHeight": break; case "CommentsLayout": break; case "Zoom": break; case "LeftToRight": break; case "Gridlines": break; case "AllowSort": break; case "AllowFilter": break; case "AllowInsertRows": break; case "AllowDeleteRows": break; case "AllowInsertCols": break; case "AllowDeleteCols": break; case "AllowInsertHyperlinks": break; case "AllowFormatCells": break; case "AllowSizeCols": break; case "AllowSizeRows": break; case "NoSummaryRowsBelowDetail": break; case "TabColorIndex": break; case "DoNotDisplayHeadings": break; case "ShowPageLayoutZoom": break; case "NoSummaryColumnsRightDetail": break; case "BlackAndWhite": break; case "DoNotDisplayZeros": break; case "DisplayPageBreak": break; case "RowColHeadings": break; case "DoNotDisplayOutline": break; case "NoOrientation": break; case "AllowUsePivotTables": break; case "ZeroHeight": break; case "ViewableRange": break; case "Selection": break; case "ProtectContents": break; default: seen = false } break; case "PivotTable": case "PivotCache": switch (Rn[3]) { case "ImmediateItemsOnDrop": break; case "ShowPageMultipleItemLabel": break; case "CompactRowIndent": break; case "Location": break; case "PivotField": break; case "Orientation": break; case "LayoutForm": break; case "LayoutSubtotalLocation": break; case "LayoutCompactRow": break; case "Position": break; case "PivotItem": break; case "DataType": break; case "DataField": break; case "SourceName": break; case "ParentField": break; case "PTLineItems": break; case "PTLineItem": break; case "CountOfSameItems": break; case "Item": break; case "ItemType": break; case "PTSource": break; case "CacheIndex": break; case "ConsolidationReference": break; case "FileName": break; case "Reference": break; case "NoColumnGrand": break; case "NoRowGrand": break; case "BlankLineAfterItems": break; case "Hidden": break; case "Subtotal": break; case "BaseField": break; case "MapChildItems": break; case "Function": break; case "RefreshOnFileOpen": break; case "PrintSetTitles": break; case "MergeLabels": break; case "DefaultVersion": break; case "RefreshName": break; case "RefreshDate": break; case "RefreshDateCopy": break; case "VersionLastRefresh": break; case "VersionLastUpdate": break; case "VersionUpdateableMin": break; case "VersionRefreshableMin": break; case "Calculation": break; default: seen = false } break; case "PageBreaks": switch (Rn[3]) { case "ColBreaks": break; case "ColBreak": break; case "RowBreaks": break; case "RowBreak": break; case "ColStart": break; case "ColEnd": break; case "RowEnd": break; default: seen = false } break; case "AutoFilter": switch (Rn[3]) { case "AutoFilterColumn": break; case "AutoFilterCondition": break; case "AutoFilterAnd": break; case "AutoFilterOr": break; default: seen = false } break; case "QueryTable": switch (Rn[3]) { case "Id": break; case "AutoFormatFont": break; case "AutoFormatPattern": break; case "QuerySource": break; case "QueryType": break; case "EnableRedirections": break; case "RefreshedInXl9": break; case "URLString": break; case "HTMLTables": break; case "Connection": break; case "CommandText": break; case "RefreshInfo": break; case "NoTitles": break; case "NextId": break; case "ColumnInfo": break; case "OverwriteCells": break; case "DoNotPromptForFile": break; case "TextWizardSettings": break; case "Source": break; case "Number": break; case "Decimal": break; case "ThousandSeparator": break; case "TrailingMinusNumbers": break; case "FormatSettings": break; case "FieldType": break; case "Delimiters": break; case "Tab": break; case "Comma": break; case "AutoFormatName": break; case "VersionLastEdit": break; case "VersionLastRefresh": break; default: seen = false } break; case "Sorting": case "ConditionalFormatting": case "DataValidation": switch (Rn[3]) { case "Range": break; case "Type": break; case "Min": break; case "Max": break; case "Sort": break; case "Descending": break; case "Order": break; case "CaseSensitive": break; case "Value": break; case "ErrorStyle": break; case "ErrorMessage": break; case "ErrorTitle": break; case "CellRangeList": break; case "InputMessage": break; case "InputTitle": break; case "ComboHide": break; case "InputHide": break; case "Condition": break; case "Qualifier": break; case "UseBlank": break; case "Value1": break; case "Value2": break; case "Format": break; default: seen = false } break; case "MapInfo": case "Schema": case "data": switch (Rn[3]) { case "Map": break; case "Entry": break; case "Range": break; case "XPath": break; case "Field": break; case "XSDType": break; case "FilterOn": break; case "Aggregate": break; case "ElementType": break; case "AttributeType": break; case "schema": case "element": case "complexType": case "datatype": case "all": case "attribute": case "extends": break; case "row": break; default: seen = false } break; case "SmartTags": break; default: seen = false; break } if (seen) break; if (!state[state.length - 1][1]) throw "Unrecognized tag: " + Rn[3] + "|" + state.join("|"); if (state[state.length - 1][0] === "CustomDocumentProperties") { if (Rn[0].substr(-2) === "/>") break; else if (Rn[1] === "/") xlml_set_custprop(Custprops, Rn, cp, str.slice(pidx, Rn.index)); else { cp = Rn; pidx = Rn.index + Rn[0].length } break } if (opts.WTF) throw "Unrecognized tag: " + Rn[3] + "|" + state.join("|") } var out = {}; if (!opts.bookSheets && !opts.bookProps) out.Sheets = sheets; out.SheetNames = sheetnames; out.SSF = SSF.get_table(); out.Props = Props; out.Custprops = Custprops; return out } function parse_xlml(data, opts) { fix_read_opts(opts = opts || {}); switch (opts.type || "base64") { case "base64": return parse_xlml_xml(Base64.decode(data), opts); case "binary": case "buffer": case "file": return parse_xlml_xml(data, opts); case "array": return parse_xlml_xml(data.map(_chr).join(""), opts) } } function write_xlml(wb, opts) {} function parse_compobj(obj) { var v = {}; var o = obj.content; var l = 28, m; m = __lpstr(o, l); l += 4 + __readUInt32LE(o, l); v.UserType = m; m = __readUInt32LE(o, l); l += 4; switch (m) { case 0: break; case 4294967295: case 4294967294: l += 4; break; default: if (m > 400) throw new Error("Unsupported Clipboard: " + m.toString(16)); l += m } m = __lpstr(o, l); l += m.length === 0 ? 0 : 5 + m.length; v.Reserved1 = m; if ((m = __readUInt32LE(o, l)) !== 1907550708) return v; throw "Unsupported Unicode Extension" } function slurp(R, blob, length, opts) { var l = length; var bufs = []; var d = blob.slice(blob.l, blob.l + l); if (opts && opts.enc && opts.enc.insitu_decrypt) switch (R.n) { case "BOF": case "FilePass": case "FileLock": case "InterfaceHdr": case "RRDInfo": case "RRDHead": case "UsrExcl": break; default: if (d.length === 0) break; opts.enc.insitu_decrypt(d) } bufs.push(d); blob.l += l; var next = XLSRecordEnum[__readUInt16LE(blob, blob.l)]; while (next != null && next.n === "Continue") { l = __readUInt16LE(blob, blob.l + 2); bufs.push(blob.slice(blob.l + 4, blob.l + 4 + l)); blob.l += 4 + l; next = XLSRecordEnum[__readUInt16LE(blob, blob.l)] } var b = bconcat(bufs); prep_blob(b, 0); var ll = 0; b.lens = []; for (var j = 0; j < bufs.length; ++j) { b.lens.push(ll); ll += bufs[j].length } return R.f(b, b.length, opts) } function safe_format_xf(p, opts, date1904) { if (!p.XF) return; try { var fmtid = p.XF.ifmt || 0; if (p.t === "e") { p.w = p.w || BErr[p.v] } else if (fmtid === 0) { if (p.t === "n") { if ((p.v | 0) === p.v) p.w = SSF._general_int(p.v); else p.w = SSF._general_num(p.v) } else p.w = SSF._general(p.v) } else p.w = SSF.format(fmtid, p.v, { date1904: date1904 || false }); if (opts.cellNF) p.z = SSF._table[fmtid] } catch (e) { if (opts.WTF) throw e } } function make_cell(val, ixfe, t) { return { v: val, ixfe: ixfe, t: t } } function parse_workbook(blob, options) { var wb = { opts: {} }; var Sheets = {}; var out = {}; var Directory = {}; var found_sheet = false; var range = {}; var last_formula = null; var sst = []; var cur_sheet = ""; var Preamble = {}; var lastcell, last_cell, cc, cmnt, rng, rngC, rngR; var shared_formulae = {}; var array_formulae = []; var temp_val; var country; var cell_valid = true; var XFs = []; var palette = []; var get_rgb = function getrgb(icv) { if (icv < 8) return XLSIcv[icv]; if (icv < 64) return palette[icv - 8] || XLSIcv[icv]; return XLSIcv[icv] }; var process_cell_style = function pcs(cell, line) { var xfd = line.XF.data; if (!xfd || !xfd.patternType) return; line.s = {}; line.s.patternType = xfd.patternType; var t; if (t = rgb2Hex(get_rgb(xfd.icvFore))) { line.s.fgColor = { rgb: t } } if (t = rgb2Hex(get_rgb(xfd.icvBack))) { line.s.bgColor = { rgb: t } } }; var addcell = function addcell(cell, line, options) { if (!cell_valid) return; if (options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line); lastcell = cell; last_cell = encode_cell(cell); if (range.s) { if (cell.r < range.s.r) range.s.r = cell.r; if (cell.c < range.s.c) range.s.c = cell.c } if (range.e) { if (cell.r + 1 > range.e.r) range.e.r = cell.r + 1; if (cell.c + 1 > range.e.c) range.e.c = cell.c + 1 } if (options.sheetRows && lastcell.r >= options.sheetRows) cell_valid = false; else out[last_cell] = line }; var opts = { enc: false, sbcch: 0, snames: [], sharedf: shared_formulae, arrayf: array_formulae, rrtabid: [], lastuser: "", biff: 8, codepage: 0, winlocked: 0, wtf: false }; if (options.password) opts.password = options.password; var mergecells = []; var objects = []; var supbooks = [[]]; var sbc = 0, sbci = 0, sbcli = 0; supbooks.SheetNames = opts.snames; supbooks.sharedf = opts.sharedf; supbooks.arrayf = opts.arrayf; var last_Rn = ""; var file_depth = 0; opts.codepage = 1200; set_cp(1200); while (blob.l < blob.length - 1) { var s = blob.l; var RecordType = blob.read_shift(2); if (RecordType === 0 && last_Rn === "EOF") break; var length = blob.l === blob.length ? 0 : blob.read_shift(2), y; var R = XLSRecordEnum[RecordType]; if (R && R.f) { if (options.bookSheets) { if (last_Rn === "BoundSheet8" && R.n !== "BoundSheet8") break } last_Rn = R.n; if (R.r === 2 || R.r == 12) { var rt = blob.read_shift(2); length -= 2; if (!opts.enc && rt !== RecordType) throw "rt mismatch"; if (R.r == 12) { blob.l += 10; length -= 10 } } var val; if (R.n === "EOF") val = R.f(blob, length, opts); else val = slurp(R, blob, length, opts); var Rn = R.n; if (opts.biff === 5 || opts.biff === 2) switch (Rn) { case "Lbl": Rn = "Label"; break } switch (Rn) { case "Date1904": wb.opts.Date1904 = val; break; case "WriteProtect": wb.opts.WriteProtect = true; break; case "FilePass": if (!opts.enc) blob.l = 0; opts.enc = val; if (opts.WTF) console.error(val); if (!options.password) throw new Error("File is password-protected"); if (val.Type !== 0) throw new Error("Encryption scheme unsupported"); if (!val.valid) throw new Error("Password is incorrect"); break; case "WriteAccess": opts.lastuser = val; break; case "FileSharing": break; case "CodePage": if (val === 21010) val = 1200; else if (val === 32769) val = 1252; opts.codepage = val; set_cp(val); break; case "RRTabId": opts.rrtabid = val; break; case "WinProtect": opts.winlocked = val; break; case "Template": break; case "RefreshAll": wb.opts.RefreshAll = val; break; case "BookBool": break; case "UsesELFs": break; case "MTRSettings": { if (val[0] && val[1]) throw "Unsupported threads: " + val } break; case "CalcCount": wb.opts.CalcCount = val; break; case "CalcDelta": wb.opts.CalcDelta = val; break; case "CalcIter": wb.opts.CalcIter = val; break; case "CalcMode": wb.opts.CalcMode = val; break; case "CalcPrecision": wb.opts.CalcPrecision = val; break; case "CalcSaveRecalc": wb.opts.CalcSaveRecalc = val; break; case "CalcRefMode": opts.CalcRefMode = val; break; case "Uncalced": break; case "ForceFullCalculation": wb.opts.FullCalc = val; break; case "WsBool": break; case "XF": XFs.push(val); break; case "ExtSST": break; case "BookExt": break; case "RichTextStream": break; case "BkHim": break; case "SupBook": supbooks[++sbc] = [val]; sbci = 0; break; case "ExternName": supbooks[sbc][++sbci] = val; break; case "Index": break; case "Lbl": supbooks[0][++sbcli] = val; break; case "ExternSheet": supbooks[sbc] = supbooks[sbc].concat(val); sbci += val.length; break; case "Protect": out["!protect"] = val; break; case "Password": if (val !== 0 && opts.WTF) console.error("Password verifier: " + val); break; case "Prot4Rev": case "Prot4RevPass": break; case "BoundSheet8": { Directory[val.pos] = val; opts.snames.push(val.name) } break; case "EOF": { if (--file_depth) break; if (range.e) { out["!range"] = range; if (range.e.r > 0 && range.e.c > 0) { range.e.r--; range.e.c--; out["!ref"] = encode_range(range); range.e.r++; range.e.c++ } if (mergecells.length > 0) out["!merges"] = mergecells; if (objects.length > 0) out["!objects"] = objects } if (cur_sheet === "") Preamble = out; else Sheets[cur_sheet] = out; out = {} } break; case "BOF": { if (opts.biff !== 8); else if (val.BIFFVer === 1280) opts.biff = 5; else if (val.BIFFVer === 2) opts.biff = 2; else if (val.BIFFVer === 7) opts.biff = 2; if (file_depth++) break; cell_valid = true; out = {}; if (opts.biff === 2) { if (cur_sheet === "") cur_sheet = "Sheet1"; range = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } } } else cur_sheet = (Directory[s] || { name: "" }).name; mergecells = []; objects = [] } break; case "Number": case "BIFF2NUM": { temp_val = { ixfe: val.ixfe, XF: XFs[val.ixfe], v: val.val, t: "n" }; if (temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({ c: val.c, r: val.r }, temp_val, options) } break; case "BoolErr": { temp_val = { ixfe: val.ixfe, XF: XFs[val.ixfe], v: val.val, t: val.t }; if (temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({ c: val.c, r: val.r }, temp_val, options) } break; case "RK": { temp_val = { ixfe: val.ixfe, XF: XFs[val.ixfe], v: val.rknum, t: "n" }; if (temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({ c: val.c, r: val.r }, temp_val, options) } break; case "MulRk": { for (var j = val.c; j <= val.C; ++j) { var ixfe = val.rkrec[j - val.c][0]; temp_val = { ixfe: ixfe, XF: XFs[ixfe], v: val.rkrec[j - val.c][1], t: "n" }; if (temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({ c: j, r: val.r }, temp_val, options) } } break; case "Formula": { switch (val.val) { case "String": last_formula = val; break; case "Array Formula": throw "Array Formula unsupported"; default: temp_val = { v: val.val, ixfe: val.cell.ixfe, t: val.tt }; temp_val.XF = XFs[temp_val.ixfe]; if (options.cellFormula) temp_val.f = "=" + stringify_formula(val.formula, range, val.cell, supbooks, opts); if (temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904); addcell(val.cell, temp_val, options); last_formula = val } } break; case "String": { if (last_formula) { last_formula.val = val; temp_val = { v: last_formula.val, ixfe: last_formula.cell.ixfe, t: "s" }; temp_val.XF = XFs[temp_val.ixfe]; if (options.cellFormula) temp_val.f = "=" + stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts); if (temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904); addcell(last_formula.cell, temp_val, options); last_formula = null } } break; case "Array": { array_formulae.push(val) } break; case "ShrFmla": { if (!cell_valid) break; shared_formulae[encode_cell(last_formula.cell)] = val[0] } break; case "LabelSst": temp_val = make_cell(sst[val.isst].t, val.ixfe, "s"); temp_val.XF = XFs[temp_val.ixfe]; if (temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({ c: val.c, r: val.r }, temp_val, options); break; case "Label": case "BIFF2STR": temp_val = make_cell(val.val, val.ixfe, "s"); temp_val.XF = XFs[temp_val.ixfe]; if (temp_val.XF) safe_format_xf(temp_val, options, wb.opts.Date1904); addcell({ c: val.c, r: val.r }, temp_val, options); break; case "Dimensions": { if (file_depth === 1) range = val } break; case "SST": { sst = val } break; case "Format": { SSF.load(val[1], val[0]) } break; case "MergeCells": mergecells = mergecells.concat(val); break; case "Obj": objects[val.cmo[0]] = opts.lastobj = val; break; case "TxO": opts.lastobj.TxO = val; break; case "HLink": { for (rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR) for (rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) if (out[encode_cell({ c: rngC, r: rngR })]) out[encode_cell({ c: rngC, r: rngR })].l = val[1] } break; case "HLinkTooltip": { for (rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR) for (rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) if (out[encode_cell({ c: rngC, r: rngR })]) out[encode_cell({ c: rngC, r: rngR })].l.tooltip = val[1] } break; case "Note": { if (opts.biff <= 5 && opts.biff >= 2) break; cc = out[encode_cell(val[0])]; var noteobj = objects[val[2]]; if (!cc) break; if (!cc.c) cc.c = []; cmnt = { a: val[1], t: noteobj.TxO.t }; cc.c.push(cmnt) } break; default: switch (R.n) { case "ClrtClient": break; case "XFExt": update_xfext(XFs[val.ixfe], val.ext); break; case "NameCmt": break; case "Header": break; case "Footer": break; case "HCenter": break; case "VCenter": break; case "Pls": break; case "Setup": break; case "DefColWidth": break; case "GCW": break; case "LHRecord": break; case "ColInfo": break; case "Row": break; case "DBCell": break; case "MulBlank": break; case "EntExU2": break; case "SxView": break; case "Sxvd": break; case "SXVI": break; case "SXVDEx": break; case "SxIvd": break; case "SXDI": break; case "SXLI": break; case "SXEx": break; case "QsiSXTag": break; case "Selection": break; case "Feat": break; case "FeatHdr": case "FeatHdr11": break; case "Feature11": case "Feature12": case "List12": break; case "Blank": break; case "Country": country = val; break; case "RecalcId": break; case "DefaultRowHeight": case "DxGCol": break; case "Fbi": case "Fbi2": case "GelFrame": break; case "Font": break; case "XFCRC": break; case "Style": break; case "StyleExt": break; case "Palette": palette = val; break; case "Theme": break; case "ScenarioProtect": break; case "ObjProtect": break; case "CondFmt12": break; case "Table": break; case "TableStyles": break; case "TableStyle": break; case "TableStyleElement": break; case "SXStreamID": break; case "SXVS": break; case "DConRef": break; case "SXAddl": break; case "DConBin": break; case "DConName": break; case "SXPI": break; case "SxFormat": break; case "SxSelect": break; case "SxRule": break; case "SxFilt": break; case "SxItm": break; case "SxDXF": break; case "ScenMan": break; case "DCon": break; case "CellWatch": break; case "PrintRowCol": break; case "PrintGrid": break; case "PrintSize": break; case "XCT": break; case "CRN": break; case "Scl": {} break; case "SheetExt": {} break; case "SheetExtOptional": {} break; case "ObNoMacros": {} break; case "ObProj": {} break; case "CodeName": {} break; case "GUIDTypeLib": {} break; case "WOpt": break; case "PhoneticInfo": break; case "OleObjectSize": break; case "DXF": case "DXFN": case "DXFN12": case "DXFN12List": case "DXFN12NoCB": break; case "Dv": case "DVal": break; case "BRAI": case "Series": case "SeriesText": break; case "DConn": break; case "DbOrParamQry": break; case "DBQueryExt": break; case "IFmtRecord": break; case "CondFmt": case "CF": case "CF12": case "CFEx": break; case "Excel9File": break; case "Units": break; case "InterfaceHdr": case "Mms": case "InterfaceEnd": case "DSF": case "BuiltInFnGroupCount": case "Window1": case "Window2": case "HideObj": case "GridSet": case "Guts": case "UserBView": case "UserSViewBegin": case "UserSViewEnd": case "Pane": break; default: switch (R.n) { case "Dat": case "Begin": case "End": case "StartBlock": case "EndBlock": case "Frame": case "Area": case "Axis": case "AxisLine": case "Tick": break; case "AxesUsed": case "CrtLayout12": case "CrtLayout12A": case "CrtLink": case "CrtLine": case "CrtMlFrt": case "CrtMlFrtContinue": break; case "LineFormat": case "AreaFormat": case "Chart": case "Chart3d": case "Chart3DBarShape": case "ChartFormat": case "ChartFrtInfo": break; case "PlotArea": case "PlotGrowth": break; case "SeriesList": case "SerParent": case "SerAuxTrend": break; case "DataFormat": case "SerToCrt": case "FontX": break; case "CatSerRange": case "AxcExt": case "SerFmt": break; case "ShtProps": break; case "DefaultText": case "Text": case "CatLab": break; case "DataLabExtContents": break; case "Legend": case "LegendException": break; case "Pie": case "Scatter": break; case "PieFormat": case "MarkerFormat": break; case "StartObject": case "EndObject": break; case "AlRuns": case "ObjectLink": break; case "SIIndex": break; case "AttachedLabel": case "YMult": break; case "Line": case "Bar": break; case "Surf": break; case "AxisParent": break; case "Pos": break; case "ValueRange": break; case "SXViewEx9": break; case "SXViewLink": break; case "PivotChartBits": break; case "SBaseRef": break; case "TextPropsStream": break; case "LnExt": break; case "MkrExt": break; case "CrtCoopt": break; case "Qsi": case "Qsif": case "Qsir": case "QsiSXTag": break; case "TxtQry": break; case "FilterMode": break; case "AutoFilter": case "AutoFilterInfo": break; case "AutoFilter12": break; case "DropDownObjIds": break; case "Sort": break; case "SortData": break; case "ShapePropsStream": break; case "MsoDrawing": case "MsoDrawingGroup": case "MsoDrawingSelection": break; case "ImData": break; case "WebPub": case "AutoWebPub": case "RightMargin": case "LeftMargin": case "TopMargin": case "BottomMargin": case "HeaderFooter": case "HFPicture": case "PLV": case "HorizontalPageBreaks": case "VerticalPageBreaks": case "Backup": case "CompressPictures": case "Compat12": break; case "Continue": case "ContinueFrt12": break; case "FrtFontList": case "FrtWrapper": break; case "ExternCount": break; case "RString": break; case "TabIdConf": case "Radar": case "RadarArea": case "DropBar": case "Intl": case "CoordList": case "SerAuxErrBar": break; default: switch (R.n) { case "SCENARIO": case "DConBin": case "PicF": case "DataLabExt": case "Lel": case "BopPop": case "BopPopCustom": case "RealTimeData": case "Name": break; default: if (options.WTF) throw "Unrecognized Record " + R.n } } } } } else blob.l += length } var sheetnamesraw = opts.biff === 2 ? ["Sheet1"] : Object.keys(Directory).sort(function (a, b) { return Number(a) - Number(b) }).map(function (x) { return Directory[x].name }); var sheetnames = sheetnamesraw.slice(); wb.Directory = sheetnamesraw; wb.SheetNames = sheetnamesraw; if (!options.bookSheets) wb.Sheets = Sheets; wb.Preamble = Preamble; wb.Strings = sst; wb.SSF = SSF.get_table(); if (opts.enc) wb.Encryption = opts.enc; wb.Metadata = {}; if (country !== undefined) wb.Metadata.Country = country; return wb } function parse_xlscfb(cfb, options) { if (!options) options = {}; fix_read_opts(options); reset_cp(); var CompObj, Summary, Workbook; if (cfb.find) { CompObj = cfb.find("!CompObj"); Summary = cfb.find("!SummaryInformation"); Workbook = cfb.find("/Workbook") } else { prep_blob(cfb, 0); Workbook = { content: cfb } } if (!Workbook) Workbook = cfb.find("/Book"); var CompObjP, SummaryP, WorkbookP; if (CompObj) CompObjP = parse_compobj(CompObj); if (options.bookProps && !options.bookSheets) WorkbookP = {}; else { if (Workbook) WorkbookP = parse_workbook(Workbook.content, options, !!Workbook.find); else throw new Error("Cannot find Workbook stream") } if (cfb.find) parse_props(cfb); var props = {}; for (var y in cfb.Summary) props[y] = cfb.Summary[y]; for (y in cfb.DocSummary) props[y] = cfb.DocSummary[y]; WorkbookP.Props = WorkbookP.Custprops = props; if (options.bookFiles) WorkbookP.cfb = cfb; WorkbookP.CompObjP = CompObjP; return WorkbookP } function parse_props(cfb) { var DSI = cfb.find("!DocumentSummaryInformation"); if (DSI) try { cfb.DocSummary = parse_PropertySetStream(DSI, DocSummaryPIDDSI) } catch (e) {} var SI = cfb.find("!SummaryInformation"); if (SI) try { cfb.Summary = parse_PropertySetStream(SI, SummaryPIDSI) } catch (e) {} } var XLSBRecordEnum = { 0: { n: "BrtRowHdr", f: parse_BrtRowHdr }, 1: { n: "BrtCellBlank", f: parse_BrtCellBlank }, 2: { n: "BrtCellRk", f: parse_BrtCellRk }, 3: { n: "BrtCellError", f: parse_BrtCellError }, 4: { n: "BrtCellBool", f: parse_BrtCellBool }, 5: { n: "BrtCellReal", f: parse_BrtCellReal }, 6: { n: "BrtCellSt", f: parse_BrtCellSt }, 7: { n: "BrtCellIsst", f: parse_BrtCellIsst }, 8: { n: "BrtFmlaString", f: parse_BrtFmlaString }, 9: { n: "BrtFmlaNum", f: parse_BrtFmlaNum }, 10: { n: "BrtFmlaBool", f: parse_BrtFmlaBool }, 11: { n: "BrtFmlaError", f: parse_BrtFmlaError }, 16: { n: "BrtFRTArchID$", f: parse_BrtFRTArchID$ }, 19: { n: "BrtSSTItem", f: parse_RichStr }, 20: { n: "BrtPCDIMissing", f: parsenoop }, 21: { n: "BrtPCDINumber", f: parsenoop }, 22: { n: "BrtPCDIBoolean", f: parsenoop }, 23: { n: "BrtPCDIError", f: parsenoop }, 24: { n: "BrtPCDIString", f: parsenoop }, 25: { n: "BrtPCDIDatetime", f: parsenoop }, 26: { n: "BrtPCDIIndex", f: parsenoop }, 27: { n: "BrtPCDIAMissing", f: parsenoop }, 28: { n: "BrtPCDIANumber", f: parsenoop }, 29: { n: "BrtPCDIABoolean", f: parsenoop }, 30: { n: "BrtPCDIAError", f: parsenoop }, 31: { n: "BrtPCDIAString", f: parsenoop }, 32: { n: "BrtPCDIADatetime", f: parsenoop }, 33: { n: "BrtPCRRecord", f: parsenoop }, 34: { n: "BrtPCRRecordDt", f: parsenoop }, 35: { n: "BrtFRTBegin", f: parsenoop }, 36: { n: "BrtFRTEnd", f: parsenoop }, 37: { n: "BrtACBegin", f: parsenoop }, 38: { n: "BrtACEnd", f: parsenoop }, 39: { n: "BrtName", f: parsenoop }, 40: { n: "BrtIndexRowBlock", f: parsenoop }, 42: { n: "BrtIndexBlock", f: parsenoop }, 43: { n: "BrtFont", f: parse_BrtFont }, 44: { n: "BrtFmt", f: parse_BrtFmt }, 45: { n: "BrtFill", f: parsenoop }, 46: { n: "BrtBorder", f: parsenoop }, 47: { n: "BrtXF", f: parse_BrtXF }, 48: { n: "BrtStyle", f: parsenoop }, 49: { n: "BrtCellMeta", f: parsenoop }, 50: { n: "BrtValueMeta", f: parsenoop }, 51: { n: "BrtMdb", f: parsenoop }, 52: { n: "BrtBeginFmd", f: parsenoop }, 53: { n: "BrtEndFmd", f: parsenoop }, 54: { n: "BrtBeginMdx", f: parsenoop }, 55: { n: "BrtEndMdx", f: parsenoop }, 56: { n: "BrtBeginMdxTuple", f: parsenoop }, 57: { n: "BrtEndMdxTuple", f: parsenoop }, 58: { n: "BrtMdxMbrIstr", f: parsenoop }, 59: { n: "BrtStr", f: parsenoop }, 60: { n: "BrtColInfo", f: parsenoop }, 62: { n: "BrtCellRString", f: parsenoop }, 63: { n: "BrtCalcChainItem$", f: parse_BrtCalcChainItem$ }, 64: { n: "BrtDVal", f: parsenoop }, 65: { n: "BrtSxvcellNum", f: parsenoop }, 66: { n: "BrtSxvcellStr", f: parsenoop }, 67: { n: "BrtSxvcellBool", f: parsenoop }, 68: { n: "BrtSxvcellErr", f: parsenoop }, 69: { n: "BrtSxvcellDate", f: parsenoop }, 70: { n: "BrtSxvcellNil", f: parsenoop }, 128: { n: "BrtFileVersion", f: parsenoop }, 129: { n: "BrtBeginSheet", f: parsenoop }, 130: { n: "BrtEndSheet", f: parsenoop }, 131: { n: "BrtBeginBook", f: parsenoop, p: 0 }, 132: { n: "BrtEndBook", f: parsenoop }, 133: { n: "BrtBeginWsViews", f: parsenoop }, 134: { n: "BrtEndWsViews", f: parsenoop }, 135: { n: "BrtBeginBookViews", f: parsenoop }, 136: { n: "BrtEndBookViews", f: parsenoop }, 137: { n: "BrtBeginWsView", f: parsenoop }, 138: { n: "BrtEndWsView", f: parsenoop }, 139: { n: "BrtBeginCsViews", f: parsenoop }, 140: { n: "BrtEndCsViews", f: parsenoop }, 141: { n: "BrtBeginCsView", f: parsenoop }, 142: { n: "BrtEndCsView", f: parsenoop }, 143: { n: "BrtBeginBundleShs", f: parsenoop }, 144: { n: "BrtEndBundleShs", f: parsenoop }, 145: { n: "BrtBeginSheetData", f: parsenoop }, 146: { n: "BrtEndSheetData", f: parsenoop }, 147: { n: "BrtWsProp", f: parse_BrtWsProp }, 148: { n: "BrtWsDim", f: parse_BrtWsDim, p: 16 }, 151: { n: "BrtPane", f: parsenoop }, 152: { n: "BrtSel", f: parsenoop }, 153: { n: "BrtWbProp", f: parse_BrtWbProp }, 154: { n: "BrtWbFactoid", f: parsenoop }, 155: { n: "BrtFileRecover", f: parsenoop }, 156: { n: "BrtBundleSh", f: parse_BrtBundleSh }, 157: { n: "BrtCalcProp", f: parsenoop }, 158: { n: "BrtBookView", f: parsenoop }, 159: { n: "BrtBeginSst", f: parse_BrtBeginSst }, 160: { n: "BrtEndSst", f: parsenoop }, 161: { n: "BrtBeginAFilter", f: parsenoop }, 162: { n: "BrtEndAFilter", f: parsenoop }, 163: { n: "BrtBeginFilterColumn", f: parsenoop }, 164: { n: "BrtEndFilterColumn", f: parsenoop }, 165: { n: "BrtBeginFilters", f: parsenoop }, 166: { n: "BrtEndFilters", f: parsenoop }, 167: { n: "BrtFilter", f: parsenoop }, 168: { n: "BrtColorFilter", f: parsenoop }, 169: { n: "BrtIconFilter", f: parsenoop }, 170: { n: "BrtTop10Filter", f: parsenoop }, 171: { n: "BrtDynamicFilter", f: parsenoop }, 172: { n: "BrtBeginCustomFilters", f: parsenoop }, 173: { n: "BrtEndCustomFilters", f: parsenoop }, 174: { n: "BrtCustomFilter", f: parsenoop }, 175: { n: "BrtAFilterDateGroupItem", f: parsenoop }, 176: { n: "BrtMergeCell", f: parse_BrtMergeCell }, 177: { n: "BrtBeginMergeCells", f: parsenoop }, 178: { n: "BrtEndMergeCells", f: parsenoop }, 179: { n: "BrtBeginPivotCacheDef", f: parsenoop }, 180: { n: "BrtEndPivotCacheDef", f: parsenoop }, 181: { n: "BrtBeginPCDFields", f: parsenoop }, 182: { n: "BrtEndPCDFields", f: parsenoop }, 183: { n: "BrtBeginPCDField", f: parsenoop }, 184: { n: "BrtEndPCDField", f: parsenoop }, 185: { n: "BrtBeginPCDSource", f: parsenoop }, 186: { n: "BrtEndPCDSource", f: parsenoop }, 187: { n: "BrtBeginPCDSRange", f: parsenoop }, 188: { n: "BrtEndPCDSRange", f: parsenoop }, 189: { n: "BrtBeginPCDFAtbl", f: parsenoop }, 190: { n: "BrtEndPCDFAtbl", f: parsenoop }, 191: { n: "BrtBeginPCDIRun", f: parsenoop }, 192: { n: "BrtEndPCDIRun", f: parsenoop }, 193: { n: "BrtBeginPivotCacheRecords", f: parsenoop }, 194: { n: "BrtEndPivotCacheRecords", f: parsenoop }, 195: { n: "BrtBeginPCDHierarchies", f: parsenoop }, 196: { n: "BrtEndPCDHierarchies", f: parsenoop }, 197: { n: "BrtBeginPCDHierarchy", f: parsenoop }, 198: { n: "BrtEndPCDHierarchy", f: parsenoop }, 199: { n: "BrtBeginPCDHFieldsUsage", f: parsenoop }, 200: { n: "BrtEndPCDHFieldsUsage", f: parsenoop }, 201: { n: "BrtBeginExtConnection", f: parsenoop }, 202: { n: "BrtEndExtConnection", f: parsenoop }, 203: { n: "BrtBeginECDbProps", f: parsenoop }, 204: { n: "BrtEndECDbProps", f: parsenoop }, 205: { n: "BrtBeginECOlapProps", f: parsenoop }, 206: { n: "BrtEndECOlapProps", f: parsenoop }, 207: { n: "BrtBeginPCDSConsol", f: parsenoop }, 208: { n: "BrtEndPCDSConsol", f: parsenoop }, 209: { n: "BrtBeginPCDSCPages", f: parsenoop }, 210: { n: "BrtEndPCDSCPages", f: parsenoop }, 211: { n: "BrtBeginPCDSCPage", f: parsenoop }, 212: { n: "BrtEndPCDSCPage", f: parsenoop }, 213: { n: "BrtBeginPCDSCPItem", f: parsenoop }, 214: { n: "BrtEndPCDSCPItem", f: parsenoop }, 215: { n: "BrtBeginPCDSCSets", f: parsenoop }, 216: { n: "BrtEndPCDSCSets", f: parsenoop }, 217: { n: "BrtBeginPCDSCSet", f: parsenoop }, 218: { n: "BrtEndPCDSCSet", f: parsenoop }, 219: { n: "BrtBeginPCDFGroup", f: parsenoop }, 220: { n: "BrtEndPCDFGroup", f: parsenoop }, 221: { n: "BrtBeginPCDFGItems", f: parsenoop }, 222: { n: "BrtEndPCDFGItems", f: parsenoop }, 223: { n: "BrtBeginPCDFGRange", f: parsenoop }, 224: { n: "BrtEndPCDFGRange", f: parsenoop }, 225: { n: "BrtBeginPCDFGDiscrete", f: parsenoop }, 226: { n: "BrtEndPCDFGDiscrete", f: parsenoop }, 227: { n: "BrtBeginPCDSDTupleCache", f: parsenoop }, 228: { n: "BrtEndPCDSDTupleCache", f: parsenoop }, 229: { n: "BrtBeginPCDSDTCEntries", f: parsenoop }, 230: { n: "BrtEndPCDSDTCEntries", f: parsenoop }, 231: { n: "BrtBeginPCDSDTCEMembers", f: parsenoop }, 232: { n: "BrtEndPCDSDTCEMembers", f: parsenoop }, 233: { n: "BrtBeginPCDSDTCEMember", f: parsenoop }, 234: { n: "BrtEndPCDSDTCEMember", f: parsenoop }, 235: { n: "BrtBeginPCDSDTCQueries", f: parsenoop }, 236: { n: "BrtEndPCDSDTCQueries", f: parsenoop }, 237: { n: "BrtBeginPCDSDTCQuery", f: parsenoop }, 238: { n: "BrtEndPCDSDTCQuery", f: parsenoop }, 239: { n: "BrtBeginPCDSDTCSets", f: parsenoop }, 240: { n: "BrtEndPCDSDTCSets", f: parsenoop }, 241: { n: "BrtBeginPCDSDTCSet", f: parsenoop }, 242: { n: "BrtEndPCDSDTCSet", f: parsenoop }, 243: { n: "BrtBeginPCDCalcItems", f: parsenoop }, 244: { n: "BrtEndPCDCalcItems", f: parsenoop }, 245: { n: "BrtBeginPCDCalcItem", f: parsenoop }, 246: { n: "BrtEndPCDCalcItem", f: parsenoop }, 247: { n: "BrtBeginPRule", f: parsenoop }, 248: { n: "BrtEndPRule", f: parsenoop }, 249: { n: "BrtBeginPRFilters", f: parsenoop }, 250: { n: "BrtEndPRFilters", f: parsenoop }, 251: { n: "BrtBeginPRFilter", f: parsenoop }, 252: { n: "BrtEndPRFilter", f: parsenoop }, 253: { n: "BrtBeginPNames", f: parsenoop }, 254: { n: "BrtEndPNames", f: parsenoop }, 255: { n: "BrtBeginPName", f: parsenoop }, 256: { n: "BrtEndPName", f: parsenoop }, 257: { n: "BrtBeginPNPairs", f: parsenoop }, 258: { n: "BrtEndPNPairs", f: parsenoop }, 259: { n: "BrtBeginPNPair", f: parsenoop }, 260: { n: "BrtEndPNPair", f: parsenoop }, 261: { n: "BrtBeginECWebProps", f: parsenoop }, 262: { n: "BrtEndECWebProps", f: parsenoop }, 263: { n: "BrtBeginEcWpTables", f: parsenoop }, 264: { n: "BrtEndECWPTables", f: parsenoop }, 265: { n: "BrtBeginECParams", f: parsenoop }, 266: { n: "BrtEndECParams", f: parsenoop }, 267: { n: "BrtBeginECParam", f: parsenoop }, 268: { n: "BrtEndECParam", f: parsenoop }, 269: { n: "BrtBeginPCDKPIs", f: parsenoop }, 270: { n: "BrtEndPCDKPIs", f: parsenoop }, 271: { n: "BrtBeginPCDKPI", f: parsenoop }, 272: { n: "BrtEndPCDKPI", f: parsenoop }, 273: { n: "BrtBeginDims", f: parsenoop }, 274: { n: "BrtEndDims", f: parsenoop }, 275: { n: "BrtBeginDim", f: parsenoop }, 276: { n: "BrtEndDim", f: parsenoop }, 277: { n: "BrtIndexPartEnd", f: parsenoop }, 278: { n: "BrtBeginStyleSheet", f: parsenoop }, 279: { n: "BrtEndStyleSheet", f: parsenoop }, 280: { n: "BrtBeginSXView", f: parsenoop }, 281: { n: "BrtEndSXVI", f: parsenoop }, 282: { n: "BrtBeginSXVI", f: parsenoop }, 283: { n: "BrtBeginSXVIs", f: parsenoop }, 284: { n: "BrtEndSXVIs", f: parsenoop }, 285: { n: "BrtBeginSXVD", f: parsenoop }, 286: { n: "BrtEndSXVD", f: parsenoop }, 287: { n: "BrtBeginSXVDs", f: parsenoop }, 288: { n: "BrtEndSXVDs", f: parsenoop }, 289: { n: "BrtBeginSXPI", f: parsenoop }, 290: { n: "BrtEndSXPI", f: parsenoop }, 291: { n: "BrtBeginSXPIs", f: parsenoop }, 292: { n: "BrtEndSXPIs", f: parsenoop }, 293: { n: "BrtBeginSXDI", f: parsenoop }, 294: { n: "BrtEndSXDI", f: parsenoop }, 295: { n: "BrtBeginSXDIs", f: parsenoop }, 296: { n: "BrtEndSXDIs", f: parsenoop }, 297: { n: "BrtBeginSXLI", f: parsenoop }, 298: { n: "BrtEndSXLI", f: parsenoop }, 299: { n: "BrtBeginSXLIRws", f: parsenoop }, 300: { n: "BrtEndSXLIRws", f: parsenoop }, 301: { n: "BrtBeginSXLICols", f: parsenoop }, 302: { n: "BrtEndSXLICols", f: parsenoop }, 303: { n: "BrtBeginSXFormat", f: parsenoop }, 304: { n: "BrtEndSXFormat", f: parsenoop }, 305: { n: "BrtBeginSXFormats", f: parsenoop }, 306: { n: "BrtEndSxFormats", f: parsenoop }, 307: { n: "BrtBeginSxSelect", f: parsenoop }, 308: { n: "BrtEndSxSelect", f: parsenoop }, 309: { n: "BrtBeginISXVDRws", f: parsenoop }, 310: { n: "BrtEndISXVDRws", f: parsenoop }, 311: { n: "BrtBeginISXVDCols", f: parsenoop }, 312: { n: "BrtEndISXVDCols", f: parsenoop }, 313: { n: "BrtEndSXLocation", f: parsenoop }, 314: { n: "BrtBeginSXLocation", f: parsenoop }, 315: { n: "BrtEndSXView", f: parsenoop }, 316: { n: "BrtBeginSXTHs", f: parsenoop }, 317: { n: "BrtEndSXTHs", f: parsenoop }, 318: { n: "BrtBeginSXTH", f: parsenoop }, 319: { n: "BrtEndSXTH", f: parsenoop }, 320: { n: "BrtBeginISXTHRws", f: parsenoop }, 321: { n: "BrtEndISXTHRws", f: parsenoop }, 322: { n: "BrtBeginISXTHCols", f: parsenoop }, 323: { n: "BrtEndISXTHCols", f: parsenoop }, 324: { n: "BrtBeginSXTDMPS", f: parsenoop }, 325: { n: "BrtEndSXTDMPs", f: parsenoop }, 326: { n: "BrtBeginSXTDMP", f: parsenoop }, 327: { n: "BrtEndSXTDMP", f: parsenoop }, 328: { n: "BrtBeginSXTHItems", f: parsenoop }, 329: { n: "BrtEndSXTHItems", f: parsenoop }, 330: { n: "BrtBeginSXTHItem", f: parsenoop }, 331: { n: "BrtEndSXTHItem", f: parsenoop }, 332: { n: "BrtBeginMetadata", f: parsenoop }, 333: { n: "BrtEndMetadata", f: parsenoop }, 334: { n: "BrtBeginEsmdtinfo", f: parsenoop }, 335: { n: "BrtMdtinfo", f: parsenoop }, 336: { n: "BrtEndEsmdtinfo", f: parsenoop }, 337: { n: "BrtBeginEsmdb", f: parsenoop }, 338: { n: "BrtEndEsmdb", f: parsenoop }, 339: { n: "BrtBeginEsfmd", f: parsenoop }, 340: { n: "BrtEndEsfmd", f: parsenoop }, 341: { n: "BrtBeginSingleCells", f: parsenoop }, 342: { n: "BrtEndSingleCells", f: parsenoop }, 343: { n: "BrtBeginList", f: parsenoop }, 344: { n: "BrtEndList", f: parsenoop }, 345: { n: "BrtBeginListCols", f: parsenoop }, 346: { n: "BrtEndListCols", f: parsenoop }, 347: { n: "BrtBeginListCol", f: parsenoop }, 348: { n: "BrtEndListCol", f: parsenoop }, 349: { n: "BrtBeginListXmlCPr", f: parsenoop }, 350: { n: "BrtEndListXmlCPr", f: parsenoop }, 351: { n: "BrtListCCFmla", f: parsenoop }, 352: { n: "BrtListTrFmla", f: parsenoop }, 353: { n: "BrtBeginExternals", f: parsenoop }, 354: { n: "BrtEndExternals", f: parsenoop }, 355: { n: "BrtSupBookSrc", f: parsenoop }, 357: { n: "BrtSupSelf", f: parsenoop }, 358: { n: "BrtSupSame", f: parsenoop }, 359: { n: "BrtSupTabs", f: parsenoop }, 360: { n: "BrtBeginSupBook", f: parsenoop }, 361: { n: "BrtPlaceholderName", f: parsenoop }, 362: { n: "BrtExternSheet", f: parsenoop }, 363: { n: "BrtExternTableStart", f: parsenoop }, 364: { n: "BrtExternTableEnd", f: parsenoop }, 366: { n: "BrtExternRowHdr", f: parsenoop }, 367: { n: "BrtExternCellBlank", f: parsenoop }, 368: { n: "BrtExternCellReal", f: parsenoop }, 369: { n: "BrtExternCellBool", f: parsenoop }, 370: { n: "BrtExternCellError", f: parsenoop }, 371: { n: "BrtExternCellString", f: parsenoop }, 372: { n: "BrtBeginEsmdx", f: parsenoop }, 373: { n: "BrtEndEsmdx", f: parsenoop }, 374: { n: "BrtBeginMdxSet", f: parsenoop }, 375: { n: "BrtEndMdxSet", f: parsenoop }, 376: { n: "BrtBeginMdxMbrProp", f: parsenoop }, 377: { n: "BrtEndMdxMbrProp", f: parsenoop }, 378: { n: "BrtBeginMdxKPI", f: parsenoop }, 379: { n: "BrtEndMdxKPI", f: parsenoop }, 380: { n: "BrtBeginEsstr", f: parsenoop }, 381: { n: "BrtEndEsstr", f: parsenoop }, 382: { n: "BrtBeginPRFItem", f: parsenoop }, 383: { n: "BrtEndPRFItem", f: parsenoop }, 384: { n: "BrtBeginPivotCacheIDs", f: parsenoop }, 385: { n: "BrtEndPivotCacheIDs", f: parsenoop }, 386: { n: "BrtBeginPivotCacheID", f: parsenoop }, 387: { n: "BrtEndPivotCacheID", f: parsenoop }, 388: { n: "BrtBeginISXVIs", f: parsenoop }, 389: { n: "BrtEndISXVIs", f: parsenoop }, 390: { n: "BrtBeginColInfos", f: parsenoop }, 391: { n: "BrtEndColInfos", f: parsenoop }, 392: { n: "BrtBeginRwBrk", f: parsenoop }, 393: { n: "BrtEndRwBrk", f: parsenoop }, 394: { n: "BrtBeginColBrk", f: parsenoop }, 395: { n: "BrtEndColBrk", f: parsenoop }, 396: { n: "BrtBrk", f: parsenoop }, 397: { n: "BrtUserBookView", f: parsenoop }, 398: { n: "BrtInfo", f: parsenoop }, 399: { n: "BrtCUsr", f: parsenoop }, 400: { n: "BrtUsr", f: parsenoop }, 401: { n: "BrtBeginUsers", f: parsenoop }, 403: { n: "BrtEOF", f: parsenoop }, 404: { n: "BrtUCR", f: parsenoop }, 405: { n: "BrtRRInsDel", f: parsenoop }, 406: { n: "BrtRREndInsDel", f: parsenoop }, 407: { n: "BrtRRMove", f: parsenoop }, 408: { n: "BrtRREndMove", f: parsenoop }, 409: { n: "BrtRRChgCell", f: parsenoop }, 410: { n: "BrtRREndChgCell", f: parsenoop }, 411: { n: "BrtRRHeader", f: parsenoop }, 412: { n: "BrtRRUserView", f: parsenoop }, 413: { n: "BrtRRRenSheet", f: parsenoop }, 414: { n: "BrtRRInsertSh", f: parsenoop }, 415: { n: "BrtRRDefName", f: parsenoop }, 416: { n: "BrtRRNote", f: parsenoop }, 417: { n: "BrtRRConflict", f: parsenoop }, 418: { n: "BrtRRTQSIF", f: parsenoop }, 419: { n: "BrtRRFormat", f: parsenoop }, 420: { n: "BrtRREndFormat", f: parsenoop }, 421: { n: "BrtRRAutoFmt", f: parsenoop }, 422: { n: "BrtBeginUserShViews", f: parsenoop }, 423: { n: "BrtBeginUserShView", f: parsenoop }, 424: { n: "BrtEndUserShView", f: parsenoop }, 425: { n: "BrtEndUserShViews", f: parsenoop }, 426: { n: "BrtArrFmla", f: parsenoop }, 427: { n: "BrtShrFmla", f: parsenoop }, 428: { n: "BrtTable", f: parsenoop }, 429: { n: "BrtBeginExtConnections", f: parsenoop }, 430: { n: "BrtEndExtConnections", f: parsenoop }, 431: { n: "BrtBeginPCDCalcMems", f: parsenoop }, 432: { n: "BrtEndPCDCalcMems", f: parsenoop }, 433: { n: "BrtBeginPCDCalcMem", f: parsenoop }, 434: { n: "BrtEndPCDCalcMem", f: parsenoop }, 435: { n: "BrtBeginPCDHGLevels", f: parsenoop }, 436: { n: "BrtEndPCDHGLevels", f: parsenoop }, 437: { n: "BrtBeginPCDHGLevel", f: parsenoop }, 438: { n: "BrtEndPCDHGLevel", f: parsenoop }, 439: { n: "BrtBeginPCDHGLGroups", f: parsenoop }, 440: { n: "BrtEndPCDHGLGroups", f: parsenoop }, 441: { n: "BrtBeginPCDHGLGroup", f: parsenoop }, 442: { n: "BrtEndPCDHGLGroup", f: parsenoop }, 443: { n: "BrtBeginPCDHGLGMembers", f: parsenoop }, 444: { n: "BrtEndPCDHGLGMembers", f: parsenoop }, 445: { n: "BrtBeginPCDHGLGMember", f: parsenoop }, 446: { n: "BrtEndPCDHGLGMember", f: parsenoop }, 447: { n: "BrtBeginQSI", f: parsenoop }, 448: { n: "BrtEndQSI", f: parsenoop }, 449: { n: "BrtBeginQSIR", f: parsenoop }, 450: { n: "BrtEndQSIR", f: parsenoop }, 451: { n: "BrtBeginDeletedNames", f: parsenoop }, 452: { n: "BrtEndDeletedNames", f: parsenoop }, 453: { n: "BrtBeginDeletedName", f: parsenoop }, 454: { n: "BrtEndDeletedName", f: parsenoop }, 455: { n: "BrtBeginQSIFs", f: parsenoop }, 456: { n: "BrtEndQSIFs", f: parsenoop }, 457: { n: "BrtBeginQSIF", f: parsenoop }, 458: { n: "BrtEndQSIF", f: parsenoop }, 459: { n: "BrtBeginAutoSortScope", f: parsenoop }, 460: { n: "BrtEndAutoSortScope", f: parsenoop }, 461: { n: "BrtBeginConditionalFormatting", f: parsenoop }, 462: { n: "BrtEndConditionalFormatting", f: parsenoop }, 463: { n: "BrtBeginCFRule", f: parsenoop }, 464: { n: "BrtEndCFRule", f: parsenoop }, 465: { n: "BrtBeginIconSet", f: parsenoop }, 466: { n: "BrtEndIconSet", f: parsenoop }, 467: { n: "BrtBeginDatabar", f: parsenoop }, 468: { n: "BrtEndDatabar", f: parsenoop }, 469: { n: "BrtBeginColorScale", f: parsenoop }, 470: { n: "BrtEndColorScale", f: parsenoop }, 471: { n: "BrtCFVO", f: parsenoop }, 472: { n: "BrtExternValueMeta", f: parsenoop }, 473: { n: "BrtBeginColorPalette", f: parsenoop }, 474: { n: "BrtEndColorPalette", f: parsenoop }, 475: { n: "BrtIndexedColor", f: parsenoop }, 476: { n: "BrtMargins", f: parsenoop }, 477: { n: "BrtPrintOptions", f: parsenoop }, 478: { n: "BrtPageSetup", f: parsenoop }, 479: { n: "BrtBeginHeaderFooter", f: parsenoop }, 480: { n: "BrtEndHeaderFooter", f: parsenoop }, 481: { n: "BrtBeginSXCrtFormat", f: parsenoop }, 482: { n: "BrtEndSXCrtFormat", f: parsenoop }, 483: { n: "BrtBeginSXCrtFormats", f: parsenoop }, 484: { n: "BrtEndSXCrtFormats", f: parsenoop }, 485: { n: "BrtWsFmtInfo", f: parsenoop }, 486: { n: "BrtBeginMgs", f: parsenoop }, 487: { n: "BrtEndMGs", f: parsenoop }, 488: { n: "BrtBeginMGMaps", f: parsenoop }, 489: { n: "BrtEndMGMaps", f: parsenoop }, 490: { n: "BrtBeginMG", f: parsenoop }, 491: { n: "BrtEndMG", f: parsenoop }, 492: { n: "BrtBeginMap", f: parsenoop }, 493: { n: "BrtEndMap", f: parsenoop }, 494: { n: "BrtHLink", f: parse_BrtHLink }, 495: { n: "BrtBeginDCon", f: parsenoop }, 496: { n: "BrtEndDCon", f: parsenoop }, 497: { n: "BrtBeginDRefs", f: parsenoop }, 498: { n: "BrtEndDRefs", f: parsenoop }, 499: { n: "BrtDRef", f: parsenoop }, 500: { n: "BrtBeginScenMan", f: parsenoop }, 501: { n: "BrtEndScenMan", f: parsenoop }, 502: { n: "BrtBeginSct", f: parsenoop }, 503: { n: "BrtEndSct", f: parsenoop }, 504: { n: "BrtSlc", f: parsenoop }, 505: { n: "BrtBeginDXFs", f: parsenoop }, 506: { n: "BrtEndDXFs", f: parsenoop }, 507: { n: "BrtDXF", f: parsenoop }, 508: { n: "BrtBeginTableStyles", f: parsenoop }, 509: { n: "BrtEndTableStyles", f: parsenoop }, 510: { n: "BrtBeginTableStyle", f: parsenoop }, 511: { n: "BrtEndTableStyle", f: parsenoop }, 512: { n: "BrtTableStyleElement", f: parsenoop }, 513: { n: "BrtTableStyleClient", f: parsenoop }, 514: { n: "BrtBeginVolDeps", f: parsenoop }, 515: { n: "BrtEndVolDeps", f: parsenoop }, 516: { n: "BrtBeginVolType", f: parsenoop }, 517: { n: "BrtEndVolType", f: parsenoop }, 518: { n: "BrtBeginVolMain", f: parsenoop }, 519: { n: "BrtEndVolMain", f: parsenoop }, 520: { n: "BrtBeginVolTopic", f: parsenoop }, 521: { n: "BrtEndVolTopic", f: parsenoop }, 522: { n: "BrtVolSubtopic", f: parsenoop }, 523: { n: "BrtVolRef", f: parsenoop }, 524: { n: "BrtVolNum", f: parsenoop }, 525: { n: "BrtVolErr", f: parsenoop }, 526: { n: "BrtVolStr", f: parsenoop }, 527: { n: "BrtVolBool", f: parsenoop }, 528: { n: "BrtBeginCalcChain$", f: parsenoop }, 529: { n: "BrtEndCalcChain$", f: parsenoop }, 530: { n: "BrtBeginSortState", f: parsenoop }, 531: { n: "BrtEndSortState", f: parsenoop }, 532: { n: "BrtBeginSortCond", f: parsenoop }, 533: { n: "BrtEndSortCond", f: parsenoop }, 534: { n: "BrtBookProtection", f: parsenoop }, 535: { n: "BrtSheetProtection", f: parsenoop }, 536: { n: "BrtRangeProtection", f: parsenoop }, 537: { n: "BrtPhoneticInfo", f: parsenoop }, 538: { n: "BrtBeginECTxtWiz", f: parsenoop }, 539: { n: "BrtEndECTxtWiz", f: parsenoop }, 540: { n: "BrtBeginECTWFldInfoLst", f: parsenoop }, 541: { n: "BrtEndECTWFldInfoLst", f: parsenoop }, 542: { n: "BrtBeginECTwFldInfo", f: parsenoop }, 548: { n: "BrtFileSharing", f: parsenoop }, 549: { n: "BrtOleSize", f: parsenoop }, 550: { n: "BrtDrawing", f: parsenoop }, 551: { n: "BrtLegacyDrawing", f: parsenoop }, 552: { n: "BrtLegacyDrawingHF", f: parsenoop }, 553: { n: "BrtWebOpt", f: parsenoop }, 554: { n: "BrtBeginWebPubItems", f: parsenoop }, 555: { n: "BrtEndWebPubItems", f: parsenoop }, 556: { n: "BrtBeginWebPubItem", f: parsenoop }, 557: { n: "BrtEndWebPubItem", f: parsenoop }, 558: { n: "BrtBeginSXCondFmt", f: parsenoop }, 559: { n: "BrtEndSXCondFmt", f: parsenoop }, 560: { n: "BrtBeginSXCondFmts", f: parsenoop }, 561: { n: "BrtEndSXCondFmts", f: parsenoop }, 562: { n: "BrtBkHim", f: parsenoop }, 564: { n: "BrtColor", f: parsenoop }, 565: { n: "BrtBeginIndexedColors", f: parsenoop }, 566: { n: "BrtEndIndexedColors", f: parsenoop }, 569: { n: "BrtBeginMRUColors", f: parsenoop }, 570: { n: "BrtEndMRUColors", f: parsenoop }, 572: { n: "BrtMRUColor", f: parsenoop }, 573: { n: "BrtBeginDVals", f: parsenoop }, 574: { n: "BrtEndDVals", f: parsenoop }, 577: { n: "BrtSupNameStart", f: parsenoop }, 578: { n: "BrtSupNameValueStart", f: parsenoop }, 579: { n: "BrtSupNameValueEnd", f: parsenoop }, 580: { n: "BrtSupNameNum", f: parsenoop }, 581: { n: "BrtSupNameErr", f: parsenoop }, 582: { n: "BrtSupNameSt", f: parsenoop }, 583: { n: "BrtSupNameNil", f: parsenoop }, 584: { n: "BrtSupNameBool", f: parsenoop }, 585: { n: "BrtSupNameFmla", f: parsenoop }, 586: { n: "BrtSupNameBits", f: parsenoop }, 587: { n: "BrtSupNameEnd", f: parsenoop }, 588: { n: "BrtEndSupBook", f: parsenoop }, 589: { n: "BrtCellSmartTagProperty", f: parsenoop }, 590: { n: "BrtBeginCellSmartTag", f: parsenoop }, 591: { n: "BrtEndCellSmartTag", f: parsenoop }, 592: { n: "BrtBeginCellSmartTags", f: parsenoop }, 593: { n: "BrtEndCellSmartTags", f: parsenoop }, 594: { n: "BrtBeginSmartTags", f: parsenoop }, 595: { n: "BrtEndSmartTags", f: parsenoop }, 596: { n: "BrtSmartTagType", f: parsenoop }, 597: { n: "BrtBeginSmartTagTypes", f: parsenoop }, 598: { n: "BrtEndSmartTagTypes", f: parsenoop }, 599: { n: "BrtBeginSXFilters", f: parsenoop }, 600: { n: "BrtEndSXFilters", f: parsenoop }, 601: { n: "BrtBeginSXFILTER", f: parsenoop }, 602: { n: "BrtEndSXFilter", f: parsenoop }, 603: { n: "BrtBeginFills", f: parsenoop }, 604: { n: "BrtEndFills", f: parsenoop }, 605: { n: "BrtBeginCellWatches", f: parsenoop }, 606: { n: "BrtEndCellWatches", f: parsenoop }, 607: { n: "BrtCellWatch", f: parsenoop }, 608: { n: "BrtBeginCRErrs", f: parsenoop }, 609: { n: "BrtEndCRErrs", f: parsenoop }, 610: { n: "BrtCrashRecErr", f: parsenoop }, 611: { n: "BrtBeginFonts", f: parsenoop }, 612: { n: "BrtEndFonts", f: parsenoop }, 613: { n: "BrtBeginBorders", f: parsenoop }, 614: { n: "BrtEndBorders", f: parsenoop }, 615: { n: "BrtBeginFmts", f: parsenoop }, 616: { n: "BrtEndFmts", f: parsenoop }, 617: { n: "BrtBeginCellXFs", f: parsenoop }, 618: { n: "BrtEndCellXFs", f: parsenoop }, 619: { n: "BrtBeginStyles", f: parsenoop }, 620: { n: "BrtEndStyles", f: parsenoop }, 625: { n: "BrtBigName", f: parsenoop }, 626: { n: "BrtBeginCellStyleXFs", f: parsenoop }, 627: { n: "BrtEndCellStyleXFs", f: parsenoop }, 628: { n: "BrtBeginComments", f: parsenoop }, 629: { n: "BrtEndComments", f: parsenoop }, 630: { n: "BrtBeginCommentAuthors", f: parsenoop }, 631: { n: "BrtEndCommentAuthors", f: parsenoop }, 632: { n: "BrtCommentAuthor", f: parse_BrtCommentAuthor }, 633: { n: "BrtBeginCommentList", f: parsenoop }, 634: { n: "BrtEndCommentList", f: parsenoop }, 635: { n: "BrtBeginComment", f: parse_BrtBeginComment }, 636: { n: "BrtEndComment", f: parsenoop }, 637: { n: "BrtCommentText", f: parse_BrtCommentText }, 638: { n: "BrtBeginOleObjects", f: parsenoop }, 639: { n: "BrtOleObject", f: parsenoop }, 640: { n: "BrtEndOleObjects", f: parsenoop }, 641: { n: "BrtBeginSxrules", f: parsenoop }, 642: { n: "BrtEndSxRules", f: parsenoop }, 643: { n: "BrtBeginActiveXControls", f: parsenoop }, 644: { n: "BrtActiveX", f: parsenoop }, 645: { n: "BrtEndActiveXControls", f: parsenoop }, 646: { n: "BrtBeginPCDSDTCEMembersSortBy", f: parsenoop }, 648: { n: "BrtBeginCellIgnoreECs", f: parsenoop }, 649: { n: "BrtCellIgnoreEC", f: parsenoop }, 650: { n: "BrtEndCellIgnoreECs", f: parsenoop }, 651: { n: "BrtCsProp", f: parsenoop }, 652: { n: "BrtCsPageSetup", f: parsenoop }, 653: { n: "BrtBeginUserCsViews", f: parsenoop }, 654: { n: "BrtEndUserCsViews", f: parsenoop }, 655: { n: "BrtBeginUserCsView", f: parsenoop }, 656: { n: "BrtEndUserCsView", f: parsenoop }, 657: { n: "BrtBeginPcdSFCIEntries", f: parsenoop }, 658: { n: "BrtEndPCDSFCIEntries", f: parsenoop }, 659: { n: "BrtPCDSFCIEntry", f: parsenoop }, 660: { n: "BrtBeginListParts", f: parsenoop }, 661: { n: "BrtListPart", f: parsenoop }, 662: { n: "BrtEndListParts", f: parsenoop }, 663: { n: "BrtSheetCalcProp", f: parsenoop }, 664: { n: "BrtBeginFnGroup", f: parsenoop }, 665: { n: "BrtFnGroup", f: parsenoop }, 666: { n: "BrtEndFnGroup", f: parsenoop }, 667: { n: "BrtSupAddin", f: parsenoop }, 668: { n: "BrtSXTDMPOrder", f: parsenoop }, 669: { n: "BrtCsProtection", f: parsenoop }, 671: { n: "BrtBeginWsSortMap", f: parsenoop }, 672: { n: "BrtEndWsSortMap", f: parsenoop }, 673: { n: "BrtBeginRRSort", f: parsenoop }, 674: { n: "BrtEndRRSort", f: parsenoop }, 675: { n: "BrtRRSortItem", f: parsenoop }, 676: { n: "BrtFileSharingIso", f: parsenoop }, 677: { n: "BrtBookProtectionIso", f: parsenoop }, 678: { n: "BrtSheetProtectionIso", f: parsenoop }, 679: { n: "BrtCsProtectionIso", f: parsenoop }, 680: { n: "BrtRangeProtectionIso", f: parsenoop }, 1024: { n: "BrtRwDescent", f: parsenoop }, 1025: { n: "BrtKnownFonts", f: parsenoop }, 1026: { n: "BrtBeginSXTupleSet", f: parsenoop }, 1027: { n: "BrtEndSXTupleSet", f: parsenoop }, 1028: { n: "BrtBeginSXTupleSetHeader", f: parsenoop }, 1029: { n: "BrtEndSXTupleSetHeader", f: parsenoop }, 1030: { n: "BrtSXTupleSetHeaderItem", f: parsenoop }, 1031: { n: "BrtBeginSXTupleSetData", f: parsenoop }, 1032: { n: "BrtEndSXTupleSetData", f: parsenoop }, 1033: { n: "BrtBeginSXTupleSetRow", f: parsenoop }, 1034: { n: "BrtEndSXTupleSetRow", f: parsenoop }, 1035: { n: "BrtSXTupleSetRowItem", f: parsenoop }, 1036: { n: "BrtNameExt", f: parsenoop }, 1037: { n: "BrtPCDH14", f: parsenoop }, 1038: { n: "BrtBeginPCDCalcMem14", f: parsenoop }, 1039: { n: "BrtEndPCDCalcMem14", f: parsenoop }, 1040: { n: "BrtSXTH14", f: parsenoop }, 1041: { n: "BrtBeginSparklineGroup", f: parsenoop }, 1042: { n: "BrtEndSparklineGroup", f: parsenoop }, 1043: { n: "BrtSparkline", f: parsenoop }, 1044: { n: "BrtSXDI14", f: parsenoop }, 1045: { n: "BrtWsFmtInfoEx14", f: parsenoop }, 1046: { n: "BrtBeginConditionalFormatting14", f: parsenoop }, 1047: { n: "BrtEndConditionalFormatting14", f: parsenoop }, 1048: { n: "BrtBeginCFRule14", f: parsenoop }, 1049: { n: "BrtEndCFRule14", f: parsenoop }, 1050: { n: "BrtCFVO14", f: parsenoop }, 1051: { n: "BrtBeginDatabar14", f: parsenoop }, 1052: { n: "BrtBeginIconSet14", f: parsenoop }, 1053: { n: "BrtDVal14", f: parsenoop }, 1054: { n: "BrtBeginDVals14", f: parsenoop }, 1055: { n: "BrtColor14", f: parsenoop }, 1056: { n: "BrtBeginSparklines", f: parsenoop }, 1057: { n: "BrtEndSparklines", f: parsenoop }, 1058: { n: "BrtBeginSparklineGroups", f: parsenoop }, 1059: { n: "BrtEndSparklineGroups", f: parsenoop }, 1061: { n: "BrtSXVD14", f: parsenoop }, 1062: { n: "BrtBeginSxview14", f: parsenoop }, 1063: { n: "BrtEndSxview14", f: parsenoop }, 1066: { n: "BrtBeginPCD14", f: parsenoop }, 1067: { n: "BrtEndPCD14", f: parsenoop }, 1068: { n: "BrtBeginExtConn14", f: parsenoop }, 1069: { n: "BrtEndExtConn14", f: parsenoop }, 1070: { n: "BrtBeginSlicerCacheIDs", f: parsenoop }, 1071: { n: "BrtEndSlicerCacheIDs", f: parsenoop }, 1072: { n: "BrtBeginSlicerCacheID", f: parsenoop }, 1073: { n: "BrtEndSlicerCacheID", f: parsenoop }, 1075: { n: "BrtBeginSlicerCache", f: parsenoop }, 1076: { n: "BrtEndSlicerCache", f: parsenoop }, 1077: { n: "BrtBeginSlicerCacheDef", f: parsenoop }, 1078: { n: "BrtEndSlicerCacheDef", f: parsenoop }, 1079: { n: "BrtBeginSlicersEx", f: parsenoop }, 1080: { n: "BrtEndSlicersEx", f: parsenoop }, 1081: { n: "BrtBeginSlicerEx", f: parsenoop }, 1082: { n: "BrtEndSlicerEx", f: parsenoop }, 1083: { n: "BrtBeginSlicer", f: parsenoop }, 1084: { n: "BrtEndSlicer", f: parsenoop }, 1085: { n: "BrtSlicerCachePivotTables", f: parsenoop }, 1086: { n: "BrtBeginSlicerCacheOlapImpl", f: parsenoop }, 1087: { n: "BrtEndSlicerCacheOlapImpl", f: parsenoop }, 1088: { n: "BrtBeginSlicerCacheLevelsData", f: parsenoop }, 1089: { n: "BrtEndSlicerCacheLevelsData", f: parsenoop }, 1090: { n: "BrtBeginSlicerCacheLevelData", f: parsenoop }, 1091: { n: "BrtEndSlicerCacheLevelData", f: parsenoop }, 1092: { n: "BrtBeginSlicerCacheSiRanges", f: parsenoop }, 1093: { n: "BrtEndSlicerCacheSiRanges", f: parsenoop }, 1094: { n: "BrtBeginSlicerCacheSiRange", f: parsenoop }, 1095: { n: "BrtEndSlicerCacheSiRange", f: parsenoop }, 1096: { n: "BrtSlicerCacheOlapItem", f: parsenoop }, 1097: { n: "BrtBeginSlicerCacheSelections", f: parsenoop }, 1098: { n: "BrtSlicerCacheSelection", f: parsenoop }, 1099: { n: "BrtEndSlicerCacheSelections", f: parsenoop }, 1100: { n: "BrtBeginSlicerCacheNative", f: parsenoop }, 1101: { n: "BrtEndSlicerCacheNative", f: parsenoop }, 1102: { n: "BrtSlicerCacheNativeItem", f: parsenoop }, 1103: { n: "BrtRangeProtection14", f: parsenoop }, 1104: { n: "BrtRangeProtectionIso14", f: parsenoop }, 1105: { n: "BrtCellIgnoreEC14", f: parsenoop }, 1111: { n: "BrtList14", f: parsenoop }, 1112: { n: "BrtCFIcon", f: parsenoop }, 1113: { n: "BrtBeginSlicerCachesPivotCacheIDs", f: parsenoop }, 1114: { n: "BrtEndSlicerCachesPivotCacheIDs", f: parsenoop }, 1115: { n: "BrtBeginSlicers", f: parsenoop }, 1116: { n: "BrtEndSlicers", f: parsenoop }, 1117: { n: "BrtWbProp14", f: parsenoop }, 1118: { n: "BrtBeginSXEdit", f: parsenoop }, 1119: { n: "BrtEndSXEdit", f: parsenoop }, 1120: { n: "BrtBeginSXEdits", f: parsenoop }, 1121: { n: "BrtEndSXEdits", f: parsenoop }, 1122: { n: "BrtBeginSXChange", f: parsenoop }, 1123: { n: "BrtEndSXChange", f: parsenoop }, 1124: { n: "BrtBeginSXChanges", f: parsenoop }, 1125: { n: "BrtEndSXChanges", f: parsenoop }, 1126: { n: "BrtSXTupleItems", f: parsenoop }, 1128: { n: "BrtBeginSlicerStyle", f: parsenoop }, 1129: { n: "BrtEndSlicerStyle", f: parsenoop }, 1130: { n: "BrtSlicerStyleElement", f: parsenoop }, 1131: { n: "BrtBeginStyleSheetExt14", f: parsenoop }, 1132: { n: "BrtEndStyleSheetExt14", f: parsenoop }, 1133: { n: "BrtBeginSlicerCachesPivotCacheID", f: parsenoop }, 1134: { n: "BrtEndSlicerCachesPivotCacheID", f: parsenoop }, 1135: { n: "BrtBeginConditionalFormattings", f: parsenoop }, 1136: { n: "BrtEndConditionalFormattings", f: parsenoop }, 1137: { n: "BrtBeginPCDCalcMemExt", f: parsenoop }, 1138: { n: "BrtEndPCDCalcMemExt", f: parsenoop }, 1139: { n: "BrtBeginPCDCalcMemsExt", f: parsenoop }, 1140: { n: "BrtEndPCDCalcMemsExt", f: parsenoop }, 1141: { n: "BrtPCDField14", f: parsenoop }, 1142: { n: "BrtBeginSlicerStyles", f: parsenoop }, 1143: { n: "BrtEndSlicerStyles", f: parsenoop }, 1144: { n: "BrtBeginSlicerStyleElements", f: parsenoop }, 1145: { n: "BrtEndSlicerStyleElements", f: parsenoop }, 1146: { n: "BrtCFRuleExt", f: parsenoop }, 1147: { n: "BrtBeginSXCondFmt14", f: parsenoop }, 1148: { n: "BrtEndSXCondFmt14", f: parsenoop }, 1149: { n: "BrtBeginSXCondFmts14", f: parsenoop }, 1150: { n: "BrtEndSXCondFmts14", f: parsenoop }, 1152: { n: "BrtBeginSortCond14", f: parsenoop }, 1153: { n: "BrtEndSortCond14", f: parsenoop }, 1154: { n: "BrtEndDVals14", f: parsenoop }, 1155: { n: "BrtEndIconSet14", f: parsenoop }, 1156: { n: "BrtEndDatabar14", f: parsenoop }, 1157: { n: "BrtBeginColorScale14", f: parsenoop }, 1158: { n: "BrtEndColorScale14", f: parsenoop }, 1159: { n: "BrtBeginSxrules14", f: parsenoop }, 1160: { n: "BrtEndSxrules14", f: parsenoop }, 1161: { n: "BrtBeginPRule14", f: parsenoop }, 1162: { n: "BrtEndPRule14", f: parsenoop }, 1163: { n: "BrtBeginPRFilters14", f: parsenoop }, 1164: { n: "BrtEndPRFilters14", f: parsenoop }, 1165: { n: "BrtBeginPRFilter14", f: parsenoop }, 1166: { n: "BrtEndPRFilter14", f: parsenoop }, 1167: { n: "BrtBeginPRFItem14", f: parsenoop }, 1168: { n: "BrtEndPRFItem14", f: parsenoop }, 1169: { n: "BrtBeginCellIgnoreECs14", f: parsenoop }, 1170: { n: "BrtEndCellIgnoreECs14", f: parsenoop }, 1171: { n: "BrtDxf14", f: parsenoop }, 1172: { n: "BrtBeginDxF14s", f: parsenoop }, 1173: { n: "BrtEndDxf14s", f: parsenoop }, 1177: { n: "BrtFilter14", f: parsenoop }, 1178: { n: "BrtBeginCustomFilters14", f: parsenoop }, 1180: { n: "BrtCustomFilter14", f: parsenoop }, 1181: { n: "BrtIconFilter14", f: parsenoop }, 1182: { n: "BrtPivotCacheConnectionName", f: parsenoop }, 2048: { n: "BrtBeginDecoupledPivotCacheIDs", f: parsenoop }, 2049: { n: "BrtEndDecoupledPivotCacheIDs", f: parsenoop }, 2050: { n: "BrtDecoupledPivotCacheID", f: parsenoop }, 2051: { n: "BrtBeginPivotTableRefs", f: parsenoop }, 2052: { n: "BrtEndPivotTableRefs", f: parsenoop }, 2053: { n: "BrtPivotTableRef", f: parsenoop }, 2054: { n: "BrtSlicerCacheBookPivotTables", f: parsenoop }, 2055: { n: "BrtBeginSxvcells", f: parsenoop }, 2056: { n: "BrtEndSxvcells", f: parsenoop }, 2057: { n: "BrtBeginSxRow", f: parsenoop }, 2058: { n: "BrtEndSxRow", f: parsenoop }, 2060: { n: "BrtPcdCalcMem15", f: parsenoop }, 2067: { n: "BrtQsi15", f: parsenoop }, 2068: { n: "BrtBeginWebExtensions", f: parsenoop }, 2069: { n: "BrtEndWebExtensions", f: parsenoop }, 2070: { n: "BrtWebExtension", f: parsenoop }, 2071: { n: "BrtAbsPath15", f: parsenoop }, 2072: { n: "BrtBeginPivotTableUISettings", f: parsenoop }, 2073: { n: "BrtEndPivotTableUISettings", f: parsenoop }, 2075: { n: "BrtTableSlicerCacheIDs", f: parsenoop }, 2076: { n: "BrtTableSlicerCacheID", f: parsenoop }, 2077: { n: "BrtBeginTableSlicerCache", f: parsenoop }, 2078: { n: "BrtEndTableSlicerCache", f: parsenoop }, 2079: { n: "BrtSxFilter15", f: parsenoop }, 2080: { n: "BrtBeginTimelineCachePivotCacheIDs", f: parsenoop }, 2081: { n: "BrtEndTimelineCachePivotCacheIDs", f: parsenoop }, 2082: { n: "BrtTimelineCachePivotCacheID", f: parsenoop }, 2083: { n: "BrtBeginTimelineCacheIDs", f: parsenoop }, 2084: { n: "BrtEndTimelineCacheIDs", f: parsenoop }, 2085: { n: "BrtBeginTimelineCacheID", f: parsenoop }, 2086: { n: "BrtEndTimelineCacheID", f: parsenoop }, 2087: { n: "BrtBeginTimelinesEx", f: parsenoop }, 2088: { n: "BrtEndTimelinesEx", f: parsenoop }, 2089: { n: "BrtBeginTimelineEx", f: parsenoop }, 2090: { n: "BrtEndTimelineEx", f: parsenoop }, 2091: { n: "BrtWorkBookPr15", f: parsenoop }, 2092: { n: "BrtPCDH15", f: parsenoop }, 2093: { n: "BrtBeginTimelineStyle", f: parsenoop }, 2094: { n: "BrtEndTimelineStyle", f: parsenoop }, 2095: { n: "BrtTimelineStyleElement", f: parsenoop }, 2096: { n: "BrtBeginTimelineStylesheetExt15", f: parsenoop }, 2097: { n: "BrtEndTimelineStylesheetExt15", f: parsenoop }, 2098: { n: "BrtBeginTimelineStyles", f: parsenoop }, 2099: { n: "BrtEndTimelineStyles", f: parsenoop }, 2100: { n: "BrtBeginTimelineStyleElements", f: parsenoop }, 2101: { n: "BrtEndTimelineStyleElements", f: parsenoop }, 2102: { n: "BrtDxf15", f: parsenoop }, 2103: { n: "BrtBeginDxfs15", f: parsenoop }, 2104: { n: "brtEndDxfs15", f: parsenoop }, 2105: { n: "BrtSlicerCacheHideItemsWithNoData", f: parsenoop }, 2106: { n: "BrtBeginItemUniqueNames", f: parsenoop }, 2107: { n: "BrtEndItemUniqueNames", f: parsenoop }, 2108: { n: "BrtItemUniqueName", f: parsenoop }, 2109: { n: "BrtBeginExtConn15", f: parsenoop }, 2110: { n: "BrtEndExtConn15", f: parsenoop }, 2111: { n: "BrtBeginOledbPr15", f: parsenoop }, 2112: { n: "BrtEndOledbPr15", f: parsenoop }, 2113: { n: "BrtBeginDataFeedPr15", f: parsenoop }, 2114: { n: "BrtEndDataFeedPr15", f: parsenoop }, 2115: { n: "BrtTextPr15", f: parsenoop }, 2116: { n: "BrtRangePr15", f: parsenoop }, 2117: { n: "BrtDbCommand15", f: parsenoop }, 2118: { n: "BrtBeginDbTables15", f: parsenoop }, 2119: { n: "BrtEndDbTables15", f: parsenoop }, 2120: { n: "BrtDbTable15", f: parsenoop }, 2121: { n: "BrtBeginDataModel", f: parsenoop }, 2122: { n: "BrtEndDataModel", f: parsenoop }, 2123: { n: "BrtBeginModelTables", f: parsenoop }, 2124: { n: "BrtEndModelTables", f: parsenoop }, 2125: { n: "BrtModelTable", f: parsenoop }, 2126: { n: "BrtBeginModelRelationships", f: parsenoop }, 2127: { n: "BrtEndModelRelationships", f: parsenoop }, 2128: { n: "BrtModelRelationship", f: parsenoop }, 2129: { n: "BrtBeginECTxtWiz15", f: parsenoop }, 2130: { n: "BrtEndECTxtWiz15", f: parsenoop }, 2131: { n: "BrtBeginECTWFldInfoLst15", f: parsenoop }, 2132: { n: "BrtEndECTWFldInfoLst15", f: parsenoop }, 2133: { n: "BrtBeginECTWFldInfo15", f: parsenoop }, 2134: { n: "BrtFieldListActiveItem", f: parsenoop }, 2135: { n: "BrtPivotCacheIdVersion", f: parsenoop }, 2136: { n: "BrtSXDI15", f: parsenoop }, 65535: { n: "", f: parsenoop } }; var evert_RE = evert_key(XLSBRecordEnum, "n"); var XLSRecordEnum = { 3: { n: "BIFF2NUM", f: parse_BIFF2NUM }, 4: { n: "BIFF2STR", f: parse_BIFF2STR }, 6: { n: "Formula", f: parse_Formula }, 9: { n: "BOF", f: parse_BOF }, 10: { n: "EOF", f: parse_EOF }, 12: { n: "CalcCount", f: parse_CalcCount }, 13: { n: "CalcMode", f: parse_CalcMode }, 14: { n: "CalcPrecision", f: parse_CalcPrecision }, 15: { n: "CalcRefMode", f: parse_CalcRefMode }, 16: { n: "CalcDelta", f: parse_CalcDelta }, 17: { n: "CalcIter", f: parse_CalcIter }, 18: { n: "Protect", f: parse_Protect }, 19: { n: "Password", f: parse_Password }, 20: { n: "Header", f: parse_Header }, 21: { n: "Footer", f: parse_Footer }, 23: { n: "ExternSheet", f: parse_ExternSheet }, 24: { n: "Lbl", f: parse_Lbl }, 25: { n: "WinProtect", f: parse_WinProtect }, 26: { n: "VerticalPageBreaks", f: parse_VerticalPageBreaks }, 27: { n: "HorizontalPageBreaks", f: parse_HorizontalPageBreaks }, 28: { n: "Note", f: parse_Note }, 29: { n: "Selection", f: parse_Selection }, 34: { n: "Date1904", f: parse_Date1904 }, 35: { n: "ExternName", f: parse_ExternName }, 38: { n: "LeftMargin", f: parse_LeftMargin }, 39: { n: "RightMargin", f: parse_RightMargin }, 40: { n: "TopMargin", f: parse_TopMargin }, 41: { n: "BottomMargin", f: parse_BottomMargin }, 42: { n: "PrintRowCol", f: parse_PrintRowCol }, 43: { n: "PrintGrid", f: parse_PrintGrid }, 47: { n: "FilePass", f: parse_FilePass }, 49: { n: "Font", f: parse_Font }, 51: { n: "PrintSize", f: parse_PrintSize }, 60: { n: "Continue", f: parse_Continue }, 61: { n: "Window1", f: parse_Window1 }, 64: { n: "Backup", f: parse_Backup }, 65: { n: "Pane", f: parse_Pane }, 66: { n: "CodePage", f: parse_CodePage }, 77: { n: "Pls", f: parse_Pls }, 80: { n: "DCon", f: parse_DCon }, 81: { n: "DConRef", f: parse_DConRef }, 82: { n: "DConName", f: parse_DConName }, 85: { n: "DefColWidth", f: parse_DefColWidth }, 89: { n: "XCT", f: parse_XCT }, 90: { n: "CRN", f: parse_CRN }, 91: { n: "FileSharing", f: parse_FileSharing }, 92: { n: "WriteAccess", f: parse_WriteAccess }, 93: { n: "Obj", f: parse_Obj }, 94: { n: "Uncalced", f: parse_Uncalced }, 95: { n: "CalcSaveRecalc", f: parse_CalcSaveRecalc }, 96: { n: "Template", f: parse_Template }, 97: { n: "Intl", f: parse_Intl }, 99: { n: "ObjProtect", f: parse_ObjProtect }, 125: { n: "ColInfo", f: parse_ColInfo }, 128: { n: "Guts", f: parse_Guts }, 129: { n: "WsBool", f: parse_WsBool }, 130: { n: "GridSet", f: parse_GridSet }, 131: { n: "HCenter", f: parse_HCenter }, 132: { n: "VCenter", f: parse_VCenter }, 133: { n: "BoundSheet8", f: parse_BoundSheet8 }, 134: { n: "WriteProtect", f: parse_WriteProtect }, 140: { n: "Country", f: parse_Country }, 141: { n: "HideObj", f: parse_HideObj }, 144: { n: "Sort", f: parse_Sort }, 146: { n: "Palette", f: parse_Palette }, 151: { n: "Sync", f: parse_Sync }, 152: { n: "LPr", f: parse_LPr }, 153: { n: "DxGCol", f: parse_DxGCol }, 154: { n: "FnGroupName", f: parse_FnGroupName }, 155: { n: "FilterMode", f: parse_FilterMode }, 156: { n: "BuiltInFnGroupCount", f: parse_BuiltInFnGroupCount }, 157: { n: "AutoFilterInfo", f: parse_AutoFilterInfo }, 158: { n: "AutoFilter", f: parse_AutoFilter }, 160: { n: "Scl", f: parse_Scl }, 161: { n: "Setup", f: parse_Setup }, 174: { n: "ScenMan", f: parse_ScenMan }, 175: { n: "SCENARIO", f: parse_SCENARIO }, 176: { n: "SxView", f: parse_SxView }, 177: { n: "Sxvd", f: parse_Sxvd }, 178: { n: "SXVI", f: parse_SXVI }, 180: { n: "SxIvd", f: parse_SxIvd }, 181: { n: "SXLI", f: parse_SXLI }, 182: { n: "SXPI", f: parse_SXPI }, 184: { n: "DocRoute", f: parse_DocRoute }, 185: { n: "RecipName", f: parse_RecipName }, 189: { n: "MulRk", f: parse_MulRk }, 190: { n: "MulBlank", f: parse_MulBlank }, 193: { n: "Mms", f: parse_Mms }, 197: { n: "SXDI", f: parse_SXDI }, 198: { n: "SXDB", f: parse_SXDB }, 199: { n: "SXFDB", f: parse_SXFDB }, 200: { n: "SXDBB", f: parse_SXDBB }, 201: { n: "SXNum", f: parse_SXNum }, 202: { n: "SxBool", f: parse_SxBool }, 203: { n: "SxErr", f: parse_SxErr }, 204: { n: "SXInt", f: parse_SXInt }, 205: { n: "SXString", f: parse_SXString }, 206: { n: "SXDtr", f: parse_SXDtr }, 207: { n: "SxNil", f: parse_SxNil }, 208: { n: "SXTbl", f: parse_SXTbl }, 209: { n: "SXTBRGIITM", f: parse_SXTBRGIITM }, 210: { n: "SxTbpg", f: parse_SxTbpg }, 211: { n: "ObProj", f: parse_ObProj }, 213: { n: "SXStreamID", f: parse_SXStreamID }, 215: { n: "DBCell", f: parse_DBCell }, 216: { n: "SXRng", f: parse_SXRng }, 217: { n: "SxIsxoper", f: parse_SxIsxoper }, 218: { n: "BookBool", f: parse_BookBool }, 220: { n: "DbOrParamQry", f: parse_DbOrParamQry }, 221: { n: "ScenarioProtect", f: parse_ScenarioProtect }, 222: { n: "OleObjectSize", f: parse_OleObjectSize }, 224: { n: "XF", f: parse_XF }, 225: { n: "InterfaceHdr", f: parse_InterfaceHdr }, 226: { n: "InterfaceEnd", f: parse_InterfaceEnd }, 227: { n: "SXVS", f: parse_SXVS }, 229: { n: "MergeCells", f: parse_MergeCells }, 233: { n: "BkHim", f: parse_BkHim }, 235: { n: "MsoDrawingGroup", f: parse_MsoDrawingGroup }, 236: { n: "MsoDrawing", f: parse_MsoDrawing }, 237: { n: "MsoDrawingSelection", f: parse_MsoDrawingSelection }, 239: { n: "PhoneticInfo", f: parse_PhoneticInfo }, 240: { n: "SxRule", f: parse_SxRule }, 241: { n: "SXEx", f: parse_SXEx }, 242: { n: "SxFilt", f: parse_SxFilt }, 244: { n: "SxDXF", f: parse_SxDXF }, 245: { n: "SxItm", f: parse_SxItm }, 246: { n: "SxName", f: parse_SxName }, 247: { n: "SxSelect", f: parse_SxSelect }, 248: { n: "SXPair", f: parse_SXPair }, 249: { n: "SxFmla", f: parse_SxFmla }, 251: { n: "SxFormat", f: parse_SxFormat }, 252: { n: "SST", f: parse_SST }, 253: { n: "LabelSst", f: parse_LabelSst }, 255: { n: "ExtSST", f: parse_ExtSST }, 256: { n: "SXVDEx", f: parse_SXVDEx }, 259: { n: "SXFormula", f: parse_SXFormula }, 290: { n: "SXDBEx", f: parse_SXDBEx }, 311: { n: "RRDInsDel", f: parse_RRDInsDel }, 312: { n: "RRDHead", f: parse_RRDHead }, 315: { n: "RRDChgCell", f: parse_RRDChgCell }, 317: { n: "RRTabId", f: parse_RRTabId }, 318: { n: "RRDRenSheet", f: parse_RRDRenSheet }, 319: { n: "RRSort", f: parse_RRSort }, 320: { n: "RRDMove", f: parse_RRDMove }, 330: { n: "RRFormat", f: parse_RRFormat }, 331: { n: "RRAutoFmt", f: parse_RRAutoFmt }, 333: { n: "RRInsertSh", f: parse_RRInsertSh }, 334: { n: "RRDMoveBegin", f: parse_RRDMoveBegin }, 335: { n: "RRDMoveEnd", f: parse_RRDMoveEnd }, 336: { n: "RRDInsDelBegin", f: parse_RRDInsDelBegin }, 337: { n: "RRDInsDelEnd", f: parse_RRDInsDelEnd }, 338: { n: "RRDConflict", f: parse_RRDConflict }, 339: { n: "RRDDefName", f: parse_RRDDefName }, 340: { n: "RRDRstEtxp", f: parse_RRDRstEtxp }, 351: { n: "LRng", f: parse_LRng }, 352: { n: "UsesELFs", f: parse_UsesELFs }, 353: { n: "DSF", f: parse_DSF }, 401: { n: "CUsr", f: parse_CUsr }, 402: { n: "CbUsr", f: parse_CbUsr }, 403: { n: "UsrInfo", f: parse_UsrInfo }, 404: { n: "UsrExcl", f: parse_UsrExcl }, 405: { n: "FileLock", f: parse_FileLock }, 406: { n: "RRDInfo", f: parse_RRDInfo }, 407: { n: "BCUsrs", f: parse_BCUsrs }, 408: { n: "UsrChk", f: parse_UsrChk }, 425: { n: "UserBView", f: parse_UserBView }, 426: { n: "UserSViewBegin", f: parse_UserSViewBegin }, 427: { n: "UserSViewEnd", f: parse_UserSViewEnd }, 428: { n: "RRDUserView", f: parse_RRDUserView }, 429: { n: "Qsi", f: parse_Qsi }, 430: { n: "SupBook", f: parse_SupBook }, 431: { n: "Prot4Rev", f: parse_Prot4Rev }, 432: { n: "CondFmt", f: parse_CondFmt }, 433: { n: "CF", f: parse_CF }, 434: { n: "DVal", f: parse_DVal }, 437: { n: "DConBin", f: parse_DConBin }, 438: { n: "TxO", f: parse_TxO }, 439: { n: "RefreshAll", f: parse_RefreshAll }, 440: { n: "HLink", f: parse_HLink }, 441: { n: "Lel", f: parse_Lel }, 442: { n: "CodeName", f: parse_XLSCodeName }, 443: { n: "SXFDBType", f: parse_SXFDBType }, 444: { n: "Prot4RevPass", f: parse_Prot4RevPass }, 445: { n: "ObNoMacros", f: parse_ObNoMacros }, 446: { n: "Dv", f: parse_Dv }, 448: { n: "Excel9File", f: parse_Excel9File }, 449: { n: "RecalcId", f: parse_RecalcId, r: 2 }, 450: { n: "EntExU2", f: parse_EntExU2 }, 512: { n: "Dimensions", f: parse_Dimensions }, 513: { n: "Blank", f: parse_Blank }, 515: { n: "Number", f: parse_Number }, 516: { n: "Label", f: parse_Label }, 517: { n: "BoolErr", f: parse_BoolErr }, 519: { n: "String", f: parse_String }, 520: { n: "Row", f: parse_Row }, 523: { n: "Index", f: parse_Index }, 545: { n: "Array", f: parse_Array }, 549: { n: "DefaultRowHeight", f: parse_DefaultRowHeight }, 566: { n: "Table", f: parse_Table }, 574: { n: "Window2", f: parse_Window2 }, 638: { n: "RK", f: parse_RK }, 659: { n: "Style", f: parse_Style }, 1048: { n: "BigName", f: parse_BigName }, 1054: { n: "Format", f: parse_Format }, 1084: { n: "ContinueBigName", f: parse_ContinueBigName }, 1212: { n: "ShrFmla", f: parse_ShrFmla }, 2048: { n: "HLinkTooltip", f: parse_HLinkTooltip }, 2049: { n: "WebPub", f: parse_WebPub }, 2050: { n: "QsiSXTag", f: parse_QsiSXTag }, 2051: { n: "DBQueryExt", f: parse_DBQueryExt }, 2052: { n: "ExtString", f: parse_ExtString }, 2053: { n: "TxtQry", f: parse_TxtQry }, 2054: { n: "Qsir", f: parse_Qsir }, 2055: { n: "Qsif", f: parse_Qsif }, 2056: { n: "RRDTQSIF", f: parse_RRDTQSIF }, 2057: { n: "BOF", f: parse_BOF }, 2058: { n: "OleDbConn", f: parse_OleDbConn }, 2059: { n: "WOpt", f: parse_WOpt }, 2060: { n: "SXViewEx", f: parse_SXViewEx }, 2061: { n: "SXTH", f: parse_SXTH }, 2062: { n: "SXPIEx", f: parse_SXPIEx }, 2063: { n: "SXVDTEx", f: parse_SXVDTEx }, 2064: { n: "SXViewEx9", f: parse_SXViewEx9 }, 2066: { n: "ContinueFrt", f: parse_ContinueFrt }, 2067: { n: "RealTimeData", f: parse_RealTimeData }, 2128: { n: "ChartFrtInfo", f: parse_ChartFrtInfo }, 2129: { n: "FrtWrapper", f: parse_FrtWrapper }, 2130: { n: "StartBlock", f: parse_StartBlock }, 2131: { n: "EndBlock", f: parse_EndBlock }, 2132: { n: "StartObject", f: parse_StartObject }, 2133: { n: "EndObject", f: parse_EndObject }, 2134: { n: "CatLab", f: parse_CatLab }, 2135: { n: "YMult", f: parse_YMult }, 2136: { n: "SXViewLink", f: parse_SXViewLink }, 2137: { n: "PivotChartBits", f: parse_PivotChartBits }, 2138: { n: "FrtFontList", f: parse_FrtFontList }, 2146: { n: "SheetExt", f: parse_SheetExt }, 2147: { n: "BookExt", f: parse_BookExt, r: 12 }, 2148: { n: "SXAddl", f: parse_SXAddl }, 2149: { n: "CrErr", f: parse_CrErr }, 2150: { n: "HFPicture", f: parse_HFPicture }, 2151: { n: "FeatHdr", f: parse_FeatHdr }, 2152: { n: "Feat", f: parse_Feat }, 2154: { n: "DataLabExt", f: parse_DataLabExt }, 2155: { n: "DataLabExtContents", f: parse_DataLabExtContents }, 2156: { n: "CellWatch", f: parse_CellWatch }, 2161: { n: "FeatHdr11", f: parse_FeatHdr11 }, 2162: { n: "Feature11", f: parse_Feature11 }, 2164: { n: "DropDownObjIds", f: parse_DropDownObjIds }, 2165: { n: "ContinueFrt11", f: parse_ContinueFrt11 }, 2166: { n: "DConn", f: parse_DConn }, 2167: { n: "List12", f: parse_List12 }, 2168: { n: "Feature12", f: parse_Feature12 }, 2169: { n: "CondFmt12", f: parse_CondFmt12 }, 2170: { n: "CF12", f: parse_CF12 }, 2171: { n: "CFEx", f: parse_CFEx }, 2172: { n: "XFCRC", f: parse_XFCRC, r: 12 }, 2173: { n: "XFExt", f: parse_XFExt, r: 12 }, 2174: { n: "AutoFilter12", f: parse_AutoFilter12 }, 2175: { n: "ContinueFrt12", f: parse_ContinueFrt12 }, 2180: { n: "MDTInfo", f: parse_MDTInfo }, 2181: { n: "MDXStr", f: parse_MDXStr }, 2182: { n: "MDXTuple", f: parse_MDXTuple }, 2183: { n: "MDXSet", f: parse_MDXSet }, 2184: { n: "MDXProp", f: parse_MDXProp }, 2185: { n: "MDXKPI", f: parse_MDXKPI }, 2186: { n: "MDB", f: parse_MDB }, 2187: { n: "PLV", f: parse_PLV }, 2188: { n: "Compat12", f: parse_Compat12, r: 12 }, 2189: { n: "DXF", f: parse_DXF }, 2190: { n: "TableStyles", f: parse_TableStyles, r: 12 }, 2191: { n: "TableStyle", f: parse_TableStyle }, 2192: { n: "TableStyleElement", f: parse_TableStyleElement }, 2194: { n: "StyleExt", f: parse_StyleExt }, 2195: { n: "NamePublish", f: parse_NamePublish }, 2196: { n: "NameCmt", f: parse_NameCmt }, 2197: { n: "SortData", f: parse_SortData }, 2198: { n: "Theme", f: parse_Theme, r: 12 }, 2199: { n: "GUIDTypeLib", f: parse_GUIDTypeLib }, 2200: { n: "FnGrp12", f: parse_FnGrp12 }, 2201: { n: "NameFnGrp12", f: parse_NameFnGrp12 }, 2202: { n: "MTRSettings", f: parse_MTRSettings, r: 12 }, 2203: { n: "CompressPictures", f: parse_CompressPictures }, 2204: { n: "HeaderFooter", f: parse_HeaderFooter }, 2205: { n: "CrtLayout12", f: parse_CrtLayout12 }, 2206: { n: "CrtMlFrt", f: parse_CrtMlFrt }, 2207: { n: "CrtMlFrtContinue", f: parse_CrtMlFrtContinue }, 2211: { n: "ForceFullCalculation", f: parse_ForceFullCalculation }, 2212: { n: "ShapePropsStream", f: parse_ShapePropsStream }, 2213: { n: "TextPropsStream", f: parse_TextPropsStream }, 2214: { n: "RichTextStream", f: parse_RichTextStream }, 2215: { n: "CrtLayout12A", f: parse_CrtLayout12A }, 4097: { n: "Units", f: parse_Units }, 4098: { n: "Chart", f: parse_Chart }, 4099: { n: "Series", f: parse_Series }, 4102: { n: "DataFormat", f: parse_DataFormat }, 4103: { n: "LineFormat", f: parse_LineFormat }, 4105: { n: "MarkerFormat", f: parse_MarkerFormat }, 4106: { n: "AreaFormat", f: parse_AreaFormat }, 4107: { n: "PieFormat", f: parse_PieFormat }, 4108: { n: "AttachedLabel", f: parse_AttachedLabel }, 4109: { n: "SeriesText", f: parse_SeriesText }, 4116: { n: "ChartFormat", f: parse_ChartFormat }, 4117: { n: "Legend", f: parse_Legend }, 4118: { n: "SeriesList", f: parse_SeriesList }, 4119: { n: "Bar", f: parse_Bar }, 4120: { n: "Line", f: parse_Line }, 4121: { n: "Pie", f: parse_Pie }, 4122: { n: "Area", f: parse_Area }, 4123: { n: "Scatter", f: parse_Scatter }, 4124: { n: "CrtLine", f: parse_CrtLine }, 4125: { n: "Axis", f: parse_Axis }, 4126: { n: "Tick", f: parse_Tick }, 4127: { n: "ValueRange", f: parse_ValueRange }, 4128: { n: "CatSerRange", f: parse_CatSerRange }, 4129: { n: "AxisLine", f: parse_AxisLine }, 4130: { n: "CrtLink", f: parse_CrtLink }, 4132: { n: "DefaultText", f: parse_DefaultText }, 4133: { n: "Text", f: parse_Text }, 4134: { n: "FontX", f: parse_FontX }, 4135: { n: "ObjectLink", f: parse_ObjectLink }, 4146: { n: "Frame", f: parse_Frame }, 4147: { n: "Begin", f: parse_Begin }, 4148: { n: "End", f: parse_End }, 4149: { n: "PlotArea", f: parse_PlotArea }, 4154: { n: "Chart3d", f: parse_Chart3d }, 4156: { n: "PicF", f: parse_PicF }, 4157: { n: "DropBar", f: parse_DropBar }, 4158: { n: "Radar", f: parse_Radar }, 4159: { n: "Surf", f: parse_Surf }, 4160: { n: "RadarArea", f: parse_RadarArea }, 4161: { n: "AxisParent", f: parse_AxisParent }, 4163: { n: "LegendException", f: parse_LegendException }, 4164: { n: "ShtProps", f: parse_ShtProps }, 4165: { n: "SerToCrt", f: parse_SerToCrt }, 4166: { n: "AxesUsed", f: parse_AxesUsed }, 4168: { n: "SBaseRef", f: parse_SBaseRef }, 4170: { n: "SerParent", f: parse_SerParent }, 4171: { n: "SerAuxTrend", f: parse_SerAuxTrend }, 4174: { n: "IFmtRecord", f: parse_IFmtRecord }, 4175: { n: "Pos", f: parse_Pos }, 4176: { n: "AlRuns", f: parse_AlRuns }, 4177: { n: "BRAI", f: parse_BRAI }, 4187: { n: "SerAuxErrBar", f: parse_SerAuxErrBar }, 4188: { n: "ClrtClient", f: parse_ClrtClient }, 4189: { n: "SerFmt", f: parse_SerFmt }, 4191: { n: "Chart3DBarShape", f: parse_Chart3DBarShape }, 4192: { n: "Fbi", f: parse_Fbi }, 4193: { n: "BopPop", f: parse_BopPop }, 4194: { n: "AxcExt", f: parse_AxcExt }, 4195: { n: "Dat", f: parse_Dat }, 4196: { n: "PlotGrowth", f: parse_PlotGrowth }, 4197: { n: "SIIndex", f: parse_SIIndex }, 4198: { n: "GelFrame", f: parse_GelFrame }, 4199: { n: "BopPopCustom", f: parse_BopPopCustom }, 4200: { n: "Fbi2", f: parse_Fbi2 }, 22: { n: "ExternCount", f: parsenoop }, 126: { n: "RK", f: parsenoop }, 127: { n: "ImData", f: parsenoop }, 135: { n: "Addin", f: parsenoop }, 136: { n: "Edg", f: parsenoop }, 137: { n: "Pub", f: parsenoop }, 145: { n: "Sub", f: parsenoop }, 148: { n: "LHRecord", f: parsenoop }, 149: { n: "LHNGraph", f: parsenoop }, 150: { n: "Sound", f: parsenoop }, 169: { n: "CoordList", f: parsenoop }, 171: { n: "GCW", f: parsenoop }, 188: { n: "ShrFmla", f: parsenoop }, 194: { n: "AddMenu", f: parsenoop }, 195: { n: "DelMenu", f: parsenoop }, 214: { n: "RString", f: parsenoop }, 223: { n: "UDDesc", f: parsenoop }, 234: { n: "TabIdConf", f: parsenoop }, 354: { n: "XL5Modify", f: parsenoop }, 421: { n: "FileSharing2", f: parsenoop }, 536: { n: "Name", f: parsenoop }, 547: { n: "ExternName", f: parse_ExternName }, 561: { n: "Font", f: parsenoop }, 1030: { n: "Formula", f: parse_Formula }, 2157: { n: "FeatInfo", f: parsenoop }, 2163: { n: "FeatInfo11", f: parsenoop }, 2177: { n: "SXAddl12", f: parsenoop }, 2240: { n: "AutoWebPub", f: parsenoop }, 2241: { n: "ListObj", f: parsenoop }, 2242: { n: "ListField", f: parsenoop }, 2243: { n: "ListDV", f: parsenoop }, 2244: { n: "ListCondFmt", f: parsenoop }, 2245: { n: "ListCF", f: parsenoop }, 2246: { n: "FMQry", f: parsenoop }, 2247: { n: "FMSQry", f: parsenoop }, 2248: { n: "PLV", f: parsenoop }, 2249: { n: "LnExt", f: parsenoop }, 2250: { n: "MkrExt", f: parsenoop }, 2251: { n: "CrtCoopt", f: parsenoop }, 0: {} }; function parse_ods(zip, opts) { if (typeof module !== "undefined" && typeof require !== "undefined" && typeof ODS === "undefined") ODS = require("./od" + "s"); if (typeof ODS === "undefined" || !ODS.parse_ods) throw new Error("Unsupported ODS"); return ODS.parse_ods(zip, opts) } function fix_opts_func(defaults) { return function fix_opts(opts) { for (var i = 0; i != defaults.length; ++i) { var d = defaults[i]; if (opts[d[0]] === undefined) opts[d[0]] = d[1]; if (d[2] === "n") opts[d[0]] = Number(opts[d[0]]) } } } var fix_read_opts = fix_opts_func([["cellNF", false], ["cellHTML", true], ["cellFormula", true], ["cellStyles", false], ["cellDates", false], ["sheetStubs", false], ["sheetRows", 0, "n"], ["bookDeps", false], ["bookSheets", false], ["bookProps", false], ["bookFiles", false], ["bookVBA", false], ["password", ""], ["WTF", false]]); var fix_write_opts = fix_opts_func([["cellDates", false], ["bookSST", false], ["bookType", "xlsx"], ["WTF", false]]); function safe_parse_wbrels(wbrels, sheets) { if (!wbrels) return 0; try { wbrels = sheets.map(function pwbr(w) { return [w.name, wbrels["!id"][w.id].Target] }) } catch (e) { return null } return !wbrels || wbrels.length === 0 ? null : wbrels } function safe_parse_ws(zip, path, relsPath, sheet, sheetRels, sheets, opts) { try { sheetRels[sheet] = parse_rels(getzipdata(zip, relsPath, true), path); sheets[sheet] = parse_ws(getzipdata(zip, path), path, opts, sheetRels[sheet]) } catch (e) { if (opts.WTF) throw e } } var nodirs = function nodirs(x) { return x.substr(-1) != "/" }; function parse_zip(zip, opts) { make_ssf(SSF); opts = opts || {}; fix_read_opts(opts); reset_cp(); if (safegetzipfile(zip, "META-INF/manifest.xml")) return parse_ods(zip, opts); var entries = keys(zip.files).filter(nodirs).sort(); var dir = parse_ct(getzipdata(zip, "[Content_Types].xml"), opts); var xlsb = false; var sheets, binname; if (dir.workbooks.length === 0) { binname = "xl/workbook.xml"; if (getzipdata(zip, binname, true)) dir.workbooks.push(binname) } if (dir.workbooks.length === 0) { binname = "xl/workbook.bin"; if (!getzipfile(zip, binname, true)) throw new Error("Could not find workbook"); dir.workbooks.push(binname); xlsb = true } if (dir.workbooks[0].substr(-3) == "bin") xlsb = true; if (xlsb) set_cp(1200); if (!opts.bookSheets && !opts.bookProps) { strs = []; if (dir.sst) strs = parse_sst(getzipdata(zip, dir.sst.replace(/^\//, "")), dir.sst, opts); themes = {}; if (opts.cellStyles && dir.themes.length) themes = parse_theme(getzipdata(zip, dir.themes[0].replace(/^\//, ""), true), dir.themes[0], opts); styles = {}; if (dir.style) styles = parse_sty(getzipdata(zip, dir.style.replace(/^\//, "")), dir.style, opts) } var wb = parse_wb(getzipdata(zip, dir.workbooks[0].replace(/^\//, "")), dir.workbooks[0], opts); var props = {}, propdata = ""; if (dir.coreprops.length !== 0) { propdata = getzipdata(zip, dir.coreprops[0].replace(/^\//, ""), true); if (propdata) props = parse_core_props(propdata); if (dir.extprops.length !== 0) { propdata = getzipdata(zip, dir.extprops[0].replace(/^\//, ""), true); if (propdata) parse_ext_props(propdata, props) } } var custprops = {}; if (!opts.bookSheets || opts.bookProps) { if (dir.custprops.length !== 0) { propdata = getzipdata(zip, dir.custprops[0].replace(/^\//, ""), true); if (propdata) custprops = parse_cust_props(propdata, opts) } } var out = {}; if (opts.bookSheets || opts.bookProps) { if (props.Worksheets && props.SheetNames.length > 0) sheets = props.SheetNames; else if (wb.Sheets) sheets = wb.Sheets.map(function pluck(x) { return x.name }); if (opts.bookProps) { out.Props = props; out.Custprops = custprops } if (typeof sheets !== "undefined") out.SheetNames = sheets; if (opts.bookSheets ? out.SheetNames : opts.bookProps) return out } sheets = {}; var deps = {}; if (opts.bookDeps && dir.calcchain) deps = parse_cc(getzipdata(zip, dir.calcchain.replace(/^\//, "")), dir.calcchain, opts); var i = 0; var sheetRels = {}; var path, relsPath; if (!props.Worksheets) { var wbsheets = wb.Sheets; props.Worksheets = wbsheets.length; props.SheetNames = []; for (var j = 0; j != wbsheets.length; ++j) { props.SheetNames[j] = wbsheets[j].name } } var wbext = xlsb ? "bin" : "xml"; var wbrelsfile = "xl/_rels/workbook." + wbext + ".rels"; var wbrels = parse_rels(getzipdata(zip, wbrelsfile, true), wbrelsfile); if (wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets); var nmode = getzipdata(zip, "xl/worksheets/sheet.xml", true) ? 1 : 0; for (i = 0; i != props.Worksheets; ++i) { if (wbrels) path = "xl/" + wbrels[i][1].replace(/[\/]?xl\//, ""); else { path = "xl/worksheets/sheet" + (i + 1 - nmode) + "." + wbext; path = path.replace(/sheet0\./, "sheet.") } relsPath = path.replace(/^(.*)(\/)([^\/]*)$/, "$1/_rels/$3.rels"); safe_parse_ws(zip, path, relsPath, props.SheetNames[i], sheetRels, sheets, opts) } if (dir.comments) parse_comments(zip, dir.comments, sheets, sheetRels, opts); out = { Directory: dir, Workbook: wb, Props: props, Custprops: custprops, Deps: deps, Sheets: sheets, SheetNames: props.SheetNames, Strings: strs, Styles: styles, Themes: themes, SSF: SSF.get_table() }; if (opts.bookFiles) { out.keys = entries; out.files = zip.files } if (opts.bookVBA) { if (dir.vba.length > 0) out.vbaraw = getzipdata(zip, dir.vba[0], true); else if (dir.defaults.bin === "application/vnd.ms-office.vbaProject") out.vbaraw = getzipdata(zip, "xl/vbaProject.bin", true) } return out } function add_rels(rels, rId, f, type, relobj) { if (!relobj) relobj = {}; if (!rels["!id"]) rels["!id"] = {}; relobj.Id = "rId" + rId; relobj.Type = type; relobj.Target = f; if (rels["!id"][relobj.Id]) throw new Error("Cannot rewrite rId " + rId); rels["!id"][relobj.Id] = relobj; rels[("/" + relobj.Target).replace("//", "/")] = relobj } function write_zip(wb, opts) { if (wb && !wb.SSF) { wb.SSF = SSF.get_table() } if (wb && wb.SSF) { make_ssf(SSF); SSF.load_table(wb.SSF); opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0 } opts.rels = {}; opts.wbrels = {}; opts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0; var wbext = opts.bookType == "xlsb" ? "bin" : "xml"; var ct = { workbooks: [], sheets: [], calcchains: [], themes: [], styles: [], coreprops: [], extprops: [], custprops: [], strs: [], comments: [], vba: [], TODO: [], rels: [], xmlns: "" }; fix_write_opts(opts = opts || {}); var zip = new jszip; var f = "", rId = 0; opts.cellXfs = []; get_cell_style(opts.cellXfs, {}, { revssf: { General: 0 } }); f = "docProps/core.xml"; zip.file(f, write_core_props(wb.Props, opts)); ct.coreprops.push(f); add_rels(opts.rels, 2, f, RELS.CORE_PROPS); f = "docProps/app.xml"; if (!wb.Props) wb.Props = {}; wb.Props.SheetNames = wb.SheetNames; wb.Props.Worksheets = wb.SheetNames.length; zip.file(f, write_ext_props(wb.Props, opts)); ct.extprops.push(f); add_rels(opts.rels, 3, f, RELS.EXT_PROPS); if (wb.Custprops !== wb.Props && keys(wb.Custprops || {}).length > 0) { f = "docProps/custom.xml"; zip.file(f, write_cust_props(wb.Custprops, opts)); ct.custprops.push(f); add_rels(opts.rels, 4, f, RELS.CUST_PROPS) } f = "xl/workbook." + wbext; zip.file(f, write_wb(wb, f, opts)); ct.workbooks.push(f); add_rels(opts.rels, 1, f, RELS.WB); for (rId = 1; rId <= wb.SheetNames.length; ++rId) { f = "xl/worksheets/sheet" + rId + "." + wbext; zip.file(f, write_ws(rId - 1, f, opts, wb)); ct.sheets.push(f); add_rels(opts.wbrels, rId, "worksheets/sheet" + rId + "." + wbext, RELS.WS) } if (opts.Strings != null && opts.Strings.length > 0) { f = "xl/sharedStrings." + wbext; zip.file(f, write_sst(opts.Strings, f, opts)); ct.strs.push(f); add_rels(opts.wbrels, ++rId, "sharedStrings." + wbext, RELS.SST) } f = "xl/theme/theme1.xml"; zip.file(f, write_theme(opts)); ct.themes.push(f); add_rels(opts.wbrels, ++rId, "theme/theme1.xml", RELS.THEME); f = "xl/styles." + wbext; zip.file(f, write_sty(wb, f, opts)); ct.styles.push(f); add_rels(opts.wbrels, ++rId, "styles." + wbext, RELS.STY); zip.file("[Content_Types].xml", write_ct(ct, opts)); zip.file("_rels/.rels", write_rels(opts.rels)); zip.file("xl/_rels/workbook." + wbext + ".rels", write_rels(opts.wbrels)); return zip } function firstbyte(f, o) { switch ((o || {}).type || "base64") { case "buffer": return f[0]; case "base64": return Base64.decode(f.substr(0, 12)).charCodeAt(0); case "binary": return f.charCodeAt(0); case "array": return f[0]; default: throw new Error("Unrecognized type " + o.type) } } function read_zip(data, opts) { var zip, d = data; var o = opts || {}; if (!o.type) o.type = has_buf && Buffer.isBuffer(data) ? "buffer" : "base64"; switch (o.type) { case "base64": zip = new jszip(d, { base64: true }); break; case "binary": case "array": zip = new jszip(d, { base64: false }); break; case "buffer": zip = new jszip(d); break; case "file": zip = new jszip(d = _fs.readFileSync(data)); break; default: throw new Error("Unrecognized type " + o.type) } return parse_zip(zip, o) } function readSync(data, opts) { var zip, d = data, isfile = false, n; var o = opts || {}; if (!o.type) o.type = has_buf && Buffer.isBuffer(data) ? "buffer" : "base64"; if (o.type == "file") { isfile = true; o.type = "buffer"; d = _fs.readFileSync(data) } switch (n = firstbyte(d, o)) { case 208: if (isfile) o.type = "file"; return parse_xlscfb(CFB.read(data, o), o); case 9: return parse_xlscfb(s2a(o.type === "base64" ? Base64.decode(data) : data), o); case 60: return parse_xlml(d, o); case 80: if (isfile) o.type = "file"; return read_zip(data, opts); default: throw new Error("Unsupported file " + n) } } function readFileSync(data, opts) { var o = opts || {}; o.type = "file"; var wb = readSync(data, o); wb.FILENAME = data; return wb } function write_zip_type(wb, opts) { var o = opts || {}; style_builder = new StyleBuilder(opts); var z = write_zip(wb, o); switch (o.type) { case "base64": return z.generate({ type: "base64" }); case "binary": return z.generate({ type: "string" }); case "buffer": return z.generate({ type: "nodebuffer" }); case "file": return _fs.writeFileSync(o.file, z.generate({ type: "nodebuffer" })); default: throw new Error("Unrecognized type " + o.type) } } function writeSync(wb, opts) { var o = opts || {}; switch (o.bookType) { case "xml": return write_xlml(wb, o); default: return write_zip_type(wb, o) } } function writeFileSync(wb, filename, opts) { var o = opts || {}; o.type = "file"; o.file = filename; switch (o.file.substr(-5).toLowerCase()) { case ".xlsx": o.bookType = "xlsx"; break; case ".xlsm": o.bookType = "xlsm"; break; case ".xlsb": o.bookType = "xlsb"; break; default: switch (o.file.substr(-4).toLowerCase()) { case ".xls": o.bookType = "xls"; break; case ".xml": o.bookType = "xml"; break } } return writeSync(wb, o) } function decode_row(rowstr) { return parseInt(unfix_row(rowstr), 10) - 1 } function encode_row(row) { return "" + (row + 1) } function fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\d+)$/, "$1$$$2") } function unfix_row(cstr) { return cstr.replace(/\$(\d+)$/, "$1") } function decode_col(colstr) { var c = unfix_col(colstr), d = 0, i = 0; for (; i !== c.length; ++i) d = 26 * d + c.charCodeAt(i) - 64; return d - 1 } function encode_col(col) { var s = ""; for (++col; col; col = Math.floor((col - 1) / 26)) s = String.fromCharCode((col - 1) % 26 + 65) + s; return s } function fix_col(cstr) { return cstr.replace(/^([A-Z])/, "$$$1") } function unfix_col(cstr) { return cstr.replace(/^\$([A-Z])/, "$1") } function split_cell(cstr) { return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/, "$1,$2").split(",") } function decode_cell(cstr) { var splt = split_cell(cstr); return { c: decode_col(splt[0]), r: decode_row(splt[1]) } } function encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r) } function fix_cell(cstr) { return fix_col(fix_row(cstr)) } function unfix_cell(cstr) { return unfix_col(unfix_row(cstr)) } function decode_range(range) { var x = range.split(":").map(decode_cell); return { s: x[0], e: x[x.length - 1] } } function encode_range(cs, ce) { if (ce === undefined || typeof ce === "number") return encode_range(cs.s, cs.e); if (typeof cs !== "string") cs = encode_cell(cs); if (typeof ce !== "string") ce = encode_cell(ce); return cs == ce ? cs : cs + ":" + ce } function safe_decode_range(range) { var o = { s: { c: 0, r: 0 }, e: { c: 0, r: 0 } }; var idx = 0, i = 0, cc = 0; var len = range.length; for (idx = 0; i < len; ++i) { if ((cc = range.charCodeAt(i) - 64) < 1 || cc > 26) break; idx = 26 * idx + cc } o.s.c = --idx; for (idx = 0; i < len; ++i) { if ((cc = range.charCodeAt(i) - 48) < 0 || cc > 9) break; idx = 10 * idx + cc } o.s.r = --idx; if (i === len || range.charCodeAt(++i) === 58) { o.e.c = o.s.c; o.e.r = o.s.r; return o } for (idx = 0; i != len; ++i) { if ((cc = range.charCodeAt(i) - 64) < 1 || cc > 26) break; idx = 26 * idx + cc } o.e.c = --idx; for (idx = 0; i != len; ++i) { if ((cc = range.charCodeAt(i) - 48) < 0 || cc > 9) break; idx = 10 * idx + cc } o.e.r = --idx; return o } function safe_format_cell(cell, v) { if (cell.z !== undefined) try { return cell.w = SSF.format(cell.z, v) } catch (e) {} if (!cell.XF) return v; try { return cell.w = SSF.format(cell.XF.ifmt || 0, v) } catch (e) { return "" + v } } function format_cell(cell, v) { if (cell == null || cell.t == null) return ""; if (cell.w !== undefined) return cell.w; if (v === undefined) return safe_format_cell(cell, cell.v); return safe_format_cell(cell, v) } function sheet_to_json(sheet, opts) { var val, row, range, header = 0, offset = 1, r, hdr = [], isempty, R, C, v; var o = opts != null ? opts : {}; var raw = o.raw; if (sheet == null || sheet["!ref"] == null) return []; range = o.range !== undefined ? o.range : sheet["!ref"]; if (o.header === 1) header = 1; else if (o.header === "A") header = 2; else if (Array.isArray(o.header)) header = 3; switch (typeof range) { case "string": r = safe_decode_range(range); break; case "number": r = safe_decode_range(sheet["!ref"]); r.s.r = range; break; default: r = range } if (header > 0) offset = 0; var rr = encode_row(r.s.r); var cols = new Array(r.e.c - r.s.c + 1); var out = new Array(r.e.r - r.s.r - offset + 1); var outi = 0; for (C = r.s.c; C <= r.e.c; ++C) { cols[C] = encode_col(C); val = sheet[cols[C] + rr]; switch (header) { case 1: hdr[C] = C; break; case 2: hdr[C] = cols[C]; break; case 3: hdr[C] = o.header[C - r.s.c]; break; default: if (val === undefined) continue; hdr[C] = format_cell(val) } } for (R = r.s.r + offset; R <= r.e.r; ++R) { rr = encode_row(R); isempty = true; if (header === 1) row = []; else { row = {}; if (Object.defineProperty) Object.defineProperty(row, "__rowNum__", { value: R, enumerable: false }); else row.__rowNum__ = R } for (C = r.s.c; C <= r.e.c; ++C) { val = sheet[cols[C] + rr]; if (val === undefined || val.t === undefined) continue; v = val.v; switch (val.t) { case "e": continue; case "s": break; case "b": case "n": break; default: throw "unrecognized type " + val.t } if (v !== undefined) { row[hdr[C]] = raw ? v : format_cell(val, v); isempty = false } } if (isempty === false || header === 1) out[outi++] = row } out.length = outi; return out } function sheet_to_row_object_array(sheet, opts) { return sheet_to_json(sheet, opts != null ? opts : {}) } function sheet_to_csv(sheet, opts) { var out = "", txt = "", qreg = /"/g; var o = opts == null ? {} : opts; if (sheet == null || sheet["!ref"] == null) return ""; var r = safe_decode_range(sheet["!ref"]); var FS = o.FS !== undefined ? o.FS : ",", fs = FS.charCodeAt(0); var RS = o.RS !== undefined ? o.RS : "\n", rs = RS.charCodeAt(0); var row = "", rr = "", cols = []; var i = 0, cc = 0, val; var R = 0, C = 0; for (C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); for (R = r.s.r; R <= r.e.r; ++R) { row = ""; rr = encode_row(R); for (C = r.s.c; C <= r.e.c; ++C) { val = sheet[cols[C] + rr]; txt = val !== undefined ? "" + format_cell(val) : ""; for (i = 0, cc = 0; i !== txt.length; ++i) if ((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34) { txt = '"' + txt.replace(qreg, '""') + '"'; break } row += (C === r.s.c ? "" : FS) + txt } out += row + RS } return out } var make_csv = sheet_to_csv; function sheet_to_formulae(sheet) { var cmds, y = "", x, val = ""; if (sheet == null || sheet["!ref"] == null) return ""; var r = safe_decode_range(sheet["!ref"]), rr = "", cols = [], C; cmds = new Array((r.e.r - r.s.r + 1) * (r.e.c - r.s.c + 1)); var i = 0; for (C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C); for (var R = r.s.r; R <= r.e.r; ++R) { rr = encode_row(R); for (C = r.s.c; C <= r.e.c; ++C) { y = cols[C] + rr; x = sheet[y]; val = ""; if (x === undefined) continue; if (x.f != null) val = x.f; else if (x.w !== undefined) val = "'" + x.w; else if (x.v === undefined) continue; else val = "" + x.v; cmds[i++] = y + "=" + val } } cmds.length = i; return cmds } var utils = { encode_col: encode_col, encode_row: encode_row, encode_cell: encode_cell, encode_range: encode_range, decode_col: decode_col, decode_row: decode_row, split_cell: split_cell, decode_cell: decode_cell, decode_range: decode_range, format_cell: format_cell, get_formulae: sheet_to_formulae, make_csv: sheet_to_csv, make_json: sheet_to_json, make_formulae: sheet_to_formulae, sheet_to_csv: sheet_to_csv, sheet_to_json: sheet_to_json, sheet_to_formulae: sheet_to_formulae, sheet_to_row_object_array: sheet_to_row_object_array }; var XmlNode = function () { function XmlNode(tagName, attributes, children) { if (!(this instanceof XmlNode)) { return new XmlNode(tagName, attributes, children) } this.tagName = tagName; this._attributes = attributes || {}; this._children = children || []; this._prefix = ""; return this } XmlNode.prototype.createElement = function () { return new XmlNode(arguments) }; XmlNode.prototype.children = function () { return this._children }; XmlNode.prototype.append = function (node) { this._children.push(node); return this }; XmlNode.prototype.prefix = function (prefix) { if (arguments.length == 0) { return this._prefix } this._prefix = prefix; return this }; XmlNode.prototype.attr = function (attr, value) { if (value == undefined) { delete this._attributes[attr]; return this } if (arguments.length == 0) { return this._attributes } else if (typeof attr == "string" && arguments.length == 1) { return this._attributes.attr[attr] } if (typeof attr == "object" && arguments.length == 1) { for (var key in attr) { this._attributes[key] = attr[key] } } else if (arguments.length == 2 && typeof attr == "string") { this._attributes[attr] = value } return this }; var APOS = "'"; QUOTE = '"'; var ESCAPED_QUOTE = {}; ESCAPED_QUOTE[QUOTE] = """; ESCAPED_QUOTE[APOS] = "'"; XmlNode.prototype.escapeAttributeValue = function (att_value) { return '"' + att_value.replace(/\"/g, """) + '"' }; XmlNode.prototype.toXml = function (node) { if (!node) node = this; var xml = node._prefix; xml += "<" + node.tagName; if (node._attributes) { for (var key in node._attributes) { xml += " " + key + "=" + this.escapeAttributeValue("" + node._attributes[key]) + "" } } if (node._children && node._children.length > 0) { xml += ">"; for (var i = 0; i < node._children.length; i++) { xml += this.toXml(node._children[i]) } xml += "</" + node.tagName + ">" } else { xml += "/>" } return xml }; return XmlNode } (); var StyleBuilder = function (options) { var customNumFmtId = 164; var table_fmt = { 0: "General", 1: "0", 2: "0.00", 3: "#,##0", 4: "#,##0.00", 9: "0%", 10: "0.00%", 11: "0.00E+00", 12: "# ?/?", 13: "# ??/??", 14: "m/d/yy", 15: "d-mmm-yy", 16: "d-mmm", 17: "mmm-yy", 18: "h:mm AM/PM", 19: "h:mm:ss AM/PM", 20: "h:mm", 21: "h:mm:ss", 22: "m/d/yy h:mm", 37: "#,##0 ;(#,##0)", 38: "#,##0 ;[Red](#,##0)", 39: "#,##0.00;(#,##0.00)", 40: "#,##0.00;[Red](#,##0.00)", 45: "mm:ss", 46: "[h]:mm:ss", 47: "mmss.0", 48: "##0.0E+0", 49: "@", 56: '"上午/下午 "hh"時"mm"分"ss"秒 "' }; var fmt_table = {}; for (var idx in table_fmt) { fmt_table[table_fmt[idx]] = idx } _hashIndex = {}; _listIndex = []; return { initialize: function (options) { this.$fonts = XmlNode("fonts").attr("count", 0).attr("x14ac:knownFonts", "1"); this.$fills = XmlNode("fills").attr("count", 0); this.$borders = XmlNode("borders").attr("count", 0); this.$numFmts = XmlNode("numFmts").attr("count", 0); this.$cellStyleXfs = XmlNode("cellStyleXfs"); this.$xf = XmlNode("xf").attr("numFmtId", 0).attr("fontId", 0).attr("fillId", 0).attr("borderId", 0); this.$cellXfs = XmlNode("cellXfs").attr("count", 0); this.$cellStyles = XmlNode("cellStyles").append(XmlNode("cellStyle").attr("name", "Normal").attr("xfId", 0).attr("builtinId", 0)); this.$dxfs = XmlNode("dxfs").attr("count", "0"); this.$tableStyles = XmlNode("tableStyles").attr("count", "0").attr("defaultTableStyle", "TableStyleMedium9").attr("defaultPivotStyle", "PivotStyleMedium4"); this.$styles = XmlNode("styleSheet").attr("xmlns:mc", "http://schemas.openxmlformats.org/markup-compatibility/2006").attr("xmlns:x14ac", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac").attr("xmlns", "http://schemas.openxmlformats.org/spreadsheetml/2006/main").attr("mc:Ignorable", "x14ac").prefix('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>').append(this.$numFmts).append(this.$fonts).append(this.$fills).append(this.$borders).append(this.$cellStyleXfs.append(this.$xf)).append(this.$cellXfs).append(this.$cellStyles).append(this.$dxfs).append(this.$tableStyles); var defaultStyle = options.defaultCellStyle || {}; if (!defaultStyle.font) defaultStyle.font = { name: "Calibri", sz: "12" }; if (!defaultStyle.font.name) defaultStyle.font.name = "Calibri"; if (!defaultStyle.font.sz) defaultStyle.font.sz = 11; if (!defaultStyle.fill) defaultStyle.fill = { patternType: "none", fgColor: {} }; if (!defaultStyle.border) defaultStyle.border = {}; if (!defaultStyle.numFmt) defaultStyle.numFmt = 0; this.defaultStyle = defaultStyle; var gray125Style = JSON.parse(JSON.stringify(defaultStyle)); gray125Style.fill = { patternType: "gray125", fgColor: {} }; this.addStyles([defaultStyle, gray125Style]); return this }, addStyle: function (attributes) { var hashKey = JSON.stringify(attributes); var index = _hashIndex[hashKey]; if (index == undefined) { index = this._addXf(attributes); _hashIndex[hashKey] = index } else { index = _hashIndex[hashKey] } return index }, addStyles: function (styles) { var self = this; return styles.map(function (style) { return self.addStyle(style) }) }, _duckTypeStyle: function (attributes) { if (typeof attributes == "object" && (attributes.patternFill || attributes.fgColor)) { return { fill: attributes } } else if (attributes.font || attributes.numFmt || attributes.border || attributes.fill) { return attributes } else { return this._getStyleCSS(attributes) } }, _getStyleCSS: function (css) { return css }, _addXf: function (attributes) { var fontId = this._addFont(attributes.font); var fillId = this._addFill(attributes.fill); var borderId = this._addBorder(attributes.border); var numFmtId = this._addNumFmt(attributes.numFmt); var $xf = XmlNode("xf").attr("numFmtId", numFmtId).attr("fontId", fontId).attr("fillId", fillId).attr("borderId", borderId).attr("xfId", "0"); if (fontId > 0) { $xf.attr("applyFont", "1") } if (fillId > 0) { $xf.attr("applyFill", "1") } if (borderId > 0) { $xf.attr("applyBorder", "1") } if (numFmtId > 0) { $xf.attr("applyNumberFormat", "1") } if (attributes.alignment) { var $alignment = XmlNode("alignment"); if (attributes.alignment.horizontal) { $alignment.attr("horizontal", attributes.alignment.horizontal) } if (attributes.alignment.vertical) { $alignment.attr("vertical", attributes.alignment.vertical) } if (attributes.alignment.indent) { $alignment.attr("indent", attributes.alignment.indent) } if (attributes.alignment.readingOrder) { $alignment.attr("readingOrder", attributes.alignment.readingOrder) } if (attributes.alignment.wrapText) { $alignment.attr("wrapText", attributes.alignment.wrapText) } if (attributes.alignment.textRotation != undefined) { $alignment.attr("textRotation", attributes.alignment.textRotation) } $xf.append($alignment).attr("applyAlignment", 1); } this.$cellXfs.append($xf); var count = +this.$cellXfs.children().length; this.$cellXfs.attr("count", count); return count - 1 }, _addFont: function (attributes) { if (!attributes) { return 0 } var $font = XmlNode("font").append(XmlNode("sz").attr("val", attributes.sz || this.defaultStyle.font.sz)).append(XmlNode("name").attr("val", attributes.name || this.defaultStyle.font.name)); if (attributes.bold) $font.append(XmlNode("b")); if (attributes.underline) $font.append(XmlNode("u")); if (attributes.italic) $font.append(XmlNode("i")); if (attributes.strike) $font.append(XmlNode("strike")); if (attributes.outline) $font.append(XmlNode("outline")); if (attributes.shadow) $font.append(XmlNode("shadow")); if (attributes.vertAlign) { $font.append(XmlNode("vertAlign").attr("val", attributes.vertAlign)) } if (attributes.color) { if (attributes.color.theme) { $font.append(XmlNode("color").attr("theme", attributes.color.theme)); if (attributes.color.tint) { $font.append(XmlNode("tint").attr("theme", attributes.color.tint)) } } else if (attributes.color.rgb) { $font.append(XmlNode("color").attr("rgb", attributes.color.rgb)) } } this.$fonts.append($font); var count = this.$fonts.children().length; this.$fonts.attr("count", count); return count - 1 }, _addNumFmt: function (numFmt) { if (!numFmt) { return 0 } if (typeof numFmt == "string") { var numFmtIdx = fmt_table[numFmt]; if (numFmtIdx >= 0) { return numFmtIdx } } if (/^[0-9]+$/.exec(numFmt)) { return numFmt } numFmt = numFmt.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"); var $numFmt = XmlNode("numFmt").attr("numFmtId", ++customNumFmtId).attr("formatCode", numFmt); this.$numFmts.append($numFmt); var count = this.$numFmts.children().length; this.$numFmts.attr("count", count); return customNumFmtId }, _addFill: function (attributes) { if (!attributes) { return 0 } var $patternFill = XmlNode("patternFill").attr("patternType", attributes.patternType || "solid"); if (attributes.fgColor) { var $fgColor = XmlNode("fgColor"); if (attributes.fgColor.rgb) { if (attributes.fgColor.rgb.length == 6) { attributes.fgColor.rgb = "FF" + attributes.fgColor.rgb } $fgColor.attr("rgb", attributes.fgColor.rgb); $patternFill.append($fgColor) } else if (attributes.fgColor.theme) { $fgColor.attr("theme", attributes.fgColor.theme); if (attributes.fgColor.tint) { $fgColor.attr("tint", attributes.fgColor.tint) } $patternFill.append($fgColor) } if (!attributes.bgColor) { attributes.bgColor = { indexed: "64" } } } if (attributes.bgColor) { var $bgColor = XmlNode("bgColor").attr(attributes.bgColor); $patternFill.append($bgColor) } var $fill = XmlNode("fill").append($patternFill); this.$fills.append($fill); var count = this.$fills.children().length; this.$fills.attr("count", count); return count - 1 }, _getSubBorder: function (direction, spec) { var $direction = XmlNode(direction); if (spec) { if (spec.style) $direction.attr("style", spec.style); if (spec.color) { var $color = XmlNode("color"); if (spec.color.auto) { $color.attr("auto", spec.color.auto) } else if (spec.color.rgb) { $color.attr("rgb", spec.color.rgb) } else if (spec.color.theme || spec.color.tint) { $color.attr("theme", spec.color.theme || "1"); $color.attr("tint", spec.color.tint || "0") } $direction.append($color) } } return $direction }, _addBorder: function (attributes) { if (!attributes) { return 0 } var self = this; var $border = XmlNode("border").attr("diagonalUp", attributes.diagonalUp).attr("diagonalDown", attributes.diagonalDown); var directions = ["left", "right", "top", "bottom", "diagonal"]; directions.forEach(function (direction) { $border.append(self._getSubBorder(direction, attributes[direction])) }); this.$borders.append($border); var count = this.$borders.children().length; this.$borders.attr("count", count); return count - 1 }, toXml: function () { return this.$styles.toXml() } } .initialize(options || {}) }; xlsxStyle.parse_xlscfb = parse_xlscfb; xlsxStyle.parse_zip = parse_zip; xlsxStyle.read = readSync; xlsxStyle.readFile = readFileSync; xlsxStyle.readFileSync = readFileSync; xlsxStyle.write = writeSync; xlsxStyle.writeFile = writeFileSync; xlsxStyle.writeFileSync = writeFileSync; xlsxStyle.utils = utils; xlsxStyle.CFB = CFB; xlsxStyle.SSF = SSF })(typeof exports !== "undefined" ? exports : xlsxStyle); var XLS = xlsxStyle;