From a5b387716c2c3ec9b9794c5712a80f857e52a5d3 Mon Sep 17 00:00:00 2001
From: Andrew Lessels <andrewlessels@gmail.com>
Date: Sun, 20 Mar 2022 16:29:24 +1100
Subject: [PATCH] Fix rawNumber support inside sheet_to_json

---
 bits/90_utils.js   |    2 +-
 test.js            |   16 +
 test.mjs           |   16 +
 test.ts            |   18 +-
 tests.lst          |    1 +
 tests/core.js      |   16 +
 tests/fixtures.js  |    1 +
 tests/fixtures.lst |    1 +
 xlsx.flow.js       | 1170 ++++++++++++++++++++------------------------
 xlsx.js            | 1142 +++++++++++++++++++-----------------------
 xlsx.mjs           |    2 +-
 11 files changed, 1102 insertions(+), 1283 deletions(-)

diff --git a/bits/90_utils.js b/bits/90_utils.js
index 71eb160..b69a87c 100644
--- a/bits/90_utils.js
+++ b/bits/90_utils.js
@@ -34,7 +34,7 @@ function make_json_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Ar
 				else if(raw && v === null) row[hdr[C]] = null;
 				else continue;
 			} else {
-				row[hdr[C]] = raw || (o.rawNumbers && val.t == "n") ? v : format_cell(val,v,o);
+				row[hdr[C]] = raw && (val.t !== "n" || (val.t === "n" && o.rawNumbers !== false)) ? v : format_cell(val,v,o);
 			}
 			if(v != null) isempty = false;
 		}
diff --git a/test.js b/test.js
index 5e3431a..21cd011 100644
--- a/test.js
+++ b/test.js
@@ -144,6 +144,8 @@ var paths = {
 	dtxlsx:  dir + 'xlsx-stream-d-date-cell.xlsx',
 	dtxlsb:  dir + 'xlsx-stream-d-date-cell.xlsb',
 
+	dtfxlsx: dir + 'DataTypesFormats.xlsx',
+
 	fstxls: dir + 'formula_stress_test.xls',
 	fstxml: dir + 'formula_stress_test.xls.xml',
 	fstxlsx: dir + 'formula_stress_test.xlsx',
@@ -1381,6 +1383,20 @@ describe('parse features', function() {
 			});
 		});
 	});
+
+	describe('data types formats', function() {[
+		['xlsx', paths.dtfxlsx],
+	].forEach(function(m) { it(m[0], function() {
+		var wb = X.read(fs.readFileSync(m[1]), {type: TYPE, cellDates: true});
+		var ws = wb.Sheets[wb.SheetNames[0]];
+		var data = X.utils.sheet_to_json(ws, { header: 1, raw: true, rawNumbers: false });
+		assert(data[0][1] instanceof Date);
+		assert(data[1][1] instanceof Date);
+		assert.equal(data[2][1], '$123.00');
+		assert.equal(data[3][1], '98.76%');
+		assert.equal(data[4][1], '456.00');
+		assert.equal(data[5][1], '7,890');
+	}); }); });
 });
 
 describe('write features', function() {
diff --git a/test.mjs b/test.mjs
index 4891dee..7bd3060 100644
--- a/test.mjs
+++ b/test.mjs
@@ -145,6 +145,8 @@ var paths = {
 	dtxlsx:  dir + 'xlsx-stream-d-date-cell.xlsx',
 	dtxlsb:  dir + 'xlsx-stream-d-date-cell.xlsb',
 
+	dtfxlsx: dir + 'DataTypesFormats.xlsx',
+
 	fstxls: dir + 'formula_stress_test.xls',
 	fstxml: dir + 'formula_stress_test.xls.xml',
 	fstxlsx: dir + 'formula_stress_test.xlsx',
@@ -1371,6 +1373,20 @@ describe('parse features', function() {
 			});
 		});
 	});
+
+	describe('data types formats', function() {[
+		['xlsx', paths.dtfxlsx]
+	].forEach(function(m) { it(m[0], function() {
+		var wb = X.read(fs.readFileSync(m[1]), {type: TYPE, cellDates: true});
+		var ws = wb.Sheets[wb.SheetNames[0]];
+		var data = X.utils.sheet_to_json(ws, { header: 1, raw: true, rawNumbers: false });
+		assert.ok(data[0][1] instanceof Date);
+		assert.ok(data[1][1] instanceof Date);
+		assert.equal(data[2][1], '$123.00');
+		assert.equal(data[3][1], '98.76%');
+		assert.equal(data[4][1], '456.00');
+		assert.equal(data[5][1], '7,890');
+	}); }); });
 });
 
 describe('write features', function() {
diff --git a/test.ts b/test.ts
index 9cd2756..2f570e3 100644
--- a/test.ts
+++ b/test.ts
@@ -165,6 +165,8 @@ var paths: any = {
 	dtxlsx:  dir + 'xlsx-stream-d-date-cell.xlsx',
 	dtxlsb:  dir + 'xlsx-stream-d-date-cell.xlsb',
 
+	dtfxlsx: dir + 'DataTypesFormats.xlsx',
+
 	fstxls: dir + 'formula_stress_test.xls',
 	fstxml: dir + 'formula_stress_test.xls.xml',
 	fstxlsx: dir + 'formula_stress_test.xlsx',
@@ -951,7 +953,7 @@ Deno.test('parse features', async function(t) {
 				X.read(fs.readFileSync(paths.cpxml), {type:TYPE, WTF:true})
 			];
 
-		var s1 = ['XLSX', 'XLSB', 'XLS', 'XML']; for(var i = 0; i < s1.length; ++i) { let x = s1[i]; 
+		var s1 = ['XLSX', 'XLSB', 'XLS', 'XML']; for(var i = 0; i < s1.length; ++i) { let x = s1[i];
 			await t.step(x + ' should parse core properties', async function(t) { var P = wbs?.[i]?.Props; if(typeof P == "undefined") throw "missing props"; coreprop(P); });
 			await t.step(x + ' should parse custom properties', async function(t) { custprop(wbs?.[i]?.Custprops); });
 		}
@@ -1335,6 +1337,20 @@ Deno.test('parse features', async function(t) {
 			});
 		});
 	});
+
+	await t.step('data types formats', async function(t) {var dtf = [
+		['xlsx', paths.dtfxlsx]
+	]; for(var j = 0; j < dtf.length; ++j) { var m = dtf[j]; await t.step(m[0], async function(t) {
+		var wb = X.read(fs.readFileSync(m[1]), {type: TYPE, cellDates: true});
+		var ws = wb.Sheets[wb.SheetNames[0]];
+		var data = X.utils.sheet_to_json<any>(ws, { header: 1, raw: true, rawNumbers: false });
+		assert.assert(data[0][1] instanceof Date);
+		assert.assert(data[1][1] instanceof Date);
+		assert.equal(data[2][1], '$123.00');
+		assert.equal(data[3][1], '98.76%');
+		assert.equal(data[4][1], '456.00');
+		assert.equal(data[5][1], '7,890');
+	}); } });
 });
 
 Deno.test('write features', async function(t) {
diff --git a/tests.lst b/tests.lst
index fbdc5ae..1eedf9d 100644
--- a/tests.lst
+++ b/tests.lst
@@ -45,6 +45,7 @@ text_and_numbers.xlsb
 time_stress_test_1.xlsb.pending
 xlsx-stream-d-date-cell.xlsb
 AutoFilter.xlsx
+DataTypesFormats.xlsx
 ErrorTypes.xlsx
 LONumbers-2010.xlsx
 LONumbers-2011.xlsx
diff --git a/tests/core.js b/tests/core.js
index 630115e..6e8a1f6 100644
--- a/tests/core.js
+++ b/tests/core.js
@@ -144,6 +144,8 @@ var paths = {
 	dtxlsx:  dir + 'xlsx-stream-d-date-cell.xlsx',
 	dtxlsb:  dir + 'xlsx-stream-d-date-cell.xlsb',
 
+	dtfxlsx: dir + 'DataTypesFormats.xlsx',
+
 	fstxls: dir + 'formula_stress_test.xls',
 	fstxml: dir + 'formula_stress_test.xls.xml',
 	fstxlsx: dir + 'formula_stress_test.xlsx',
@@ -1381,6 +1383,20 @@ describe('parse features', function() {
 			});
 		});
 	});
+
+	describe('data types formats', function() {[
+		['xlsx', paths.dtfxlsx],
+	].forEach(function(m) { it(m[0], function() {
+		var wb = X.read(fs.readFileSync(m[1]), {type: TYPE, cellDates: true});
+		var ws = wb.Sheets[wb.SheetNames[0]];
+		var data = X.utils.sheet_to_json(ws, { header: 1, raw: true, rawNumbers: false });
+		assert(data[0][1] instanceof Date);
+		assert(data[1][1] instanceof Date);
+		assert.equal(data[2][1], '$123.00');
+		assert.equal(data[3][1], '98.76%');
+		assert.equal(data[4][1], '456.00');
+		assert.equal(data[5][1], '7,890');
+	}); }); });
 });
 
 describe('write features', function() {
diff --git a/tests/fixtures.js b/tests/fixtures.js
index 40aed27..dd2c462 100644
--- a/tests/fixtures.js
+++ b/tests/fixtures.js
@@ -57,6 +57,7 @@ fs['./test_files/column_width.xlsx'] = 'UEsDBBQABgAIAAAAIQA7SI5AaQEAAMQEAAATAAgC
 fs['./test_files/column_width.xlsb'] = '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';
 fs['./test_files/column_width.slk'] = 'SUQ7UFdYTDtOO0UNUDtQR2VuZXJhbA1QO1AwDVA7UDAuMDANUDtQIywjIzANUDtQIywjIzAuMDANUDtQIywjIzBfKTs7XCgjLCMjMFwpDVA7UCMsIyMwXyk7O1tSZWRdXCgjLCMjMFwpDVA7UCMsIyMwLjAwXyk7O1woIywjIzAuMDBcKQ1QO1AjLCMjMC4wMF8pOztbUmVkXVwoIywjIzAuMDBcKQ1QO1AiJCIjLCMjMF8pOztcKCIkIiMsIyMwXCkNUDtQIiQiIywjIzBfKTs7W1JlZF1cKCIkIiMsIyMwXCkNUDtQIiQiIywjIzAuMDBfKTs7XCgiJCIjLCMjMC4wMFwpDVA7UCIkIiMsIyMwLjAwXyk7O1tSZWRdXCgiJCIjLCMjMC4wMFwpDVA7UDAlDVA7UDAuMDAlDVA7UDAuMDBFKzAwDVA7UCMjMC4wRSswDVA7UCNcID8vPw1QO1AjXCA/Py8/Pw1QO1BtL2QveXkNUDtQZFwtbW1tXC15eQ1QO1BkXC1tbW0NUDtQbW1tXC15eQ1QO1BoOm1tXCBBTS9QTQ1QO1BoOm1tOnNzXCBBTS9QTQ1QO1BoaDptbQ1QO1BoaDptbTpzcw1QO1BtL2QveXlcIGhoOm1tDVA7UG1tOnNzDVA7UG1tOnNzLjANUDtQQA1QO1BbaF06bW06c3MNUDtQXygiJCIqICMsIyMwXyk7O18oIiQiKiBcKCMsIyMwXCk7O18oIiQiKiAiLSJfKTs7XyhAXykNUDtQXygqICMsIyMwXyk7O18oKiBcKCMsIyMwXCk7O18oKiAiLSJfKTs7XyhAXykNUDtQXygiJCIqICMsIyMwLjAwXyk7O18oIiQiKiBcKCMsIyMwLjAwXCk7O18oIiQiKiAiLSI/P18pOztfKEBfKQ1QO1BfKCogIywjIzAuMDBfKTs7XygqIFwoIywjIzAuMDBcKTs7XygqICItIj8/Xyk7O18oQF8pDVA7RkNhbGlicmk7TTI0MDtMOQ1QO0ZDYWxpYnJpO00yNDA7TDkNUDtGQ2FsaWJyaTtNMjQwO0w5DVA7RkNhbGlicmk7TTI0MDtMOQ1QO0VDYWxpYnJpO00yNDA7TDkNUDtFQ2FsaWJyaSBMaWdodDtNMzYwO1NCO0w1NQ1QO0VDYWxpYnJpO00zMDA7U0I7TDU1DVA7RUNhbGlicmk7TTI2MDtTQjtMNTUNUDtFQ2FsaWJyaTtNMjIwO1NCO0w1NQ1QO0VDYWxpYnJpO00yNDA7TDE4DVA7RUNhbGlicmk7TTI0MDtMMTUNUDtFQ2FsaWJyaTtNMjQwO0w2MQ1QO0VDYWxpYnJpO00yNDA7TDYzDVA7RUNhbGlicmk7TTI0MDtTQjtMNjQNUDtFQ2FsaWJyaTtNMjQwO1NCO0w1Mw1QO0VDYWxpYnJpO00yNDA7TDUzDVA7RUNhbGlicmk7TTI0MDtTQjtMMTANUDtFQ2FsaWJyaTtNMjQwO0wxMQ1QO0VDYWxpYnJpO00yNDA7U0k7TDI0DVA7RUNhbGlicmk7TTI0MDtTQjtMOQ1QO0VDYWxpYnJpO00yNDA7TDEwDUY7UDA7REcwRzEwO00zMjANQjtZNDtYODtEMCAwIDMgNw1PO0w7RDtWMDtLNDc7RzEwMCAwLjAwMQ1GO1cyIDIgMA1GO1czIDMgMTYNRjtXNCA0IDENRjtXNSA1IDQNRjtXNiA2IDgNRjtXNyA3IDEyDUY7VzggOCAxNg1DO1kxO1gxO0siZGVmYXVsdCINQztYMjtLIlcgLjA5Ig1DO1g1O0siVyA0Ig1DO1g3O0siVyAxMiINQztZMjtYMTtLIlcgMTAiDUM7WDI7SyIxIHB4Ig1DO1g0O0siMTAgcHgiDUM7WDY7SyJXIDgiDUM7WDg7SyJXIDE2Ig1DO1kzO1gxO0siNjUgcHgiDUM7WDM7SyJXIDE1LjgzIg1DO1g1O0siMjkgcHgiDUM7WDc7SyI3NyBweCINQztZNDtYMztLIjEwMCBweCINQztYNDtLIlcgLjkiDUM7WDY7SyI1MyBweCINQztYODtLIjEwMSBweCINRQ0=';
 fs['./test_files/cross-sheet_formula_names.xlsb'] = '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';
+fs['./test_files/DataTypesFormats.xlsx'] = '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';
 fs['./test_files/defined_names_simple.xls'] = '0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAMQAAAAAAAAAAEAAA/v///wAAAAD+////AAAAADAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8JCBAAAAYFAFQ4zQfBwAEABgcAAOEAAgCwBMEAAgAAAOIAAABcAHAACQAATWljcm9zb2Z0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIAAgCwBGEBAgAAAMABAAA9AQIAAQCcAAIAEQAZAAIAAAASAAIAAAATAAIAAACvAQIAAAC8AQIAAAA9ABIAAAAAAFhhTjQ4AAAAAAABAFgCQAACAAAAjQACAAAAIgACAAAADgACAAEAtwECAAAA2gACAAAAMQAeANwAAAAIAJABAAAAAqHJBwFDAGEAbABpAGIAcgBpADEAHgDcAAAACACQAQAAAAKhnQcBQwBhAGwAaQBiAHIAaQAxAB4A3AAAAAgAkAEAAAACoZ0HAUMAYQBsAGkAYgByAGkAMQAeANwAAAAIAJABAAAAAqGdBwFDAGEAbABpAGIAcgBpADEAHgDcAAAACACQAQAAAAKhnQcBQwBhAGwAaQBiAHIAaQAxACoAaAEAADYAkAEAAAACoZ0NAUMAYQBsAGkAYgByAGkAIABMAGkAZwBoAHQAMQAeACwBAQA2ALwCAAAAAqGdBwFDAGEAbABpAGIAcgBpADEAHgAEAQEANgC8AgAAAAKhnQcBQwBhAGwAaQBiAHIAaQAxAB4A3AABADYAvAIAAAACoZ0HAUMAYQBsAGkAYgByAGkAMQAeANwAAAARAJABAAAAAqGdBwFDAGEAbABpAGIAcgBpADEAHgDcAAAAFACQAQAAAAKhnQcBQwBhAGwAaQBiAHIAaQAxAB4A3AAAADwAkAEAAAACoZ0HAUMAYQBsAGkAYgByAGkAMQAeANwAAAA+AJABAAAAAqGdBwFDAGEAbABpAGIAcgBpADEAHgDcAAEAPwC8AgAAAAKhAQcBQwBhAGwAaQBiAHIAaQAxAB4A3AABADQAvAIAAAACoZ0HAUMAYQBsAGkAYgByAGkAMQAeANwAAAA0AJABAAAAAqGdBwFDAGEAbABpAGIAcgBpADEAHgDcAAEACQC8AgAAAAKhnQcBQwBhAGwAaQBiAHIAaQAxAB4A3AAAAAoAkAEAAAACoZ0HAUMAYQBsAGkAYgByAGkAMQAeANwAAgAXAJABAAAAAqEABwFDAGEAbABpAGIAcgBpADEAHgDcAAEACAC8AgAAAAKhAAcBQwBhAGwAaQBiAHIAaQAxAB4A3AAAAAkAkAEAAAACoQAHAUMAYQBsAGkAYgByAGkAHgQzAAUAFwABIwAsACMAIwAwAFwAIAAiAKwgIgA7AFwALQAjACwAIwAjADAAXAAgACIArCAiAB4EPQAGABwAASMALAAjACMAMABcACAAIgCsICIAOwBbAFIAZQBkAF0AXAAtACMALAAjACMAMABcACAAIgCsICIAHgQ/AAcAHQABIwAsACMAIwAwAC4AMAAwAFwAIAAiAKwgIgA7AFwALQAjACwAIwAjADAALgAwADAAXAAgACIArCAiAB4ESQAIACIAASMALAAjACMAMAAuADAAMABcACAAIgCsICIAOwBbAFIAZQBkAF0AXAAtACMALAAjACMAMAAuADAAMABcACAAIgCsICIAHgRxACoANgABXwAtACoAIAAjACwAIwAjADAAXAAgACIArCAiAF8ALQA7AFwALQAqACAAIwAsACMAIwAwAFwAIAAiAKwgIgBfAC0AOwBfAC0AKgAgACIALQAiAFwAIAAiAKwgIgBfAC0AOwBfAC0AQABfAC0AHgRrACkAMwABXwAtACoAIAAjACwAIwAjADAAXAAgAF8ArCBfAC0AOwBcAC0AKgAgACMALAAjACMAMABcACAAXwCsIF8ALQA7AF8ALQAqACAAIgAtACIAXAAgAF8ArCBfAC0AOwBfAC0AQABfAC0AHgSBACwAPgABXwAtACoAIAAjACwAIwAjADAALgAwADAAXAAgACIArCAiAF8ALQA7AFwALQAqACAAIwAsACMAIwAwAC4AMAAwAFwAIAAiAKwgIgBfAC0AOwBfAC0AKgAgACIALQAiAD8APwBcACAAIgCsICIAXwAtADsAXwAtAEAAXwAtAB4EewArADsAAV8ALQAqACAAIwAsACMAIwAwAC4AMAAwAFwAIABfAKwgXwAtADsAXAAtACoAIAAjACwAIwAjADAALgAwADAAXAAgAF8ArCBfAC0AOwBfAC0AKgAgACIALQAiAD8APwBcACAAXwCsIF8ALQA7AF8ALQBAAF8ALQDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAPX/IAAAAAAAAAAAAAAAwCDgABQAAAAAAAEAIAAAAAAAAAAAAAACwCDgABQABQAAAPX/IAAAtAAAAAAAAAAEmyDgABQABQAAAPX/IAAAtAAAAAAAAAAEryDgABQABQAAAPX/IAAAtAAAAAAAAAAEiSDgABQABQAAAPX/IAAAtAAAAAAAAAAEmiDgABQABQAAAPX/IAAAtAAAAAAAAAAEnyDgABQABQAAAPX/IAAAtAAAAAAAAAAEqiDgABQABQAAAPX/IAAAtAAAAAAAAAAErCDgABQABQAAAPX/IAAAtAAAAAAAAAAEryDgABQABQAAAPX/IAAAtAAAAAAAAAAEliDgABQABQAAAPX/IAAAtAAAAAAAAAAEqyDgABQABQAAAPX/IAAAtAAAAAAAAAAErCDgABQABQAAAPX/IAAAtAAAAAAAAAAEqyDgABQAFQAAAPX/IAAAtAAAAAAAAAAErCDgABQAFQAAAPX/IAAAtAAAAAAAAAAEryDgABQAFQAAAPX/IAAAtAAAAAAAAAAEliDgABQAFQAAAPX/IAAAtAAAAAAAAAAEqyDgABQAFQAAAPX/IAAAtAAAAAAAAAAEsSDgABQAFQAAAPX/IAAAtAAAAAAAAAAEuSDgABQAFQAAAPX/IAAAtAAAAAAAAAAEsSDgABQAFQAAAPX/IAAAtAAAAAAAAAAEtSDgABQAFQAAAPX/IAAAtAAAAAAAAAAEtyDgABQAFQAAAPX/IAAAtAAAAAAAAAAEsyDgABQAFQAAAPX/IAAAtAAAAAAAAAAEviDgABQAFQAAAPX/IAAAtAAAAAAAAAAEuSDgABQACwAAAPX/IAAAtAAAAAAAAAAErSDgABQADwAAAPX/IAAAlBERlwuXCwAEliDgABQAEQAAAPX/IAAAlGZmvx+/HwAEtyDgABQABQArAPX/IAAA+AAAAAAAAAAAwCDgABQABQApAPX/IAAA+AAAAAAAAAAAwCDgABQABQAsAPX/IAAA+AAAAAAAAAAAwCDgABQABQAqAPX/IAAA+AAAAAAAAAAAwCDgABQAEwAAAPX/IAAA9AAAAAAAAAAAwCDgABQACgAAAPX/IAAAtAAAAAAAAAAEqiDgABQABwAAAPX/IAAA1ABQAACAGAAAwCDgABQACAAAAPX/IAAA1ABQAAAAFgAAwCDgABQACQAAAPX/IAAA1AAgAAAAFgAAwCDgABQACQAAAPX/IAAA9AAAAAAAAAAAwCDgABQADQAAAPX/IAAAlBERlwuXCwAEryDgABQAEAAAAPX/IAAA1ABgAAAAGgAAwCDgABQADAAAAPX/IAAAtAAAAAAAAAAE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BAAAAC0AOwBfAC0AfQhBAH0IAAAAAAAAAAAAAAAAIgAAAAMADQAUAAMAAAAAAAAAAF8ArCBfAC0OAAUAAgQAFAADAAAABAAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAEAAAAAMADQAUAAMAAAABAAAAAF8ArCBfAC0OAAUAAgQAFAADAGVmBAAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAFgAAAAMADQAUAAMAAAABAAAAAF8ArCBfAC0OAAUAAgQAFAADAMxMBAAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAHAAAAAMADQAUAAMAAAAAAAAAAF8ArCBfAC0OAAUAAgQAFAADADIzBAAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAIwAAAAMADQAUAAMAAAAAAAAAAF8ArCBfAC0OAAUAAgQAFAADAAAABQAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAEQAAAAMADQAUAAMAAAABAAAAAF8ArCBfAC0OAAUAAgQAFAADAGVmBQAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAFwAAAAMADQAUAAMAAAABAAAAAF8ArCBfAC0OAAUAAgQAFAADAMxMBQAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAHQAAAAMADQAUAAMAAAAAAAAAAF8ArCBfAC0OAAUAAgQAFAADADIzBQAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAJAAAAAMADQAUAAMAAAAAAAAAAF8ArCBfAC0OAAUAAgQAFAADAAAABgAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAEgAAAAMADQAUAAMAAAABAAAAAF8ArCBfAC0OAAUAAgQAFAADAGVmBgAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAGAAAAAMADQAUAAMAAAABAAAAAF8ArCBfAC0OAAUAAgQAFAADAMxMBgAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAHgAAAAMADQAUAAMAAAAAAAAAAF8ArCBfAC0OAAUAAgQAFAADADIzBgAAACMAMAAuADAAfQhBAH0IAAAAAAAAAAAAAAAAJQAAAAMADQAUAAMAAAAAAAAAAF8ArCBfAC0OAAUAAgQAFAADAAAABwAA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Y5zPAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7/AAAGAQIAAAAAAAAAAAAAAAAAAAAAAAEAAAAC1c3VnC4bEJOXCAArLPmuMAAAAAgBAAAJAAAAAQAAAFAAAAAPAAAAWAAAABcAAABsAAAACwAAAHQAAAAQAAAAfAAAABMAAACEAAAAFgAAAIwAAAANAAAAlAAAAAwAAADGAAAAAgAAAOUEAAAeAAAADAAAAE1pY3Jvc29mdAAAAAMAAAAAAA8ACwAAAAAAAAALAAAAAAAAAAsAAAAAAAAACwAAAAAAAAAeEAAAAwAAAAcAAABTaGVldDEADwAAAFNoZWV0MSFTSEVFVGpzAAgAAABTaGVldEpTAAwQAAAEAAAAHgAAAAsAAABXb3Jrc2hlZXRzAAMAAAABAAAAHgAAAA0AAABOYW1lZCBSYW5nZXMAAwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAA/v///yEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAD+////KQAAACoAAAArAAAALAAAAC0AAAAuAAAALwAAAP7////9/////v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUB//////////8CAAAAIAgCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAVwBvAHIAawBiAG8AbwBrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0T4AAAAAAAAFAFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAACAQEAAAADAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAEAAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIB////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAAQAAAAAAAA';
 fs['./test_files/defined_names_simple.xml'] = 'PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8P21zby1hcHBsaWNhdGlvbiBwcm9naWQ9IkV4Y2VsLlNoZWV0Ij8+DQo8V29ya2Jvb2sgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOnNwcmVhZHNoZWV0Ig0KIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSINCiB4bWxuczp4PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpleGNlbCINCiB4bWxuczpzcz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6c3ByZWFkc2hlZXQiDQogeG1sbnM6aHRtbD0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+DQogPERvY3VtZW50UHJvcGVydGllcyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIj4NCiAgPEF1dGhvcj5NaWNyb3NvZnQ8L0F1dGhvcj4NCiAgPExhc3RBdXRob3I+TWljcm9zb2Z0PC9MYXN0QXV0aG9yPg0KICA8Q3JlYXRlZD4yMDE0LTA3LTEwVDE3OjExOjM3WjwvQ3JlYXRlZD4NCiAgPExhc3RTYXZlZD4yMDE0LTA3LTEwVDE3OjIxOjEzWjwvTGFzdFNhdmVkPg0KICA8Q29tcGFueT5NaWNyb3NvZnQ8L0NvbXBhbnk+DQogIDxWZXJzaW9uPjE1LjAwPC9WZXJzaW9uPg0KIDwvRG9jdW1lbnRQcm9wZXJ0aWVzPg0KIDxPZmZpY2VEb2N1bWVudFNldHRpbmdzIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiPg0KICA8QWxsb3dQTkcvPg0KIDwvT2ZmaWNlRG9jdW1lbnRTZXR0aW5ncz4NCiA8RXhjZWxXb3JrYm9vayB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6ZXhjZWwiPg0KICA8V2luZG93SGVpZ2h0PjEzMzkwPC9XaW5kb3dIZWlnaHQ+DQogIDxXaW5kb3dXaWR0aD4yNDkyMDwvV2luZG93V2lkdGg+DQogIDxXaW5kb3dUb3BYPjA8L1dpbmRvd1RvcFg+DQogIDxXaW5kb3dUb3BZPjA8L1dpbmRvd1RvcFk+DQogIDxQcm90ZWN0U3RydWN0dXJlPkZhbHNlPC9Qcm90ZWN0U3RydWN0dXJlPg0KICA8UHJvdGVjdFdpbmRvd3M+RmFsc2U8L1Byb3RlY3RXaW5kb3dzPg0KIDwvRXhjZWxXb3JrYm9vaz4NCiA8U3R5bGVzPg0KICA8U3R5bGUgc3M6SUQ9IkRlZmF1bHQiIHNzOk5hbWU9Ik5vcm1hbCI+DQogICA8QWxpZ25tZW50IHNzOlZlcnRpY2FsPSJCb3R0b20iLz4NCiAgIDxCb3JkZXJzLz4NCiAgIDxGb250IHNzOkZvbnROYW1lPSJDYWxpYnJpIiB4OkNoYXJTZXQ9IjE2MSIgeDpGYW1pbHk9IlN3aXNzIiBzczpTaXplPSIxMSINCiAgICBzczpDb2xvcj0iIzAwMDAwMCIvPg0KICAgPEludGVyaW9yLz4NCiAgIDxOdW1iZXJGb3JtYXQvPg0KICAgPFByb3RlY3Rpb24vPg0KICA8L1N0eWxlPg0KIDwvU3R5bGVzPg0KIDxOYW1lcz4NCiAgPE5hbWVkUmFuZ2Ugc3M6TmFtZT0iU2hlZXRKUyIgc3M6UmVmZXJzVG89Ij1TaGVldDEhUjFDMSIvPg0KIDwvTmFtZXM+DQogPFdvcmtzaGVldCBzczpOYW1lPSJTaGVldDEiPg0KICA8TmFtZXM+DQogICA8TmFtZWRSYW5nZSBzczpOYW1lPSJTSEVFVGpzIiBzczpSZWZlcnNUbz0iPVNoZWV0MSFSMkMxIi8+DQogIDwvTmFtZXM+DQogIDxUYWJsZSBzczpFeHBhbmRlZENvbHVtbkNvdW50PSIyIiBzczpFeHBhbmRlZFJvd0NvdW50PSIyIiB4OkZ1bGxDb2x1bW5zPSIxIg0KICAgeDpGdWxsUm93cz0iMSIgc3M6RGVmYXVsdFJvd0hlaWdodD0iMTQuNSI+DQogICA8Um93Pg0KICAgIDxDZWxsIHNzOkZvcm11bGE9Ij0xKzEiPjxEYXRhIHNzOlR5cGU9Ik51bWJlciI+MjwvRGF0YT48TmFtZWRDZWxsDQogICAgICBzczpOYW1lPSJTaGVldEpTIi8+PC9DZWxsPg0KICAgIDxDZWxsPjxEYXRhIHNzOlR5cGU9Ik51bWJlciI+MTwvRGF0YT48L0NlbGw+DQogICA8L1Jvdz4NCiAgIDxSb3c+DQogICAgPENlbGw+PERhdGEgc3M6VHlwZT0iTnVtYmVyIj4zPC9EYXRhPjxOYW1lZENlbGwgc3M6TmFtZT0iU0hFRVRqcyIvPjwvQ2VsbD4NCiAgICA8Q2VsbCBzczpGb3JtdWxhPSI9U0hFRVRqcyAtIFNoZWV0MSFTSEVFVGpzIj48RGF0YSBzczpUeXBlPSJOdW1iZXIiPjA8L0RhdGE+PC9DZWxsPg0KICAgPC9Sb3c+DQogIDwvVGFibGU+DQogIDxXb3Jrc2hlZXRPcHRpb25zIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpleGNlbCI+DQogICA8UGFnZVNldHVwPg0KICAgIDxIZWFkZXIgeDpNYXJnaW49IjAuMyIvPg0KICAgIDxGb290ZXIgeDpNYXJnaW49IjAuMyIvPg0KICAgIDxQYWdlTWFyZ2lucyB4OkJvdHRvbT0iMC43NSIgeDpMZWZ0PSIwLjciIHg6UmlnaHQ9IjAuNyIgeDpUb3A9IjAuNzUiLz4NCiAgIDwvUGFnZVNldHVwPg0KICAgPFNlbGVjdGVkLz4NCiAgIDxQYW5lcz4NCiAgICA8UGFuZT4NCiAgICAgPE51bWJlcj4zPC9OdW1iZXI+DQogICAgIDxBY3RpdmVSb3c+MTwvQWN0aXZlUm93Pg0KICAgICA8QWN0aXZlQ29sPjE8L0FjdGl2ZUNvbD4NCiAgICA8L1BhbmU+DQogICA8L1BhbmVzPg0KICAgPFByb3RlY3RPYmplY3RzPkZhbHNlPC9Qcm90ZWN0T2JqZWN0cz4NCiAgIDxQcm90ZWN0U2NlbmFyaW9zPkZhbHNlPC9Qcm90ZWN0U2NlbmFyaW9zPg0KICA8L1dvcmtzaGVldE9wdGlvbnM+DQogPC9Xb3Jrc2hlZXQ+DQo8L1dvcmtib29rPg0K';
 fs['./test_files/defined_names_simple.xlsx'] = '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';
diff --git a/tests/fixtures.lst b/tests/fixtures.lst
index c731718..ed26a56 100644
--- a/tests/fixtures.lst
+++ b/tests/fixtures.lst
@@ -57,6 +57,7 @@
 ./test_files/column_width.xlsb
 ./test_files/column_width.slk
 ./test_files/cross-sheet_formula_names.xlsb
+./test_files/DataTypesFormats.xlsx
 ./test_files/defined_names_simple.xls
 ./test_files/defined_names_simple.xml
 ./test_files/defined_names_simple.xlsx
diff --git a/xlsx.flow.js b/xlsx.flow.js
index 7de707e..2094177 100644
--- a/xlsx.flow.js
+++ b/xlsx.flow.js
@@ -131,29 +131,29 @@ var Base64 = function() {
     }
   };
 }();
