From 8b80a6f44c2376752c1d2cd1fb55fc850c432266 Mon Sep 17 00:00:00 2001 From: Owain Jones <72195665+OwainJones@users.noreply.github.com> Date: Thu, 7 Aug 2025 12:29:43 +0100 Subject: [PATCH 01/18] Update backend.js Updating for tables --- lib/importer/src/dudk/backend.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/importer/src/dudk/backend.js b/lib/importer/src/dudk/backend.js index 86530204..7428040b 100644 --- a/lib/importer/src/dudk/backend.js +++ b/lib/importer/src/dudk/backend.js @@ -1,4 +1,5 @@ const xlsx = require("xlsx"); +const exceljs = require("exceljs"); const crypto = require("crypto"); const assert = require('node:assert').strict; const attributeTypes = require('./types/attribute-types'); @@ -60,6 +61,24 @@ exports.SessionSetFile = (sid, filename) => { sessionStore.set(sid, session); }; +//Set filename for exceljs import +exports.SessionSetxlsxFile = (sid, filename) => { + ab = filename.arrayBuffer(); + wbx = { + const wbx = new exceljs.Workbook(); + wbx.xlsx.load(ab) + return wbx; + let sessionx = { + filename; filename, + wb: wbx, + sheetNames: Array.from(Object.keys(wbx.worksheets)), + headerRanges: {}, // A map from sheetname to the header range + footerRanges: {}, // A map from sheetname to the footer range + mappingRules: {}, + jobs: new Map(), + } + sessionStore.set(sid, session); + exports.SessionGetMappingRules = (sid) => { let session = sessionStore.get(sid); return session.mappingRules; From 9295a7e9397e7897e6809fe18beafcc3e401d5c1 Mon Sep 17 00:00:00 2001 From: Owain Jones Date: Mon, 11 Aug 2025 10:37:46 +0100 Subject: [PATCH 02/18] Added for table testing --- fixtures/tables_test.xlsx | Bin 0 -> 15570 bytes lib/importer/package-lock.json | 973 +++++++++++++++++++++++- lib/importer/package.json | 9 +- lib/importer/src/dudk/backend.js | 101 ++- lib/importer/src/dudk/backend.test.js | 15 + lib/importer/src/dudk/excel.js | 13 + package-lock.json | 1000 +++++++++++++++++++++++++ package.json | 5 + 8 files changed, 2095 insertions(+), 21 deletions(-) create mode 100644 fixtures/tables_test.xlsx create mode 100644 lib/importer/src/dudk/excel.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/fixtures/tables_test.xlsx b/fixtures/tables_test.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..595c1c7563c5b2e742f8ac56976e9167993425ce GIT binary patch literal 15570 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.1.0" } }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/format/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@fast-csv/parse/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1994,6 +2040,102 @@ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", "license": "MIT" }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -2004,6 +2146,13 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, "node_modules/babel-jest": { "version": "30.0.5", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.5.tgz", @@ -2109,6 +2258,70 @@ "dev": true, "license": "MIT" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true, + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2176,12 +2389,66 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -2234,6 +2501,19 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "license": "MIT/X11", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2400,6 +2680,22 @@ "dev": true, "license": "MIT" }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2429,6 +2725,40 @@ "dev": true, "license": "MIT" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2444,6 +2774,13 @@ "node": ">= 8" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -2504,6 +2841,49 @@ "node": ">=8" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2538,6 +2918,16 @@ "dev": true, "license": "MIT" }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2825,6 +3215,27 @@ "node": ">=0.10.0" } }, + "node_modules/exceljs": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz", + "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.10.1", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -2884,6 +3295,20 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3033,6 +3458,13 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, "node_modules/fs-extra": { "version": "11.3.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", @@ -3069,6 +3501,23 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3218,17 +3667,45 @@ "node": ">=10.17.0" } }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", @@ -3376,6 +3853,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4176,6 +4660,52 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4186,6 +4716,52 @@ "json-buffer": "3.0.1" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -4210,6 +4786,16 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -4217,6 +4803,13 @@ "dev": true, "license": "MIT" }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true, + "license": "ISC" + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -4230,6 +4823,84 @@ "node": ">=8" } }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4237,6 +4908,20 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -4611,6 +5296,13 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4778,6 +5470,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4847,6 +5546,39 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4891,6 +5623,42 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -4935,6 +5703,19 @@ ], "license": "MIT" }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4945,6 +5726,13 @@ "semver": "bin/semver.js" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5252,6 +6040,23 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -5289,6 +6094,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -5309,6 +6124,16 @@ "node": ">=8.0" } }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true, + "license": "MIT/X11", + "engines": { + "node": "*" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -5451,6 +6276,58 @@ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -5498,6 +6375,16 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -5677,6 +6564,13 @@ "node": ">=0.8" } }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -5789,6 +6683,65 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } } } } diff --git a/lib/importer/package.json b/lib/importer/package.json index 4c320fba..1e20c8b0 100644 --- a/lib/importer/package.json +++ b/lib/importer/package.json @@ -20,16 +20,17 @@ "license": "ISC", "description": "The Data Upload Design Kit makes it easier for users to upload data about many things at once by uploading a file without the need for hard-coded Excel spreadsheet templates. Designed to work with the GOV.UK Prototype Kit, it makes it easier for service designers and developers to work with spreadsheets.", "dependencies": { + "fs-extra": "11.3.0", "multer": "2.0.1", - "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz", - "fs-extra": "11.3.0" + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz" }, "devDependencies": { "@eslint/js": "^9.32.0", "eslint": "^9.32.0", "eslint-plugin-jest": "^29.0.1", + "exceljs": "^4.4.0", "globals": "^16.3.0", - "mock-fs": "^5.5.0", - "jest": "^30.0.5" + "jest": "^30.0.5", + "mock-fs": "^5.5.0" } } diff --git a/lib/importer/src/dudk/backend.js b/lib/importer/src/dudk/backend.js index 7428040b..3cd58ea0 100644 --- a/lib/importer/src/dudk/backend.js +++ b/lib/importer/src/dudk/backend.js @@ -17,6 +17,8 @@ let sessionStore = function () { }(); let dimensionsCache = new Map(); +let tablesCache = new Map(); +let tableRangesCache = new Map(); // Maximum number of rows/records to return in one go. While we're all // in-memory, this merely restricts how much we allocate in one go for a shallow @@ -48,10 +50,13 @@ exports.CreateSession = () => { // Set the filename of the file for an import session. exports.SessionSetFile = (sid, filename) => { const wb = xlsx.readFile(filename, { dense: true, cellStyles: true, cellDates: true, raw: true }); + const wbx = new exceljs.Workbook(); + wbx.xlsx.readFile(filename); let session = { filename: filename, wb: wb, + wbx: wbx, sheetNames: Array.from(Object.keys(wb.Sheets)), headerRanges: {}, // A map from sheetname to the header range footerRanges: {}, // A map from sheetname to the footer range @@ -61,15 +66,16 @@ exports.SessionSetFile = (sid, filename) => { sessionStore.set(sid, session); }; -//Set filename for exceljs import +//Set filename for exceljs import session. +/* exports.SessionSetxlsxFile = (sid, filename) => { - ab = filename.arrayBuffer(); - wbx = { - const wbx = new exceljs.Workbook(); - wbx.xlsx.load(ab) - return wbx; + const ab = filename.arrayBuffer(); + const wbx = new exceljs.Workbook(); + wbx.xlsx.load(ab) + + let sessionx = { - filename; filename, + filename: filename, wb: wbx, sheetNames: Array.from(Object.keys(wbx.worksheets)), headerRanges: {}, // A map from sheetname to the header range @@ -78,6 +84,9 @@ exports.SessionSetxlsxFile = (sid, filename) => { jobs: new Map(), } sessionStore.set(sid, session); +} +*/ + exports.SessionGetMappingRules = (sid) => { let session = sessionStore.get(sid); @@ -175,6 +184,16 @@ exports.SessionGetInputDimensions = (sid) => { return getDimensions(sid); }; +exports.SessionGetInputTables = (sid) => { + assert(sessionStore.has(sid)); + return getTables(sid); +}; + +exports.SessionGetInputTableRanges = (sid, sheet) => { + assert(sessionStore.has(sid)); + return getTableRanges(sid, sheet); +}; + function randInRange(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } @@ -381,6 +400,74 @@ function cellsToSamples(row) { return row.map(cellToSample); } +function getTables(sid) { + let session = sessionStore.get(sid); + let sheetTables = new Map(); + + let cached = tablesCache.get(sid); + if (cached) { + return cached + } + console.log("DEBUG workbook", session.wbx); + Object.keys(session.wb.Sheets).forEach((sheetName) => { + const sheetx = session.wbx.getWorksheet(sheetName); + + sheetTables.set(sheetName, { + tableCount: Object.keys(sheetx.tables).length, + tableNames: Object.keys(sheetx.tables) + }) + }) + + tablesCache.set(sid, { sheetTables: sheetTables }) + + return { + sheetTables: sheetTables, + }; +} + +function getTableRanges(sid, sheetName) { + let session = sessionStore.get(sid); + let tableRanges = new Map(); + + let cached = tableRangesCache.get(sid); + if (cached) { + return cached + } + + Object.keys(session.wbx.getWorksheet(sheetName).tables).forEach((key) => { + const table = session.wbx.getWorksheet(sheetName).tables[key].table; + const name = table.name; + + if (table["tableRef"]) { + const range = xlsx.utils.decode_range(table["tableRef"]); + const colnames = [] + Object.keys(table.columns).foreach((id) => { + colnames.push(table.columns[id].name); + }) + + tableRanges.set(name, { + ref: table["tableRef"], + range: range, + colnames: colnames + }) + } else { + tableRanges.set(name, { + ref: 0, + range: 0, + colnames: 0 + }) + } + + }) + + tableRangesCache.set(sid, { tableRanges: tableRanges }) + + return { + tableRanges: tableRanges, + }; + +} + // Returns a sample of rows in a range. range is of the form {sheet: 'Foo', start:{row: X, column: Y}, end:{row: X, column: Y}}. // Returns three arrays - one with startCount rows from the top of the range, diff --git a/lib/importer/src/dudk/backend.test.js b/lib/importer/src/dudk/backend.test.js index 55007f6c..53110bb1 100644 --- a/lib/importer/src/dudk/backend.test.js +++ b/lib/importer/src/dudk/backend.test.js @@ -127,6 +127,21 @@ describe("Backend tests", () => { } }); + test('tables', () => { + const sid = backend.CreateSession(); + backend.SessionSetFile(sid, '../../fixtures/tables_test.xlsx'); + + const tables = backend.SessionGetInputTables(sid); + expect(tables).toMatchObject([ + [{ + tableCount: 3, + tableNames: ['Soldier','Scout','Scoundrel'] + }] + ]); + + }); + + test('merged cells', () => { const sid = backend.CreateSession(); backend.SessionSetFile(sid, '../../fixtures/merged-cells.xlsx'); diff --git a/lib/importer/src/dudk/excel.js b/lib/importer/src/dudk/excel.js new file mode 100644 index 00000000..acbb71bb --- /dev/null +++ b/lib/importer/src/dudk/excel.js @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2014-2019 Guyon Roche + * LICENCE: MIT - please refer to LICENSE file included with this module + * or https://github.com/exceljs/exceljs/blob/master/LICENSE + */ + +if (parseInt(process.versions.node.split('.')[0], 10) < 10) { + throw new Error( + 'For node versions older than 10, please use the ES5 Import: https://github.com/exceljs/exceljs#es5-imports' + ); +} + +module.exports = require('./lib/exceljs.nodejs.js'); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..c38591f6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1000 @@ +{ + "name": "data-import", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "exceljs": "^4.4.0" + } + }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "license": "MIT", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "license": "MIT", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", + "license": "MIT" + }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "license": "MIT", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "license": "MIT", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "license": "MIT/X11", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/exceljs": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.4.0.tgz", + "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==", + "license": "MIT", + "dependencies": { + "archiver": "^5.0.0", + "dayjs": "^1.8.34", + "fast-csv": "^4.3.1", + "jszip": "^3.10.1", + "readable-stream": "^3.6.0", + "saxes": "^5.0.1", + "tmp": "^0.2.0", + "unzipper": "^0.10.11", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "license": "MIT", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "license": "ISC" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "license": "MIT" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "license": "MIT" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "license": "MIT" + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "license": "MIT" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==", + "license": "MIT" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "license": "MIT/X11", + "engines": { + "node": "*" + } + }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "license": "MIT", + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..fa6a38aa --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "exceljs": "^4.4.0" + } +} From de7b8f17e120999b1b813b98508241aec37d2b16 Mon Sep 17 00:00:00 2001 From: Owain Jones Date: Tue, 12 Aug 2025 10:34:26 +0100 Subject: [PATCH 03/18] Some minor updates to testing --- fixtures/tables_test.xlsx | Bin 15570 -> 17902 bytes lib/importer/package-lock.json | 110 +++++++++++++++++++++++++++++++ lib/importer/package.json | 1 + lib/importer/src/dudk/backend.js | 13 +++- 4 files changed, 122 insertions(+), 2 deletions(-) diff --git a/fixtures/tables_test.xlsx b/fixtures/tables_test.xlsx index 595c1c7563c5b2e742f8ac56976e9167993425ce..da904a17cfeb0b1ddc49e6a84eda5d0f8b0e3e5c 100644 GIT binary patch delta 8984 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 delta 6878 zcmZWuWmpw!*WPrqH%Noh-65@XZ9wVnZjdbODzL>QAHaKeBT6 zvGZd_DQtn0)(y2K6T439EIjAJVS7(9M>RN0hMM`Js=EKAGCV<} z5l5^XvVgXgSCUIcUr&giojg5*x--rD=@HPU#T62d87^UF5N^TOhZ(Nk|5D>!O8>f_ zT)Yoda{F`AfT>kair`9?-WzGHuQQ5wRx0QCl)C*{8tmk5%9v}clo{|&oHH+XA*yO7 zCc%{>-ASf!ccJ^b;7iAS0SU0DY!SDrZb(C483MaQUCO7r@|N<8o- zbbxQqPMqAJ47nV%3u!H-POWD}TDHV;TuGw! z*{Ee#OFoaWi#Cd!qdvz4eLHGC&k2~2FePt39V}eU-(w71Wr#_6tL)djU9cpwi5xIqClrq)#OSC6~nuRF?mErIS<}R`y7|JVz zCmt9`AwqA3)4i`Z5j52LrkFpO+mmhnVQM}X>qmiFNOvXYS@C9)jAdxYXMGAs;)(Q@ zLh*X1^z*Tg7k9aZE=J>l1!-+k5SC|EVL$?lx|&Vav(o(&?Lk_xyGY225i4Hk-(KBwg@~(T_QE?Z(c*b+q4dV#-a-xRhKst*EhM z&6Yz?QAmcoZLYzY`jJ5u)$Ze$UYJS@Gswdr`@lpL+dZFeEQ3oLy9KOL#{*lzJ}yx_ zK%9%aui~DAvMdrT(Zv>m{aPtIG70v%)G_ySWqM^D(XH1+o-JfrtPUCKn!Wo0gEhk?lOjnhs=fiHwU-GT-_6(B z&;n&TxSfk{XO?+E@G)+ZdOlonRNPgIc!3>!5NPBDJdlzS;Qx~)S;@$_Og>2DA?N91 zuBC8(dUTCJrwJh^9uD1SW)l7AoD|wfvC=u8!)2E`&LXXX6cFvN`&+@Y&%aknj2g)M zp$jQ#kwl95Yb{9&h+e4<-f(=zT?74EJ)ituR?DNFz1!9unaoPp2oG%RZ0=WUCgu<; zKSq-JyaPZ1%iYP91jZ*sZ56<1u%S@K{EDPVo_}^lFpuw?@3pBa4_U@x^7cHXmHZG* zuRHZD5>Ndoz~f!|eiitW-ZQ%Cx|DmHsDudqP9wRnYJY({B_NOf3)s05Oqx`sJq^gc_kvMB7w;3Ev;iMbRcaQ z(Ge01eN|I^HCTHpGKPDAo~H3W^2)@y{V`dU1qW*3DIO-%+KYoetg$BMJ2hCz(bA&r zb~pym?B8}^ev{gP=%mnjo3U?nu1otIr`eH)BA$LCPv_mw21u%0Y?v3t_2*_c6qJ{R zOo1*nJ?|a|1tg?6L$jjRRD|+tsE)F|jBdq8C+HF7Jbu$M*A)e0rm~;?HZ~&Gk&^Ugq>J}?M{2mxS-9)2zVP+ZdB|9LFSQ^}1nLgVe|u=}vXE3P zmA_DX=8ItShC$nTj7pIblNOPlS6OZMkcNYhYA6W6_QAD%bb( z>9u0hU76z%c5yRuAE|7xz)+hAjfBN(C5Dcm=U-=X@wf$ z+P7EsfNZ@DPlB$sg>6md3$O2JtyYO(9tjJW!5Uv?Qc2?7^^SqiBJ