-var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node);
+var has_buf = /*#__PURE__*/(function() { return typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node; })();
 
-var Buffer_from = /*::(*/function(){}/*:: :any)*/;
+var Buffer_from = /*#__PURE__*/(function() {
+	if(typeof Buffer !== 'undefined') {
+		var nbfs = !Buffer.from;
+		if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
+		return nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
+	}
+	return function() {};
+})();
 
-if(typeof Buffer !== 'undefined') {
-	var nbfs = !Buffer.from;
-	if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
-	Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
-	// $FlowIgnore
-	if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
-	// $FlowIgnore
-	if(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); };
-}
 
 function new_raw_buf(len/*:number*/) {
 	/* jshint -W056 */
-	return has_buf ? Buffer.alloc(len) : typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len);
+	if(has_buf) return Buffer.alloc ? Buffer.alloc(len) : new Buffer(len);
+	return typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len);
 	/* jshint +W056 */
 }
 
 function new_unsafe_buf(len/*:number*/) {
 	/* jshint -W056 */
-	return has_buf ? Buffer.allocUnsafe(len) : typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len);
+	if(has_buf) return Buffer.allocUnsafe ? Buffer.allocUnsafe(len) : new Buffer(len);
+	return typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len);
 	/* jshint +W056 */
 }
 
@@ -188,6 +188,23 @@ function ab2a(data/*:ArrayBuffer|Uint8Array*/)/*:Array<number>*/ {
 	return o;
 }
 
+var bconcat = has_buf ? function(bufs) { return Buffer.concat(bufs.map(function(buf) { return Buffer.isBuffer(buf) ? buf : Buffer_from(buf); })); } : function(bufs) {
+	if(typeof Uint8Array !== "undefined") {
+		var i = 0, maxlen = 0;
+		for(i = 0; i < bufs.length; ++i) maxlen += bufs[i].length;
+		var o = new Uint8Array(maxlen);
+		var len = 0;
+		for(i = 0, maxlen = 0; i < bufs.length; maxlen += len, ++i) {
+			len = bufs[i].length;
+			if(bufs[i] instanceof Uint8Array) o.set(bufs[i], maxlen);
+			else if(typeof bufs[i] == "string") { throw "wtf"; }
+			else o.set(new Uint8Array(bufs[i]), maxlen);
+		}
+		return o;
+	}
+	return [].concat.apply([], bufs.map(function(buf) { return Array.isArray(buf) ? buf : [].slice.call(buf); }));
+};
+
 function utf8decode(content/*:string*/) {
 	var out = [], widx = 0, L = content.length + 250;
 	var o = new_raw_buf(content.length + 255);
@@ -220,23 +237,6 @@ function utf8decode(content/*:string*/) {
 	return bconcat(out);
 }
 
-var bconcat = function(bufs) {
-	if(typeof Uint8Array !== "undefined") {
-		var i = 0, maxlen = 0;
-		for(i = 0; i < bufs.length; ++i) maxlen += bufs[i].length;
-		var o = new Uint8Array(maxlen);
-		var len = 0;
-		for(i = 0, maxlen = 0; i < bufs.length; maxlen += len, ++i) {
-			len = bufs[i].length;
-			if(bufs[i] instanceof Uint8Array) o.set(bufs[i], maxlen);
-			else if(typeof bufs[i] == "string") { throw "wtf"; }
-			else o.set(new Uint8Array(bufs[i]), maxlen);
-		}
-		return o;
-	}
-	return [].concat.apply([], bufs.map(function(buf) { return Array.isArray(buf) ? buf : [].slice.call(buf); }));
-};
-
 var chr0 = /\u0000/g, chr1 = /[\u0001-\u0006]/g;
 /*::
 declare type Block = any;
@@ -255,26 +255,19 @@ type EvertArrType = {[string]:Array<string>};
 
 type StringConv = {(string):string};
 
-type WriteObjStrFactory = {from_sheet(ws:Worksheet, o:any, wb:?Workbook):string};
 */
 /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
 /*jshint -W041 */
-var SSF/*:SSFModule*/ = ({}/*:any*/);
-function make_ssf(SSF/*:SSFModule*/){
-SSF.version = '0.11.2';
 function _strrev(x/*:string*/)/*:string*/ { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }
-function fill(c/*:string*/,l/*:number*/)/*:string*/ { var o = ""; while(o.length < l) o+=c; return o; }
 function pad0(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
 function pad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;}
 function rpad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);}
 function pad0r1(v/*:any*/,d/*:number*/)/*:string*/{var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}
 function pad0r2(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
-var p2_32 = Math.pow(2,32);
+var p2_32 = /*#__PURE__*/Math.pow(2,32);
 function pad0r(v/*:any*/,d/*:number*/)/*:string*/{if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }
-function isgeneral(s/*:string*/, i/*:?number*/)/*:boolean*/ { i = i || 0; 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; }
-/*::
-type SSF_write_num = {(type:string, fmt:string, val:number):string};
-*/
+/* yes, in 2022 this is still faster than string compare */
+function SSF_isgeneral(s/*:string*/, i/*:?number*/)/*:boolean*/ { i = i || 0; 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 days/*:Array<Array<string> >*/ = [
 	['Sun', 'Sunday'],
 	['Mon', 'Monday'],
@@ -298,7 +291,8 @@ var months/*:Array<Array<string> >*/ = [
 	['N', 'Nov', 'November'],
 	['D', 'Dec', 'December']
 ];
-function init_table(t/*:any*/) {
+function SSF_init_table(t/*:any*/) {
+	if(!t) t = {};
 	t[0]=  'General';
 	t[1]=  '0';
 	t[2]=  '0.00';
@@ -328,47 +322,66 @@ function init_table(t/*:any*/) {
 	t[48]= '##0.0E+0';
 	t[49]= '@';
 	t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "';
+	return t;
 }
+/* repeated to satiate webpack */
+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 table_fmt = {};
-init_table(table_fmt);
 /* Defaults determined by systematically testing in Excel 2019 */
 
 /* These formats appear to default to other formats in the table */
-var default_map/*:Array<number>*/ = [];
-var defi = 0;
+var SSF_default_map = {
+	5:  37, 6:  38, 7:  39, 8:  40,         //  5 -> 37 ...  8 -> 40
 
-//  5 -> 37 ...  8 -> 40
-for(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi;
+	23:  0, 24:  0, 25:  0, 26:  0,         // 23 ->  0 ... 26 ->  0
 
-// 23 ->  0 ... 26 ->  0
-for(defi = 23; defi <= 26; ++defi) default_map[defi] = 0;
+	27: 14, 28: 14, 29: 14, 30: 14, 31: 14, // 27 -> 14 ... 31 -> 14
 
-// 27 -> 14 ... 31 -> 14
-for(defi = 27; defi <= 31; ++defi) default_map[defi] = 14;
-// 50 -> 14 ... 58 -> 14
-for(defi = 50; defi <= 58; ++defi) default_map[defi] = 14;
+	50: 14, 51: 14, 52: 14, 53: 14, 54: 14, // 50 -> 14 ... 58 -> 14
+	55: 14, 56: 14, 57: 14, 58: 14,
+	59:  1, 60:  2, 61:  3, 62:  4,         // 59 ->  1 ... 62 ->  4
 
-// 59 ->  1 ... 62 ->  4
-for(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58;
-// 67 ->  9 ... 68 -> 10
-for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58;
-// 72 -> 14 ... 75 -> 17
-for(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58;
+	67:  9, 68: 10,                         // 67 ->  9 ... 68 -> 10
+	69: 12, 70: 13, 71: 14,                 // 69 -> 12 ... 71 -> 14
+	72: 14, 73: 15, 74: 16, 75: 17,         // 72 -> 14 ... 75 -> 17
+	76: 20, 77: 21, 78: 22,                 // 76 -> 20 ... 78 -> 22
+	79: 45, 80: 46, 81: 47,                 // 79 -> 45 ... 81 -> 47
+	82: 0                                   // 82 ->  0 ... 65536 -> 0 (omitted)
+};
 
-// 69 -> 12 ... 71 -> 14
-for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57;
-
-// 76 -> 20 ... 78 -> 22
-for(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56;
-
-// 79 -> 45 ... 81 -> 47
-for(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34;
-
-// 82 ->  0 ... 65536 -> 0 (omitted)
 
 /* These formats technically refer to Accounting formats with no equivalent */
-var default_str = {
+var SSF_default_str = {
 	//  5 -- Currency,   0 decimal, black negative
 	5:  '"$"#,##0_);\\("$"#,##0\\)',
 	63: '"$"#,##0_);\\("$"#,##0\\)',
@@ -398,7 +411,7 @@ var default_str = {
 	44: '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)'
 };
 
-function frac(x/*:number*/, D/*:number*/, mixed/*:?boolean*/)/*:Array<number>*/ {
+function SSF_frac(x/*:number*/, D/*:number*/, mixed/*:?boolean*/)/*:Array<number>*/ {
 	var sgn = x < 0 ? -1 : 1;
 	var B = x * sgn;
 	var P_2 = 0, P_1 = 1, P = 0;
@@ -418,7 +431,7 @@ function frac(x/*:number*/, D/*:number*/, mixed/*:?boolean*/)/*:Array<number>*/
 	var q = Math.floor(sgn * P/Q);
 	return [q, sgn*P - q*Q, Q];
 }
-function parse_date_code(v/*:number*/,opts/*:?any*/,b2/*:?boolean*/) {
+function SSF_parse_date_code(v/*:number*/,opts/*:?any*/,b2/*:?boolean*/) {
 	if(v > 2958465 || v < 0) return null;
 	var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;
 	var dout=[];
@@ -439,7 +452,7 @@ function parse_date_code(v/*:number*/,opts/*:?any*/,b2/*:?boolean*/) {
 		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);
+		if(b2) dow = SSF_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);
@@ -448,64 +461,53 @@ function parse_date_code(v/*:number*/,opts/*:?any*/,b2/*:?boolean*/) {
 	out.q = dow;
 	return out;
 }
-SSF.parse_date_code = parse_date_code;
-var basedate = new Date(1899, 11, 31, 0, 0, 0);
-var dnthresh = basedate.getTime();
-var base1904 = new Date(1900, 2, 1, 0, 0, 0);
+var SSFbasedate = /*#__PURE__*/new Date(1899, 11, 31, 0, 0, 0);
+var SSFdnthresh = /*#__PURE__*/SSFbasedate.getTime();
+var SSFbase1904 = /*#__PURE__*/new Date(1900, 2, 1, 0, 0, 0);
 function datenum_local(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ {
-	var epoch = v.getTime();
+	var epoch = /*#__PURE__*/v.getTime();
 	if(date1904) epoch -= 1461*24*60*60*1000;
-	else if(v >= base1904) epoch += 24*60*60*1000;
-	return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);
+	else if(v >= SSFbase1904) epoch += 24*60*60*1000;
+	return (epoch - (SSFdnthresh + (/*#__PURE__*/v.getTimezoneOffset() - /*#__PURE__*/SSFbasedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);
 }
-/* The longest 32-bit integer text is "-4294967296", exactly 11 chars */
-function general_fmt_int(v/*:number*/)/*:string*/ { return v.toString(10); }
-SSF._general_int = general_fmt_int;
-
 /* ECMA-376 18.8.30 numFmt*/
 /* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
-var general_fmt_num = (function make_general_fmt_num() {
-	var trailing_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)$/;
-	function strip_decimal(o/*:string*/)/*:string*/ {
-		return (o.indexOf(".") == -1) ? o : o.replace(trailing_zeroes_and_decimal, "$1");
-	}
+/* exponent >= -9 and <= 9 */
+function SSF_strip_decimal(o/*:string*/)/*:string*/ {
+	return (o.indexOf(".") == -1) ? o : o.replace(/(?:\.0*|(\.\d*[1-9])0+)$/, "$1");
+}
 
-	/* General Exponential always shows 2 digits exp and trims the mantissa */
-	var mantissa_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/;
-	var exp_with_single_digit = /(E[+-])(\d)$/;
-	function normalize_exp(o/*:string*/)/*:string*/ {
-		if(o.indexOf("E") == -1) return o;
-		return o.replace(mantissa_zeroes_and_decimal,"$1E").replace(exp_with_single_digit,"$10$2");
-	}
+/* General Exponential always shows 2 digits exp and trims the mantissa */
+function SSF_normalize_exp(o/*:string*/)/*:string*/ {
+	if(o.indexOf("E") == -1) return o;
+	return o.replace(/(?:\.0*|(\.\d*[1-9])0+)[Ee]/,"$1E").replace(/(E[+-])(\d)$/,"$10$2");
+}
 
-	/* exponent >= -9 and <= 9 */
-	function small_exp(v/*:number*/)/*:string*/ {
-		var w = (v<0?12:11);
-		var o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o;
-		o = v.toPrecision(10); if(o.length <= w) return o;
-		return v.toExponential(5);
-	}
+/* exponent >= -9 and <= 9 */
+function SSF_small_exp(v/*:number*/)/*:string*/ {
+	var w = (v<0?12:11);
+	var o = SSF_strip_decimal(v.toFixed(12)); if(o.length <= w) return o;
+	o = v.toPrecision(10); if(o.length <= w) return o;
+	return v.toExponential(5);
+}
 
-	/* exponent >= 11 or <= -10 likely exponential */
-	function large_exp(v/*:number*/)/*:string*/ {
-		var o = strip_decimal(v.toFixed(11));
-		return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o;
-	}
+/* exponent >= 11 or <= -10 likely exponential */
+function SSF_large_exp(v/*:number*/)/*:string*/ {
+	var o = SSF_strip_decimal(v.toFixed(11));
+	return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o;
+}
 
-	function general_fmt_num_base(v/*:number*/)/*:string*/ {
-		var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;
+function SSF_general_num(v/*:number*/)/*:string*/ {
+	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 = small_exp(v);
-		else if(V === 10) o = v.toFixed(10).substr(0,12);
-		else o = large_exp(v);
+	if(V >= -4 && V <= -1) o = v.toPrecision(10+V);
+	else if(Math.abs(V) <= 9) o = SSF_small_exp(v);
+	else if(V === 10) o = v.toFixed(10).substr(0,12);
+	else o = SSF_large_exp(v);
 
-		return strip_decimal(normalize_exp(o.toUpperCase()));
-	}
+	return SSF_strip_decimal(SSF_normalize_exp(o.toUpperCase()));
+}
 
-	return general_fmt_num_base;
-})();
-SSF._general_num = general_fmt_num;
 
 /*
 	"General" rules:
@@ -514,22 +516,23 @@ SSF._general_num = general_fmt_num;
 	- "up to 11 characters" displayed for numbers
 	- Default date format (code 14) used for Dates
 
+	The longest 32-bit integer text is "-2147483648", exactly 11 chars
 	TODO: technically the display depends on the width of the cell
 */
-function general_fmt(v/*:any*/, opts/*:any*/) {
+function SSF_general(v/*:any*/, opts/*:any*/) {
 	switch(typeof v) {
 		case 'string': return v;
 		case 'boolean': return v ? "TRUE" : "FALSE";
-		case 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v);
+		case 'number': return (v|0) === v ? v.toString(10) : SSF_general_num(v);
 		case 'undefined': return "";
 		case 'object':
 			if(v == null) return "";
-			if(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);
+			if(v instanceof Date) return SSF_format(14, datenum_local(v, opts && opts.date1904), opts);
 	}
 	throw new Error("unsupported value in General format: " + v);
 }
-SSF._general = general_fmt;
-function fix_hijri(date/*:Date*/, o/*:[number, number, number]*/) {
+
+function SSF_fix_hijri(date/*:Date*/, o/*:[number, number, number]*/) {
   /* TODO: properly adjust y/m/d and  */
   o[0] -= 581;
   var dow = date.getDay();
@@ -537,8 +540,7 @@ function fix_hijri(date/*:Date*/, o/*:[number, number, number]*/) {
   return dow;
 }
 //var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
-/*jshint -W086 */
-function write_date(type/*:number*/, fmt/*:string*/, val, ss0/*:?number*/)/*:string*/ {
+function SSF_write_date(type/*:number*/, fmt/*:string*/, val, ss0/*:?number*/)/*:string*/ {
 	var o="", ss=0, tt=0, y = val.y, out, outl = 0;
 	switch(type) {
 		case 98: /* 'b' buddhist year */
@@ -602,6 +604,9 @@ function write_date(type/*:number*/, fmt/*:string*/, val, ss0/*:?number*/)/*:str
 	var outstr = outl > 0 ? pad0(out, outl) : "";
 	return outstr;
 }
+
+
+/*jshint -W086 */
 /*jshint +W086 */
 function commaify(s/*:string*/)/*:string*/ {
 	var w = 3;
@@ -610,17 +615,18 @@ function commaify(s/*:string*/)/*:string*/ {
 	for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w);
 	return o;
 }
-var write_num/*:SSF_write_num*/ = (function make_write_num(){
 var pct1 = /%/g;
 function write_num_pct(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
 	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/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
 	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/*:string*/, val/*:number*/)/*:string*/{
 	var o/*:string*/;
 	var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
@@ -729,7 +735,7 @@ function write_num_flt(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string
 	var oa = "";
 	if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
 		ri = Math.min(/*::String(*/r[4]/*::)*/.length,7);
-		ff = frac(aval, Math.pow(10,ri)-1, false);
+		ff = SSF_frac(aval, Math.pow(10,ri)-1, false);
 		o = "" + sign;
 		oa = write_num("n", /*::String(*/r[1]/*::)*/, ff[1]);
 		if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
@@ -741,7 +747,7 @@ function write_num_flt(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string
 	}
 	if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
 		ri = Math.min(Math.max(r[1].length, r[4].length),7);
-		ff = frac(aval, Math.pow(10,ri)-1, true);
+		ff = SSF_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?]+$/))) {
@@ -849,7 +855,7 @@ function write_num_int(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string
 	var oa = "";
 	if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
 		ri = Math.min(/*::String(*/r[4]/*::)*/.length,7);
-		ff = frac(aval, Math.pow(10,ri)-1, false);
+		ff = SSF_frac(aval, Math.pow(10,ri)-1, false);
 		o = "" + sign;
 		oa = write_num("n", /*::String(*/r[1]/*::)*/, ff[1]);
 		if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
@@ -861,7 +867,7 @@ function write_num_int(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string
 	}
 	if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
 		ri = Math.min(Math.max(r[1].length, r[4].length),7);
-		ff = frac(aval, Math.pow(10,ri)-1, true);
+		ff = SSF_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?]+$/))) {
@@ -887,10 +893,10 @@ function write_num_int(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string
 	}
 	throw new Error("unsupported format |" + fmt + "|");
 }
-return function write_num(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ {
+function write_num(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ {
 	return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);
-};})();
-function split_fmt(fmt/*:string*/)/*:Array<string>*/ {
+}
+function SSF_split_fmt(fmt/*:string*/)/*:Array<string>*/ {
 	var out/*:Array<string>*/ = [];
 	var in_str = false/*, cc*/;
 	for(var i = 0, j = 0; i < fmt.length; ++i) switch((/*cc=*/fmt.charCodeAt(i))) {
@@ -906,13 +912,13 @@ function split_fmt(fmt/*:string*/)/*:Array<string>*/ {
 	if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string ");
 	return out;
 }
-SSF._split = split_fmt;
-var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/;
+
+var SSF_abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/;
 function fmt_is_date(fmt/*:string*/)/*:boolean*/ {
 	var i = 0, /*cc = 0,*/ c = "", o = "";
 	while(i < fmt.length) {
 		switch((c = fmt.charAt(i))) {
-			case 'G': if(isgeneral(fmt, i)) i+= 6; i++; break;
+			case 'G': if(SSF_isgeneral(fmt, i)) i+= 6; i++; break;
 			case '"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break;
 			case '\\': i+=2; break;
 			case '_': i+=2; break;
@@ -931,7 +937,7 @@ function fmt_is_date(fmt/*:string*/)/*:boolean*/ {
 			case '[':
 				o = c;
 				while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
-				if(o.match(abstime)) return true;
+				if(o.match(SSF_abstime)) return true;
 				break;
 			case '.':
 				/* falls through */
@@ -949,7 +955,7 @@ function fmt_is_date(fmt/*:string*/)/*:boolean*/ {
 	}
 	return false;
 }
-SSF.is_date = fmt_is_date;
+
 function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
 	var out = [], o = "", i = 0, c = "", lst='t', dt, j, cc;
 	var hr='H';
@@ -957,7 +963,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
 	while(i < fmt.length) {
 		switch((c = fmt.charAt(i))) {
 			case 'G': /* General */
-				if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);
+				if(!SSF_isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);
 				out[out.length] = {t:'G', v:'General'}; i+=7; break;
 			case '"': /* Literal text */
 				for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);
@@ -969,7 +975,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
 				out[out.length] = {t:'T', v:v}; ++i; break;
 			case 'B': case 'b':
 				if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") {
-					if(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; }
+					if(dt==null) { dt=SSF_parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; }
 					out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;
 				}
 				/* falls through */
@@ -978,14 +984,14 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
 				/* falls through */
 			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 ""; }
+				if(dt==null) { dt=SSF_parse_date_code(v, opts); if(dt==null) return ""; }
 				o = c; while(++i < fmt.length && fmt.charAt(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': case 'a': case '上':
 				var q={t:c, v:c};
-				if(dt==null) dt=parse_date_code(v, opts);
+				if(dt==null) dt=SSF_parse_date_code(v, opts);
 				if(fmt.substr(i, 3).toUpperCase() === "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).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
 				else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
@@ -996,8 +1002,8 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
 				o = c;
 				while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
 				if(o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|';
-				if(o.match(abstime)) {
-					if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
+				if(o.match(SSF_abstime)) {
+					if(dt==null) { dt=SSF_parse_date_code(v, opts); if(dt==null) return ""; }
 					out[out.length] = {t:'Z', v:o.toLowerCase()};
 					lst = o.charAt(1);
 				} else if(o.indexOf("$") > -1) {
@@ -1074,7 +1080,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
 			case 'X': out[i].v = ""; out[i].t = ";"; break;
 			case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':
 				/*::if(!dt) throw "unreachable"; */
-				out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
+				out[i].v = SSF_write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
 				out[i].t = 't'; break;
 			case 'n': case '?':
 				jj = i+1;
@@ -1089,7 +1095,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
 				}
 				nstr += out[i].v;
 				i = jj-1; break;
-			case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;
+			case 'G': out[i].t = 't'; out[i].v = SSF_general(v,opts); break;
 		}
 	}
 	var vv = "", myv, ostr;
@@ -1157,8 +1163,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
 	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;
@@ -1174,7 +1179,7 @@ function chkcond(v, rr) {
 	return false;
 }
 function choose_fmt(f/*:string*/, v/*:any*/) {
-	var fmt = split_fmt(f);
+	var fmt = SSF_split_fmt(f);
 	var l = fmt.length, lat = fmt[l-1].indexOf("@");
 	if(l<4 && lat>-1) --l;
 	if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|");
@@ -1187,14 +1192,14 @@ function choose_fmt(f/*:string*/, v/*:any*/) {
 	}
 	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) {
+	if(fmt[0].match(/\[[=<>]/) != null || fmt[1].match(/\[[=<>]/) != 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/*:string|number*/,v/*:any*/,o/*:?any*/) {
+function SSF_format(fmt/*:string|number*/,v/*:any*/,o/*:?any*/) {
 	if(o == null) o = {};
 	var sfmt = "";
 	switch(typeof fmt) {
@@ -1205,19 +1210,19 @@ function format(fmt/*:string|number*/,v/*:any*/,o/*:?any*/) {
 		case "number":
 			if(fmt == 14 && o.dateNF) sfmt = o.dateNF;
 			else sfmt = (o.table != null ? (o.table/*:any*/) : table_fmt)[fmt];
-			if(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]];
-			if(sfmt == null) sfmt = default_str[fmt] || "General";
+			if(sfmt == null) sfmt = (o.table && o.table[SSF_default_map[fmt]]) || table_fmt[SSF_default_map[fmt]];
+			if(sfmt == null) sfmt = SSF_default_str[fmt] || "General";
 			break;
 	}
-	if(isgeneral(sfmt,0)) return general_fmt(v, o);
+	if(SSF_isgeneral(sfmt,0)) return SSF_general(v, o);
 	if(v instanceof Date) v = datenum_local(v, o.date1904);
 	var f = choose_fmt(sfmt, v);
-	if(isgeneral(f[1])) return general_fmt(v, o);
+	if(SSF_isgeneral(f[1])) return SSF_general(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]);
 }
-function load_entry(fmt/*:string*/, idx/*:?number*/)/*:number*/ {
+function SSF_load(fmt/*:string*/, idx/*:?number*/)/*:number*/ {
 	if(typeof idx != 'number') {
 		idx = +idx || -1;
 /*::if(typeof idx != 'number') return 0x188; */
@@ -1233,36 +1238,24 @@ function load_entry(fmt/*:string*/, idx/*:?number*/)/*:number*/ {
 	table_fmt[idx] = fmt;
 	return idx;
 }
-SSF.load = load_entry;
-SSF._table = table_fmt;
-SSF.get_table = function get_table()/*:SSFTable*/ { return table_fmt; };
-SSF.load_table = function load_table(tbl/*:SSFTable*/)/*:void*/ {
+function SSF_load_table(tbl/*:SSFTable*/)/*:void*/ {
 	for(var i=0; i!=0x0188; ++i)
-		if(tbl[i] !== undefined) load_entry(tbl[i], i);
-};
-SSF.init_table = init_table;
-SSF.format = format;
+		if(tbl[i] !== undefined) SSF_load(tbl[i], i);
 }
-make_ssf(SSF);
-/* map from xlml named formats to SSF TODO: localize */
-var XLMLFormatMap/*{[string]:string}*/ = ({
-	"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";@'
-}/*:any*/);
+
+function make_ssf() {
+	table_fmt = SSF_init_table();
+}
+
+var SSF = {
+	format: SSF_format,
+	load: SSF_load,
+	_table: table_fmt,
+	load_table: SSF_load_table,
+	parse_date_code: SSF_parse_date_code,
+	is_date: fmt_is_date,
+	get_table: function get_table() { return SSF._table = table_fmt; }
+};
 
 var SSFImplicit/*{[number]:string}*/ = ({
 	"5": '"$"#,##0_);\\("$"#,##0\\)',
@@ -1307,7 +1300,7 @@ var SSFImplicit/*{[number]:string}*/ = ({
 /* dateNF parse TODO: move to SSF */
 var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;
 function dateNF_regex(dateNF/*:string|number*/)/*:RegExp*/ {
-	var fmt = typeof dateNF == "number" ? SSF._table[dateNF] : dateNF;
+	var fmt = typeof dateNF == "number" ? table_fmt[dateNF] : dateNF;
 	fmt = fmt.replace(dateNFregex, "(\\d+)");
 	return new RegExp("^" + fmt + "$");
 }
@@ -3280,16 +3273,16 @@ function evert_arr(obj/*:any*/)/*:EvertArrType*/ {
 	return o;
 }
 
-var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000
+var basedate = /*#__PURE__*/new Date(1899, 11, 30, 0, 0, 0); // 2209161600000
 function datenum(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ {
-	var epoch = v.getTime();
+	var epoch = /*#__PURE__*/v.getTime();
 	if(date1904) epoch -= 1462*24*60*60*1000;
-	var dnthresh = basedate.getTime() + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;
+	var dnthresh = /*#__PURE__*/basedate.getTime() + (/*#__PURE__*/v.getTimezoneOffset() - /*#__PURE__*/basedate.getTimezoneOffset()) * 60000;
 	return (epoch - dnthresh) / (24 * 60 * 60 * 1000);
 }
-var refdate = new Date();
-var dnthresh = basedate.getTime() + (refdate.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;
-var refoffset = refdate.getTimezoneOffset();
+var refdate = /*#__PURE__*/new Date();
+var dnthresh = /*#__PURE__*/basedate.getTime() + (/*#__PURE__*/refdate.getTimezoneOffset() - /*#__PURE__*/basedate.getTimezoneOffset()) * 60000;
+var refoffset = /*#__PURE__*/refdate.getTimezoneOffset();
 function numdate(v/*:number*/)/*:Date*/ {
 	var out = new Date();
 	out.setTime(v * 24 * 60 * 60 * 1000 + dnthresh);
@@ -3326,9 +3319,9 @@ function parse_isodur(s) {
 	return sec;
 }
 
-var good_pd_date = new Date('2017-02-19T19:06:09.000Z');
-if(isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17');
-var good_pd = good_pd_date.getFullYear() == 2017;
+var good_pd_date_1 = /*#__PURE__*/new Date('2017-02-19T19:06:09.000Z');
+var good_pd_date = /*#__PURE__*/isNaN(/*#__PURE__*/good_pd_date_1.getFullYear()) ? /*#__PURE__*/new Date('2/19/17') : good_pd_date_1;
+var good_pd = /*#__PURE__*/good_pd_date.getFullYear() == 2017;
 /* parses a date as a local date */
 function parseDate(str/*:string|Date*/, fixdate/*:?number*/)/*:Date*/ {
 	var d = new Date(str);
@@ -3353,12 +3346,30 @@ function parseDate(str/*:string|Date*/, fixdate/*:?number*/)/*:Date*/ {
 function cc2str(arr/*:Array<number>*/, debomit)/*:string*/ {
 	if(has_buf && Buffer.isBuffer(arr)) {
 		if(debomit) {
-			if(arr[0] == 0xFF && arr[1] == 0xFE) return arr.slice(2).toString("utf16le");
-			if(arr[1] == 0xFE && arr[2] == 0xFF) return utf16beread(arr.slice(2).toString("binary"));
+			if(arr[0] == 0xFF && arr[1] == 0xFE) return utf8write(arr.slice(2).toString("utf16le"));
+			if(arr[1] == 0xFE && arr[2] == 0xFF) return utf8write(utf16beread(arr.slice(2).toString("binary")));
 		}
 		return arr.toString("binary");
 	}
-	/* TODO: investigate performance degradation of TextEncoder in Edge 13 */
+
+	if(typeof TextDecoder !== "undefined") try {
+		if(debomit) {
+			if(arr[0] == 0xFF && arr[1] == 0xFE) return utf8write(new TextDecoder("utf-16le").decode(arr.slice(2)));
+			if(arr[0] == 0xFE && arr[1] == 0xFF) return utf8write(new TextDecoder("utf-16be").decode(arr.slice(2)));
+		}
+		var rev = {
+			"\u20ac": "\x80", "\u201a": "\x82", "\u0192": "\x83", "\u201e": "\x84",
+			"\u2026": "\x85", "\u2020": "\x86", "\u2021": "\x87", "\u02c6": "\x88",
+			"\u2030": "\x89", "\u0160": "\x8a", "\u2039": "\x8b", "\u0152": "\x8c",
+			"\u017d": "\x8e", "\u2018": "\x91", "\u2019": "\x92", "\u201c": "\x93",
+			"\u201d": "\x94", "\u2022": "\x95", "\u2013": "\x96", "\u2014": "\x97",
+			"\u02dc": "\x98", "\u2122": "\x99", "\u0161": "\x9a", "\u203a": "\x9b",
+			"\u0153": "\x9c", "\u017e": "\x9e", "\u0178": "\x9f"
+		};
+		if(Array.isArray(arr)) arr = new Uint8Array(arr);
+		return new TextDecoder("latin1").decode(arr).replace(/[€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ]/g, function(c) { return rev[c] || c; });
+	} catch(e) {}
+
 	var o = [];
 	for(var i = 0; i != arr.length; ++i) o.push(String.fromCharCode(arr[i]));
 	return o.join("");
@@ -3403,13 +3414,15 @@ function fuzzydate(s/*:string*/)/*:Date*/ {
 	return o;
 }
 
-var safe_split_regex = "abacaba".split(/(:?b)/i).length == 5;
-function split_regex(str/*:string*/, re, def/*:string*/)/*:Array<string>*/ {
-	if(safe_split_regex || typeof re == "string") return str.split(re);
-	var p = str.split(re), o = [p[0]];
-	for(var i = 1; i < p.length; ++i) { o.push(def); o.push(p[i]); }
-	return o;
-}
+var split_regex = /*#__PURE__*/(function() {
+	var safe_split_regex = "abacaba".split(/(:?b)/i).length == 5;
+	return function split_regex(str/*:string*/, re, def/*:string*/)/*:Array<string>*/ {
+		if(safe_split_regex || typeof re == "string") return str.split(re);
+		var p = str.split(re), o = [p[0]];
+		for(var i = 1; i < p.length; ++i) { o.push(def); o.push(p[i]); }
+		return o;
+	};
+})();
 function getdatastr(data)/*:?string*/ {
 	if(!data) return null;
 	if(data.content && data.type) return cc2str(data.content, true);
@@ -3517,9 +3530,8 @@ function resolve_path(path/*:string*/, base/*:string*/)/*:string*/ {
 }
 var XML_HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n';
 var attregexg=/([^"\s?>\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g;
-var tagregex=/<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg;
-
-if(!(XML_HEADER.match(tagregex))) tagregex = /<[^>]*>/g;
+var tagregex1=/<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg, tagregex2 = /<[^>]*>/g;
+var tagregex = /*#__PURE__*/XML_HEADER.match(tagregex1) ? tagregex1 : tagregex2;
 var nsregex=/<\w*:/, nsregex2 = /<(\/?)\w+:/;
 function parsexmltag(tag/*:string*/, skip_root/*:?boolean*/, skip_LC/*:?boolean*/)/*:any*/ {
 	var z = ({}/*:any*/);
@@ -3559,7 +3571,7 @@ var encodings = {
 	'&lt;': '<',
 	'&amp;': '&'
 };
-var rencoding = evert(encodings);
+var rencoding = /*#__PURE__*/evert(encodings);
 //var rencstr = "&<>'\"".split("");
 
 // TODO: CP remap (need to read file version to determine OS)
@@ -3608,7 +3620,7 @@ function parsexmlbool(value/*:any*/)/*:boolean*/ {
 	}
 }
 
-var utf8read/*:StringConv*/ = function utf8reada(orig/*:string*/)/*:string*/ {
+function utf8reada(orig/*:string*/)/*:string*/ {
 	var out = "", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0;
 	while (i < orig.length) {
 		c = orig.charCodeAt(i++);
@@ -3623,9 +3635,31 @@ var utf8read/*:StringConv*/ = function utf8reada(orig/*:string*/)/*:string*/ {
 		out += String.fromCharCode(0xDC00 + (w&1023));
 	}
 	return out;
-};
+}
 
-var utf8write/*:StringConv*/ = function(orig/*:string*/)/*:string*/ {
+function utf8readb(data) {
+	var out = new_raw_buf(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 = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);
+		}
+		if(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }
+		out[k++] = w%256; out[k++] = w>>>8;
+	}
+	return out.slice(0,k).toString('ucs2');
+}
+
+function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); }
+
+var utf8corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
+var utf8read = has_buf && (/*#__PURE__*/utf8readc(utf8corpus) == /*#__PURE__*/utf8reada(utf8corpus) && utf8readc || /*#__PURE__*/utf8readb(utf8corpus) == /*#__PURE__*/utf8reada(utf8corpus) && utf8readb) || utf8reada;
+
+var utf8write/*:StringConv*/ = has_buf ? function(data) { return Buffer_from(data, 'utf8').toString("binary"); } : function(orig/*:string*/)/*:string*/ {
 	var out/*:Array<string>*/ = [], i = 0, c = 0, d = 0;
 	while(i < orig.length) {
 		c = orig.charCodeAt(i++);
@@ -3651,31 +3685,6 @@ var utf8write/*:StringConv*/ = function(orig/*:string*/)/*:string*/ {
 	return out.join("");
 };
 
-if(has_buf) {
-	var utf8readb = function utf8readb(data) {
-		var out = Buffer.alloc(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 = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);
-			}
-			if(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }
-			out[k++] = w%256; out[k++] = w>>>8;
-		}
-		return out.slice(0,k).toString('ucs2');
-	};
-	var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
-	if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;
-	var utf8readc = function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); };
-	if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;
-
-	utf8write = function(data) { return Buffer_from(data, 'utf8').toString("binary"); };
-}
-
 // matches <foo>...</foo> extracts content
 var matchtag = /*#__PURE__*/(function() {
 	var mtcache/*:{[k:string]:RegExp}*/ = ({}/*:any*/);
@@ -3825,39 +3834,44 @@ function write_double_le(b/*:RawBytes|CFBlob*/, v/*:number*/, idx/*:number*/) {
 	b[idx + 7] = (e >> 4) | bs;
 }
 
-var __toBuffer = function(bufs/*:Array<Array<RawBytes> >*/)/*:RawBytes*/ { var x=[],w=10240; for(var i=0;i<bufs[0].length;++i) if(bufs[0][i]) for(var j=0,L=bufs[0][i].length;j<L;j+=w) x.push.apply(x, bufs[0][i].slice(j,j+w)); return x; };
-var ___toBuffer = __toBuffer;
-var __utf16le = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/)/*:string*/ { var ss/*:Array<string>*/=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join("").replace(chr0,''); };
-var ___utf16le = __utf16le;
-var __hexlify = function(b/*:RawBytes|CFBlob*/,s/*:number*/,l/*:number*/)/*:string*/ { var ss/*:Array<string>*/=[]; for(var i=s; i<s+l; ++i) ss.push(("0" + b[i].toString(16)).slice(-2)); return ss.join(""); };
-var ___hexlify = __hexlify;
-var __utf8 = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/) { var ss=[]; for(var i=s; i<e; i++) ss.push(String.fromCharCode(__readUInt8(b,i))); return ss.join(""); };
-var ___utf8 = __utf8;
-var __lpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
-var ___lpstr = __lpstr;
-var __cpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
-var ___cpstr = __cpstr;
-var __lpwstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
-var ___lpwstr = __lpwstr;
-var __lpp4, ___lpp4;
-__lpp4 = ___lpp4 = function lpp4_(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf16le(b, i+4,i+4+len) : "";};
-var __8lpp4 = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len) : "";};
-var ___8lpp4 = __8lpp4;
-var __double, ___double;
-__double = ___double = function(b/*:RawBytes|CFBlob*/, idx/*:number*/) { return read_double_le(b, idx);};
+var ___toBuffer = function(bufs/*:Array<Array<RawBytes> >*/)/*:RawBytes*/ { var x=[],w=10240; for(var i=0;i<bufs[0].length;++i) if(bufs[0][i]) for(var j=0,L=bufs[0][i].length;j<L;j+=w) x.push.apply(x, bufs[0][i].slice(j,j+w)); return x; };
+var __toBuffer = has_buf ? function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0].map(function(x) { return Buffer.isBuffer(x) ? x : Buffer_from(x); })) : ___toBuffer(bufs);} : ___toBuffer;
+
+var ___utf16le = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/)/*:string*/ { var ss/*:Array<string>*/=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join("").replace(chr0,''); };
+var __utf16le = has_buf ? function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/)/*:string*/ { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___utf16le(b,s,e); return b.toString('utf16le',s,e).replace(chr0,'')/*.replace(chr1,'!')*/; } : ___utf16le;
+
+var ___hexlify = function(b/*:RawBytes|CFBlob*/,s/*:number*/,l/*:number*/)/*:string*/ { var ss/*:Array<string>*/=[]; for(var i=s; i<s+l; ++i) ss.push(("0" + b[i].toString(16)).slice(-2)); return ss.join(""); };
+var __hexlify = has_buf ? function(b/*:RawBytes|CFBlob*/,s/*:number*/,l/*:number*/)/*:string*/ { return Buffer.isBuffer(b)/*:: && b instanceof Buffer*/ ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); } : ___hexlify;
+
+var ___utf8 = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/) { var ss=[]; for(var i=s; i<e; i++) ss.push(String.fromCharCode(__readUInt8(b,i))); return ss.join(""); };
+var __utf8 = has_buf ? function utf8_b(b/*:RawBytes|CFBlob*/, s/*:number*/, e/*:number*/) { return (Buffer.isBuffer(b)/*:: && (b instanceof Buffer)*/) ? b.toString('utf8',s,e) : ___utf8(b,s,e); } : ___utf8;
+
+var ___lpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
+var __lpstr = ___lpstr;
+
+var ___cpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
+var __cpstr = ___cpstr;
+
+var ___lpwstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
+var __lpwstr = ___lpwstr;
+
+var ___lpp4 = function lpp4_(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf16le(b, i+4,i+4+len) : "";};
+var __lpp4 = ___lpp4;
+
+var ___8lpp4 = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len) : "";};
+var __8lpp4 = ___8lpp4;
+
+var ___double = function(b/*:RawBytes|CFBlob*/, idx/*:number*/) { return read_double_le(b, idx);};
+var __double = ___double;
+
 var is_buf = function is_buf_a(a) { return Array.isArray(a) || (typeof Uint8Array !== "undefined" && a instanceof Uint8Array); };
 
 if(has_buf/*:: && typeof Buffer !== 'undefined'*/) {
-	__utf16le = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/)/*:string*/ { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___utf16le(b,s,e); return b.toString('utf16le',s,e).replace(chr0,'')/*.replace(chr1,'!')*/; };
-	__hexlify = function(b/*:RawBytes|CFBlob*/,s/*:number*/,l/*:number*/)/*:string*/ { return Buffer.isBuffer(b)/*:: && b instanceof Buffer*/ ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); };
 	__lpstr = function lpstr_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___lpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : "";};
 	__cpstr = function cpstr_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___cpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : "";};
 	__lpwstr = function lpwstr_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___lpwstr(b, i); var len = 2*b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len-1);};
 	__lpp4 = function lpp4_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len);};
 	__8lpp4 = function lpp4_8b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___8lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf8',i+4,i+4+len);};
-	__utf8 = function utf8_b(b/*:RawBytes|CFBlob*/, s/*:number*/, e/*:number*/) { return (Buffer.isBuffer(b)/*:: && (b instanceof Buffer)*/) ? b.toString('utf8',s,e) : ___utf8(b,s,e); };
-	__toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0].map(function(x) { return Buffer.isBuffer(x) ? x : Buffer_from(x); })) : ___toBuffer(bufs);};
-	bconcat = function(bufs) { return Buffer.concat(bufs.map(function(buf) { return Buffer.isBuffer(buf) ? buf : Buffer_from(buf); })); };
 	__double = function double_(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(Buffer.isBuffer(b)/*::&& b instanceof Buffer*/) return b.readDoubleLE(i); return ___double(b,i); };
 	is_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a) || (typeof Uint8Array !== "undefined" && a instanceof Uint8Array); };
 }
@@ -4240,8 +4254,8 @@ function safe_decode_range(range/*:string*/)/*:Range*/ {
 
 function safe_format_cell(cell/*:Cell*/, v/*:any*/) {
 	var q = (cell.t == 'd' && v instanceof Date);
-	if(cell.z != null) try { return (cell.w = SSF.format(cell.z, q ? datenum(v) : v)); } catch(e) { }
-	try { return (cell.w = SSF.format((cell.XF||{}).numFmtId||(q ? 14 : 0),  q ? datenum(v) : v)); } catch(e) { return ''+v; }
+	if(cell.z != null) try { return (cell.w = SSF_format(cell.z, q ? datenum(v) : v)); } catch(e) { }
+	try { return (cell.w = SSF_format((cell.XF||{}).numFmtId||(q ? 14 : 0),  q ? datenum(v) : v)); } catch(e) { return ''+v; }
 }
 
 function format_cell(cell/*:Cell*/, v/*:any*/, o/*:any*/) {
@@ -4305,9 +4319,9 @@ function sheet_add_aoa(_ws/*:?Worksheet*/, data/*:AOA*/, opts/*:?any*/)/*:Worksh
 				else if(typeof cell.v === 'number') cell.t = 'n';
 				else if(typeof cell.v === 'boolean') cell.t = 'b';
 				else if(cell.v instanceof Date) {
-					cell.z = o.dateNF || SSF._table[14];
-					if(o.cellDates) { cell.t = 'd'; cell.w = SSF.format(cell.z, datenum(cell.v)); }
-					else { cell.t = 'n'; cell.v = datenum(cell.v); cell.w = SSF.format(cell.z, cell.v); }
+					cell.z = o.dateNF || table_fmt[14];
+					if(o.cellDates) { cell.t = 'd'; cell.w = SSF_format(cell.z, datenum(cell.v)); }
+					else { cell.t = 'n'; cell.v = datenum(cell.v); cell.w = SSF_format(cell.z, cell.v); }
 				}
 				else cell.t = 's';
 			}
@@ -4822,7 +4836,7 @@ function rgbify(arr/*:Array<number>*/)/*:Array<[number, number, number]>*/ { ret
 
 /* [MS-XLS] 2.5.161 */
 /* [MS-XLSB] 2.5.75 Icv */
-var _XLSIcv = rgbify([
+var _XLSIcv = /*#__PURE__*/ rgbify([
 	/* Color Constants */
 	0x000000,
 	0xFFFFFF,
@@ -4914,7 +4928,7 @@ var _XLSIcv = rgbify([
 	0x000000, /* 0x50 icvInfoBk ?? */
 	0x000000 /* 0x51 icvInfoText ?? */
 ]);
-var XLSIcv = dup(_XLSIcv);
+var XLSIcv = /*#__PURE__*/dup(_XLSIcv);
 
 /* [MS-XLSB] 2.5.97.2 */
 var BErr = {
@@ -4928,7 +4942,19 @@ var BErr = {
 	/*::[*/0x2B/*::]*/: "#GETTING_DATA",
 	/*::[*/0xFF/*::]*/: "#WTF?"
 };
-var RBErr = evert_num(BErr);
+//var RBErr = evert_num(BErr);
+var RBErr = {
+	"#NULL!":        0x00,
+	"#DIV/0!":       0x07,
+	"#VALUE!":       0x0F,
+	"#REF!":         0x17,
+	"#NAME?":        0x1D,
+	"#NUM!":         0x24,
+	"#N/A":          0x2A,
+	"#GETTING_DATA": 0x2B,
+	"#WTF?":         0xFF
+};
+
 /* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
 /* 12.3 Part Summary <SpreadsheetML> */
 /* 14.2 Part Summary <DrawingML> */
@@ -5182,18 +5208,17 @@ function parse_ct(data/*:?string*/) {
 	return ct;
 }
 
-var CTYPE_XML_ROOT = writextag('Types', null, {
-	'xmlns': XMLNS.CT,
-	'xmlns:xsd': XMLNS.xsd,
-	'xmlns:xsi': XMLNS.xsi
-});
-
 function write_ct(ct, opts)/*:string*/ {
 	var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
 
 	var o/*:Array<string>*/ = [], v;
 	o[o.length] = (XML_HEADER);
-	o[o.length] = (CTYPE_XML_ROOT);
+	o[o.length] = writextag('Types', null, {
+		'xmlns': XMLNS.CT,
+		'xmlns:xsd': XMLNS.xsd,
+		'xmlns:xsi': XMLNS.xsi
+	});
+
 	o = o.concat([
 		['xml', 'application/xml'],
 		['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
@@ -5324,14 +5349,12 @@ function parse_rels(data/*:?string*/, currentFilePath/*:string*/) {
 }
 
 
-var RELS_ROOT = writextag('Relationships', null, {
-	//'xmlns:ns0': XMLNS.RELS,
-	'xmlns': XMLNS.RELS
-});
-
 /* TODO */
 function write_rels(rels)/*:string*/ {
-	var o = [XML_HEADER, RELS_ROOT];
+	var o = [XML_HEADER, writextag('Relationships', null, {
+		//'xmlns:ns0': XMLNS.RELS,
+		'xmlns': XMLNS.RELS
+	})];
 	keys(rels['!id']).forEach(function(rid) {
 		o[o.length] = (writextag('Relationship', null, rels['!id'][rid]));
 	});
@@ -7944,7 +7967,7 @@ var SYLK = /*#__PURE__*/(function() {
 					else if(val === 'FALSE') val = false;
 					else if(!isNaN(fuzzynum(val))) {
 						val = fuzzynum(val);
-						if(next_cell_format !== null && SSF.is_date(next_cell_format)) val = numdate(val);
+						if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(val);
 					} else if(!isNaN(fuzzydate(val).getDate())) {
 						val = parseDate(val);
 					}
@@ -8189,7 +8212,7 @@ var DIF = /*#__PURE__*/(function() {
 							push_value(o, 1, 0, (!DIF_XL || isNaN(cell.v)) ? cell.v : '="' + cell.v + '"');
 							break;
 						case 'd':
-							if(!cell.w) cell.w = SSF.format(cell.z || SSF._table[14], datenum(parseDate(cell.v)));
+							if(!cell.w) cell.w = SSF_format(cell.z || table_fmt[14], datenum(parseDate(cell.v)));
 							if(DIF_XL) push_value(o, 0, cell.w, "V");
 							else push_value(o, 1, 0, cell.w);
 							break;
@@ -8286,7 +8309,7 @@ var ETH = /*#__PURE__*/(function() {
 					case 'd':
 						var t = datenum(parseDate(cell.v));
 						oo[2] = 'vtc'; oo[3] = 'nd'; oo[4] = ""+t;
-						oo[5] = cell.w || SSF.format(cell.z || SSF._table[14], t);
+						oo[5] = cell.w || SSF_format(cell.z || table_fmt[14], t);
 						break;
 					case 'e': continue;
 				}
@@ -8427,12 +8450,12 @@ var PRN = /*#__PURE__*/(function() {
 			else if(s == "FALSE") { cell.t = 'b'; cell.v = false; }
 			else if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; if(o.cellText !== false) cell.w = s; cell.v = v; }
 			else if(!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) {
-				cell.z = o.dateNF || SSF._table[14];
+				cell.z = o.dateNF || table_fmt[14];
 				var k = 0;
 				if(_re && s.match(_re)){ s=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); k=1; }
 				if(o.cellDates) { cell.t = 'd'; cell.v = parseDate(s, k); }
 				else { cell.t = 'n'; cell.v = datenum(parseDate(s, k)); }
-				if(o.cellText !== false) cell.w = SSF.format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);
+				if(o.cellText !== false) cell.w = SSF_format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);
 				if(!o.cellNF) delete cell.z;
 			} else {
 				cell.t = 's';
@@ -8589,7 +8612,7 @@ var WK_ = /*#__PURE__*/(function() {
 				case 0x10: /* FORMULA */
 					/* TODO: actual translation of the format code */
 					if(RT == 0x0E && (val[2] & 0x70) == 0x70 && (val[2] & 0x0F) > 1 && (val[2] & 0x0F) < 15) {
-						val[1].z = o.dateNF || SSF._table[14];
+						val[1].z = o.dateNF || table_fmt[14];
 						if(o.cellDates) { val[1].t = 'd'; val[1].v = numdate(val[1].v); }
 					}
 
@@ -10413,8 +10436,8 @@ function parse_fonts(t, styles, themes, opts) {
 /* 18.8.31 numFmts CT_NumFmts */
 function parse_numFmts(t, styles, opts) {
 	styles.NumberFmt = [];
-	var k/*Array<number>*/ = (keys(SSF._table)/*:any*/);
-	for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]];
+	var k/*Array<number>*/ = (keys(table_fmt)/*:any*/);
+	for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = table_fmt[k[i]];
 	var m = t[0].match(tagregex);
 	if(!m) return;
 	for(i=0; i < m.length; ++i) {
@@ -10429,7 +10452,7 @@ function parse_numFmts(t, styles, opts) {
 						for(j = 0x188; j > 0x3c; --j) if(styles.NumberFmt[j] == null) break;
 						styles.NumberFmt[j] = f;
 					}
-					SSF.load(f,j);
+					SSF_load(f,j);
 				}
 			} break;
 			case '</numFmt>': break;
@@ -10787,7 +10810,7 @@ function write_BrtBeginTableStyles(cnt, defTableStyle, defPivotStyle) {
 function parse_sty_bin(data, themes, opts) {
 	var styles = {};
 	styles.NumberFmt = ([]/*:any*/);
-	for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];
+	for(var y in table_fmt) styles.NumberFmt[y] = table_fmt[y];
 
 	styles.CellXf = [];
 	styles.Fonts = [];
@@ -10796,7 +10819,7 @@ function parse_sty_bin(data, themes, opts) {
 	recordhopper(data, function hopper_sty(val, R, RT) {
 		switch(RT) {
 			case 0x002C: /* BrtFmt */
-				styles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);
+				styles.NumberFmt[val[0]] = val[1]; SSF_load(val[1], val[0]);
 				break;
 			case 0x002B: /* BrtFont */
 				styles.Fonts.push(val);
@@ -12792,10 +12815,9 @@ var PtgBinOp = {
 };
 
 // List of invalid characters needs to be tested further
-var quoteCharacters /*:RegExp */ = new RegExp(/[^\w\u4E00-\u9FFF\u3040-\u30FF]/);
 function formula_quote_sheet_name(sname/*:string*/, opts)/*:string*/ {
 	if(!sname && !(opts && opts.biff <= 5 && opts.biff >= 2)) throw new Error("empty sheet name");
-	if (quoteCharacters.test(sname)) return "'" + sname + "'";
+	if (/[^\w\u4E00-\u9FFF\u3040-\u30FF]/.test(sname)) return "'" + sname + "'";
 	return sname;
 }
 function get_ixti_raw(supbooks, ixti/*:number*/, opts)/*:string*/ {
@@ -14500,7 +14522,7 @@ function get_cell_style(styles/*:Array<any>*/, cell/*:Cell*/, opts) {
 	var i = 0x3c, len = styles.length;
 	if(z == null && opts.ssf) {
 		for(; i < 0x188; ++i) if(opts.ssf[i] == null) {
-			SSF.load(cell.z, i);
+			SSF_load(cell.z, i);
 			// $FlowIgnore
 			opts.ssf[i] = cell.z;
 			opts.revssf[cell.z] = z = i;
@@ -14521,28 +14543,28 @@ function get_cell_style(styles/*:Array<any>*/, cell/*:Cell*/, opts) {
 
 function safe_format(p/*:Cell*/, fmtid/*:number*/, fillid/*:?number*/, opts, themes, styles) {
 	try {
-		if(opts.cellNF) p.z = SSF._table[fmtid];
+		if(opts.cellNF) p.z = table_fmt[fmtid];
 	} catch(e) { if(opts.WTF) throw e; }
 	if(p.t === 'z' && !opts.cellStyles) return;
 	if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);
 	if((!opts || opts.cellText !== false) && p.t !== 'z') try {
-		if(SSF._table[fmtid] == null) SSF.load(SSFImplicit[fmtid] || "General", fmtid);
+		if(table_fmt[fmtid] == null) SSF_load(SSFImplicit[fmtid] || "General", fmtid);
 		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);
+				if((p.v|0) === p.v) p.w = p.v.toString(10);
+				else p.w = SSF_general_num(p.v);
 			}
 			else if(p.t === 'd') {
 				var dd = datenum(p.v);
-				if((dd|0) === dd) p.w = SSF._general_int(dd);
-				else p.w = SSF._general_num(dd);
+				if((dd|0) === dd) p.w = dd.toString(10);
+				else p.w = SSF_general_num(dd);
 			}
 			else if(p.v === undefined) return "";
-			else p.w = SSF._general(p.v,_ssfopts);
+			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);
+		else if(p.t === 'd') p.w = SSF_format(fmtid,datenum(p.v),_ssfopts);
+		else p.w = SSF_format(fmtid,p.v,_ssfopts);
 	} catch(e) { if(opts.WTF) throw e; }
 	if(!opts.cellStyles) return;
 	if(fillid != null) try {
@@ -14838,7 +14860,7 @@ function write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts/*::, idx, wb*/)/*:string
 				cell.t = 'n';
 				vv = ''+(cell.v = datenum(parseDate(cell.v)));
 			}
-			if(typeof cell.z === 'undefined') cell.z = SSF._table[14];
+			if(typeof cell.z === 'undefined') cell.z = table_fmt[14];
 			break;
 		default: vv = cell.v; break;
 	}
@@ -15042,7 +15064,7 @@ return function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, th
 				}
 			}
 			safe_format(p, fmtid, fillid, opts, themes, styles);
-			if(opts.cellDates && do_format && p.t == 'n' && SSF.is_date(SSF._table[fmtid])) { p.t = 'd'; p.v = numdate(p.v); }
+			if(opts.cellDates && do_format && p.t == 'n' && fmt_is_date(table_fmt[fmtid])) { p.t = 'd'; p.v = numdate(p.v); }
 			if(tag.cm && opts.xlmeta) {
 				var cm = (opts.xlmeta.Cell||[])[+tag.cm-1];
 				if(cm && cm.type == 'XLDAPR') p.D = true;
@@ -15823,8 +15845,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
 				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;
-				if(opts.cellDates && cf && p.t == 'n' && SSF.is_date(SSF._table[cf.numFmtId])) {
-					var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
+				if(opts.cellDates && cf && p.t == 'n' && fmt_is_date(table_fmt[cf.numFmtId])) {
+					var _d = SSF_parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
 				}
 				if(cm) {
 					if(cm.type == 'XLDAPR') p.D = true;
@@ -16030,7 +16052,7 @@ function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:num
 		case 'b': vv = cell.v ? "1" : "0"; break;
 		case 'd': // no BrtCellDate :(
 			cell = dup(cell);
-			cell.z = cell.z || SSF._table[14];
+			cell.z = cell.z || table_fmt[14];
 			cell.v = datenum(parseDate(cell.v)); cell.t = 'n';
 			break;
 		/* falls through */
@@ -16513,7 +16535,7 @@ function safe1904(wb/*:Workbook*/)/*:string*/ {
 	return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false";
 }
 
-var badchars = "][*?\/\\".split("");
+var badchars = /*#__PURE__*/"][*?\/\\".split("");
 function check_ws_name(n/*:string*/, safe/*:?boolean*/)/*:boolean*/ {
 	if(n.length > 31) { if(safe) return false; throw new Error("Sheet names cannot exceed 31 chars"); }
 	var _good = true;
@@ -17217,10 +17239,13 @@ function xlml_parsexmltagobj(tag/*:string*/) {
 
 // ----
 
+/* map from xlml named formats to SSF TODO: localize */
+var XLMLFormatMap/*: {[string]:string}*/;
+
 function xlml_format(format, value)/*:string*/ {
 	var fmt = XLMLFormatMap[format] || unescapexml(format);
-	if(fmt === "General") return SSF._general(value);
-	return SSF.format(fmt, value);
+	if(fmt === "General") return SSF_general(value);
+	return SSF_format(fmt, value);
 }
 
 function xlml_set_custprop(Custprops, key, cp, val/*:string*/) {
@@ -17242,18 +17267,18 @@ function safe_format_xlml(cell/*:Cell*/, nf, o) {
 		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);
+				if((cell.v|0) === cell.v) cell.w = cell.v.toString(10);
+				else cell.w = SSF_general_num(cell.v);
 			}
-			else cell.w = SSF._general(cell.v);
+			else cell.w = SSF_general(cell.v);
 		}
 		else cell.w = xlml_format(nf||"General", cell.v);
 	} catch(e) { if(o.WTF) throw e; }
 	try {
 		var z = XLMLFormatMap[nf]||nf||"General";
 		if(o.cellNF) cell.z = z;
-		if(o.cellDates && cell.t == 'n' && SSF.is_date(z)) {
-			var _d = SSF.parse_date_code(cell.v); if(_d) { cell.t = 'd'; cell.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
+		if(o.cellDates && cell.t == 'n' && fmt_is_date(z)) {
+			var _d = SSF_parse_date_code(cell.v); if(_d) { cell.t = 'd'; cell.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
 		}
 	} catch(e) { if(o.WTF) throw e; }
 }
@@ -17345,7 +17370,7 @@ function xlml_clean_comment(comment/*:any*/) {
 /* TODO: Everything */
 function parse_xlml_xml(d, _opts)/*:Workbook*/ {
 	var opts = _opts || {};
-	make_ssf(SSF);
+	make_ssf();
 	var str = debom(xlml_normalize(d));
 	if(opts.type == 'binary' || opts.type == 'array' || opts.type == 'base64') {
 		if(typeof $cptable !== 'undefined') str = $cptable.utils.decode(65001, char_codes(str));
@@ -17355,7 +17380,28 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
 	opening = opening.replace(/".*?"/g, "");
 	if((opening.indexOf(">") & 1023) > Math.min((opening.indexOf(",") & 1023), (opening.indexOf(";")&1023))) { var _o = dup(opts); _o.type = "string"; return PRN.to_workbook(str, _o); }
 	if(opening.indexOf("<?xml") == -1) ["html", "table", "head", "meta", "script", "style", "div"].forEach(function(tag) { if(opening.indexOf("<" + tag) >= 0) ishtml = true; });
-	if(ishtml) return HTML_.to_workbook(str, opts);
+	if(ishtml) return html_to_workbook(str, opts);
+
+	XLMLFormatMap = ({
+		"General Number": "General",
+		"General Date": table_fmt[22],
+		"Long Date": "dddd, mmmm dd, yyyy",
+		"Medium Date": table_fmt[15],
+		"Short Date": table_fmt[14],
+		"Long Time": table_fmt[19],
+		"Medium Time": table_fmt[18],
+		"Short Time": table_fmt[20],
+		"Currency": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
+		"Fixed": table_fmt[2],
+		"Standard": table_fmt[4],
+		"Percent": table_fmt[10],
+		"Scientific": table_fmt[11],
+		"Yes/No": '"Yes";"Yes";"No";@',
+		"True/False": '"True";"True";"False";@',
+		"On/Off": '"Yes";"Yes";"No";@'
+	}/*:any*/);
+
+
 	var Rn;
 	var state = [], tmp;
 	if(DENSE != null && opts.dense == null) opts.dense = DENSE;
@@ -17498,8 +17544,8 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
 		case 'numberformat' /*case 'NumberFormat'*/:
 			stag.nf = unescapexml(xlml_parsexmltag(Rn[0]).Format || "General");
 			if(XLMLFormatMap[stag.nf]) stag.nf = XLMLFormatMap[stag.nf];
-			for(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == stag.nf) break;
-			if(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == null) { SSF.load(stag.nf, ssfidx); break; }
+			for(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(table_fmt[ssfidx] == stag.nf) break;
+			if(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(table_fmt[ssfidx] == null) { SSF_load(stag.nf, ssfidx); break; }
 			break;
 
 		case 'column' /*case 'Column'*/:
@@ -18067,7 +18113,7 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
 	if(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;
 	out.SheetNames = sheetnames;
 	out.Workbook = Workbook;
-	out.SSF = SSF.get_table();
+	out.SSF = dup(table_fmt);
 	out.Props = Props;
 	out.Custprops = Custprops;
 	return out;
@@ -18104,7 +18150,7 @@ function write_sty_xlml(wb, opts)/*:string*/ {
 	var styles/*:Array<string>*/ = ['<Style ss:ID="Default" ss:Name="Normal"><NumberFormat/></Style>'];
 	opts.cellXfs.forEach(function(xf, id) {
 		var payload/*:Array<string>*/ = [];
-		payload.push(writextag('NumberFormat', null, {"ss:Format": escapexml(SSF._table[xf.numFmtId])}));
+		payload.push(writextag('NumberFormat', null, {"ss:Format": escapexml(table_fmt[xf.numFmtId])}));
 
 		var o = /*::(*/{"ss:ID": "s" + (21+id)}/*:: :any)*/;
 		styles.push(writextag('Style', payload.join(""), o));
@@ -18288,7 +18334,7 @@ function write_ws_xlml_cell(cell, ref/*:string*/, ws, opts, idx/*:number*/, wb,
 		case 'n': t = 'Number'; p = String(cell.v); break;
 		case 'b': t = 'Boolean'; p = (cell.v ? "1" : "0"); break;
 		case 'e': t = 'Error'; p = BErr[cell.v]; break;
-		case 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || SSF._table[14]; break;
+		case 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || table_fmt[14]; break;
 		case 's': t = 'String'; p = escapexlml(cell.v||""); break;
 	}
 	/* TODO: cell style */
@@ -18368,9 +18414,9 @@ function write_ws_xlml(idx/*:number*/, opts, wb/*:Workbook*/)/*:string*/ {
 }
 function write_xlml(wb, opts)/*:string*/ {
 	if(!opts) opts = {};
-	if(!wb.SSF) wb.SSF = SSF.get_table();
+	if(!wb.SSF) wb.SSF = dup(table_fmt);
 	if(wb.SSF) {
-		make_ssf(SSF); SSF.load_table(wb.SSF);
+		make_ssf(); SSF_load_table(wb.SSF);
 		// $FlowIgnore
 		opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
 		opts.ssf = wb.SSF;
@@ -18474,21 +18520,21 @@ function safe_format_xf(p/*:any*/, opts/*:ParseOpts*/, date1904/*:?boolean*/) {
 	var fmtid = 0;
 	try {
 		fmtid = p.z || p.XF.numFmtId || 0;
-		if(opts.cellNF) p.z = SSF._table[fmtid];
+		if(opts.cellNF) p.z = table_fmt[fmtid];
 	} catch(e) { if(opts.WTF) throw e; }
 	if(!opts || opts.cellText !== false) try {
 		if(p.t === 'e') { p.w = p.w || BErr[p.v]; }
 		else if(fmtid === 0 || fmtid == "General") {
 			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);
+				if((p.v|0) === p.v) p.w = p.v.toString(10);
+				else p.w = SSF_general_num(p.v);
 			}
-			else p.w = SSF._general(p.v);
+			else p.w = SSF_general(p.v);
 		}
-		else p.w = SSF.format(fmtid,p.v, {date1904:!!date1904, dateNF: opts && opts.dateNF});
+		else p.w = SSF_format(fmtid,p.v, {date1904:!!date1904, dateNF: opts && opts.dateNF});
 	} catch(e) { if(opts.WTF) throw e; }
-	if(opts.cellDates && fmtid && p.t == 'n' && SSF.is_date(SSF._table[fmtid] || String(fmtid))) {
-		var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
+	if(opts.cellDates && fmtid && p.t == 'n' && fmt_is_date(table_fmt[fmtid] || String(fmtid))) {
+		var _d = SSF_parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
 	}
 }
 
@@ -18884,15 +18930,15 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 				case 0x041e /* Format */: { /* val = [id, fmt] */
 					if(opts.biff == 4) {
 						BIFF2FmtTable[BIFF2Fmt++] = val[1];
-						for(var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx) if(SSF._table[b4idx] == val[1]) break;
-						if(b4idx >= 163) SSF.load(val[1], BIFF2Fmt + 163);
+						for(var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx) if(table_fmt[b4idx] == val[1]) break;
+						if(b4idx >= 163) SSF_load(val[1], BIFF2Fmt + 163);
 					}
-					else SSF.load(val[1], val[0]);
+					else SSF_load(val[1], val[0]);
 				} break;
 				case 0x001e /* BIFF2FORMAT */: {
 					BIFF2FmtTable[BIFF2Fmt++] = val;
-					for(var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx) if(SSF._table[b2idx] == val) break;
-					if(b2idx >= 163) SSF.load(val, BIFF2Fmt + 163);
+					for(var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx) if(table_fmt[b2idx] == val) break;
+					if(b2idx >= 163) SSF_load(val, BIFF2Fmt + 163);
 				} break;
 
 				case 0x00e5 /* MergeCells */: merges = merges.concat(val); break;
@@ -18977,175 +19023,11 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 					if(!cur_sheet) Workbook.WBProps.CodeName = val || "ThisWorkbook";
 					else wsprops.CodeName = val || wsprops.name;
 				} break;
-				case 0x0055 /* DefColWidth */:
-				case 0x0225 /* DefaultRowHeight */:
-				case 0x005e /* Uncalced */:
-				case 0x01af /* Prot4Rev */: case 0x01bc /* Prot4RevPass */: /*TODO: Revision Control*/
-				case 0x005b /* FileSharing */:
-				case 0x00ff /* ExtSST */:
-				case 0x0863 /* BookExt */:
-				case 0x08a6 /* RichTextStream */:
-				case 0x00e9 /* BkHim */:
-				case 0x0060 /* Template */:
-				case 0x00da /* BookBool */:
-				case 0x0160 /* UsesELFs */:
-				case 0x089a /* MTRSettings */:
-				case 0x000b: case 0x020b /* Index */:
-				case 0x105c /* ClrtClient */:
-				case 0x001d /* Selection */:
-				case 0x0014 /* Header */:
-				case 0x0015 /* Footer */:
-				case 0x0083 /* HCenter */:
-				case 0x0084 /* VCenter */:
-				case 0x004d /* Pls */:
-				case 0x00ab /* GCW */:
-				case 0x0094 /* LHRecord */:
-				case 0x00d7 /* DBCell */:
-				case 0x01c2 /* EntExU2 */:
-				case 0x00b0 /* SxView */:
-				case 0x00b1 /* Sxvd */:
-				case 0x00b2 /* SXVI */:
-				case 0x0100 /* SXVDEx */:
-				case 0x00b4 /* SxIvd */:
-				case 0x00cd /* SXString */:
-				case 0x0097 /* Sync */:
-				case 0x0087 /* Addin */:
-				case 0x00c5 /* SXDI */:
-				case 0x00b5 /* SXLI */:
-				case 0x00f1 /* SXEx */:
-				case 0x0802 /* QsiSXTag */:
-				case 0x0868 /* Feat */:
-				case 0x0867 /* FeatHdr */: case 0x0871 /* FeatHdr11 */:
-				case 0x0872 /* Feature11 */: case 0x0878 /* Feature12 */: case 0x0877 /* List12 */:
-				case 0x01c1 /* RecalcId */:
-				case 0x0099 /* DxGCol */:
-				case 0x1060 /* Fbi */: case 0x1068 /* Fbi2 */: case 0x1066 /* GelFrame */:
-				case 0x0031 /* Font */:
-				case 0x087c /* XFCRC */:
-				case 0x0293 /* Style */:
-				case 0x0892 /* StyleExt */:
-				case 0x00dd /* ScenarioProtect */:
-				case 0x0063 /* ObjProtect */:
-				case 0x0879 /* CondFmt12 */:
-				case 0x0236 /* Table */:
-				case 0x088e /* TableStyles */:
-				case 0x088f /* TableStyle */:
-				case 0x0890 /* TableStyleElement */:
-				case 0x00d5 /* SXStreamID */:
-				case 0x00e3 /* SXVS */:
-				case 0x0051 /* DConRef */:
-				case 0x0864 /* SXAddl */:
-				case 0x01b5 /* DConBin */:
-				case 0x0052 /* DConName */:
-				case 0x00b6 /* SXPI */:
-				case 0x00fb /* SxFormat */:
-				case 0x00f7 /* SxSelect */:
-				case 0x00f0 /* SxRule */:
-				case 0x00f2 /* SxFilt */:
-				case 0x00f5 /* SxItm */:
-				case 0x00f4 /* SxDXF */:
-				case 0x00ae /* ScenMan */:
-				case 0x0050 /* DCon */:
-				case 0x086c /* CellWatch */:
-				case 0x002a /* PrintRowCol */:
-				case 0x002b /* PrintGrid */:
-				case 0x0033 /* PrintSize */:
-				case 0x0059 /* XCT */:
-				case 0x005a /* CRN */:
-				case 0x00a0 /* Scl */:
-				case 0x0862 /* SheetExt */:
-				case 0x01bd /* ObNoMacros */:
-				case 0x00d3 /* ObProj */:
-				case 0x0897 /* GUIDTypeLib */:
-				case 0x080b /* WOpt */:
-				case 0x00ef /* PhoneticInfo */:
-				case 0x00de /* OleObjectSize */:
-				case 0x088d /* DXF */:
-				case 0x01be /* Dv */: case 0x01b2 /* DVal */:
-				case 0x1051 /* BRAI */: case 0x1003 /* Series */: case 0x100d /* SeriesText */:
-				case 0x0876 /* DConn */:
-				case 0x00dc /* DbOrParamQry */:
-				case 0x0803 /* DBQueryExt */:
-				case 0x080a /* OleDbConn */:
-				case 0x0804 /* ExtString */:
-				case 0x104e /* IFmtRecord */:
-				case 0x01b0 /* CondFmt */: case 0x01b1 /* CF */: case 0x087a /* CF12 */: case 0x087b /* CFEx */:
-				case 0x01c0 /* Excel9File */:
-				case 0x1001 /* Units */:
-				case 0x00e1 /* InterfaceHdr' */: case 0x00c1 /* Mms */: case 0x00e2 /* InterfaceEnd */: case 0x0161 /* DSF */:
-				case 0x009c /* BuiltInFnGroupCount */: /* 2.4.30 0x0E or 0x10 but excel 2011 generates 0x11? */ break;
-				case 0x003d /* Window1 */: case 0x008d /* HideObj */: case 0x0082 /* GridSet */: case 0x0080 /* Guts */:
-				case 0x01a9 /* UserBView */: case 0x01aa /* UserSViewBegin */: case 0x01ab /* UserSViewEnd */:
-				case 0x0041 /* Pane */:
-				case 0x1063 /* Dat */:
-				case 0x1033 /* Begin */: case 0x1034 /* End */:
-				case 0x0852 /* StartBlock */: case 0x0853 /* EndBlock */:
-				case 0x1032 /* Frame */: case 0x101a /* Area */:
-				case 0x101d /* Axis */: case 0x1021 /* AxisLine */: case 0x101e /* Tick */:
-				case 0x1046 /* AxesUsed */:
-				case 0x089d /* CrtLayout12 */: case 0x08a7 /* CrtLayout12A */: case 0x1022 /* CrtLink */: case 0x101c /* CrtLine */: case 0x089e /* CrtMlFrt */: case 0x089f /* CrtMlFrtContinue */:
-				case 0x1007 /* LineFormat */: case 0x100a /* AreaFormat */:
-				case 0x1002 /* Chart */: case 0x103a /* Chart3d */: case 0x105f /* Chart3DBarShape */: case 0x1014 /* ChartFormat */: case 0x0850 /* ChartFrtInfo */:
-				case 0x1035 /* PlotArea */: case 0x1064 /* PlotGrowth */:
-				case 0x1016 /* SeriesList */: case 0x104a /* SerParent */: case 0x104b /* SerAuxTrend */:
-				case 0x1006 /* DataFormat */: case 0x1045 /* SerToCrt */: case 0x1026 /* FontX */:
-				case 0x1020 /* CatSerRange */: case 0x1062 /* AxcExt */: case 0x105d /* SerFmt */:
-				case 0x1044 /* ShtProps */:
-				case 0x1024 /* DefaultText */: case 0x1025 /* Text */: case 0x0856 /* CatLab */:
-				case 0x086b /* DataLabExtContents */:
-				case 0x1015 /* Legend */: case 0x1043 /* LegendException */:
-				case 0x1019 /* Pie */: case 0x101b /* Scatter */:
-				case 0x100b /* PieFormat */: case 0x1009 /* MarkerFormat */:
-				case 0x0854 /* StartObject */: case 0x0855 /* EndObject */:
-				case 0x1050 /* AlRuns */: case 0x1027 /* ObjectLink */:
-				case 0x1065 /* SIIndex */:
-				case 0x100c /* AttachedLabel */: case 0x0857 /* YMult */:
-				case 0x1018 /* Line */: case 0x1017 /* Bar */:
-				case 0x103f /* Surf */:
-				case 0x1041 /* AxisParent */:
-				case 0x104f /* Pos */:
-				case 0x101f /* ValueRange */:
-				case 0x0810 /* SXViewEx9 */:
-				case 0x0858 /* SXViewLink */:
-				case 0x0859 /* PivotChartBits */:
-				case 0x1048 /* SBaseRef */:
-				case 0x08a5 /* TextPropsStream */:
-				case 0x08c9 /* LnExt */:
-				case 0x08ca /* MkrExt */:
-				case 0x08cb /* CrtCoopt */:
-				case 0x01ad /* Qsi */: case 0x0807 /* Qsif */: case 0x0806 /* Qsir */:
-				case 0x0805 /* TxtQry */:
-				case 0x009b /* FilterMode */:
-				case 0x009e /* AutoFilter */: case 0x009d /* AutoFilterInfo */:
-				case 0x087e /* AutoFilter12 */:
-				case 0x0874 /* DropDownObjIds */:
-				case 0x0090 /* Sort */:
-				case 0x0895 /* SortData */:
-				case 0x08a4 /* ShapePropsStream */:
-				case 0x00ec /* MsoDrawing */: case 0x00eb /* MsoDrawingGroup*/: case 0x00ed /* MsoDrawingSelection */:
-				case 0x0801 /* WebPub */: case 0x08c0 /* AutoWebPub */:
-				case 0x089c /* HeaderFooter */: case 0x0866 /* HFPicture */: case 0x088b /* PLV */:
-				case 0x001b /* HorizontalPageBreaks */: case 0x001a /* VerticalPageBreaks */:
-				case 0x0040 /* Backup */: case 0x089b /* CompressPictures */: case 0x088c /* Compat12 */:
-				case 0x003c /* 'Continue' */: case 0x087f /* 'ContinueFrt12' */:
-				case 0x085a /* FrtFontList */: case 0x0851 /* 'FrtWrapper' */:
-				case 0x00ea /* TabIdConf */: case 0x103e /* Radar */: case 0x1040 /* RadarArea */: case 0x103d /* DropBar */: case 'Intl': case 'CoordList': case 'SerAuxErrBar':
-				case 0x0045 /* BIFF2FONTCLR */: case 0x001f /* BIFF2FMTCNT */: case 0x0032 /* BIFF2FONTXTRA */:
-				case 0x0043 /* BIFF2XF */: case 0x0243 /* BIFF3XF */: case 0x0443 /* BIFF4XF */:
-				case 0x0044 /* BIFF2XFINDEX */:
-				case 0x0056 /* BIFF4FMTCNT */: case 0x0008 /* BIFF2ROW */: case 0x003e /* BIFF2WINDOW2 */:
-				case 0x00af /* SCENARIO */: case 0x103c /* PicF */: case 0x086a /* DataLabExt */:
-				case 0x01b9 /* Lel */: case 0x1061 /* BopPop */: case 0x1067 /* BopPopCustom */: case 0x0813 /* RealTimeData */:
-				case 0x0095 /* LHNGraph */: case 0x009a /* FnGroupName */: case 0x00c2 /* AddMenu */: case 0x0098 /* LPr */:
-				case 0x08c1 /* ListObj */: case 0x08c2 /* ListField */:
-				case 0x013f /* RRSort */:
-				case 0x0418 /* BigName */:
-				case 0x00bf /* ToolbarHdr */: case 0x00c0/* ToolbarEnd */:
-				case 0x0034 /* DDEObjName */:
-				case 0x08d6 /* FRTArchId$ */: break;
-				default: if(options.WTF) throw 'Unrecognized Record 0x' + RecordType.toString(16);
 			}
-		} else blob.l += length;
+		} else {
+			if(!R) console.error("Missing Info for XLS Record 0x" + RecordType.toString(16));
+			blob.l += length;
+		}
 	}
 	wb.SheetNames=keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});
 	if(!options.bookSheets) wb.Sheets=Sheets;
@@ -19157,7 +19039,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 	} else wb.Preamble=Preamble;
 	if(wb.Sheets) FilterDatabases.forEach(function(r,i) { wb.Sheets[wb.SheetNames[i]]['!autofilter'] = r; });
 	wb.Strings = sst;
-	wb.SSF = SSF.get_table();
+	wb.SSF = dup(table_fmt);
 	if(opts.enc) wb.Encryption = opts.enc;
 	if(themes) wb.Themes = themes;
 	wb.Metadata = {};
@@ -20970,10 +20852,10 @@ function write_biff8_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) {
 	var bufs = [];
 
 	if(wb && !wb.SSF) {
-		wb.SSF = SSF.get_table();
+		wb.SSF = dup(table_fmt);
 	}
 	if(wb && wb.SSF) {
-		make_ssf(SSF); SSF.load_table(wb.SSF);
+		make_ssf(); SSF_load_table(wb.SSF);
 		// $FlowIgnore
 		o.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0;
 		o.ssf = wb.SSF;
@@ -21010,134 +20892,126 @@ function write_biff_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) {
 	throw new Error("invalid type " + o.bookType + " for BIFF");
 }
 /* note: browser DOM element cannot see mso- style attrs, must parse */
-var HTML_ = /*#__PURE__*/(function() {
-	function html_to_sheet(str/*:string*/, _opts)/*:Workbook*/ {
-		var opts = _opts || {};
-		if(DENSE != null && opts.dense == null) opts.dense = DENSE;
-		var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/);
-		str = str.replace(/<!--.*?-->/g, "");
-		var mtch/*:any*/ = str.match(/<table/i);
-		if(!mtch) throw new Error("Invalid HTML: could not find <table>");
-		var mtch2/*:any*/ = str.match(/<\/table/i);
-		var i/*:number*/ = mtch.index, j/*:number*/ = mtch2 && mtch2.index || str.length;
-		var rows = split_regex(str.slice(i, j), /(:?<tr[^>]*>)/i, "<tr>");
-		var R = -1, C = 0, RS = 0, CS = 0;
-		var range/*:Range*/ = {s:{r:10000000, c:10000000},e:{r:0,c:0}};
-		var merges/*:Array<Range>*/ = [];
-		for(i = 0; i < rows.length; ++i) {
-			var row = rows[i].trim();
-			var hd = row.slice(0,3).toLowerCase();
-			if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
-			if(hd != "<td" && hd != "<th") continue;
-			var cells = row.split(/<\/t[dh]>/i);
-			for(j = 0; j < cells.length; ++j) {
-				var cell = cells[j].trim();
-				if(!cell.match(/<t[dh]/i)) continue;
-				var m = cell, cc = 0;
-				/* TODO: parse styles etc */
-				while(m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) m = m.slice(cc+1);
-				for(var midx = 0; midx < merges.length; ++midx) {
-					var _merge/*:Range*/ = merges[midx];
-					if(_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) { C = _merge.e.c + 1; midx = -1; }
-				}
-				var tag = parsexmltag(cell.slice(0, cell.indexOf(">")));
-				CS = tag.colspan ? +tag.colspan : 1;
-				if((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}});
-				var _t/*:string*/ = tag.t || tag["data-t"] || "";
-				/* TODO: generate stub cells */
-				if(!m.length) { C += CS; continue; }
-				m = htmldecode(m);
-				if(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;
-				if(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;
-				if(!m.length) { C += CS; continue; }
-				var o/*:Cell*/ = {t:'s', v:m};
-				if(opts.raw || !m.trim().length || _t == 's'){}
-				else if(m === 'TRUE') o = {t:'b', v:true};
-				else if(m === 'FALSE') o = {t:'b', v:false};
-				else if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)};
-				else if(!isNaN(fuzzydate(m).getDate())) {
-					o = ({t:'d', v:parseDate(m)}/*:any*/);
-					if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/);
-					o.z = opts.dateNF || SSF._table[14];
-				}
-				if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; }
-				else ws[encode_cell({r:R, c:C})] = o;
-				C += CS;
+function html_to_sheet(str/*:string*/, _opts)/*:Workbook*/ {
+	var opts = _opts || {};
+	if(DENSE != null && opts.dense == null) opts.dense = DENSE;
+	var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/);
+	str = str.replace(/<!--.*?-->/g, "");
+	var mtch/*:any*/ = str.match(/<table/i);
+	if(!mtch) throw new Error("Invalid HTML: could not find <table>");
+	var mtch2/*:any*/ = str.match(/<\/table/i);
+	var i/*:number*/ = mtch.index, j/*:number*/ = mtch2 && mtch2.index || str.length;
+	var rows = split_regex(str.slice(i, j), /(:?<tr[^>]*>)/i, "<tr>");
+	var R = -1, C = 0, RS = 0, CS = 0;
+	var range/*:Range*/ = {s:{r:10000000, c:10000000},e:{r:0,c:0}};
+	var merges/*:Array<Range>*/ = [];
+	for(i = 0; i < rows.length; ++i) {
+		var row = rows[i].trim();
+		var hd = row.slice(0,3).toLowerCase();
+		if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
+		if(hd != "<td" && hd != "<th") continue;
+		var cells = row.split(/<\/t[dh]>/i);
+		for(j = 0; j < cells.length; ++j) {
+			var cell = cells[j].trim();
+			if(!cell.match(/<t[dh]/i)) continue;
+			var m = cell, cc = 0;
+			/* TODO: parse styles etc */
+			while(m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) m = m.slice(cc+1);
+			for(var midx = 0; midx < merges.length; ++midx) {
+				var _merge/*:Range*/ = merges[midx];
+				if(_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) { C = _merge.e.c + 1; midx = -1; }
 			}
+			var tag = parsexmltag(cell.slice(0, cell.indexOf(">")));
+			CS = tag.colspan ? +tag.colspan : 1;
+			if((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}});
+			var _t/*:string*/ = tag.t || tag["data-t"] || "";
+			/* TODO: generate stub cells */
+			if(!m.length) { C += CS; continue; }
+			m = htmldecode(m);
+			if(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;
+			if(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;
+			if(!m.length) { C += CS; continue; }
+			var o/*:Cell*/ = {t:'s', v:m};
+			if(opts.raw || !m.trim().length || _t == 's'){}
+			else if(m === 'TRUE') o = {t:'b', v:true};
+			else if(m === 'FALSE') o = {t:'b', v:false};
+			else if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)};
+			else if(!isNaN(fuzzydate(m).getDate())) {
+				o = ({t:'d', v:parseDate(m)}/*:any*/);
+				if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/);
+				o.z = opts.dateNF || table_fmt[14];
+			}
+			if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; }
+			else ws[encode_cell({r:R, c:C})] = o;
+			C += CS;
 		}
-		ws['!ref'] = encode_range(range);
-		if(merges.length) ws["!merges"] = merges;
-		return ws;
 	}
-	function html_to_book(str/*:string*/, opts)/*:Workbook*/ {
-		var mtch = str.match(/<table[\s\S]*?>[\s\S]*?<\/table>/gi);
-		if(!mtch || mtch.length == 0) throw new Error("Invalid HTML: could not find <table>");
-		if(mtch.length == 1) return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts);
-		var wb = book_new();
-		mtch.forEach(function(s, idx) { book_append_sheet(wb, html_to_sheet(s, opts), "Sheet" + (idx+1)); });
-		return wb;
-	}
-	function make_html_row(ws/*:Worksheet*/, r/*:Range*/, R/*:number*/, o/*:Sheet2HTMLOpts*/)/*:string*/ {
-		var M/*:Array<Range>*/ = (ws['!merges'] ||[]);
-		var oo/*:Array<string>*/ = [];
-		for(var C = r.s.c; C <= r.e.c; ++C) {
-			var RS = 0, CS = 0;
-			for(var j = 0; j < M.length; ++j) {
-				if(M[j].s.r > R || M[j].s.c > C) continue;
-				if(M[j].e.r < R || M[j].e.c < C) continue;
-				if(M[j].s.r < R || M[j].s.c < C) { RS = -1; break; }
-				RS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break;
-			}
-			if(RS < 0) continue;
-			var coord = encode_cell({r:R,c:C});
-			var cell = o.dense ? (ws[R]||[])[C] : ws[coord];
-			/* TODO: html entities */
-			var w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || "";
-			var sp = ({}/*:any*/);
-			if(RS > 1) sp.rowspan = RS;
-			if(CS > 1) sp.colspan = CS;
-			if(o.editable) w = '<span contenteditable="true">' + w + '</span>';
-			else if(cell) {
-				sp["data-t"] = cell && cell.t || 'z';
-				if(cell.v != null) sp["data-v"] = cell.v;
-				if(cell.z != null) sp["data-z"] = cell.z;
-				if(cell.l && (cell.l.Target || "#").charAt(0) != "#") w = '<a href="' + cell.l.Target +'">' + w + '</a>';
-			}
-			sp.id = (o.id || "sjs") + "-" + coord;
-			oo.push(writextag('td', w, sp));
+	ws['!ref'] = encode_range(range);
+	if(merges.length) ws["!merges"] = merges;
+	return ws;
+}
+function make_html_row(ws/*:Worksheet*/, r/*:Range*/, R/*:number*/, o/*:Sheet2HTMLOpts*/)/*:string*/ {
+	var M/*:Array<Range>*/ = (ws['!merges'] ||[]);
+	var oo/*:Array<string>*/ = [];
+	for(var C = r.s.c; C <= r.e.c; ++C) {
+		var RS = 0, CS = 0;
+		for(var j = 0; j < M.length; ++j) {
+			if(M[j].s.r > R || M[j].s.c > C) continue;
+			if(M[j].e.r < R || M[j].e.c < C) continue;
+			if(M[j].s.r < R || M[j].s.c < C) { RS = -1; break; }
+			RS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break;
 		}
-		var preamble = "<tr>";
-		return preamble + oo.join("") + "</tr>";
+		if(RS < 0) continue;
+		var coord = encode_cell({r:R,c:C});
+		var cell = o.dense ? (ws[R]||[])[C] : ws[coord];
+		/* TODO: html entities */
+		var w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || "";
+		var sp = ({}/*:any*/);
+		if(RS > 1) sp.rowspan = RS;
+		if(CS > 1) sp.colspan = CS;
+		if(o.editable) w = '<span contenteditable="true">' + w + '</span>';
+		else if(cell) {
+			sp["data-t"] = cell && cell.t || 'z';
+			if(cell.v != null) sp["data-v"] = cell.v;
+			if(cell.z != null) sp["data-z"] = cell.z;
+			if(cell.l && (cell.l.Target || "#").charAt(0) != "#") w = '<a href="' + cell.l.Target +'">' + w + '</a>';
+		}
+		sp.id = (o.id || "sjs") + "-" + coord;
+		oo.push(writextag('td', w, sp));
 	}
-	function make_html_preamble(ws/*:Worksheet*/, R/*:Range*/, o/*:Sheet2HTMLOpts*/)/*:string*/ {
-		var out/*:Array<string>*/ = [];
-		return out.join("") + '<table' + (o && o.id ? ' id="' + o.id + '"' : "") + '>';
-	}
-	var _BEGIN = '<html><head><meta charset="utf-8"/><title>SheetJS Table Export</title></head><body>';
-	var _END = '</body></html>';
-	function sheet_to_html(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*//*, wb:?Workbook*/)/*:string*/ {
-		var o = opts || {};
-		var header = o.header != null ? o.header : _BEGIN;
-		var footer = o.footer != null ? o.footer : _END;
-		var out/*:Array<string>*/ = [header];
-		var r = decode_range(ws['!ref']);
-		o.dense = Array.isArray(ws);
-		out.push(make_html_preamble(ws, r, o));
-		for(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o));
-		out.push("</table>" + footer);
-		return out.join("");
+	var preamble = "<tr>";
+	return preamble + oo.join("") + "</tr>";
+}
 
-	}
-	return {
-		to_workbook: html_to_book,
-		to_sheet: html_to_sheet,
-		_row: make_html_row,
-		BEGIN: _BEGIN,
-		END: _END,
-		_preamble: make_html_preamble,
-		from_sheet: sheet_to_html
-	};
-})();
+var HTML_BEGIN = '<html><head><meta charset="utf-8"/><title>SheetJS Table Export</title></head><body>';
+var HTML_END = '</body></html>';
+
+function html_to_workbook(str/*:string*/, opts)/*:Workbook*/ {
+	var mtch = str.match(/<table[\s\S]*?>[\s\S]*?<\/table>/gi);
+	if(!mtch || mtch.length == 0) throw new Error("Invalid HTML: could not find <table>");
+	if(mtch.length == 1) return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts);
+	var wb = book_new();
+	mtch.forEach(function(s, idx) { book_append_sheet(wb, html_to_sheet(s, opts), "Sheet" + (idx+1)); });
+	return wb;
+}
+
+function make_html_preamble(ws/*:Worksheet*/, R/*:Range*/, o/*:Sheet2HTMLOpts*/)/*:string*/ {
+	var out/*:Array<string>*/ = [];
+	return out.join("") + '<table' + (o && o.id ? ' id="' + o.id + '"' : "") + '>';
+}
+
+function sheet_to_html(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*//*, wb:?Workbook*/)/*:string*/ {
+	var o = opts || {};
+	var header = o.header != null ? o.header : HTML_BEGIN;
+	var footer = o.footer != null ? o.footer : HTML_END;
+	var out/*:Array<string>*/ = [header];
+	var r = decode_range(ws['!ref']);
+	o.dense = Array.isArray(ws);
+	out.push(make_html_preamble(ws, r, o));
+	for(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o));
+	out.push("</table>" + footer);
+	return out.join("");
+}
 
 function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {
 	var opts = _opts || {};
@@ -21196,7 +21070,7 @@ function sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/
 				else if(!isNaN(fuzzydate(v).getDate())) {
 					o = ({t:'d', v:parseDate(v)}/*:any*/);
 					if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/);
-					o.z = opts.dateNF || SSF._table[14];
+					o.z = opts.dateNF || table_fmt[14];
 				}
 			}
 			if(o.z === undefined && z != null) o.z = z;
@@ -22801,7 +22675,7 @@ function safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, idx/
 function strip_front_slash(x/*:string*/)/*:string*/ { return x.charAt(0) == '/' ? x.slice(1) : x; }
 
 function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
-	make_ssf(SSF);
+	make_ssf();
 	opts = opts || {};
 	fix_read_opts(opts);
 
@@ -22964,7 +22838,7 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {
 		Strings: strs,
 		Styles: styles,
 		Themes: themes,
-		SSF: SSF.get_table()
+		SSF: dup(table_fmt)
 	}/*:any*/);
 	if(opts && opts.bookFiles) {
 		if(zip.files) {
@@ -23046,10 +22920,10 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
 function write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
 	_shapeid = 1024;
 	if(wb && !wb.SSF) {
-		wb.SSF = SSF.get_table();
+		wb.SSF = dup(table_fmt);
 	}
 	if(wb && wb.SSF) {
-		make_ssf(SSF); SSF.load_table(wb.SSF);
+		make_ssf(); SSF_load_table(wb.SSF);
 		// $FlowIgnore
 		opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
 		opts.ssf = wb.SSF;
@@ -23181,10 +23055,10 @@ function write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
 function write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
 	_shapeid = 1024;
 	if(wb && !wb.SSF) {
-		wb.SSF = SSF.get_table();
+		wb.SSF = dup(table_fmt);
 	}
 	if(wb && wb.SSF) {
-		make_ssf(SSF); SSF.load_table(wb.SSF);
+		make_ssf(); SSF_load_table(wb.SSF);
 		// $FlowIgnore
 		opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
 		opts.ssf = wb.SSF;
@@ -23581,7 +23455,7 @@ function writeSync(wb/*:Workbook*/, opts/*:?WriteOpts*/) {
 		case 'slk':
 		case 'sylk': return write_string_type(SYLK.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);
 		case 'htm':
-		case 'html': return write_string_type(HTML_.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);
+		case 'html': return write_string_type(sheet_to_html(wb.Sheets[wb.SheetNames[idx]], o), o);
 		case 'txt': return write_stxt_type(sheet_to_txt(wb.Sheets[wb.SheetNames[idx]], o), o);
 		case 'csv': return write_string_type(sheet_to_csv(wb.Sheets[wb.SheetNames[idx]], o), o, "\ufeff");
 		case 'dif': return write_string_type(DIF.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);
@@ -23681,7 +23555,7 @@ function make_json_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Ar
 				else if(raw && v === null) row[hdr[C]] = null;
 				else continue;
 			} else {
-				row[hdr[C]] = raw || (o.rawNumbers && val.t == "n") ? v : format_cell(val,v,o);
+				row[hdr[C]] = raw && (val.t !== "n" || (val.t === "n" && o.rawNumbers !== false)) ? v : format_cell(val,v,o);
 			}
 			if(v != null) isempty = false;
 		}
@@ -23877,7 +23751,7 @@ function sheet_add_json(_ws/*:?Worksheet*/, js/*:Array<any>*/, opts)/*:Worksheet
 				else if(v instanceof Date) {
 					t = 'd';
 					if(!o.cellDates) { t = 'n'; v = datenum(v); }
-					z = (o.dateNF || SSF._table[14]);
+					z = (o.dateNF || table_fmt[14]);
 				}
 				else if(v === null && o.nullError) { t = 'e'; v = 0; }
 				if(!cell) ws[ref] = cell = ({t:t, v:v}/*:any*/);
@@ -24023,7 +23897,7 @@ var utils/*:any*/ = {
 	sheet_to_csv: sheet_to_csv,
 	sheet_to_txt: sheet_to_txt,
 	sheet_to_json: sheet_to_json,
-	sheet_to_html: HTML_.from_sheet,
+	sheet_to_html: sheet_to_html,
 	sheet_to_formulae: sheet_to_formulae,
 	sheet_to_row_object_array: sheet_to_json,
 	sheet_get_cell: ws_get_cell_stub,
@@ -24080,12 +23954,12 @@ function write_html_stream(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*/) {
 	var stream = _Readable();
 
 	var o = opts || {};
-	var header = o.header != null ? o.header : HTML_.BEGIN;
-	var footer = o.footer != null ? o.footer : HTML_.END;
+	var header = o.header != null ? o.header : HTML_BEGIN;
+	var footer = o.footer != null ? o.footer : HTML_END;
 	stream.push(header);
 	var r = decode_range(ws['!ref']);
 	o.dense = Array.isArray(ws);
-	stream.push(HTML_._preamble(ws, r, o));
+	stream.push(make_html_preamble(ws, r, o));
 	var R = r.s.r;
 	var end = false;
 	stream._read = function() {
@@ -24094,7 +23968,7 @@ function write_html_stream(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*/) {
 			return stream.push(null);
 		}
 		while(R <= r.e.r) {
-			stream.push(HTML_._row(ws, r, R, o));
+			stream.push(make_html_row(ws, r, R, o));
 			++R;
 			break;
 		}
diff --git a/xlsx.js b/xlsx.js
index 0df556b..f95ebf6 100644
--- a/xlsx.js
+++ b/xlsx.js
@@ -130,29 +130,29 @@ var Base64 = function() {
     }
   };
 }();
-var has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node);
+var has_buf = (function() { return typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node; })();
 
-var Buffer_from = function(){};
+var Buffer_from = (function() {
+	if(typeof Buffer !== 'undefined') {
+		var nbfs = !Buffer.from;
+		if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
+		return nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
+	}
+	return function() {};
+})();
 
-if(typeof Buffer !== 'undefined') {
-	var nbfs = !Buffer.from;
-	if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
-	Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
-	// $FlowIgnore
-	if(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };
-	// $FlowIgnore
-	if(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); };
-}
 
 function new_raw_buf(len) {
 	/* jshint -W056 */
-	return has_buf ? Buffer.alloc(len) : typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len);
+	if(has_buf) return Buffer.alloc ? Buffer.alloc(len) : new Buffer(len);
+	return typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len);
 	/* jshint +W056 */
 }
 
 function new_unsafe_buf(len) {
 	/* jshint -W056 */
-	return has_buf ? Buffer.allocUnsafe(len) : typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len);
+	if(has_buf) return Buffer.allocUnsafe ? Buffer.allocUnsafe(len) : new Buffer(len);
+	return typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len);
 	/* jshint +W056 */
 }
 
@@ -186,6 +186,23 @@ var o = new Array(data.length);
 	return o;
 }
 
+var bconcat = has_buf ? function(bufs) { return Buffer.concat(bufs.map(function(buf) { return Buffer.isBuffer(buf) ? buf : Buffer_from(buf); })); } : function(bufs) {
+	if(typeof Uint8Array !== "undefined") {
+		var i = 0, maxlen = 0;
+		for(i = 0; i < bufs.length; ++i) maxlen += bufs[i].length;
+		var o = new Uint8Array(maxlen);
+		var len = 0;
+		for(i = 0, maxlen = 0; i < bufs.length; maxlen += len, ++i) {
+			len = bufs[i].length;
+			if(bufs[i] instanceof Uint8Array) o.set(bufs[i], maxlen);
+			else if(typeof bufs[i] == "string") { throw "wtf"; }
+			else o.set(new Uint8Array(bufs[i]), maxlen);
+		}
+		return o;
+	}
+	return [].concat.apply([], bufs.map(function(buf) { return Array.isArray(buf) ? buf : [].slice.call(buf); }));
+};
+
 function utf8decode(content) {
 	var out = [], widx = 0, L = content.length + 250;
 	var o = new_raw_buf(content.length + 255);
@@ -218,31 +235,10 @@ function utf8decode(content) {
 	return bconcat(out);
 }
 
-var bconcat = function(bufs) {
-	if(typeof Uint8Array !== "undefined") {
-		var i = 0, maxlen = 0;
-		for(i = 0; i < bufs.length; ++i) maxlen += bufs[i].length;
-		var o = new Uint8Array(maxlen);
-		var len = 0;
-		for(i = 0, maxlen = 0; i < bufs.length; maxlen += len, ++i) {
-			len = bufs[i].length;
-			if(bufs[i] instanceof Uint8Array) o.set(bufs[i], maxlen);
-			else if(typeof bufs[i] == "string") { throw "wtf"; }
-			else o.set(new Uint8Array(bufs[i]), maxlen);
-		}
-		return o;
-	}
-	return [].concat.apply([], bufs.map(function(buf) { return Array.isArray(buf) ? buf : [].slice.call(buf); }));
-};
-
 var chr0 = /\u0000/g, chr1 = /[\u0001-\u0006]/g;
 /* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
 /*jshint -W041 */
-var SSF = ({});
-function make_ssf(SSF){
-SSF.version = '0.11.2';
 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);}
@@ -250,7 +246,8 @@ function pad0r1(v,d){var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.l
 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) { i = i || 0; 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; }
+/* yes, in 2022 this is still faster than string compare */
+function SSF_isgeneral(s, i) { i = i || 0; 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 days = [
 	['Sun', 'Sunday'],
 	['Mon', 'Monday'],
@@ -274,7 +271,8 @@ var months = [
 	['N', 'Nov', 'November'],
 	['D', 'Dec', 'December']
 ];
-function init_table(t) {
+function SSF_init_table(t) {
+	if(!t) t = {};
 	t[0]=  'General';
 	t[1]=  '0';
 	t[2]=  '0.00';
@@ -304,47 +302,66 @@ function init_table(t) {
 	t[48]= '##0.0E+0';
 	t[49]= '@';
 	t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "';
+	return t;
 }
+/* repeated to satiate webpack */
+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 table_fmt = {};
-init_table(table_fmt);
 /* Defaults determined by systematically testing in Excel 2019 */
 
 /* These formats appear to default to other formats in the table */
-var default_map = [];
-var defi = 0;
+var SSF_default_map = {
+	5:  37, 6:  38, 7:  39, 8:  40,         //  5 -> 37 ...  8 -> 40
 
-//  5 -> 37 ...  8 -> 40
-for(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi;
+	23:  0, 24:  0, 25:  0, 26:  0,         // 23 ->  0 ... 26 ->  0
 
-// 23 ->  0 ... 26 ->  0
-for(defi = 23; defi <= 26; ++defi) default_map[defi] = 0;
+	27: 14, 28: 14, 29: 14, 30: 14, 31: 14, // 27 -> 14 ... 31 -> 14
 
-// 27 -> 14 ... 31 -> 14
-for(defi = 27; defi <= 31; ++defi) default_map[defi] = 14;
-// 50 -> 14 ... 58 -> 14
-for(defi = 50; defi <= 58; ++defi) default_map[defi] = 14;
+	50: 14, 51: 14, 52: 14, 53: 14, 54: 14, // 50 -> 14 ... 58 -> 14
+	55: 14, 56: 14, 57: 14, 58: 14,
+	59:  1, 60:  2, 61:  3, 62:  4,         // 59 ->  1 ... 62 ->  4
 
-// 59 ->  1 ... 62 ->  4
-for(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58;
-// 67 ->  9 ... 68 -> 10
-for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58;
-// 72 -> 14 ... 75 -> 17
-for(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58;
+	67:  9, 68: 10,                         // 67 ->  9 ... 68 -> 10
+	69: 12, 70: 13, 71: 14,                 // 69 -> 12 ... 71 -> 14
+	72: 14, 73: 15, 74: 16, 75: 17,         // 72 -> 14 ... 75 -> 17
+	76: 20, 77: 21, 78: 22,                 // 76 -> 20 ... 78 -> 22
+	79: 45, 80: 46, 81: 47,                 // 79 -> 45 ... 81 -> 47
+	82: 0                                   // 82 ->  0 ... 65536 -> 0 (omitted)
+};
 
-// 69 -> 12 ... 71 -> 14
-for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57;
-
-// 76 -> 20 ... 78 -> 22
-for(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56;
-
-// 79 -> 45 ... 81 -> 47
-for(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34;
-
-// 82 ->  0 ... 65536 -> 0 (omitted)
 
 /* These formats technically refer to Accounting formats with no equivalent */
-var default_str = {
+var SSF_default_str = {
 	//  5 -- Currency,   0 decimal, black negative
 	5:  '"$"#,##0_);\\("$"#,##0\\)',
 	63: '"$"#,##0_);\\("$"#,##0\\)',
@@ -374,7 +391,7 @@ var default_str = {
 	44: '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)'
 };
 
-function frac(x, D, mixed) {
+function SSF_frac(x, D, mixed) {
 	var sgn = x < 0 ? -1 : 1;
 	var B = x * sgn;
 	var P_2 = 0, P_1 = 1, P = 0;
@@ -394,7 +411,7 @@ function frac(x, D, mixed) {
 	var q = Math.floor(sgn * P/Q);
 	return [q, sgn*P - q*Q, Q];
 }
-function parse_date_code(v,opts,b2) {
+function SSF_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=[];
@@ -415,7 +432,7 @@ function parse_date_code(v,opts,b2) {
 		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);
+		if(b2) dow = SSF_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);
@@ -424,64 +441,53 @@ function parse_date_code(v,opts,b2) {
 	out.q = dow;
 	return out;
 }
-SSF.parse_date_code = parse_date_code;
-var basedate = new Date(1899, 11, 31, 0, 0, 0);
-var dnthresh = basedate.getTime();
-var base1904 = new Date(1900, 2, 1, 0, 0, 0);
+var SSFbasedate = new Date(1899, 11, 31, 0, 0, 0);
+var SSFdnthresh = SSFbasedate.getTime();
+var SSFbase1904 = new Date(1900, 2, 1, 0, 0, 0);
 function datenum_local(v, date1904) {
 	var epoch = v.getTime();
 	if(date1904) epoch -= 1461*24*60*60*1000;
-	else if(v >= base1904) epoch += 24*60*60*1000;
-	return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);
+	else if(v >= SSFbase1904) epoch += 24*60*60*1000;
+	return (epoch - (SSFdnthresh + (v.getTimezoneOffset() - SSFbasedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);
 }
-/* The longest 32-bit integer text is "-4294967296", exactly 11 chars */
-function general_fmt_int(v) { return v.toString(10); }
-SSF._general_int = general_fmt_int;
-
 /* ECMA-376 18.8.30 numFmt*/
 /* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
-var general_fmt_num = (function make_general_fmt_num() {
-	var trailing_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)$/;
-	function strip_decimal(o) {
-		return (o.indexOf(".") == -1) ? o : o.replace(trailing_zeroes_and_decimal, "$1");
-	}
+/* exponent >= -9 and <= 9 */
+function SSF_strip_decimal(o) {
+	return (o.indexOf(".") == -1) ? o : o.replace(/(?:\.0*|(\.\d*[1-9])0+)$/, "$1");
+}
 
-	/* General Exponential always shows 2 digits exp and trims the mantissa */
-	var mantissa_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/;
-	var exp_with_single_digit = /(E[+-])(\d)$/;
-	function normalize_exp(o) {
-		if(o.indexOf("E") == -1) return o;
-		return o.replace(mantissa_zeroes_and_decimal,"$1E").replace(exp_with_single_digit,"$10$2");
-	}
+/* General Exponential always shows 2 digits exp and trims the mantissa */
+function SSF_normalize_exp(o) {
+	if(o.indexOf("E") == -1) return o;
+	return o.replace(/(?:\.0*|(\.\d*[1-9])0+)[Ee]/,"$1E").replace(/(E[+-])(\d)$/,"$10$2");
+}
 
-	/* exponent >= -9 and <= 9 */
-	function small_exp(v) {
-		var w = (v<0?12:11);
-		var o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o;
-		o = v.toPrecision(10); if(o.length <= w) return o;
-		return v.toExponential(5);
-	}
+/* exponent >= -9 and <= 9 */
+function SSF_small_exp(v) {
+	var w = (v<0?12:11);
+	var o = SSF_strip_decimal(v.toFixed(12)); if(o.length <= w) return o;
+	o = v.toPrecision(10); if(o.length <= w) return o;
+	return v.toExponential(5);
+}
 
-	/* exponent >= 11 or <= -10 likely exponential */
-	function large_exp(v) {
-		var o = strip_decimal(v.toFixed(11));
-		return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o;
-	}
+/* exponent >= 11 or <= -10 likely exponential */
+function SSF_large_exp(v) {
+	var o = SSF_strip_decimal(v.toFixed(11));
+	return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o;
+}
 
-	function general_fmt_num_base(v) {
-		var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;
+function SSF_general_num(v) {
+	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 = small_exp(v);
-		else if(V === 10) o = v.toFixed(10).substr(0,12);
-		else o = large_exp(v);
+	if(V >= -4 && V <= -1) o = v.toPrecision(10+V);
+	else if(Math.abs(V) <= 9) o = SSF_small_exp(v);
+	else if(V === 10) o = v.toFixed(10).substr(0,12);
+	else o = SSF_large_exp(v);
 
-		return strip_decimal(normalize_exp(o.toUpperCase()));
-	}
+	return SSF_strip_decimal(SSF_normalize_exp(o.toUpperCase()));
+}
 
-	return general_fmt_num_base;
-})();
-SSF._general_num = general_fmt_num;
 
 /*
 	"General" rules:
@@ -490,22 +496,23 @@ SSF._general_num = general_fmt_num;
 	- "up to 11 characters" displayed for numbers
 	- Default date format (code 14) used for Dates
 
+	The longest 32-bit integer text is "-2147483648", exactly 11 chars
 	TODO: technically the display depends on the width of the cell
 */
-function general_fmt(v, opts) {
+function SSF_general(v, opts) {
 	switch(typeof v) {
 		case 'string': return v;
 		case 'boolean': return v ? "TRUE" : "FALSE";
-		case 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v);
+		case 'number': return (v|0) === v ? v.toString(10) : SSF_general_num(v);
 		case 'undefined': return "";
 		case 'object':
 			if(v == null) return "";
-			if(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);
+			if(v instanceof Date) return SSF_format(14, datenum_local(v, opts && opts.date1904), opts);
 	}
 	throw new Error("unsupported value in General format: " + v);
 }
-SSF._general = general_fmt;
-function fix_hijri(date, o) {
+
+function SSF_fix_hijri(date, o) {
   /* TODO: properly adjust y/m/d and  */
   o[0] -= 581;
   var dow = date.getDay();
@@ -513,8 +520,7 @@ function fix_hijri(date, o) {
   return dow;
 }
 //var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
-/*jshint -W086 */
-function write_date(type, fmt, val, ss0) {
+function SSF_write_date(type, fmt, val, ss0) {
 	var o="", ss=0, tt=0, y = val.y, out, outl = 0;
 	switch(type) {
 		case 98: /* 'b' buddhist year */
@@ -577,6 +583,9 @@ if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;
 	var outstr = outl > 0 ? pad0(out, outl) : "";
 	return outstr;
 }
+
+
+/*jshint -W086 */
 /*jshint +W086 */
 function commaify(s) {
 	var w = 3;
@@ -585,17 +594,18 @@ function commaify(s) {
 	for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w);
 	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;
@@ -704,7 +714,7 @@ function write_num_flt(type, fmt, val) {
 	var oa = "";
 	if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
 		ri = Math.min(r[4].length,7);
-		ff = frac(aval, Math.pow(10,ri)-1, false);
+		ff = SSF_frac(aval, Math.pow(10,ri)-1, false);
 		o = "" + sign;
 		oa = write_num("n", r[1], ff[1]);
 		if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
@@ -716,7 +726,7 @@ function write_num_flt(type, fmt, val) {
 	}
 	if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
 		ri = Math.min(Math.max(r[1].length, r[4].length),7);
-		ff = frac(aval, Math.pow(10,ri)-1, true);
+		ff = SSF_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?]+$/))) {
@@ -822,7 +832,7 @@ return "." + $1 + fill("0", hashq(r[1]).length-$1.length); });
 	var oa = "";
 	if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
 		ri = Math.min(r[4].length,7);
-		ff = frac(aval, Math.pow(10,ri)-1, false);
+		ff = SSF_frac(aval, Math.pow(10,ri)-1, false);
 		o = "" + sign;
 		oa = write_num("n", r[1], ff[1]);
 		if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
@@ -834,7 +844,7 @@ return "." + $1 + fill("0", hashq(r[1]).length-$1.length); });
 	}
 	if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
 		ri = Math.min(Math.max(r[1].length, r[4].length),7);
-		ff = frac(aval, Math.pow(10,ri)-1, true);
+		ff = SSF_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?]+$/))) {
@@ -860,10 +870,10 @@ return "." + $1 + fill("0", hashq(r[1]).length-$1.length); });
 	}
 	throw new Error("unsupported format |" + fmt + "|");
 }
-return function write_num(type, fmt, val) {
+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) {
+}
+function SSF_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))) {
@@ -879,13 +889,13 @@ function split_fmt(fmt) {
 	if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string ");
 	return out;
 }
-SSF._split = split_fmt;
-var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/;
+
+var SSF_abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/;
 function fmt_is_date(fmt) {
 	var i = 0, /*cc = 0,*/ c = "", o = "";
 	while(i < fmt.length) {
 		switch((c = fmt.charAt(i))) {
-			case 'G': if(isgeneral(fmt, i)) i+= 6; i++; break;
+			case 'G': if(SSF_isgeneral(fmt, i)) i+= 6; i++; break;
 			case '"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break;
 			case '\\': i+=2; break;
 			case '_': i+=2; break;
@@ -904,7 +914,7 @@ function fmt_is_date(fmt) {
 			case '[':
 				o = c;
 				while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
-				if(o.match(abstime)) return true;
+				if(o.match(SSF_abstime)) return true;
 				break;
 			case '.':
 				/* falls through */
@@ -922,7 +932,7 @@ function fmt_is_date(fmt) {
 	}
 	return false;
 }
-SSF.is_date = fmt_is_date;
+
 function eval_fmt(fmt, v, opts, flen) {
 	var out = [], o = "", i = 0, c = "", lst='t', dt, j, cc;
 	var hr='H';
@@ -930,7 +940,7 @@ function eval_fmt(fmt, v, opts, flen) {
 	while(i < fmt.length) {
 		switch((c = fmt.charAt(i))) {
 			case 'G': /* General */
-				if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);
+				if(!SSF_isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);
 				out[out.length] = {t:'G', v:'General'}; i+=7; break;
 			case '"': /* Literal text */
 				for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);
@@ -942,7 +952,7 @@ function eval_fmt(fmt, v, opts, flen) {
 				out[out.length] = {t:'T', v:v}; ++i; break;
 			case 'B': case 'b':
 				if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") {
-					if(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; }
+					if(dt==null) { dt=SSF_parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; }
 					out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;
 				}
 				/* falls through */
@@ -951,14 +961,14 @@ function eval_fmt(fmt, v, opts, flen) {
 				/* falls through */
 			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 ""; }
+				if(dt==null) { dt=SSF_parse_date_code(v, opts); if(dt==null) return ""; }
 				o = c; while(++i < fmt.length && fmt.charAt(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': case 'a': case '上':
 				var q={t:c, v:c};
-				if(dt==null) dt=parse_date_code(v, opts);
+				if(dt==null) dt=SSF_parse_date_code(v, opts);
 				if(fmt.substr(i, 3).toUpperCase() === "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).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
 				else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
@@ -969,8 +979,8 @@ function eval_fmt(fmt, v, opts, flen) {
 				o = c;
 				while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
 				if(o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|';
-				if(o.match(abstime)) {
-					if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
+				if(o.match(SSF_abstime)) {
+					if(dt==null) { dt=SSF_parse_date_code(v, opts); if(dt==null) return ""; }
 					out[out.length] = {t:'Z', v:o.toLowerCase()};
 					lst = o.charAt(1);
 				} else if(o.indexOf("$") > -1) {
@@ -1044,7 +1054,7 @@ if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
 			case 't': case 'T': case ' ': case 'D': break;
 			case 'X': out[i].v = ""; out[i].t = ";"; 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].v = SSF_write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
 				out[i].t = 't'; break;
 			case 'n': case '?':
 				jj = i+1;
@@ -1059,7 +1069,7 @@ out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
 				}
 				nstr += out[i].v;
 				i = jj-1; break;
-			case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;
+			case 'G': out[i].t = 't'; out[i].v = SSF_general(v,opts); break;
 		}
 	}
 	var vv = "", myv, ostr;
@@ -1127,8 +1137,7 @@ out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
 	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;
@@ -1144,7 +1153,7 @@ function chkcond(v, rr) {
 	return false;
 }
 function choose_fmt(f, v) {
-	var fmt = split_fmt(f);
+	var fmt = SSF_split_fmt(f);
 	var l = fmt.length, lat = fmt[l-1].indexOf("@");
 	if(l<4 && lat>-1) --l;
 	if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|");
@@ -1157,14 +1166,14 @@ function choose_fmt(f, v) {
 	}
 	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) {
+	if(fmt[0].match(/\[[=<>]/) != null || fmt[1].match(/\[[=<>]/) != 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) {
+function SSF_format(fmt,v,o) {
 	if(o == null) o = {};
 	var sfmt = "";
 	switch(typeof fmt) {
@@ -1175,19 +1184,19 @@ function format(fmt,v,o) {
 		case "number":
 			if(fmt == 14 && o.dateNF) sfmt = o.dateNF;
 			else sfmt = (o.table != null ? (o.table) : table_fmt)[fmt];
-			if(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]];
-			if(sfmt == null) sfmt = default_str[fmt] || "General";
+			if(sfmt == null) sfmt = (o.table && o.table[SSF_default_map[fmt]]) || table_fmt[SSF_default_map[fmt]];
+			if(sfmt == null) sfmt = SSF_default_str[fmt] || "General";
 			break;
 	}
-	if(isgeneral(sfmt,0)) return general_fmt(v, o);
+	if(SSF_isgeneral(sfmt,0)) return SSF_general(v, o);
 	if(v instanceof Date) v = datenum_local(v, o.date1904);
 	var f = choose_fmt(sfmt, v);
-	if(isgeneral(f[1])) return general_fmt(v, o);
+	if(SSF_isgeneral(f[1])) return SSF_general(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]);
 }
-function load_entry(fmt, idx) {
+function SSF_load(fmt, idx) {
 	if(typeof idx != 'number') {
 		idx = +idx || -1;
 for(var i = 0; i < 0x0188; ++i) {
@@ -1199,36 +1208,24 @@ if(idx < 0) idx = 0x187;
 table_fmt[idx] = fmt;
 	return idx;
 }
-SSF.load = load_entry;
-SSF._table = table_fmt;
-SSF.get_table = function get_table() { return table_fmt; };
-SSF.load_table = function load_table(tbl) {
+function SSF_load_table(tbl) {
 	for(var i=0; i!=0x0188; ++i)
-		if(tbl[i] !== undefined) load_entry(tbl[i], i);
-};
-SSF.init_table = init_table;
-SSF.format = format;
+		if(tbl[i] !== undefined) SSF_load(tbl[i], i);
 }
-make_ssf(SSF);
-/* map from xlml named formats to SSF TODO: localize */
-var XLMLFormatMap/*{[string]:string}*/ = ({
-	"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";@'
-});
+
+function make_ssf() {
+	table_fmt = SSF_init_table();
+}
+
+var SSF = {
+	format: SSF_format,
+	load: SSF_load,
+	_table: table_fmt,
+	load_table: SSF_load_table,
+	parse_date_code: SSF_parse_date_code,
+	is_date: fmt_is_date,
+	get_table: function get_table() { return SSF._table = table_fmt; }
+};
 
 var SSFImplicit/*{[number]:string}*/ = ({
 	"5": '"$"#,##0_);\\("$"#,##0\\)',
@@ -1273,7 +1270,7 @@ var SSFImplicit/*{[number]:string}*/ = ({
 /* dateNF parse TODO: move to SSF */
 var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;
 function dateNF_regex(dateNF) {
-	var fmt = typeof dateNF == "number" ? SSF._table[dateNF] : dateNF;
+	var fmt = typeof dateNF == "number" ? table_fmt[dateNF] : dateNF;
 	fmt = fmt.replace(dateNFregex, "(\\d+)");
 	return new RegExp("^" + fmt + "$");
 }
@@ -3247,8 +3244,8 @@ function parse_isodur(s) {
 	return sec;
 }
 
-var good_pd_date = new Date('2017-02-19T19:06:09.000Z');
-if(isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17');
+var good_pd_date_1 = new Date('2017-02-19T19:06:09.000Z');
+var good_pd_date = isNaN(good_pd_date_1.getFullYear()) ? new Date('2/19/17') : good_pd_date_1;
 var good_pd = good_pd_date.getFullYear() == 2017;
 /* parses a date as a local date */
 function parseDate(str, fixdate) {
@@ -3273,12 +3270,30 @@ if(fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000);
 function cc2str(arr, debomit) {
 	if(has_buf && Buffer.isBuffer(arr)) {
 		if(debomit) {
-			if(arr[0] == 0xFF && arr[1] == 0xFE) return arr.slice(2).toString("utf16le");
-			if(arr[1] == 0xFE && arr[2] == 0xFF) return utf16beread(arr.slice(2).toString("binary"));
+			if(arr[0] == 0xFF && arr[1] == 0xFE) return utf8write(arr.slice(2).toString("utf16le"));
+			if(arr[1] == 0xFE && arr[2] == 0xFF) return utf8write(utf16beread(arr.slice(2).toString("binary")));
 		}
 		return arr.toString("binary");
 	}
-	/* TODO: investigate performance degradation of TextEncoder in Edge 13 */
+
+	if(typeof TextDecoder !== "undefined") try {
+		if(debomit) {
+			if(arr[0] == 0xFF && arr[1] == 0xFE) return utf8write(new TextDecoder("utf-16le").decode(arr.slice(2)));
+			if(arr[0] == 0xFE && arr[1] == 0xFF) return utf8write(new TextDecoder("utf-16be").decode(arr.slice(2)));
+		}
+		var rev = {
+			"\u20ac": "\x80", "\u201a": "\x82", "\u0192": "\x83", "\u201e": "\x84",
+			"\u2026": "\x85", "\u2020": "\x86", "\u2021": "\x87", "\u02c6": "\x88",
+			"\u2030": "\x89", "\u0160": "\x8a", "\u2039": "\x8b", "\u0152": "\x8c",
+			"\u017d": "\x8e", "\u2018": "\x91", "\u2019": "\x92", "\u201c": "\x93",
+			"\u201d": "\x94", "\u2022": "\x95", "\u2013": "\x96", "\u2014": "\x97",
+			"\u02dc": "\x98", "\u2122": "\x99", "\u0161": "\x9a", "\u203a": "\x9b",
+			"\u0153": "\x9c", "\u017e": "\x9e", "\u0178": "\x9f"
+		};
+		if(Array.isArray(arr)) arr = new Uint8Array(arr);
+		return new TextDecoder("latin1").decode(arr).replace(/[€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ]/g, function(c) { return rev[c] || c; });
+	} catch(e) {}
+
 	var o = [];
 	for(var i = 0; i != arr.length; ++i) o.push(String.fromCharCode(arr[i]));
 	return o.join("");
@@ -3323,13 +3338,15 @@ function fuzzydate(s) {
 	return o;
 }
 
-var safe_split_regex = "abacaba".split(/(:?b)/i).length == 5;
-function split_regex(str, re, def) {
-	if(safe_split_regex || typeof re == "string") return str.split(re);
-	var p = str.split(re), o = [p[0]];
-	for(var i = 1; i < p.length; ++i) { o.push(def); o.push(p[i]); }
-	return o;
-}
+var split_regex = (function() {
+	var safe_split_regex = "abacaba".split(/(:?b)/i).length == 5;
+	return function split_regex(str, re, def) {
+		if(safe_split_regex || typeof re == "string") return str.split(re);
+		var p = str.split(re), o = [p[0]];
+		for(var i = 1; i < p.length; ++i) { o.push(def); o.push(p[i]); }
+		return o;
+	};
+})();
 function getdatastr(data) {
 	if(!data) return null;
 	if(data.content && data.type) return cc2str(data.content, true);
@@ -3437,9 +3454,8 @@ function resolve_path(path, base) {
 }
 var XML_HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n';
 var attregexg=/([^"\s?>\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g;
-var tagregex=/<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg;
-
-if(!(XML_HEADER.match(tagregex))) tagregex = /<[^>]*>/g;
+var tagregex1=/<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/mg, tagregex2 = /<[^>]*>/g;
+var tagregex = XML_HEADER.match(tagregex1) ? tagregex1 : tagregex2;
 var nsregex=/<\w*:/, nsregex2 = /<(\/?)\w+:/;
 function parsexmltag(tag, skip_root, skip_LC) {
 	var z = ({});
@@ -3528,7 +3544,7 @@ function parsexmlbool(value) {
 	}
 }
 
-var utf8read = function utf8reada(orig) {
+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++);
@@ -3543,9 +3559,31 @@ var utf8read = function utf8reada(orig) {
 		out += String.fromCharCode(0xDC00 + (w&1023));
 	}
 	return out;
-};
+}
 
-var utf8write = function(orig) {
+function utf8readb(data) {
+	var out = new_raw_buf(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 = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);
+		}
+		if(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }
+		out[k++] = w%256; out[k++] = w>>>8;
+	}
+	return out.slice(0,k).toString('ucs2');
+}
+
+function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); }
+
+var utf8corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
+var utf8read = has_buf && (utf8readc(utf8corpus) == utf8reada(utf8corpus) && utf8readc || utf8readb(utf8corpus) == utf8reada(utf8corpus) && utf8readb) || utf8reada;
+
+var utf8write = has_buf ? function(data) { return Buffer_from(data, 'utf8').toString("binary"); } : function(orig) {
 	var out = [], i = 0, c = 0, d = 0;
 	while(i < orig.length) {
 		c = orig.charCodeAt(i++);
@@ -3571,31 +3609,6 @@ var utf8write = function(orig) {
 	return out.join("");
 };
 
-if(has_buf) {
-	var utf8readb = function utf8readb(data) {
-		var out = Buffer.alloc(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 = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);
-			}
-			if(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }
-			out[k++] = w%256; out[k++] = w>>>8;
-		}
-		return out.slice(0,k).toString('ucs2');
-	};
-	var corpus = "foo bar baz\u00e2\u0098\u0083\u00f0\u009f\u008d\u00a3";
-	if(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;
-	var utf8readc = function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); };
-	if(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;
-
-	utf8write = function(data) { return Buffer_from(data, 'utf8').toString("binary"); };
-}
-
 // matches <foo>...</foo> extracts content
 var matchtag = (function() {
 	var mtcache = ({});
@@ -3745,39 +3758,44 @@ function write_double_le(b, v, idx) {
 	b[idx + 7] = (e >> 4) | bs;
 }
 
-var __toBuffer = function(bufs) { var x=[],w=10240; for(var i=0;i<bufs[0].length;++i) if(bufs[0][i]) for(var j=0,L=bufs[0][i].length;j<L;j+=w) x.push.apply(x, bufs[0][i].slice(j,j+w)); return x; };
-var ___toBuffer = __toBuffer;
-var __utf16le = function(b,s,e) { var ss=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join("").replace(chr0,''); };
-var ___utf16le = __utf16le;
-var __hexlify = function(b,s,l) { var ss=[]; for(var i=s; i<s+l; ++i) ss.push(("0" + b[i].toString(16)).slice(-2)); return ss.join(""); };
-var ___hexlify = __hexlify;
-var __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 ___utf8 = __utf8;
-var __lpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
-var ___lpstr = __lpstr;
-var __cpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
-var ___cpstr = __cpstr;
-var __lpwstr = function(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
-var ___lpwstr = __lpwstr;
-var __lpp4, ___lpp4;
-__lpp4 = ___lpp4 = function lpp4_(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf16le(b, i+4,i+4+len) : "";};
-var __8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len) : "";};
-var ___8lpp4 = __8lpp4;
-var __double, ___double;
-__double = ___double = function(b, idx) { return read_double_le(b, idx);};
+var ___toBuffer = function(bufs) { var x=[],w=10240; for(var i=0;i<bufs[0].length;++i) if(bufs[0][i]) for(var j=0,L=bufs[0][i].length;j<L;j+=w) x.push.apply(x, bufs[0][i].slice(j,j+w)); return x; };
+var __toBuffer = has_buf ? function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0].map(function(x) { return Buffer.isBuffer(x) ? x : Buffer_from(x); })) : ___toBuffer(bufs);} : ___toBuffer;
+
+var ___utf16le = function(b,s,e) { var ss=[]; for(var i=s; i<e; i+=2) ss.push(String.fromCharCode(__readUInt16LE(b,i))); return ss.join("").replace(chr0,''); };
+var __utf16le = has_buf ? function(b,s,e) { if(!Buffer.isBuffer(b)) return ___utf16le(b,s,e); return b.toString('utf16le',s,e).replace(chr0,'')/*.replace(chr1,'!')*/; } : ___utf16le;
+
+var ___hexlify = function(b,s,l) { var ss=[]; for(var i=s; i<s+l; ++i) ss.push(("0" + b[i].toString(16)).slice(-2)); return ss.join(""); };
+var __hexlify = has_buf ? function(b,s,l) { return Buffer.isBuffer(b) ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); } : ___hexlify;
+
+var ___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 __utf8 = has_buf ? function utf8_b(b, s, e) { return (Buffer.isBuffer(b)) ? b.toString('utf8',s,e) : ___utf8(b,s,e); } : ___utf8;
+
+var ___lpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
+var __lpstr = ___lpstr;
+
+var ___cpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
+var __cpstr = ___cpstr;
+
+var ___lpwstr = function(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : "";};
+var __lpwstr = ___lpwstr;
+
+var ___lpp4 = function lpp4_(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf16le(b, i+4,i+4+len) : "";};
+var __lpp4 = ___lpp4;
+
+var ___8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len) : "";};
+var __8lpp4 = ___8lpp4;
+
+var ___double = function(b, idx) { return read_double_le(b, idx);};
+var __double = ___double;
+
 var is_buf = function is_buf_a(a) { return Array.isArray(a) || (typeof Uint8Array !== "undefined" && a instanceof Uint8Array); };
 
 if(has_buf) {
-	__utf16le = function(b,s,e) { if(!Buffer.isBuffer(b)) return ___utf16le(b,s,e); return b.toString('utf16le',s,e).replace(chr0,'')/*.replace(chr1,'!')*/; };
-	__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) : "";};
 	__cpstr = function cpstr_b(b, i) { if(!Buffer.isBuffer(b)) return ___cpstr(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);};
 	__lpp4 = function lpp4_b(b, i) { if(!Buffer.isBuffer(b)) return ___lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len);};
 	__8lpp4 = function lpp4_8b(b, i) { if(!Buffer.isBuffer(b)) return ___8lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf8',i+4,i+4+len);};
-	__utf8 = function utf8_b(b, s, e) { return (Buffer.isBuffer(b)) ? b.toString('utf8',s,e) : ___utf8(b,s,e); };
-	__toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0].map(function(x) { return Buffer.isBuffer(x) ? x : Buffer_from(x); })) : ___toBuffer(bufs);};
-	bconcat = function(bufs) { return Buffer.concat(bufs.map(function(buf) { return Buffer.isBuffer(buf) ? buf : Buffer_from(buf); })); };
 	__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) || (typeof Uint8Array !== "undefined" && a instanceof Uint8Array); };
 }
@@ -4149,8 +4167,8 @@ function safe_decode_range(range) {
 
 function safe_format_cell(cell, v) {
 	var q = (cell.t == 'd' && v instanceof Date);
-	if(cell.z != null) try { return (cell.w = SSF.format(cell.z, q ? datenum(v) : v)); } catch(e) { }
-	try { return (cell.w = SSF.format((cell.XF||{}).numFmtId||(q ? 14 : 0),  q ? datenum(v) : v)); } catch(e) { return ''+v; }
+	if(cell.z != null) try { return (cell.w = SSF_format(cell.z, q ? datenum(v) : v)); } catch(e) { }
+	try { return (cell.w = SSF_format((cell.XF||{}).numFmtId||(q ? 14 : 0),  q ? datenum(v) : v)); } catch(e) { return ''+v; }
 }
 
 function format_cell(cell, v, o) {
@@ -4214,9 +4232,9 @@ function sheet_add_aoa(_ws, data, opts) {
 				else if(typeof cell.v === 'number') cell.t = 'n';
 				else if(typeof cell.v === 'boolean') cell.t = 'b';
 				else if(cell.v instanceof Date) {
-					cell.z = o.dateNF || SSF._table[14];
-					if(o.cellDates) { cell.t = 'd'; cell.w = SSF.format(cell.z, datenum(cell.v)); }
-					else { cell.t = 'n'; cell.v = datenum(cell.v); cell.w = SSF.format(cell.z, cell.v); }
+					cell.z = o.dateNF || table_fmt[14];
+					if(o.cellDates) { cell.t = 'd'; cell.w = SSF_format(cell.z, datenum(cell.v)); }
+					else { cell.t = 'n'; cell.v = datenum(cell.v); cell.w = SSF_format(cell.z, cell.v); }
 				}
 				else cell.t = 's';
 			}
@@ -4731,7 +4749,7 @@ function rgbify(arr) { return arr.map(function(x) { return [(x>>16)&255,(x>>8)&2
 
 /* [MS-XLS] 2.5.161 */
 /* [MS-XLSB] 2.5.75 Icv */
-var _XLSIcv = rgbify([
+var _XLSIcv =  rgbify([
 	/* Color Constants */
 	0x000000,
 	0xFFFFFF,
@@ -4837,7 +4855,19 @@ var BErr = {
 0x2B: "#GETTING_DATA",
 0xFF: "#WTF?"
 };
-var RBErr = evert_num(BErr);
+//var RBErr = evert_num(BErr);
+var RBErr = {
+	"#NULL!":        0x00,
+	"#DIV/0!":       0x07,
+	"#VALUE!":       0x0F,
+	"#REF!":         0x17,
+	"#NAME?":        0x1D,
+	"#NUM!":         0x24,
+	"#N/A":          0x2A,
+	"#GETTING_DATA": 0x2B,
+	"#WTF?":         0xFF
+};
+
 /* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */
 /* 12.3 Part Summary <SpreadsheetML> */
 /* 14.2 Part Summary <DrawingML> */
@@ -5091,18 +5121,17 @@ function parse_ct(data) {
 	return ct;
 }
 
-var CTYPE_XML_ROOT = writextag('Types', null, {
-	'xmlns': XMLNS.CT,
-	'xmlns:xsd': XMLNS.xsd,
-	'xmlns:xsi': XMLNS.xsi
-});
-
 function write_ct(ct, opts) {
 	var type2ct/*{[string]:Array<string>}*/ = evert_arr(ct2type);
 
 	var o = [], v;
 	o[o.length] = (XML_HEADER);
-	o[o.length] = (CTYPE_XML_ROOT);
+	o[o.length] = writextag('Types', null, {
+		'xmlns': XMLNS.CT,
+		'xmlns:xsd': XMLNS.xsd,
+		'xmlns:xsi': XMLNS.xsi
+	});
+
 	o = o.concat([
 		['xml', 'application/xml'],
 		['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],
@@ -5233,14 +5262,12 @@ function parse_rels(data, currentFilePath) {
 }
 
 
-var RELS_ROOT = writextag('Relationships', null, {
-	//'xmlns:ns0': XMLNS.RELS,
-	'xmlns': XMLNS.RELS
-});
-
 /* TODO */
 function write_rels(rels) {
-	var o = [XML_HEADER, RELS_ROOT];
+	var o = [XML_HEADER, writextag('Relationships', null, {
+		//'xmlns:ns0': XMLNS.RELS,
+		'xmlns': XMLNS.RELS
+	})];
 	keys(rels['!id']).forEach(function(rid) {
 		o[o.length] = (writextag('Relationship', null, rels['!id'][rid]));
 	});
@@ -7848,7 +7875,7 @@ var SYLK = (function() {
 					else if(val === 'FALSE') val = false;
 					else if(!isNaN(fuzzynum(val))) {
 						val = fuzzynum(val);
-						if(next_cell_format !== null && SSF.is_date(next_cell_format)) val = numdate(val);
+						if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(val);
 					} else if(!isNaN(fuzzydate(val).getDate())) {
 						val = parseDate(val);
 					}
@@ -8093,7 +8120,7 @@ var DIF = (function() {
 							push_value(o, 1, 0, (!DIF_XL || isNaN(cell.v)) ? cell.v : '="' + cell.v + '"');
 							break;
 						case 'd':
-							if(!cell.w) cell.w = SSF.format(cell.z || SSF._table[14], datenum(parseDate(cell.v)));
+							if(!cell.w) cell.w = SSF_format(cell.z || table_fmt[14], datenum(parseDate(cell.v)));
 							if(DIF_XL) push_value(o, 0, cell.w, "V");
 							else push_value(o, 1, 0, cell.w);
 							break;
@@ -8190,7 +8217,7 @@ var ETH = (function() {
 					case 'd':
 						var t = datenum(parseDate(cell.v));
 						oo[2] = 'vtc'; oo[3] = 'nd'; oo[4] = ""+t;
-						oo[5] = cell.w || SSF.format(cell.z || SSF._table[14], t);
+						oo[5] = cell.w || SSF_format(cell.z || table_fmt[14], t);
 						break;
 					case 'e': continue;
 				}
@@ -8331,12 +8358,12 @@ var PRN = (function() {
 			else if(s == "FALSE") { cell.t = 'b'; cell.v = false; }
 			else if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; if(o.cellText !== false) cell.w = s; cell.v = v; }
 			else if(!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) {
-				cell.z = o.dateNF || SSF._table[14];
+				cell.z = o.dateNF || table_fmt[14];
 				var k = 0;
 				if(_re && s.match(_re)){ s=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); k=1; }
 				if(o.cellDates) { cell.t = 'd'; cell.v = parseDate(s, k); }
 				else { cell.t = 'n'; cell.v = datenum(parseDate(s, k)); }
-				if(o.cellText !== false) cell.w = SSF.format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);
+				if(o.cellText !== false) cell.w = SSF_format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);
 				if(!o.cellNF) delete cell.z;
 			} else {
 				cell.t = 's';
@@ -8493,7 +8520,7 @@ var WK_ = (function() {
 				case 0x10: /* FORMULA */
 					/* TODO: actual translation of the format code */
 					if(RT == 0x0E && (val[2] & 0x70) == 0x70 && (val[2] & 0x0F) > 1 && (val[2] & 0x0F) < 15) {
-						val[1].z = o.dateNF || SSF._table[14];
+						val[1].z = o.dateNF || table_fmt[14];
 						if(o.cellDates) { val[1].t = 'd'; val[1].v = numdate(val[1].v); }
 					}
 
@@ -10316,8 +10343,8 @@ function parse_fonts(t, styles, themes, opts) {
 /* 18.8.31 numFmts CT_NumFmts */
 function parse_numFmts(t, styles, opts) {
 	styles.NumberFmt = [];
-	var k/*Array<number>*/ = (keys(SSF._table));
-	for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]];
+	var k/*Array<number>*/ = (keys(table_fmt));
+	for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = table_fmt[k[i]];
 	var m = t[0].match(tagregex);
 	if(!m) return;
 	for(i=0; i < m.length; ++i) {
@@ -10332,7 +10359,7 @@ function parse_numFmts(t, styles, opts) {
 						for(j = 0x188; j > 0x3c; --j) if(styles.NumberFmt[j] == null) break;
 						styles.NumberFmt[j] = f;
 					}
-					SSF.load(f,j);
+					SSF_load(f,j);
 				}
 			} break;
 			case '</numFmt>': break;
@@ -10690,7 +10717,7 @@ function write_BrtBeginTableStyles(cnt, defTableStyle, defPivotStyle) {
 function parse_sty_bin(data, themes, opts) {
 	var styles = {};
 	styles.NumberFmt = ([]);
-	for(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];
+	for(var y in table_fmt) styles.NumberFmt[y] = table_fmt[y];
 
 	styles.CellXf = [];
 	styles.Fonts = [];
@@ -10699,7 +10726,7 @@ function parse_sty_bin(data, themes, opts) {
 	recordhopper(data, function hopper_sty(val, R, RT) {
 		switch(RT) {
 			case 0x002C: /* BrtFmt */
-				styles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);
+				styles.NumberFmt[val[0]] = val[1]; SSF_load(val[1], val[0]);
 				break;
 			case 0x002B: /* BrtFont */
 				styles.Fonts.push(val);
@@ -12692,10 +12719,9 @@ var PtgBinOp = {
 };
 
 // List of invalid characters needs to be tested further
-var quoteCharacters  = new RegExp(/[^\w\u4E00-\u9FFF\u3040-\u30FF]/);
 function formula_quote_sheet_name(sname, opts) {
 	if(!sname && !(opts && opts.biff <= 5 && opts.biff >= 2)) throw new Error("empty sheet name");
-	if (quoteCharacters.test(sname)) return "'" + sname + "'";
+	if (/[^\w\u4E00-\u9FFF\u3040-\u30FF]/.test(sname)) return "'" + sname + "'";
 	return sname;
 }
 function get_ixti_raw(supbooks, ixti, opts) {
@@ -14400,7 +14426,7 @@ function get_cell_style(styles, cell, opts) {
 	var i = 0x3c, len = styles.length;
 	if(z == null && opts.ssf) {
 		for(; i < 0x188; ++i) if(opts.ssf[i] == null) {
-			SSF.load(cell.z, i);
+			SSF_load(cell.z, i);
 			// $FlowIgnore
 			opts.ssf[i] = cell.z;
 			opts.revssf[cell.z] = z = i;
@@ -14421,28 +14447,28 @@ function get_cell_style(styles, cell, opts) {
 
 function safe_format(p, fmtid, fillid, opts, themes, styles) {
 	try {
-		if(opts.cellNF) p.z = SSF._table[fmtid];
+		if(opts.cellNF) p.z = table_fmt[fmtid];
 	} catch(e) { if(opts.WTF) throw e; }
 	if(p.t === 'z' && !opts.cellStyles) return;
 	if(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);
 	if((!opts || opts.cellText !== false) && p.t !== 'z') try {
-		if(SSF._table[fmtid] == null) SSF.load(SSFImplicit[fmtid] || "General", fmtid);
+		if(table_fmt[fmtid] == null) SSF_load(SSFImplicit[fmtid] || "General", fmtid);
 		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);
+				if((p.v|0) === p.v) p.w = p.v.toString(10);
+				else p.w = SSF_general_num(p.v);
 			}
 			else if(p.t === 'd') {
 				var dd = datenum(p.v);
-				if((dd|0) === dd) p.w = SSF._general_int(dd);
-				else p.w = SSF._general_num(dd);
+				if((dd|0) === dd) p.w = dd.toString(10);
+				else p.w = SSF_general_num(dd);
 			}
 			else if(p.v === undefined) return "";
-			else p.w = SSF._general(p.v,_ssfopts);
+			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);
+		else if(p.t === 'd') p.w = SSF_format(fmtid,datenum(p.v),_ssfopts);
+		else p.w = SSF_format(fmtid,p.v,_ssfopts);
 	} catch(e) { if(opts.WTF) throw e; }
 	if(!opts.cellStyles) return;
 	if(fillid != null) try {
@@ -14738,7 +14764,7 @@ function write_ws_xml_cell(cell, ref, ws, opts) {
 				cell.t = 'n';
 				vv = ''+(cell.v = datenum(parseDate(cell.v)));
 			}
-			if(typeof cell.z === 'undefined') cell.z = SSF._table[14];
+			if(typeof cell.z === 'undefined') cell.z = table_fmt[14];
 			break;
 		default: vv = cell.v; break;
 	}
@@ -14942,7 +14968,7 @@ return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) {
 				}
 			}
 			safe_format(p, fmtid, fillid, opts, themes, styles);
-			if(opts.cellDates && do_format && p.t == 'n' && SSF.is_date(SSF._table[fmtid])) { p.t = 'd'; p.v = numdate(p.v); }
+			if(opts.cellDates && do_format && p.t == 'n' && fmt_is_date(table_fmt[fmtid])) { p.t = 'd'; p.v = numdate(p.v); }
 			if(tag.cm && opts.xlmeta) {
 				var cm = (opts.xlmeta.Cell||[])[+tag.cm-1];
 				if(cm && cm.type == 'XLDAPR') p.D = true;
@@ -15722,8 +15748,8 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
 				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;
-				if(opts.cellDates && cf && p.t == 'n' && SSF.is_date(SSF._table[cf.numFmtId])) {
-					var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
+				if(opts.cellDates && cf && p.t == 'n' && fmt_is_date(table_fmt[cf.numFmtId])) {
+					var _d = SSF_parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
 				}
 				if(cm) {
 					if(cm.type == 'XLDAPR') p.D = true;
@@ -15929,7 +15955,7 @@ function write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen) {
 		case 'b': vv = cell.v ? "1" : "0"; break;
 		case 'd': // no BrtCellDate :(
 			cell = dup(cell);
-			cell.z = cell.z || SSF._table[14];
+			cell.z = cell.z || table_fmt[14];
 			cell.v = datenum(parseDate(cell.v)); cell.t = 'n';
 			break;
 		/* falls through */
@@ -17112,10 +17138,13 @@ if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1);
 
 // ----
 
+/* map from xlml named formats to SSF TODO: localize */
+var XLMLFormatMap;
+
 function xlml_format(format, value) {
 	var fmt = XLMLFormatMap[format] || unescapexml(format);
-	if(fmt === "General") return SSF._general(value);
-	return SSF.format(fmt, value);
+	if(fmt === "General") return SSF_general(value);
+	return SSF_format(fmt, value);
 }
 
 function xlml_set_custprop(Custprops, key, cp, val) {
@@ -17137,18 +17166,18 @@ function safe_format_xlml(cell, nf, o) {
 		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);
+				if((cell.v|0) === cell.v) cell.w = cell.v.toString(10);
+				else cell.w = SSF_general_num(cell.v);
 			}
-			else cell.w = SSF._general(cell.v);
+			else cell.w = SSF_general(cell.v);
 		}
 		else cell.w = xlml_format(nf||"General", cell.v);
 	} catch(e) { if(o.WTF) throw e; }
 	try {
 		var z = XLMLFormatMap[nf]||nf||"General";
 		if(o.cellNF) cell.z = z;
-		if(o.cellDates && cell.t == 'n' && SSF.is_date(z)) {
-			var _d = SSF.parse_date_code(cell.v); if(_d) { cell.t = 'd'; cell.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
+		if(o.cellDates && cell.t == 'n' && fmt_is_date(z)) {
+			var _d = SSF_parse_date_code(cell.v); if(_d) { cell.t = 'd'; cell.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
 		}
 	} catch(e) { if(o.WTF) throw e; }
 }
@@ -17240,7 +17269,7 @@ function xlml_clean_comment(comment) {
 /* TODO: Everything */
 function parse_xlml_xml(d, _opts) {
 	var opts = _opts || {};
-	make_ssf(SSF);
+	make_ssf();
 	var str = debom(xlml_normalize(d));
 	if(opts.type == 'binary' || opts.type == 'array' || opts.type == 'base64') {
 		if(typeof $cptable !== 'undefined') str = $cptable.utils.decode(65001, char_codes(str));
@@ -17250,7 +17279,28 @@ function parse_xlml_xml(d, _opts) {
 	opening = opening.replace(/".*?"/g, "");
 	if((opening.indexOf(">") & 1023) > Math.min((opening.indexOf(",") & 1023), (opening.indexOf(";")&1023))) { var _o = dup(opts); _o.type = "string"; return PRN.to_workbook(str, _o); }
 	if(opening.indexOf("<?xml") == -1) ["html", "table", "head", "meta", "script", "style", "div"].forEach(function(tag) { if(opening.indexOf("<" + tag) >= 0) ishtml = true; });
-	if(ishtml) return HTML_.to_workbook(str, opts);
+	if(ishtml) return html_to_workbook(str, opts);
+
+	XLMLFormatMap = ({
+		"General Number": "General",
+		"General Date": table_fmt[22],
+		"Long Date": "dddd, mmmm dd, yyyy",
+		"Medium Date": table_fmt[15],
+		"Short Date": table_fmt[14],
+		"Long Time": table_fmt[19],
+		"Medium Time": table_fmt[18],
+		"Short Time": table_fmt[20],
+		"Currency": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
+		"Fixed": table_fmt[2],
+		"Standard": table_fmt[4],
+		"Percent": table_fmt[10],
+		"Scientific": table_fmt[11],
+		"Yes/No": '"Yes";"Yes";"No";@',
+		"True/False": '"True";"True";"False";@',
+		"On/Off": '"Yes";"Yes";"No";@'
+	});
+
+
 	var Rn;
 	var state = [], tmp;
 	if(DENSE != null && opts.dense == null) opts.dense = DENSE;
@@ -17392,8 +17442,8 @@ for(var cma = c; cma <= cc; ++cma) {
 		case 'numberformat' /*case 'NumberFormat'*/:
 			stag.nf = unescapexml(xlml_parsexmltag(Rn[0]).Format || "General");
 			if(XLMLFormatMap[stag.nf]) stag.nf = XLMLFormatMap[stag.nf];
-			for(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == stag.nf) break;
-			if(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == null) { SSF.load(stag.nf, ssfidx); break; }
+			for(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(table_fmt[ssfidx] == stag.nf) break;
+			if(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(table_fmt[ssfidx] == null) { SSF_load(stag.nf, ssfidx); break; }
 			break;
 
 		case 'column' /*case 'Column'*/:
@@ -17960,7 +18010,7 @@ Workbook.WBProps.date1904 = true;
 	if(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;
 	out.SheetNames = sheetnames;
 	out.Workbook = Workbook;
-	out.SSF = SSF.get_table();
+	out.SSF = dup(table_fmt);
 	out.Props = Props;
 	out.Custprops = Custprops;
 	return out;
@@ -17996,7 +18046,7 @@ function write_sty_xlml(wb, opts) {
 	var styles = ['<Style ss:ID="Default" ss:Name="Normal"><NumberFormat/></Style>'];
 	opts.cellXfs.forEach(function(xf, id) {
 		var payload = [];
-		payload.push(writextag('NumberFormat', null, {"ss:Format": escapexml(SSF._table[xf.numFmtId])}));
+		payload.push(writextag('NumberFormat', null, {"ss:Format": escapexml(table_fmt[xf.numFmtId])}));
 
 		var o = {"ss:ID": "s" + (21+id)};
 		styles.push(writextag('Style', payload.join(""), o));
@@ -18178,7 +18228,7 @@ function write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr){
 		case 'n': t = 'Number'; p = String(cell.v); break;
 		case 'b': t = 'Boolean'; p = (cell.v ? "1" : "0"); break;
 		case 'e': t = 'Error'; p = BErr[cell.v]; break;
-		case 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || SSF._table[14]; break;
+		case 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || table_fmt[14]; break;
 		case 's': t = 'String'; p = escapexlml(cell.v||""); break;
 	}
 	/* TODO: cell style */
@@ -18258,9 +18308,9 @@ function write_ws_xlml(idx, opts, wb) {
 }
 function write_xlml(wb, opts) {
 	if(!opts) opts = {};
-	if(!wb.SSF) wb.SSF = SSF.get_table();
+	if(!wb.SSF) wb.SSF = dup(table_fmt);
 	if(wb.SSF) {
-		make_ssf(SSF); SSF.load_table(wb.SSF);
+		make_ssf(); SSF_load_table(wb.SSF);
 		// $FlowIgnore
 		opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
 		opts.ssf = wb.SSF;
@@ -18362,21 +18412,21 @@ function safe_format_xf(p, opts, date1904) {
 	var fmtid = 0;
 	try {
 		fmtid = p.z || p.XF.numFmtId || 0;
-		if(opts.cellNF) p.z = SSF._table[fmtid];
+		if(opts.cellNF) p.z = table_fmt[fmtid];
 	} catch(e) { if(opts.WTF) throw e; }
 	if(!opts || opts.cellText !== false) try {
 		if(p.t === 'e') { p.w = p.w || BErr[p.v]; }
 		else if(fmtid === 0 || fmtid == "General") {
 			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);
+				if((p.v|0) === p.v) p.w = p.v.toString(10);
+				else p.w = SSF_general_num(p.v);
 			}
-			else p.w = SSF._general(p.v);
+			else p.w = SSF_general(p.v);
 		}
-		else p.w = SSF.format(fmtid,p.v, {date1904:!!date1904, dateNF: opts && opts.dateNF});
+		else p.w = SSF_format(fmtid,p.v, {date1904:!!date1904, dateNF: opts && opts.dateNF});
 	} catch(e) { if(opts.WTF) throw e; }
-	if(opts.cellDates && fmtid && p.t == 'n' && SSF.is_date(SSF._table[fmtid] || String(fmtid))) {
-		var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
+	if(opts.cellDates && fmtid && p.t == 'n' && fmt_is_date(table_fmt[fmtid] || String(fmtid))) {
+		var _d = SSF_parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
 	}
 }
 
@@ -18770,15 +18820,15 @@ wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
 				case 0x041e /* Format */: { /* val = [id, fmt] */
 					if(opts.biff == 4) {
 						BIFF2FmtTable[BIFF2Fmt++] = val[1];
-						for(var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx) if(SSF._table[b4idx] == val[1]) break;
-						if(b4idx >= 163) SSF.load(val[1], BIFF2Fmt + 163);
+						for(var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx) if(table_fmt[b4idx] == val[1]) break;
+						if(b4idx >= 163) SSF_load(val[1], BIFF2Fmt + 163);
 					}
-					else SSF.load(val[1], val[0]);
+					else SSF_load(val[1], val[0]);
 				} break;
 				case 0x001e /* BIFF2FORMAT */: {
 					BIFF2FmtTable[BIFF2Fmt++] = val;
-					for(var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx) if(SSF._table[b2idx] == val) break;
-					if(b2idx >= 163) SSF.load(val, BIFF2Fmt + 163);
+					for(var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx) if(table_fmt[b2idx] == val) break;
+					if(b2idx >= 163) SSF_load(val, BIFF2Fmt + 163);
 				} break;
 
 				case 0x00e5 /* MergeCells */: merges = merges.concat(val); break;
@@ -18862,175 +18912,11 @@ wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
 if(!cur_sheet) Workbook.WBProps.CodeName = val || "ThisWorkbook";
 					else wsprops.CodeName = val || wsprops.name;
 				} break;
-				case 0x0055 /* DefColWidth */:
-				case 0x0225 /* DefaultRowHeight */:
-				case 0x005e /* Uncalced */:
-				case 0x01af /* Prot4Rev */: case 0x01bc /* Prot4RevPass */: /*TODO: Revision Control*/
-				case 0x005b /* FileSharing */:
-				case 0x00ff /* ExtSST */:
-				case 0x0863 /* BookExt */:
-				case 0x08a6 /* RichTextStream */:
-				case 0x00e9 /* BkHim */:
-				case 0x0060 /* Template */:
-				case 0x00da /* BookBool */:
-				case 0x0160 /* UsesELFs */:
-				case 0x089a /* MTRSettings */:
-				case 0x000b: case 0x020b /* Index */:
-				case 0x105c /* ClrtClient */:
-				case 0x001d /* Selection */:
-				case 0x0014 /* Header */:
-				case 0x0015 /* Footer */:
-				case 0x0083 /* HCenter */:
-				case 0x0084 /* VCenter */:
-				case 0x004d /* Pls */:
-				case 0x00ab /* GCW */:
-				case 0x0094 /* LHRecord */:
-				case 0x00d7 /* DBCell */:
-				case 0x01c2 /* EntExU2 */:
-				case 0x00b0 /* SxView */:
-				case 0x00b1 /* Sxvd */:
-				case 0x00b2 /* SXVI */:
-				case 0x0100 /* SXVDEx */:
-				case 0x00b4 /* SxIvd */:
-				case 0x00cd /* SXString */:
-				case 0x0097 /* Sync */:
-				case 0x0087 /* Addin */:
-				case 0x00c5 /* SXDI */:
-				case 0x00b5 /* SXLI */:
-				case 0x00f1 /* SXEx */:
-				case 0x0802 /* QsiSXTag */:
-				case 0x0868 /* Feat */:
-				case 0x0867 /* FeatHdr */: case 0x0871 /* FeatHdr11 */:
-				case 0x0872 /* Feature11 */: case 0x0878 /* Feature12 */: case 0x0877 /* List12 */:
-				case 0x01c1 /* RecalcId */:
-				case 0x0099 /* DxGCol */:
-				case 0x1060 /* Fbi */: case 0x1068 /* Fbi2 */: case 0x1066 /* GelFrame */:
-				case 0x0031 /* Font */:
-				case 0x087c /* XFCRC */:
-				case 0x0293 /* Style */:
-				case 0x0892 /* StyleExt */:
-				case 0x00dd /* ScenarioProtect */:
-				case 0x0063 /* ObjProtect */:
-				case 0x0879 /* CondFmt12 */:
-				case 0x0236 /* Table */:
-				case 0x088e /* TableStyles */:
-				case 0x088f /* TableStyle */:
-				case 0x0890 /* TableStyleElement */:
-				case 0x00d5 /* SXStreamID */:
-				case 0x00e3 /* SXVS */:
-				case 0x0051 /* DConRef */:
-				case 0x0864 /* SXAddl */:
-				case 0x01b5 /* DConBin */:
-				case 0x0052 /* DConName */:
-				case 0x00b6 /* SXPI */:
-				case 0x00fb /* SxFormat */:
-				case 0x00f7 /* SxSelect */:
-				case 0x00f0 /* SxRule */:
-				case 0x00f2 /* SxFilt */:
-				case 0x00f5 /* SxItm */:
-				case 0x00f4 /* SxDXF */:
-				case 0x00ae /* ScenMan */:
-				case 0x0050 /* DCon */:
-				case 0x086c /* CellWatch */:
-				case 0x002a /* PrintRowCol */:
-				case 0x002b /* PrintGrid */:
-				case 0x0033 /* PrintSize */:
-				case 0x0059 /* XCT */:
-				case 0x005a /* CRN */:
-				case 0x00a0 /* Scl */:
-				case 0x0862 /* SheetExt */:
-				case 0x01bd /* ObNoMacros */:
-				case 0x00d3 /* ObProj */:
-				case 0x0897 /* GUIDTypeLib */:
-				case 0x080b /* WOpt */:
-				case 0x00ef /* PhoneticInfo */:
-				case 0x00de /* OleObjectSize */:
-				case 0x088d /* DXF */:
-				case 0x01be /* Dv */: case 0x01b2 /* DVal */:
-				case 0x1051 /* BRAI */: case 0x1003 /* Series */: case 0x100d /* SeriesText */:
-				case 0x0876 /* DConn */:
-				case 0x00dc /* DbOrParamQry */:
-				case 0x0803 /* DBQueryExt */:
-				case 0x080a /* OleDbConn */:
-				case 0x0804 /* ExtString */:
-				case 0x104e /* IFmtRecord */:
-				case 0x01b0 /* CondFmt */: case 0x01b1 /* CF */: case 0x087a /* CF12 */: case 0x087b /* CFEx */:
-				case 0x01c0 /* Excel9File */:
-				case 0x1001 /* Units */:
-				case 0x00e1 /* InterfaceHdr' */: case 0x00c1 /* Mms */: case 0x00e2 /* InterfaceEnd */: case 0x0161 /* DSF */:
-				case 0x009c /* BuiltInFnGroupCount */: /* 2.4.30 0x0E or 0x10 but excel 2011 generates 0x11? */ break;
-				case 0x003d /* Window1 */: case 0x008d /* HideObj */: case 0x0082 /* GridSet */: case 0x0080 /* Guts */:
-				case 0x01a9 /* UserBView */: case 0x01aa /* UserSViewBegin */: case 0x01ab /* UserSViewEnd */:
-				case 0x0041 /* Pane */:
-				case 0x1063 /* Dat */:
-				case 0x1033 /* Begin */: case 0x1034 /* End */:
-				case 0x0852 /* StartBlock */: case 0x0853 /* EndBlock */:
-				case 0x1032 /* Frame */: case 0x101a /* Area */:
-				case 0x101d /* Axis */: case 0x1021 /* AxisLine */: case 0x101e /* Tick */:
-				case 0x1046 /* AxesUsed */:
-				case 0x089d /* CrtLayout12 */: case 0x08a7 /* CrtLayout12A */: case 0x1022 /* CrtLink */: case 0x101c /* CrtLine */: case 0x089e /* CrtMlFrt */: case 0x089f /* CrtMlFrtContinue */:
-				case 0x1007 /* LineFormat */: case 0x100a /* AreaFormat */:
-				case 0x1002 /* Chart */: case 0x103a /* Chart3d */: case 0x105f /* Chart3DBarShape */: case 0x1014 /* ChartFormat */: case 0x0850 /* ChartFrtInfo */:
-				case 0x1035 /* PlotArea */: case 0x1064 /* PlotGrowth */:
-				case 0x1016 /* SeriesList */: case 0x104a /* SerParent */: case 0x104b /* SerAuxTrend */:
-				case 0x1006 /* DataFormat */: case 0x1045 /* SerToCrt */: case 0x1026 /* FontX */:
-				case 0x1020 /* CatSerRange */: case 0x1062 /* AxcExt */: case 0x105d /* SerFmt */:
-				case 0x1044 /* ShtProps */:
-				case 0x1024 /* DefaultText */: case 0x1025 /* Text */: case 0x0856 /* CatLab */:
-				case 0x086b /* DataLabExtContents */:
-				case 0x1015 /* Legend */: case 0x1043 /* LegendException */:
-				case 0x1019 /* Pie */: case 0x101b /* Scatter */:
-				case 0x100b /* PieFormat */: case 0x1009 /* MarkerFormat */:
-				case 0x0854 /* StartObject */: case 0x0855 /* EndObject */:
-				case 0x1050 /* AlRuns */: case 0x1027 /* ObjectLink */:
-				case 0x1065 /* SIIndex */:
-				case 0x100c /* AttachedLabel */: case 0x0857 /* YMult */:
-				case 0x1018 /* Line */: case 0x1017 /* Bar */:
-				case 0x103f /* Surf */:
-				case 0x1041 /* AxisParent */:
-				case 0x104f /* Pos */:
-				case 0x101f /* ValueRange */:
-				case 0x0810 /* SXViewEx9 */:
-				case 0x0858 /* SXViewLink */:
-				case 0x0859 /* PivotChartBits */:
-				case 0x1048 /* SBaseRef */:
-				case 0x08a5 /* TextPropsStream */:
-				case 0x08c9 /* LnExt */:
-				case 0x08ca /* MkrExt */:
-				case 0x08cb /* CrtCoopt */:
-				case 0x01ad /* Qsi */: case 0x0807 /* Qsif */: case 0x0806 /* Qsir */:
-				case 0x0805 /* TxtQry */:
-				case 0x009b /* FilterMode */:
-				case 0x009e /* AutoFilter */: case 0x009d /* AutoFilterInfo */:
-				case 0x087e /* AutoFilter12 */:
-				case 0x0874 /* DropDownObjIds */:
-				case 0x0090 /* Sort */:
-				case 0x0895 /* SortData */:
-				case 0x08a4 /* ShapePropsStream */:
-				case 0x00ec /* MsoDrawing */: case 0x00eb /* MsoDrawingGroup*/: case 0x00ed /* MsoDrawingSelection */:
-				case 0x0801 /* WebPub */: case 0x08c0 /* AutoWebPub */:
-				case 0x089c /* HeaderFooter */: case 0x0866 /* HFPicture */: case 0x088b /* PLV */:
-				case 0x001b /* HorizontalPageBreaks */: case 0x001a /* VerticalPageBreaks */:
-				case 0x0040 /* Backup */: case 0x089b /* CompressPictures */: case 0x088c /* Compat12 */:
-				case 0x003c /* 'Continue' */: case 0x087f /* 'ContinueFrt12' */:
-				case 0x085a /* FrtFontList */: case 0x0851 /* 'FrtWrapper' */:
-				case 0x00ea /* TabIdConf */: case 0x103e /* Radar */: case 0x1040 /* RadarArea */: case 0x103d /* DropBar */: case 'Intl': case 'CoordList': case 'SerAuxErrBar':
-				case 0x0045 /* BIFF2FONTCLR */: case 0x001f /* BIFF2FMTCNT */: case 0x0032 /* BIFF2FONTXTRA */:
-				case 0x0043 /* BIFF2XF */: case 0x0243 /* BIFF3XF */: case 0x0443 /* BIFF4XF */:
-				case 0x0044 /* BIFF2XFINDEX */:
-				case 0x0056 /* BIFF4FMTCNT */: case 0x0008 /* BIFF2ROW */: case 0x003e /* BIFF2WINDOW2 */:
-				case 0x00af /* SCENARIO */: case 0x103c /* PicF */: case 0x086a /* DataLabExt */:
-				case 0x01b9 /* Lel */: case 0x1061 /* BopPop */: case 0x1067 /* BopPopCustom */: case 0x0813 /* RealTimeData */:
-				case 0x0095 /* LHNGraph */: case 0x009a /* FnGroupName */: case 0x00c2 /* AddMenu */: case 0x0098 /* LPr */:
-				case 0x08c1 /* ListObj */: case 0x08c2 /* ListField */:
-				case 0x013f /* RRSort */:
-				case 0x0418 /* BigName */:
-				case 0x00bf /* ToolbarHdr */: case 0x00c0/* ToolbarEnd */:
-				case 0x0034 /* DDEObjName */:
-				case 0x08d6 /* FRTArchId$ */: break;
-				default: if(options.WTF) throw 'Unrecognized Record 0x' + RecordType.toString(16);
 			}
-		} else blob.l += length;
+		} else {
+			if(!R) console.error("Missing Info for XLS Record 0x" + RecordType.toString(16));
+			blob.l += length;
+		}
 	}
 	wb.SheetNames=keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});
 	if(!options.bookSheets) wb.Sheets=Sheets;
@@ -19042,7 +18928,7 @@ if(!cur_sheet) Workbook.WBProps.CodeName = val || "ThisWorkbook";
 	} else wb.Preamble=Preamble;
 	if(wb.Sheets) FilterDatabases.forEach(function(r,i) { wb.Sheets[wb.SheetNames[i]]['!autofilter'] = r; });
 	wb.Strings = sst;
-	wb.SSF = SSF.get_table();
+	wb.SSF = dup(table_fmt);
 	if(opts.enc) wb.Encryption = opts.enc;
 	if(themes) wb.Themes = themes;
 	wb.Metadata = {};
@@ -20854,10 +20740,10 @@ function write_biff8_buf(wb, opts) {
 	var bufs = [];
 
 	if(wb && !wb.SSF) {
-		wb.SSF = SSF.get_table();
+		wb.SSF = dup(table_fmt);
 	}
 	if(wb && wb.SSF) {
-		make_ssf(SSF); SSF.load_table(wb.SSF);
+		make_ssf(); SSF_load_table(wb.SSF);
 		// $FlowIgnore
 		o.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0;
 		o.ssf = wb.SSF;
@@ -20894,134 +20780,126 @@ function write_biff_buf(wb, opts) {
 	throw new Error("invalid type " + o.bookType + " for BIFF");
 }
 /* note: browser DOM element cannot see mso- style attrs, must parse */
-var HTML_ = (function() {
-	function html_to_sheet(str, _opts) {
-		var opts = _opts || {};
-		if(DENSE != null && opts.dense == null) opts.dense = DENSE;
-		var ws = opts.dense ? ([]) : ({});
-		str = str.replace(/<!--.*?-->/g, "");
-		var mtch = str.match(/<table/i);
-		if(!mtch) throw new Error("Invalid HTML: could not find <table>");
-		var mtch2 = str.match(/<\/table/i);
-		var i = mtch.index, j = mtch2 && mtch2.index || str.length;
-		var rows = split_regex(str.slice(i, j), /(:?<tr[^>]*>)/i, "<tr>");
-		var R = -1, C = 0, RS = 0, CS = 0;
-		var range = {s:{r:10000000, c:10000000},e:{r:0,c:0}};
-		var merges = [];
-		for(i = 0; i < rows.length; ++i) {
-			var row = rows[i].trim();
-			var hd = row.slice(0,3).toLowerCase();
-			if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
-			if(hd != "<td" && hd != "<th") continue;
-			var cells = row.split(/<\/t[dh]>/i);
-			for(j = 0; j < cells.length; ++j) {
-				var cell = cells[j].trim();
-				if(!cell.match(/<t[dh]/i)) continue;
-				var m = cell, cc = 0;
-				/* TODO: parse styles etc */
-				while(m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) m = m.slice(cc+1);
-				for(var midx = 0; midx < merges.length; ++midx) {
-					var _merge = merges[midx];
-					if(_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) { C = _merge.e.c + 1; midx = -1; }
-				}
-				var tag = parsexmltag(cell.slice(0, cell.indexOf(">")));
-				CS = tag.colspan ? +tag.colspan : 1;
-				if((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}});
-				var _t = tag.t || tag["data-t"] || "";
-				/* TODO: generate stub cells */
-				if(!m.length) { C += CS; continue; }
-				m = htmldecode(m);
-				if(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;
-				if(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;
-				if(!m.length) { C += CS; continue; }
-				var o = {t:'s', v:m};
-				if(opts.raw || !m.trim().length || _t == 's'){}
-				else if(m === 'TRUE') o = {t:'b', v:true};
-				else if(m === 'FALSE') o = {t:'b', v:false};
-				else if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)};
-				else if(!isNaN(fuzzydate(m).getDate())) {
-					o = ({t:'d', v:parseDate(m)});
-					if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});
-					o.z = opts.dateNF || SSF._table[14];
-				}
-				if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; }
-				else ws[encode_cell({r:R, c:C})] = o;
-				C += CS;
+function html_to_sheet(str, _opts) {
+	var opts = _opts || {};
+	if(DENSE != null && opts.dense == null) opts.dense = DENSE;
+	var ws = opts.dense ? ([]) : ({});
+	str = str.replace(/<!--.*?-->/g, "");
+	var mtch = str.match(/<table/i);
+	if(!mtch) throw new Error("Invalid HTML: could not find <table>");
+	var mtch2 = str.match(/<\/table/i);
+	var i = mtch.index, j = mtch2 && mtch2.index || str.length;
+	var rows = split_regex(str.slice(i, j), /(:?<tr[^>]*>)/i, "<tr>");
+	var R = -1, C = 0, RS = 0, CS = 0;
+	var range = {s:{r:10000000, c:10000000},e:{r:0,c:0}};
+	var merges = [];
+	for(i = 0; i < rows.length; ++i) {
+		var row = rows[i].trim();
+		var hd = row.slice(0,3).toLowerCase();
+		if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
+		if(hd != "<td" && hd != "<th") continue;
+		var cells = row.split(/<\/t[dh]>/i);
+		for(j = 0; j < cells.length; ++j) {
+			var cell = cells[j].trim();
+			if(!cell.match(/<t[dh]/i)) continue;
+			var m = cell, cc = 0;
+			/* TODO: parse styles etc */
+			while(m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) m = m.slice(cc+1);
+			for(var midx = 0; midx < merges.length; ++midx) {
+				var _merge = merges[midx];
+				if(_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) { C = _merge.e.c + 1; midx = -1; }
 			}
+			var tag = parsexmltag(cell.slice(0, cell.indexOf(">")));
+			CS = tag.colspan ? +tag.colspan : 1;
+			if((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}});
+			var _t = tag.t || tag["data-t"] || "";
+			/* TODO: generate stub cells */
+			if(!m.length) { C += CS; continue; }
+			m = htmldecode(m);
+			if(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;
+			if(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;
+			if(!m.length) { C += CS; continue; }
+			var o = {t:'s', v:m};
+			if(opts.raw || !m.trim().length || _t == 's'){}
+			else if(m === 'TRUE') o = {t:'b', v:true};
+			else if(m === 'FALSE') o = {t:'b', v:false};
+			else if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)};
+			else if(!isNaN(fuzzydate(m).getDate())) {
+				o = ({t:'d', v:parseDate(m)});
+				if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});
+				o.z = opts.dateNF || table_fmt[14];
+			}
+			if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; }
+			else ws[encode_cell({r:R, c:C})] = o;
+			C += CS;
 		}
-		ws['!ref'] = encode_range(range);
-		if(merges.length) ws["!merges"] = merges;
-		return ws;
 	}
-	function html_to_book(str, opts) {
-		var mtch = str.match(/<table[\s\S]*?>[\s\S]*?<\/table>/gi);
-		if(!mtch || mtch.length == 0) throw new Error("Invalid HTML: could not find <table>");
-		if(mtch.length == 1) return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts);
-		var wb = book_new();
-		mtch.forEach(function(s, idx) { book_append_sheet(wb, html_to_sheet(s, opts), "Sheet" + (idx+1)); });
-		return wb;
-	}
-	function make_html_row(ws, r, R, o) {
-		var M = (ws['!merges'] ||[]);
-		var oo = [];
-		for(var C = r.s.c; C <= r.e.c; ++C) {
-			var RS = 0, CS = 0;
-			for(var j = 0; j < M.length; ++j) {
-				if(M[j].s.r > R || M[j].s.c > C) continue;
-				if(M[j].e.r < R || M[j].e.c < C) continue;
-				if(M[j].s.r < R || M[j].s.c < C) { RS = -1; break; }
-				RS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break;
-			}
-			if(RS < 0) continue;
-			var coord = encode_cell({r:R,c:C});
-			var cell = o.dense ? (ws[R]||[])[C] : ws[coord];
-			/* TODO: html entities */
-			var w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || "";
-			var sp = ({});
-			if(RS > 1) sp.rowspan = RS;
-			if(CS > 1) sp.colspan = CS;
-			if(o.editable) w = '<span contenteditable="true">' + w + '</span>';
-			else if(cell) {
-				sp["data-t"] = cell && cell.t || 'z';
-				if(cell.v != null) sp["data-v"] = cell.v;
-				if(cell.z != null) sp["data-z"] = cell.z;
-				if(cell.l && (cell.l.Target || "#").charAt(0) != "#") w = '<a href="' + cell.l.Target +'">' + w + '</a>';
-			}
-			sp.id = (o.id || "sjs") + "-" + coord;
-			oo.push(writextag('td', w, sp));
+	ws['!ref'] = encode_range(range);
+	if(merges.length) ws["!merges"] = merges;
+	return ws;
+}
+function make_html_row(ws, r, R, o) {
+	var M = (ws['!merges'] ||[]);
+	var oo = [];
+	for(var C = r.s.c; C <= r.e.c; ++C) {
+		var RS = 0, CS = 0;
+		for(var j = 0; j < M.length; ++j) {
+			if(M[j].s.r > R || M[j].s.c > C) continue;
+			if(M[j].e.r < R || M[j].e.c < C) continue;
+			if(M[j].s.r < R || M[j].s.c < C) { RS = -1; break; }
+			RS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break;
 		}
-		var preamble = "<tr>";
-		return preamble + oo.join("") + "</tr>";
+		if(RS < 0) continue;
+		var coord = encode_cell({r:R,c:C});
+		var cell = o.dense ? (ws[R]||[])[C] : ws[coord];
+		/* TODO: html entities */
+		var w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || "";
+		var sp = ({});
+		if(RS > 1) sp.rowspan = RS;
+		if(CS > 1) sp.colspan = CS;
+		if(o.editable) w = '<span contenteditable="true">' + w + '</span>';
+		else if(cell) {
+			sp["data-t"] = cell && cell.t || 'z';
+			if(cell.v != null) sp["data-v"] = cell.v;
+			if(cell.z != null) sp["data-z"] = cell.z;
+			if(cell.l && (cell.l.Target || "#").charAt(0) != "#") w = '<a href="' + cell.l.Target +'">' + w + '</a>';
+		}
+		sp.id = (o.id || "sjs") + "-" + coord;
+		oo.push(writextag('td', w, sp));
 	}
-	function make_html_preamble(ws, R, o) {
-		var out = [];
-		return out.join("") + '<table' + (o && o.id ? ' id="' + o.id + '"' : "") + '>';
-	}
-	var _BEGIN = '<html><head><meta charset="utf-8"/><title>SheetJS Table Export</title></head><body>';
-	var _END = '</body></html>';
-	function sheet_to_html(ws, opts/*, wb:?Workbook*/) {
-		var o = opts || {};
-		var header = o.header != null ? o.header : _BEGIN;
-		var footer = o.footer != null ? o.footer : _END;
-		var out = [header];
-		var r = decode_range(ws['!ref']);
-		o.dense = Array.isArray(ws);
-		out.push(make_html_preamble(ws, r, o));
-		for(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o));
-		out.push("</table>" + footer);
-		return out.join("");
+	var preamble = "<tr>";
+	return preamble + oo.join("") + "</tr>";
+}
 
-	}
-	return {
-		to_workbook: html_to_book,
-		to_sheet: html_to_sheet,
-		_row: make_html_row,
-		BEGIN: _BEGIN,
-		END: _END,
-		_preamble: make_html_preamble,
-		from_sheet: sheet_to_html
-	};
-})();
+var HTML_BEGIN = '<html><head><meta charset="utf-8"/><title>SheetJS Table Export</title></head><body>';
+var HTML_END = '</body></html>';
+
+function html_to_workbook(str, opts) {
+	var mtch = str.match(/<table[\s\S]*?>[\s\S]*?<\/table>/gi);
+	if(!mtch || mtch.length == 0) throw new Error("Invalid HTML: could not find <table>");
+	if(mtch.length == 1) return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts);
+	var wb = book_new();
+	mtch.forEach(function(s, idx) { book_append_sheet(wb, html_to_sheet(s, opts), "Sheet" + (idx+1)); });
+	return wb;
+}
+
+function make_html_preamble(ws, R, o) {
+	var out = [];
+	return out.join("") + '<table' + (o && o.id ? ' id="' + o.id + '"' : "") + '>';
+}
+
+function sheet_to_html(ws, opts/*, wb:?Workbook*/) {
+	var o = opts || {};
+	var header = o.header != null ? o.header : HTML_BEGIN;
+	var footer = o.footer != null ? o.footer : HTML_END;
+	var out = [header];
+	var r = decode_range(ws['!ref']);
+	o.dense = Array.isArray(ws);
+	out.push(make_html_preamble(ws, r, o));
+	for(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o));
+	out.push("</table>" + footer);
+	return out.join("");
+}
 
 function sheet_add_dom(ws, table, _opts) {
 	var opts = _opts || {};
@@ -21080,7 +20958,7 @@ function sheet_add_dom(ws, table, _opts) {
 				else if(!isNaN(fuzzydate(v).getDate())) {
 					o = ({t:'d', v:parseDate(v)});
 					if(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});
-					o.z = opts.dateNF || SSF._table[14];
+					o.z = opts.dateNF || table_fmt[14];
 				}
 			}
 			if(o.z === undefined && z != null) o.z = z;
@@ -22685,7 +22563,7 @@ function safe_parse_sheet(zip, path, relsPath, sheet, idx, sheetRels, sheets, st
 function strip_front_slash(x) { return x.charAt(0) == '/' ? x.slice(1) : x; }
 
 function parse_zip(zip, opts) {
-	make_ssf(SSF);
+	make_ssf();
 	opts = opts || {};
 	fix_read_opts(opts);
 
@@ -22848,7 +22726,7 @@ function parse_zip(zip, opts) {
 		Strings: strs,
 		Styles: styles,
 		Themes: themes,
-		SSF: SSF.get_table()
+		SSF: dup(table_fmt)
 	});
 	if(opts && opts.bookFiles) {
 		if(zip.files) {
@@ -22928,10 +22806,10 @@ function write_zip(wb, opts) {
 function write_zip_xlsxb(wb, opts) {
 	_shapeid = 1024;
 	if(wb && !wb.SSF) {
-		wb.SSF = SSF.get_table();
+		wb.SSF = dup(table_fmt);
 	}
 	if(wb && wb.SSF) {
-		make_ssf(SSF); SSF.load_table(wb.SSF);
+		make_ssf(); SSF_load_table(wb.SSF);
 		// $FlowIgnore
 		opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
 		opts.ssf = wb.SSF;
@@ -23062,10 +22940,10 @@ f = "docProps/app.xml";
 function write_zip_xlsx(wb, opts) {
 	_shapeid = 1024;
 	if(wb && !wb.SSF) {
-		wb.SSF = SSF.get_table();
+		wb.SSF = dup(table_fmt);
 	}
 	if(wb && wb.SSF) {
-		make_ssf(SSF); SSF.load_table(wb.SSF);
+		make_ssf(); SSF_load_table(wb.SSF);
 		// $FlowIgnore
 		opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;
 		opts.ssf = wb.SSF;
@@ -23460,7 +23338,7 @@ function writeSync(wb, opts) {
 		case 'slk':
 		case 'sylk': return write_string_type(SYLK.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);
 		case 'htm':
-		case 'html': return write_string_type(HTML_.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);
+		case 'html': return write_string_type(sheet_to_html(wb.Sheets[wb.SheetNames[idx]], o), o);
 		case 'txt': return write_stxt_type(sheet_to_txt(wb.Sheets[wb.SheetNames[idx]], o), o);
 		case 'csv': return write_string_type(sheet_to_csv(wb.Sheets[wb.SheetNames[idx]], o), o, "\ufeff");
 		case 'dif': return write_string_type(DIF.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);
@@ -23554,7 +23432,7 @@ function make_json_row(sheet, r, R, cols, header, hdr, dense, o) {
 				else if(raw && v === null) row[hdr[C]] = null;
 				else continue;
 			} else {
-				row[hdr[C]] = raw || (o.rawNumbers && val.t == "n") ? v : format_cell(val,v,o);
+				row[hdr[C]] = raw && (val.t !== "n" || (val.t === "n" && o.rawNumbers !== false)) ? v : format_cell(val,v,o);
 			}
 			if(v != null) isempty = false;
 		}
@@ -23750,7 +23628,7 @@ function sheet_add_json(_ws, js, opts) {
 				else if(v instanceof Date) {
 					t = 'd';
 					if(!o.cellDates) { t = 'n'; v = datenum(v); }
-					z = (o.dateNF || SSF._table[14]);
+					z = (o.dateNF || table_fmt[14]);
 				}
 				else if(v === null && o.nullError) { t = 'e'; v = 0; }
 				if(!cell) ws[ref] = cell = ({t:t, v:v});
@@ -23896,7 +23774,7 @@ var utils = {
 	sheet_to_csv: sheet_to_csv,
 	sheet_to_txt: sheet_to_txt,
 	sheet_to_json: sheet_to_json,
-	sheet_to_html: HTML_.from_sheet,
+	sheet_to_html: sheet_to_html,
 	sheet_to_formulae: sheet_to_formulae,
 	sheet_to_row_object_array: sheet_to_json,
 	sheet_get_cell: ws_get_cell_stub,
@@ -23953,12 +23831,12 @@ function write_html_stream(ws, opts) {
 	var stream = _Readable();
 
 	var o = opts || {};
-	var header = o.header != null ? o.header : HTML_.BEGIN;
-	var footer = o.footer != null ? o.footer : HTML_.END;
+	var header = o.header != null ? o.header : HTML_BEGIN;
+	var footer = o.footer != null ? o.footer : HTML_END;
 	stream.push(header);
 	var r = decode_range(ws['!ref']);
 	o.dense = Array.isArray(ws);
-	stream.push(HTML_._preamble(ws, r, o));
+	stream.push(make_html_preamble(ws, r, o));
 	var R = r.s.r;
 	var end = false;
 	stream._read = function() {
@@ -23967,7 +23845,7 @@ function write_html_stream(ws, opts) {
 			return stream.push(null);
 		}
 		while(R <= r.e.r) {
-			stream.push(HTML_._row(ws, r, R, o));
+			stream.push(make_html_row(ws, r, R, o));
 			++R;
 			break;
 		}
diff --git a/xlsx.mjs b/xlsx.mjs
index 35d2d65..9e6b6d4 100644
--- a/xlsx.mjs
+++ b/xlsx.mjs
@@ -23553,7 +23553,7 @@ function make_json_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Ar
 				else if(raw && v === null) row[hdr[C]] = null;
 				else continue;
 			} else {
-				row[hdr[C]] = raw || (o.rawNumbers && val.t == "n") ? v : format_cell(val,v,o);
+				row[hdr[C]] = raw && (val.t !== "n" || (val.t === "n" && o.rawNumbers !== false)) ? v : format_cell(val,v,o);
 			}
 			if(v != null) isempty = false;
 		}