nitro-patcher 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/node.ts","../src/nitro/binary.ts","../src/nitro/crc.ts","../src/nitro/crypto.ts","../src/nitro/header.ts","../src/nitro/banner.ts","../src/nitro/filesystem.ts","../src/nitro/blz.ts","../src/nitro/twl.ts","../src/nitro/nds-file.ts"],"sourcesContent":["import { createHash, createHmac, createCipheriv, createPublicKey, verify } from 'node:crypto';\nexport { readFile, writeFile } from 'node:fs/promises';\nexport { readFileSync } from 'node:fs';\nexport { inflateRawSync } from 'node:zlib';\n\nexport const hashDigest = (algorithm: 'md5' | 'sha1', data: Uint8Array): Buffer =>\n createHash(algorithm).update(data).digest();\nexport const hmacSha1 = (key: Uint8Array, data: Uint8Array): Buffer =>\n createHmac('sha1', key).update(data).digest();\nexport const createAesBlockCipher = (key: Uint8Array): ((block: Uint8Array) => Buffer) => {\n const cipher = createCipheriv('aes-128-ecb', key, null);\n cipher.setAutoPadding(false);\n return (block) => cipher.update(block);\n};\nexport const verifyRsaSha1 = (data: Uint8Array, signature: Uint8Array): boolean => {\n const key = createPublicKey({\n key: {\n kty: 'RSA',\n n: Buffer.from(\n '956F790DF08BB85A76AAEFA27FE874758BED9EDF9E9A670CD818BEB9B2885203B3FA11AEAA186513B5D6BB85A384D0D0EFB366CBC6051AAA86827AB74311F59C9BFC6C7079D5F17BD0819F522056738C721F40CF2361932590A3C5DC94CFD17A8CBC954A918AA858F4D804BAF7D3C1C4D7B8F077012FA170260B2C049056F3A5',\n 'hex',\n ).toString('base64url'),\n e: 'AQAB',\n },\n format: 'jwk',\n });\n return verify('RSA-SHA1', data, key, signature);\n};\n","export const DEFAULT_MAX_SIZE = 0x40000000;\n\nexport const bytes = (value: Uint8Array, name = 'input'): Buffer => {\n if (!(value instanceof Uint8Array)) throw new TypeError(`${name} must be a Buffer or Uint8Array`);\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength);\n};\n\nexport const range = (\n buffer: Buffer,\n offset: number,\n size: number,\n name = 'binary data',\n): Buffer => {\n if (\n !Number.isSafeInteger(offset) ||\n !Number.isSafeInteger(size) ||\n offset < 0 ||\n size < 0 ||\n offset + size > buffer.length\n ) {\n throw new RangeError(\n `Invalid ${name} range: offset=${offset}, size=${size}, available=${buffer.length}`,\n );\n }\n return buffer.subarray(offset, offset + size);\n};\n\nexport const align = (value: number, alignment = 0x200): number => {\n return Math.ceil(value / alignment) * alignment;\n};\n\n/** Seekable, bounded in-memory writer; unwritten gaps have MemoryStream's zero fill. */\nexport class BinaryWriter {\n readonly maxSize: number;\n buffer: Buffer;\n position: number;\n length: number;\n constructor(initialSize = 65536, maxSize = DEFAULT_MAX_SIZE) {\n if (!Number.isSafeInteger(maxSize) || maxSize < 1 || maxSize > 0xffffffff)\n throw new RangeError('Invalid output size limit');\n this.maxSize = maxSize;\n this.buffer = Buffer.alloc(Math.min(initialSize, maxSize));\n this.position = 0;\n this.length = 0;\n }\n\n ensure(end: number) {\n if (!Number.isSafeInteger(end) || end < 0 || end > this.maxSize)\n throw new RangeError(`Output exceeds size limit (${this.maxSize} bytes)`);\n if (end <= this.buffer.length) return;\n const next = Buffer.alloc(Math.min(this.maxSize, Math.max(end, this.buffer.length * 2, 1024)));\n this.buffer.copy(next, 0, 0, this.length);\n this.buffer = next;\n }\n\n write(data: Uint8Array) {\n data = bytes(data);\n if (!Number.isSafeInteger(this.position) || this.position < 0)\n throw new RangeError('Invalid writer position');\n this.ensure(this.position + data.length);\n bytes(data).copy(this.buffer, this.position);\n this.position += data.length;\n this.length = Math.max(this.length, this.position);\n }\n\n fillTo(end: number, fill = 0xff) {\n this.ensure(end);\n if (end <= this.position) return;\n this.buffer.fill(fill, this.position, end);\n this.position = end;\n this.length = Math.max(this.length, end);\n }\n\n pad(alignment: number, fill = 0xff) {\n this.fillTo(align(this.position, alignment), fill);\n }\n toBuffer() {\n return this.buffer.subarray(0, this.length);\n }\n}\n","// CRCs used by the Nintendo DS header and banner (NitroHelper, GPL-3.0).\nconst table16 = new Uint16Array(256);\nconst table32 = new Uint32Array(256);\nfor (let i = 0; i < 256; i++) {\n let a = i,\n b = i;\n for (let bit = 0; bit < 8; bit++) {\n a = (a >>> 1) ^ (a & 1 ? 0xa001 : 0);\n b = (b >>> 1) ^ (b & 1 ? 0xedb88320 : 0);\n }\n table16[i] = a;\n table32[i] = b;\n}\nexport const crc16 = (data: Uint8Array, initial = 0xffff) => {\n let crc = initial;\n for (const byte of data) crc = (crc >>> 8) ^ table16[(crc ^ byte) & 0xff];\n return crc;\n};\nexport const crc32 = (data: Uint8Array) => {\n let crc = 0xffffffff;\n for (const byte of data) crc = (crc >>> 8) ^ table32[(crc ^ byte) & 0xff];\n return (crc ^ 0xffffffff) >>> 0;\n};\n","import { createAesBlockCipher } from '#nitro-runtime';\n\nexport interface ModcryptHeader {\n gameCode: string;\n gameTitle: string;\n twlInternalFlags: number;\n appflags?: Buffer;\n hmac_arm9i?: Buffer;\n}\n\n// KEY1 table carried forward from NitroHelper/Arm9Encryptor.cs (Dirbaio/ndstool).\nconst KEY1 = Buffer.from(\n '99D5205F5744F5B96E19A4D99E6A5A94D8AEF1EB4175E23A9382D03233EE31D5CC57619A3706A21B793972F555AEF6BE5F1B69FBE59DF1E9CE2CD9A15E3205E6' +\n 'FED3FECFD462040D8BF5ECB72B6079BB1295310D6E3FDA2B8884F0F13D127E254522F1BB24061A0611ADDF288B6481342BEB332999AAF2BD9C14959D9FF7F58C' +\n '7297A1299DD15FCF664D071ADED34A4B85C9A7A31795053A3D490ABF0A898BA24A8249DD2790F10BE9EB1C6A83764505BA817061173F4BDEAECFAB3957F23A56' +\n '4811AD8A40E1453FFA9B0254CAA693FBEF4DFE6FA3D8879C08BAD5486A8D2DFD6E15F874BDBE528B18228A9EFB7437071B366C4A19BA4262B97991107B676596' +\n 'FE0223E8EE998C773E5C86644D6D7886A54F65E21EB2DF5A0AD07E0814B071ACBDDB831CB9D7A162CDC6637C5269C3E6BF75CE12445D2104FAFBD33C381163D4' +\n '958541494609F2084311DC1F76C0156D1F3C6370EA87806CC3BD638BC2372137DCEE09232E376A4D7390F75030AC1C92041023914FD207AA683E4F9AC964606A' +\n 'C81421F3D62241124424CFE68A56DD0D534DE1851E8C525A9C1984C20357F16FE300BE58F64CEDD521649C1FBE55033C4ADCFFAAC9DAE05D5EBFE6DEF5D8B1F8' +\n 'FF36B3B9626795DB315F37ED4C70679990B518316C3D9999E442DAD3254213A0AED7706CB155CFC7D746D54361173D4428E93385D5D0A293AA25121FFBC50B46' +\n 'F597765645A6BE87B1946BE8B1FE3399AE1F3E6C39711D09009037E4103E7574FF8C833BB0F1B0F90105474295F1D6AC7E38E69E9574263FB4685018D04330B4' +\n '4C4BE368BFE54DB6958B0AA074253277CFA1F72CD871135AABEAC951E80DEEEFE9937E19A71E433881162CA148E373CC29216CD35DCEA0D9617143A01513B564' +\n '92CF2A19DCADB7A59F8665F81A9FE7FBF7FDB8136C27DB6FDF351CF78D2C5B9B12AB386406CCDE31E84E751164E3FAEAEB3454C2AD3F34EB932C7D26369D56F3' +\n '5AE1F6B398634A9E3283E49A84607D902E130EEE934B36A285EC1638E8880602BFF0A03AEDD76A9A73E157CFF844B8DC2E2359D1DF9552719961A04BD57F6E78' +\n 'BAA9C530D34086329D320C9C37B7022FBA5498A9C41304C98DBEC8E75D97502E93D622590C27BC2292E0A7200F936F7F4C9FD3B5A62A0B7467497D1026CBD1C5' +\n '8671E78CA09CE95BB21AF601EE8C9E5E83F21ADBE6E5EA845976D27CF68DA5493648C21652BB83A374B9070C3BFF6128E161E9E4EF6E15AA4EBAE85D0596BB32' +\n '56B0FB72520F0EC84225657689AFF2DE1027F0014B74A79707D5265454091F820A867D30390EB3269B0B57BB360631AFFD79FCD930102B0CB3E19BD77BDC5FEF' +\n 'D2F813454D4775BD46963C7E75F33EB567C59A3BB05B296BDE805BC81505B131B6CE49DDAD84B5AE60DC67313430FE4EBD802FA6BF63392186D9357F16682205' +\n '54E990268C076C51A43155D70907A83E2E5366C1F8F27BC4F258CFF187C5A2E7278F308758A064622318B9887CFACEC498AEAD17CC4A5BF3E948D556D30DF2C8' +\n '92738CDBD72F56AC81F992694DC632F6E6C08D21E276806111BCDC6C93AF19699BD0BFB9319F0267A351EE8306227B0CAB494240B8D5017DCE5EF7555339C599' +\n '46D8879FBAF764B4E39AFAA16D90681030CA8A54A79F60C319F56B0D7A5198E6984351B4D635E94FC3DF0F7BD62F5CBD3A156119F14BCBAADC6D64C9D3C61E56' +\n 'EF384C50718675CC0D0D4EE928F6065D701BAAD345CFA839AC95A62EB4E422D474A8375F487A04CCA54C40D828B428080D1C725241F07D47193A534E5884626B' +\n '93B58A81214E0DDCB43FA2C6FCC92B40DA3804E95E5A866B0C22258568118D7C921D95554DAB8EBBDAA6E6B751B6325A0541DD052A0A5650911747CCC9E67EB5' +\n '614ADB736751C833F5DA6E742E54C3370D6DAF08E8158A5FE25921CDA8DE0C065A776B5FDB18653EC850DE78E0B882B35D4E7232074FC13423BA96B7674EA428' +\n '1E3462EB2D6A70E92F42C4704E5A319CF95B4728AADA716F381FB378C4926B1C9EF6359AB74D0EBFCC1829410348355D55D02BC629AF5C6074698E5E9B7CD4BD' +\n '7B44647D3F925D69B61F004BD48335CF7E644E17AE8DD52E9A28124E2E2B49085CAEC64685AE41611E6F82D25137161F0BF659A49ACA5AAF0DD4338B2063F184' +\n '805CCBCF08B4B9D31605BD6283319B5651989FBAB25BAAB2226B2CB5D448FA632B5F58FA61FA6409BB38E0B89D9260A80D676F0E37F50D019FC277D4FEECF173' +\n '3039E07DF56198E42C2855045655DB2F6BECE55806B664806A2A1A4E5B0FD8C40A2E5219D962F53048BE8C7B4F389BA2C3AFC9D3C7C1624186B96121576F994F' +\n 'C1BACE7BB53B4D5E8A8B44575F135F706D5B2947DC38E2EC045565122AE81743E18EDD2AB3E294F7096E5CE6EB8AF86D89495448F52FADBFEA944BCAFC398782' +\n '5F8A01F275F2E671D6D842DEF12D1D28A6887EA3A0471D30D9A371DF491CCB01F836B1F2F022585D456BBDA0BBB28842C78C28CE93E8906308907C893CF57DB7' +\n '042D4F555116FD7E79E8BEC1F212D4F8B4840523A0CCD22BFDE1ABAD0DD1556C2341944D77374F05280CBF17B312676C8CC35AF741842A6DD09412272CB4ED9C' +\n '4DEC478297D567B91B9DC055077EE58EE2A8E73E12E40E3A2A455534A2F92D5A1BAB527C83105F55D2F15A432BC6A7A4891595E8B44B9DF875E39F60785BD6E6' +\n '0D44E62106BD472253A400AD8D43138539F7AAFC38AF7BEDFCE42B5450984CFC8580F7DF3C8022E194DADE24C6B07A3938DC0FA1A7F4F96F6318578B84412A2E' +\n 'D453F2D9000FD0DD996E19A60AD0EC5B5824ABC0CB0665EC1A1338940A67032F3FF7E377447733C61439D0E3C0A20879BB409957410B0190CDE1CC4867DBB3AF' +\n '8874F34C828F72B1B52329C4126C19FC8E46A49CC4256587D36DBE8A93110338ED832BF346A493EA3B53851DCED4F1088327EDFC9B1A18BCF98BAEDC24AB5038' +\n 'E9724B1022177B465DAB5964F340AEF8BBE5C8F926034E557DEBEBFEF739E6E00A11BE2E28FF98EDC0C9425642C3FD00F6AF87A25B013F329247959A72A5323D' +\n 'AE6BD09B07D24992E3784AFAA1067DF241CF77740414B20C86846416D5BB51A1E56FF1D1F2E2F75F58204DB857C7CFDDC5D8BE763DF65F7EE72A8B88241B383F' +\n '0E412377F5F04BD40C1FFAA40B805FCF45F6E0DA2F345953FB203C52625E35B562FE8B6063E3865A151A6ED14745BC32B4EB6738ABE46E333AB5EDA3AD67E04E' +\n '4195EE626271261D31EF6230AFD782ACC2DC0504F59707BF11592307C06402E897E53EAF18AC59A68B4A33901C6E7C9C207E4C3C3E6164BBC56B7C7E3E9FC54C' +\n '9FEA73F5D789C04CF4FBF42DEC141B51D5C112C810DF0B4A8B9CBC93456A3E3E7DC1A9BACDC1B407E4E1688643B26D38F3FB0C5C663771DE56EF6EA0104065A7' +\n '98F7D0BE0EC83736EC10CA7C9CAB841E051776021C4F52AA5FC1C6A056B9D80484444DA759D8DE60E6380E058F03E13B6D8104336F300BCE69052133FB26BB89' +\n '7DB6AE877E5107E0ACF7960A6BF9C45C1DE44447B85EFAE3788455424B485EF77D4735861D2B430503EC8AB81E063C760C481A43A7B78AED1E13C643EE10EFDB' +\n 'ECFB3C83B29544EFD854514E2D11441DFB36591E7A34C1C3CA570061EA67A5169B55D055E17FD936D24076AEDC01CEB07A83D5CB2098EC6BC1729234F3825737' +\n '628A32360C9043AEAE5C9B788E136502FD6871C1FEB031A02482B0C3B17969A7F5D2EBD082C032DC9EC7263C6D8D98C1BB22D4D00F33EC3EB9CCE1DC6A4C7736' +\n '141CF9BF819F285F71853229907548C4B34ACED8448F142FFD4057EFAA0875D946D1D66E32551FC318FE841FFC84D5FF715E1B48C386950E280827D33883717B' +\n '4C8063549A56B0ACCF80CA3109EFFEF3BEAF247EA6FE533FC28D4A3368D122A666AD7BEADEB643B0A1259500A33F7546141144ECD795BC92F04FA91653629760' +\n '2A0F41F17124BEEE947F08CD6093B3855B07003FD80F28839AD1699FD1DA2EC39001A2B96B4E2A669DDAAEA6EA2AD3682F0C0C9CD28C4AEDE29E57659D0987A3' +\n 'B4C4325DC9D4322BB1E0711E644DE69071E31E40ED7DF3840EEDC87876AEC0712772BB05EA0264FBF3486BB542933FED9F1353D2F7FE2AEC1D4725DB3C9186C6' +\n '8EF011FD237436F7A4F59E7A7E535044D447CAD3EB386DE6D971947F4AC6694B11F452EA22FE8AB036678B59E8E6802AEB650413EEECDC9E5FB1EC056A59E69F' +\n '5E596B89BFF71ACA44F95B6A718503E42962E0706F41C4CFB2B1CCE37EA607A887E77F8493DB524B6CEC7EDDD4244810699F046074E64818F3E42CB94F2E507A' +\n 'DFD454692B8BA7F3CEFF1FF33E26013917958489B0F04C4B82919FC44BAC9DA574AF1725C9CA32D3BC898A8489CC0DAE7CA2DB9C6A7891EEEA765D4E8760F569' +\n '1567D402CFAF483607EABF6F662D068FC49AFEF9F6908775B8F7AD0F76105A3D59B02EB3C7352CCC70562BCBE33796C52F461B8A2246C788A726329861DF8622' +\n '8AF41C2F87A109AACCA9AED3BD00451C9A5487865287EFFF1E8FA18FC1895C351BDA2D3A2C16B2C2F156E278C16B6397C5568FC9327F2CAAAFA6A8AC20912288' +\n 'DEE4608BF94B42251AE37F9C2C19893A7E05D436CC6958C2C1328B2F9085EB7A3950A5A12792C566B0204F587E5583432B45E29CE4D812902C168356167903B3' +\n 'AD2D61181A131F37E2E19C737B80D5FD2D5187FC7BAAD71F2C7A8EAFF48DBBCD95117C720BEE6FE2B9AFDE3783DE8C8D620567B796C68D56B60DD762BAD64636' +\n 'BD8EC8E6EA2A6C1014FF6B5BFA823C46B1304346518A7D9B923E83795B555DB26C5ECE90628E5398C90D6DE52D57CDC58157BAE1E8B88F72E54F13DCEA9D7115' +\n '10B21188D509D47F5B657F2C3B384C1168508DFB9EB059BF9480894AC51A18128953D14A1029E88C1CECB6EA46C7178B251531A8A26B43B19DE2DB0B879BB011' +\n '040E71D2297789820A66417F1D0B48FF72BB24FDC248A19BFE7B7FCE88DB86D9853B1CB0DCA83307BF512EE30E9A00971E06C097439DD8B645C486675F00F888' +\n '9AA4529EC7AA8A8375ECC518AECEC32F1A2BF918FFAE1AF5530BB53351A7FDE8A8E1A264B622174380CC0AD8AE3BBA40D7D9924A89DF0410EE9B182B6A77698A' +\n '68F4F9B9A221156EE61E3B0362309B60417E259B9E8FC5521008F8C269A1211188375E793566FF1042186EED97B66B1C4E36E56D7DB4E4BF20B9E0053A69D5B8' +\n 'E3D5DCE0B9AC533E07A457AD77FF4818762AAC492A8E47756D9F676330358C390539D56F643A5BADCA0BBB82529945B193363699AF13204436D8024409399285' +\n 'FF4A4A9787A663D7C7B5B524ED0FB46F0C585214D9A67BD379BC3858A1BD3B8406D81A06FD6BA8EA4B69280437AD8299FB0E1B85BDA85D73CDDC58750ABE636C' +\n '48E74CE4302B0460B915D8DA8681758F96D48D1C5D70857C1C677BD50867A6CE4B0A6670B7E563D45B8A82EA1067CAE2F4EF17852F2A5F8A9782F86AD63410EA' +\n 'EBC95C3CE149F846EBDEBDF6A992F1AAA6A018B03AD30F1FF36FFF31454344D3509AF7880996C1CE76CCF22C2CBAAD82778F1884C0D2079C3690834E0BA54F43' +\n '3E04AB784FD6FB09012490DA6F3C3A610D7F694AEB2B3002B4DBE084A9ECD735BF377D8558CEA94EE480C7A8D3306748EB29AF2F746AB4A73F0F3F92AFF3CAAC' +\n 'AF4BD994C043CA810D2F48A1B027D5D2EF4B0585A3DE4D93303CF0BB4A8F30274CEBE33E64ED9A2F3BF182F0BAF4CF7F40CBB0E17FBCAA57D3C974F2FA430D22' +\n 'D0F4774E93D785701F99BFB6DE35F130A75E71F06B012D7B64F033530A3988F36B3AA66B35D22F43CD02FDB5E9BC5BAAD8A4197E0E5D94819E6F77ADD60E7493' +\n '96E7C4185FADF519',\n 'hex',\n);\n\nexport const aes128CtrCrypt = (key: Buffer, counter: Buffer, data: Buffer): Buffer => {\n if (key.length !== 16 || counter.length !== 16)\n throw new RangeError('AES key and counter must have 16 bytes');\n const ctr = Buffer.from(counter).reverse();\n const aes = createAesBlockCipher(Buffer.from(key).reverse());\n const output = Buffer.alloc(data.length);\n for (let p = 0; p < data.length; p += 16) {\n const mask = aes(ctr);\n for (let j = 0; j < 16 && p + j < data.length; j++) output[p + j] = data[p + j] ^ mask[15 - j];\n for (let j = 15; j >= 0; j--) {\n ctr[j] = (ctr[j] + 1) & 255;\n if (ctr[j]) break;\n }\n }\n return output;\n};\n\nexport const modcryptKey = (header: ModcryptHeader): Buffer => {\n if (typeof header.gameCode !== 'string' || header.gameCode.length !== 4)\n throw new Error('Expected four-character game code');\n if (header.twlInternalFlags & 4 || (header.appflags?.[3] ?? 0) & 0x80) {\n const key = Buffer.alloc(16);\n key.write(header.gameTitle, 0, 12, 'ascii');\n key.write(header.gameCode, 12, 4, 'ascii');\n return key;\n }\n if (!header.hmac_arm9i || header.hmac_arm9i.length < 16)\n throw new Error('Missing ARM9i HMAC for modcrypt key');\n const x = Buffer.from(\n 'Nintendo' + header.gameCode + [...header.gameCode].reverse().join(''),\n 'ascii',\n );\n for (let i = 0; i < 16; i++) x[i] ^= header.hmac_arm9i[i];\n const mask = (1n << 128n) - 1n;\n let v = x.readBigUInt64LE(0) | (x.readBigUInt64LE(8) << 64n);\n v = (v + 0xfffefb4e295902582a680f5f1a4f3e79n) & mask;\n v = ((v << 42n) | (v >> 86n)) & mask;\n const out = Buffer.alloc(16);\n out.writeBigUInt64LE(v & ((1n << 64n) - 1n));\n out.writeBigUInt64LE(v >> 64n, 8);\n return out;\n};\n\nexport const encryptSecureArea = (gameCode: string, input: Buffer): Buffer => {\n if (typeof gameCode !== 'string' || gameCode.length !== 4)\n throw new Error('Expected four-character game code');\n if (input.length < 0x800) throw new RangeError('Secure area must contain at least 0x800 bytes');\n const output = Buffer.from(input);\n let magic = new Uint32Array(0x412);\n let args: [number, number, number] = [0, 0, 0];\n function encrypt(a: number, b: number): [number, number] {\n for (let i = 0; i < 16; i++) {\n const c = (magic[i] ^ a) >>> 0;\n const sum = (magic[18 + (c >>> 24)] + magic[274 + ((c >>> 16) & 255)]) >>> 0;\n const f = (magic[786 + (c & 255)] + (magic[530 + ((c >>> 8) & 255)] ^ sum)) >>> 0;\n a = (b ^ f) >>> 0;\n b = c;\n }\n return [(b ^ magic[17]) >>> 0, (a ^ magic[16]) >>> 0];\n }\n function init2() {\n [args[2], args[1]] = encrypt(args[2], args[1]);\n [args[1], args[0]] = encrypt(args[1], args[0]);\n const key = Buffer.alloc(12);\n args.forEach((v, i) => key.writeUInt32LE(v, i * 4));\n for (let j = 0; j < 18; j++) magic[j] ^= key.readUInt32BE((j * 4) & 7);\n let a = 0,\n b = 0;\n for (let i = 0; i < 0x412; i += 2) {\n [a, b] = encrypt(a, b);\n magic[i] = a;\n magic[i + 1] = b;\n }\n }\n function init1() {\n magic = Uint32Array.from({ length: 0x412 }, (_, i) => KEY1.readUInt32LE(i * 4));\n const code = Buffer.from(gameCode, 'ascii').readUInt32LE();\n args = [code, code >>> 1, (code << 1) >>> 0];\n init2();\n init2();\n }\n init1();\n args[1] = (args[1] << 1) >>> 0;\n args[2] >>>= 1;\n init2();\n for (let p = 8; p < 0x800; p += 8) {\n const [b, a] = encrypt(output.readUInt32LE(p + 4), output.readUInt32LE(p));\n output.writeUInt32LE(a, p);\n output.writeUInt32LE(b, p + 4);\n }\n let [b, a] = encrypt(0x6a624f79, 0x72636e65);\n init1();\n [b, a] = encrypt(b, a);\n output.writeUInt32LE(a, 0);\n output.writeUInt32LE(b, 4);\n return output;\n};\n","// Port of NitroHelper/Header.cs. Copyright Xzonn and upstream contributors, GPL-3.0.\nimport { bytes, range } from './binary';\nimport { crc16 } from './crc';\nimport { encryptSecureArea } from './crypto';\n\nexport const UnitCode = Object.freeze({ NDS: 0, NDS_DSi: 2, DSi: 3 });\n\nexport class Header {\n raw: Buffer;\n trimmedRom: boolean;\n doublePadding: boolean;\n nitrocode: boolean;\n decrypted: boolean;\n headerCRC: boolean;\n logoCRC: boolean;\n secureCRC: boolean;\n dlp_signature: Buffer;\n declare ARM9romOffset: number;\n declare ARM9entryAddress: number;\n declare ARM9ramAddress: number;\n declare ARM9size: number;\n declare ARM7romOffset: number;\n declare ARM7entryAddress: number;\n declare ARM7ramAddress: number;\n declare ARM7size: number;\n declare FNToffset: number;\n declare FNTsize: number;\n declare FAToffset: number;\n declare FATsize: number;\n declare ARM9overlayOffset: number;\n declare ARM9overlaySize: number;\n declare ARM7overlayOffset: number;\n declare ARM7overlaySize: number;\n declare flagsRead: number;\n declare flagsInit: number;\n declare bannerOffset: number;\n declare dsi9_rom_offset: number;\n declare offset_0x1C4: number;\n declare dsi9_ram_address: number;\n declare dsi9_size: number;\n declare dsi7_rom_offset: number;\n declare offset_0x1D4: number;\n declare dsi7_ram_address: number;\n declare dsi7_size: number;\n declare digest_ntr_start: number;\n declare digest_ntr_size: number;\n declare digest_twl_start: number;\n declare digest_twl_size: number;\n declare sector_hashtable_start: number;\n declare sector_hashtable_size: number;\n declare block_hashtable_start: number;\n declare block_hashtable_size: number;\n declare digest_sector_size: number;\n declare digest_block_sectorcount: number;\n declare banner_size: number;\n declare offset_0x20C: number;\n declare total_rom_size: number;\n declare offset_0x214: number;\n declare offset_0x218: number;\n declare offset_0x21C: number;\n declare modcrypt1_start: number;\n declare modcrypt1_size: number;\n declare modcrypt2_start: number;\n declare modcrypt2_size: number;\n declare tid_low: number;\n declare tid_high: number;\n declare public_sav_size: number;\n declare private_sav_size: number;\n declare unitCode: number;\n declare encryptionSeed: number;\n declare twlInternalFlags: number;\n declare permitsFlags: number;\n declare ROMversion: number;\n declare internalFlags: number;\n declare secureCRC16: number;\n declare ROMtimeout: number;\n declare ARM9autoload: number;\n declare ARM7autoload: number;\n declare ROMsize: number;\n declare headerSize: number;\n declare logoCRC16: number;\n declare headerCRC16: number;\n declare debug_romOffset: number;\n declare debug_size: number;\n declare debug_ramAddress: number;\n declare reserved3: number;\n declare mbk9_wramcnt_setting: number;\n declare region_flags: number;\n declare access_control: number;\n declare scfg_ext_mask: number;\n declare gameTitle: string;\n declare gameCode: string;\n declare makerCode: string;\n declare reserved: Buffer;\n declare reserved2: Buffer;\n declare logo: Buffer;\n declare appflags: Buffer;\n declare hmac_arm9: Buffer;\n declare hmac_arm7: Buffer;\n declare hmac_digest_master: Buffer;\n declare hmac_icon_title: Buffer;\n declare hmac_arm9i: Buffer;\n declare hmac_arm7i: Buffer;\n declare hmac_arm9_no_secure: Buffer;\n declare rsa_signature: Buffer;\n declare secureDisable: bigint;\n\n constructor(input: Uint8Array) {\n const data = bytes(input, 'header');\n range(data, 0, 0x170, 'header');\n const size = data.readUInt32LE(0x84);\n if (size < 0x170 || size > data.length) throw new RangeError(`Invalid header size: ${size}`);\n this.raw = Buffer.from(data.subarray(0, size));\n if (this.unitCode & 2 && size > 0x200) range(this.raw, 0, 0x1000, 'DSi header');\n this.trimmedRom = this.total_rom_size\n ? this.total_rom_size >= data.length\n : data.length !== this.size;\n this.doublePadding =\n (this.ARM9size % 0x400 < 0x200 &&\n this.ARM7romOffset % 0x400 === 0 &&\n this.ARM9overlayOffset % 0x400 === 0) ||\n (this.ARM7size % 0x400 < 0x200 &&\n this.FNToffset % 0x400 === 0 &&\n this.ARM7overlayOffset % 0x400 === 0) ||\n (this.FNTsize % 0x400 < 0x200 && this.FAToffset % 0x400 === 0) ||\n (this.FATsize % 0x400 < 0x200 && this.bannerOffset % 0x400 === 0);\n const nitroOffset = this.ARM9romOffset + this.ARM9size;\n this.nitrocode =\n nitroOffset >= size &&\n nitroOffset + 4 <= data.length &&\n data.readUInt32LE(nitroOffset) === 0xdec00621;\n this.decrypted = data.length >= 0x4008 && data.readBigUInt64LE(0x4000) === 0xe7ffdeffe7ffdeffn;\n this.headerCRC = crc16(this.raw.subarray(0, 0x15e)) === this.headerCRC16;\n this.logoCRC = crc16(this.logo) === this.logoCRC16;\n const secure = data.subarray(0x4000, 0x8000);\n this.secureCRC =\n secure.length > 0 &&\n crc16(this.decrypted ? encryptSecureArea(this.gameCode, secure) : secure) ===\n this.secureCRC16;\n this.dlp_signature = Buffer.alloc(0);\n if (\n this.ROMsize >= size &&\n this.ROMsize + 0x88 <= data.length &&\n data.readUInt32LE(this.ROMsize) === 0x00016361\n ) {\n this.dlp_signature = Buffer.from(data.subarray(this.ROMsize, this.ROMsize + 0x88));\n }\n }\n\n get size() {\n return 2 ** (17 + this.raw[0x14]);\n }\n set size(value: number) {\n const power = Math.log2(value);\n if (!Number.isInteger(power) || power < 17 || power > 32)\n throw new RangeError('ROM capacity must be a power of two from 128 KiB to 4 GiB');\n this.raw[0x14] = power - 17;\n }\n toBuffer() {\n const data = Buffer.from(this.raw);\n data.writeUInt16LE(crc16(data.subarray(0xc0, 0x15c)), 0x15c);\n data.writeUInt16LE(crc16(data.subarray(0, 0x15e)), 0x15e);\n return data;\n }\n toString() {\n return `NDS header: ${this.gameTitle.replace(/\\0+$/, '')} (${this.gameCode})`;\n }\n}\n\nfunction field(\n name: string,\n offset: number,\n length: number,\n type: 'buffer' | 'string' | 'number' = 'buffer',\n dsi = false,\n) {\n Object.defineProperty(Header.prototype, name, {\n enumerable: true,\n get(this: Header) {\n if (dsi && (!(this.unitCode & 2) || this.raw.length <= 0x200))\n return type === 'buffer' ? Buffer.alloc(length) : 0;\n const data = range(this.raw, offset, length, `header ${name}`);\n if (type === 'string') return data.toString('latin1');\n if (type === 'buffer') return data;\n return length === 8 ? data.readBigUInt64LE() : data.readUIntLE(0, length);\n },\n set(this: Header, value: string | number | bigint | Uint8Array) {\n const target = range(this.raw, offset, length, `header ${name}`);\n if (type === 'string') {\n if (typeof value !== 'string' || Buffer.byteLength(value, 'latin1') > length)\n throw new TypeError(`Invalid ${name}`);\n target.fill(0);\n target.write(value, 'latin1');\n } else if (type === 'buffer') {\n if (!(value instanceof Uint8Array)) throw new TypeError(`Invalid ${name}`);\n const source = bytes(value, name);\n if (source.length !== length) throw new RangeError(`${name} must contain ${length} bytes`);\n source.copy(target);\n } else if (length === 8) {\n if (typeof value !== 'bigint') throw new TypeError(`Invalid ${name}`);\n target.writeBigUInt64LE(value);\n } else {\n if (typeof value !== 'number') throw new TypeError(`Invalid ${name}`);\n target.writeUIntLE(value, 0, length);\n }\n },\n });\n}\nfield('gameTitle', 0, 12, 'string');\nfield('gameCode', 12, 4, 'string');\nfield('makerCode', 16, 2, 'string');\nfor (const [name, offset] of Object.entries({\n unitCode: 0x12,\n encryptionSeed: 0x13,\n twlInternalFlags: 0x1c,\n permitsFlags: 0x1d,\n ROMversion: 0x1e,\n internalFlags: 0x1f,\n}))\n field(name, offset, 1, 'number');\nfield('reserved', 0x15, 7);\nconst ntr32 =\n 'ARM9romOffset ARM9entryAddress ARM9ramAddress ARM9size ARM7romOffset ARM7entryAddress ARM7ramAddress ARM7size FNToffset FNTsize FAToffset FATsize ARM9overlayOffset ARM9overlaySize ARM7overlayOffset ARM7overlaySize flagsRead flagsInit bannerOffset'.split(\n ' ',\n );\nntr32.forEach((name, i) => field(name, 0x20 + i * 4, 4, 'number'));\nfield('secureCRC16', 0x6c, 2, 'number');\nfield('ROMtimeout', 0x6e, 2, 'number');\nfield('ARM9autoload', 0x70, 4, 'number');\nfield('ARM7autoload', 0x74, 4, 'number');\nfield('secureDisable', 0x78, 8, 'number');\nfield('ROMsize', 0x80, 4, 'number');\nfield('headerSize', 0x84, 4, 'number');\nfield('reserved2', 0x88, 56);\nfield('logo', 0xc0, 156);\nfield('logoCRC16', 0x15c, 2, 'number');\nfield('headerCRC16', 0x15e, 2, 'number');\n'debug_romOffset debug_size debug_ramAddress reserved3'\n .split(' ')\n .forEach((name, i) => field(name, 0x160 + i * 4, 4, 'number'));\nfield('appflags', 0x1bc, 4, 'buffer', true);\n'mbk9_wramcnt_setting region_flags access_control scfg_ext_mask'\n .split(' ')\n .forEach((name, i) => field(name, 0x1ac + i * 4, 4, 'number', true));\nconst twl32 =\n 'dsi9_rom_offset offset_0x1C4 dsi9_ram_address dsi9_size dsi7_rom_offset offset_0x1D4 dsi7_ram_address dsi7_size digest_ntr_start digest_ntr_size digest_twl_start digest_twl_size sector_hashtable_start sector_hashtable_size block_hashtable_start block_hashtable_size digest_sector_size digest_block_sectorcount banner_size offset_0x20C total_rom_size offset_0x214 offset_0x218 offset_0x21C modcrypt1_start modcrypt1_size modcrypt2_start modcrypt2_size tid_low tid_high public_sav_size private_sav_size'.split(\n ' ',\n );\ntwl32.forEach((name, i) => field(name, 0x1c0 + i * 4, 4, 'number', true));\n'hmac_arm9 hmac_arm7 hmac_digest_master hmac_icon_title hmac_arm9i hmac_arm7i'\n .split(' ')\n .forEach((name, i) => field(name, 0x300 + i * 20, 20, 'buffer', true));\nfield('hmac_arm9_no_secure', 0x3a0, 20, 'buffer', true);\nfield('rsa_signature', 0xf80, 0x80, 'buffer', true);\n","// Port of NitroHelper/Banner.cs. Copyright Xzonn and upstream contributors, GPL-3.0.\nimport { bytes, range } from './binary';\nimport { crc16 } from './crc';\n\nconst titles = [\n 'japaneseTitle',\n 'englishTitle',\n 'frenchTitle',\n 'germanTitle',\n 'italianTitle',\n 'spanishTitle',\n 'chineseTitle',\n 'koreanTitle',\n] as const;\nexport class Banner {\n version: number;\n raw: Buffer;\n bannerCRC: boolean;\n tileData: Buffer;\n palette: Buffer;\n japaneseTitle = '';\n englishTitle = '';\n frenchTitle = '';\n germanTitle = '';\n italianTitle = '';\n spanishTitle = '';\n chineseTitle = '';\n koreanTitle = '';\n constructor(input: Uint8Array, offset = 0, hardSize = 0) {\n const data = bytes(input, 'banner');\n this.version = range(data, offset, 2, 'banner').readUInt16LE();\n let size = this.getDefSize(hardSize);\n if (this.version >>> 8 === 1)\n size = hardSize > 0 && hardSize !== 0xffffffff ? Math.min(hardSize, 0x23c0) : 0x23c0;\n this.raw = Buffer.from(range(data, offset, size, 'banner'));\n this.bannerCRC = crc16(this.raw.subarray(0x20, 0x840)) === this.raw.readUInt16LE(2);\n this.tileData = Buffer.from(this.raw.subarray(0x20, 0x220));\n this.palette = Buffer.from(this.raw.subarray(0x220, 0x240));\n for (const [i, title] of titles.entries())\n this[title] =\n i < this.titleCount\n ? this.raw\n .subarray(0x240 + i * 0x100, 0x340 + i * 0x100)\n .toString('utf16le')\n .split('\\0')[0]\n : '';\n }\n get titleCount() {\n return this.version >= 3 ? 8 : this.version >= 2 ? 7 : 6;\n }\n getDefSize(hardSize = 0) {\n if (this.version === 2) return 0x940;\n if (this.version === 3) return 0xa40;\n if (this.version === 0x103) return hardSize > 0 && hardSize !== 0xffffffff ? hardSize : 0x23c0;\n return 0x840;\n }\n toBuffer() {\n const output = Buffer.from(this.raw);\n output.writeUInt16LE(this.version);\n if (this.tileData.length !== 512 || this.palette.length !== 32)\n throw new RangeError('Invalid banner icon size');\n this.tileData.copy(output, 0x20);\n this.palette.copy(output, 0x220);\n for (let i = 0; i < this.titleCount; i++) {\n const text = Buffer.from(this[titles[i]], 'utf16le');\n if (text.length > 256)\n throw new RangeError(`Banner ${titles[i]} exceeds 128 UTF-16 code units`);\n output.fill(0, 0x240 + i * 256, 0x340 + i * 256);\n text.copy(output, 0x240 + i * 256);\n }\n output.writeUInt16LE(crc16(output.subarray(0x20, 0x840)), 2);\n if (this.version >= 2) output.writeUInt16LE(crc16(output.subarray(0x20, 0x940)), 4);\n if (this.version >= 3) output.writeUInt16LE(crc16(output.subarray(0x20, 0xa40)), 6);\n if (this.version >>> 8 >= 1) output.writeUInt16LE(crc16(output.subarray(0x1240, 0x23c0)), 8);\n return output;\n }\n}\n","// Based on NitroHelper FNT/FAT/OverlayTable, GPL-3.0.\nimport { bytes, range } from './binary';\n\n/** A file in the original ROM, optionally replaced with new bytes. */\nexport interface NitroFile {\n name: string;\n id: number;\n offset: number;\n size: number;\n replacement?: Buffer;\n}\n\nexport interface NitroFolder {\n name: string;\n id: number;\n files: NitroFile[];\n folders: NitroFolder[];\n}\n\nexport interface FatEntry {\n id: number;\n offset: number;\n size: number;\n}\n\nexport class FileAllocationTable {\n readonly entries: FatEntry[];\n readonly sortedIDs: number[];\n\n constructor(input: Uint8Array, offset: number, size: number) {\n const data = bytes(input);\n const table = range(data, offset, size, 'FAT');\n if (size % 8 || size / 8 > 65535) throw new Error('Invalid FAT entry count');\n this.entries = [];\n for (let p = 0; p < size; p += 8) {\n const start = table.readUInt32LE(p),\n end = table.readUInt32LE(p + 4);\n range(data, start, end - start, `FAT entry ${p / 8}`);\n this.entries.push({ id: p / 8, offset: start, size: end - start });\n }\n this.sortedIDs = [...this.entries]\n .sort((a, b) => a.offset - b.offset || a.id - b.id)\n .map((entry) => entry.id);\n }\n}\n\nexport class FileNameTable {\n readonly root: NitroFolder;\n\n constructor(fat: FileAllocationTable, input: Uint8Array, offset: number, size: number) {\n const table = range(bytes(input), offset, size, 'FNT');\n range(table, 0, 8, 'FNT root directory');\n const count = table.readUInt16LE(6);\n if (count < 1 || count > 4096) throw new Error('Invalid FNT directory count');\n range(table, 0, count * 8, 'FNT directory table');\n const decoder = new TextDecoder('shift_jis');\n const visited = new Set<number>();\n const fileIds = new Set<number>();\n const parse = (index: number, name: string, depth: number): NitroFolder => {\n if (depth > 256 || index >= count || visited.has(index))\n throw new Error('Invalid FNT directory tree or cycle');\n visited.add(index);\n let cursor = table.readUInt32LE(index * 8);\n let fileId = table.readUInt16LE(index * 8 + 4);\n if (cursor < count * 8) throw new Error('FNT directory names overlap directory table');\n const folder: NitroFolder = {\n name,\n id: index === 0 ? 0xffff : 0xf000 + index,\n files: [],\n folders: [],\n };\n const names = new Set<string>();\n while (true) {\n const tag = range(table, cursor++, 1, 'FNT name')[0];\n if (!tag) break;\n const length = tag & 0x7f;\n if (!length) throw new Error('Empty FNT directory name');\n const filename = decoder.decode(range(table, cursor, length, 'FNT filename'));\n cursor += length;\n if (\n filename.includes('/') ||\n filename.includes('\\\\') ||\n filename.includes('\\0') ||\n filename === '.' ||\n filename === '..'\n )\n throw new Error('Invalid FNT path component');\n const normalized = filename.toLowerCase();\n if (names.has(normalized)) throw new Error(`Duplicate FNT path: ${filename}`);\n names.add(normalized);\n if (tag & 0x80) {\n const id = range(table, cursor, 2, 'FNT directory id').readUInt16LE();\n cursor += 2;\n if (id < 0xf000) throw new Error('Invalid FNT directory id');\n folder.folders.push(parse(id & 0xfff, filename, depth + 1));\n } else {\n const entry = fat.entries[fileId++];\n if (!entry) throw new Error('FNT file id is outside FAT');\n if (fileIds.has(entry.id)) throw new Error(`Duplicate FNT file id: ${entry.id}`);\n fileIds.add(entry.id);\n folder.files.push({ name: filename, ...entry });\n }\n }\n return folder;\n };\n this.root = { name: 'root', id: 0xffff, files: [], folders: [parse(0, 'data', 0)] };\n }\n\n static findFile(id: number, folder: NitroFolder): NitroFile | undefined {\n for (const file of folder.files) if (file.id === id) return file;\n for (const subfolder of folder.folders) {\n const file = FileNameTable.findFile(id, subfolder);\n if (file) return file;\n }\n return undefined;\n }\n}\n\nexport interface OverlayItem {\n overlayId: number;\n ramAddress: number;\n ramSize: number;\n bssSize: number;\n staticInitialiserStartAddress: number;\n staticInitialiserEndAddress: number;\n fileId: number;\n reserved: number;\n}\n\nconst overlayFields = [\n 'overlayId',\n 'ramAddress',\n 'ramSize',\n 'bssSize',\n 'staticInitialiserStartAddress',\n 'staticInitialiserEndAddress',\n 'fileId',\n 'reserved',\n] as const;\n\nexport class OverlayTable {\n readonly entries: OverlayItem[] = [];\n constructor(\n input: Uint8Array,\n offset: number,\n size: number,\n readonly isArm9: boolean,\n ) {\n if (!size) return;\n const table = range(bytes(input), offset, size, 'overlay table');\n if (size % 32) throw new Error('Invalid overlay table size');\n for (let p = 0; p < size; p += 32) {\n if (table.readUInt32LE(p) === 0xffffffff) break;\n this.entries.push({\n overlayId: table.readUInt32LE(p),\n ramAddress: table.readUInt32LE(p + 4),\n ramSize: table.readUInt32LE(p + 8),\n bssSize: table.readUInt32LE(p + 12),\n staticInitialiserStartAddress: table.readUInt32LE(p + 16),\n staticInitialiserEndAddress: table.readUInt32LE(p + 20),\n fileId: table.readUInt32LE(p + 24),\n reserved: table.readUInt32LE(p + 28),\n });\n }\n }\n readBasicOverlays(fat: FileAllocationTable): NitroFile[] {\n return this.entries.map((item) => {\n const file = fat.entries[item.fileId];\n if (!file) throw new Error('Overlay file id is outside FAT');\n return {\n ...file,\n name: `overlay${this.isArm9 ? '' : '7'}_${String(item.overlayId).padStart(4, '0')}.bin`,\n };\n });\n }\n toBuffer(): Buffer {\n const data = Buffer.alloc(this.entries.length * 32);\n this.entries.forEach((entry, i) =>\n overlayFields.forEach((field, j) => data.writeUInt32LE(entry[field], i * 32 + j * 4)),\n );\n return data;\n }\n}\n","export interface Arm9Header {\n reserved2: Buffer;\n ARM9ramAddress: number;\n ARM9size: number;\n}\n\n// Native port of Xzonn/BlzHelper BLZ.cs (MIT), including overwrite-safe prefix.\n// Compression returns an empty Buffer when no smaller representation exists.\nexport const decompressBLZ = (input: Buffer, maxSize = 0x10000000): Buffer => {\n if (input.length < 8) throw new Error('BLZ footer is truncated');\n const diff = input.readUInt32LE(input.length - 4);\n const packed = input.readUInt32LE(input.length - 8),\n header = packed >>> 24,\n length = packed & 0xffffff;\n const size = input.length + diff,\n prefix = input.length - length;\n if (header < 8 || header > length || length > input.length || size > maxSize)\n throw new Error('Invalid BLZ size or footer');\n const out = Buffer.alloc(size);\n input.copy(out, 0, 0, prefix);\n let src = input.length - header,\n dst = size;\n while (src > prefix) {\n const flags = input[--src];\n for (let bit = 128; bit && src > prefix; bit >>= 1) {\n if (!(flags & bit)) {\n if (dst <= prefix) throw new Error('BLZ output overflow');\n out[--dst] = input[--src];\n } else {\n if (src - 2 < prefix) throw new Error('Truncated BLZ reference');\n const high = input[--src],\n low = input[--src];\n const count = (high >>> 4) + 3,\n offset = (((high & 15) << 8) | low) + 3;\n if (dst - count < prefix || dst - 1 + offset >= size)\n throw new Error('Invalid BLZ reference');\n for (let j = 0; j < count; j++) {\n --dst;\n out[dst] = out[dst + offset];\n }\n }\n }\n }\n if (dst !== prefix) throw new Error('BLZ decompressed size mismatch');\n return out;\n};\n\nexport const compressBLZ = (input: Buffer): Buffer => {\n if (input.length > 0xffffff) throw new Error('BLZ input exceeds 24-bit format limit');\n const temp = Buffer.alloc(input.length);\n let src = input.length,\n dst = input.length;\n // Linked candidate lists retain upstream nearest-match tie breaking without\n // scanning every byte of the 4 KiB search window for each literal.\n const heads = new Int32Array(256).fill(-1);\n const next = new Int32Array(input.length);\n let indexedFrom = input.length;\n while (src > 0) {\n if (dst < 1) return Buffer.alloc(0);\n const flagPos = --dst;\n let flags = 0;\n for (let bit = 0; bit < 8; bit++) {\n flags <<= 1;\n if (!src) continue;\n while (indexedFrom > src) {\n const p = --indexedFrom;\n next[p] = heads[input[p]];\n heads[input[p]] = p;\n }\n const maxCount = Math.min(src, 18);\n let best = 0,\n offset = 0;\n for (let p = heads[input[src - 1]]; p >= 0; p = next[p]) {\n const d = p - src + 1;\n if (d > 0x1002) break;\n let n = 0;\n const limit = Math.min(d, maxCount);\n while (n < limit && input[src - 1 - n] === input[src + d - 1 - n]) n++;\n if (n > best) {\n best = n;\n offset = d;\n if (best === maxCount) break;\n }\n }\n if (best < 3) {\n if (dst < 1) return Buffer.alloc(0);\n temp[--dst] = input[--src];\n } else {\n if (dst < 2) return Buffer.alloc(0);\n src -= best;\n dst -= 2;\n temp[dst] = (offset - 3) & 255;\n temp[dst + 1] = ((best - 3) << 4) | ((offset - 3) >>> 8);\n flags |= 1;\n }\n }\n temp[flagPos] = flags;\n }\n let packed = temp.subarray(dst),\n sourcePos = input.length,\n compressedPos = packed.length,\n prefix = 0,\n skip = 0;\n outer: while (sourcePos > 0) {\n const flags = packed[--compressedPos];\n for (let bit = 128; bit && sourcePos > 0; bit >>= 1) {\n if (!(flags & bit)) {\n compressedPos--;\n sourcePos--;\n } else {\n sourcePos -= (packed[compressedPos - 1] >>> 4) + 3;\n compressedPos -= 2;\n if (sourcePos < compressedPos) {\n prefix = sourcePos;\n skip = compressedPos;\n break outer;\n }\n }\n }\n }\n packed = Buffer.concat([input.subarray(0, prefix), packed.subarray(skip)]);\n const aligned = Math.ceil(packed.length / 4) * 4,\n finalSize = aligned + 8;\n if (finalSize >= input.length) return Buffer.alloc(0);\n const out = Buffer.alloc(finalSize, 255);\n packed.copy(out);\n const header = finalSize - packed.length,\n length = packed.length - prefix + header;\n out.writeUInt32LE(((header << 24) | length) >>> 0, finalSize - 8);\n out.writeUInt32LE(input.length - finalSize, finalSize - 4);\n return out;\n};\n\nexport const decompressArm9 = (\n data: Buffer,\n header: Arm9Header,\n): { compressed: boolean; data: Buffer } => {\n if (data.length < 0x18) throw new Error('ARM9 data too short');\n const nitro = data.readUInt32LE(0xc) === 0xdec00621 ? 12 : 0;\n const init = header.reserved2.readUInt32LE(0) & 0x3fff;\n const ptr = init ? data.readUInt32LE(init + 0x14) : header.ARM9ramAddress + header.ARM9size;\n const compressed =\n ptr > header.ARM9ramAddress && ptr + nitro >= header.ARM9ramAddress + data.length;\n return {\n compressed,\n data: compressed\n ? Buffer.concat([\n decompressBLZ(data.subarray(0, data.length - nitro)),\n data.subarray(data.length - nitro),\n ])\n : Buffer.from(data),\n };\n};\nexport const compressArm9 = (data: Buffer, header: Arm9Header, postSize = 0): Buffer => {\n if (data.length < 0x4000) throw new Error('ARM9 secure area is truncated');\n const nitro = data.readUInt32LE(0xc) === 0xdec00621 ? 12 : 0;\n const packed = compressBLZ(data.subarray(0x4000, data.length - nitro));\n if (!packed.length) throw new Error('ARM9 BLZ compression produced no smaller representation');\n const out = Buffer.concat([data.subarray(0, 0x4000), packed, data.subarray(data.length - nitro)]);\n const init = header.reserved2.readUInt32LE(0) & 0x3fff;\n if (init) out.writeUInt32LE(out.length - postSize + header.ARM9ramAddress, init + 0x14);\n return out;\n};\n","import { hashDigest, hmacSha1, verifyRsaSha1, readFileSync } from '#nitro-runtime';\nimport type { BinaryWriter } from './binary';\nimport type { ModcryptHeader } from './crypto';\nimport type { Arm9Header } from './blz';\nimport { aes128CtrCrypt, encryptSecureArea, modcryptKey } from './crypto';\nimport { compressArm9, decompressArm9 } from './blz';\n\nexport interface TwlHeader extends ModcryptHeader {\n digest_sector_size: number;\n digest_block_sectorcount: number;\n digest_ntr_start: number;\n digest_ntr_size: number;\n digest_twl_start: number;\n digest_twl_size: number;\n sector_hashtable_start: number;\n sector_hashtable_size: number;\n block_hashtable_start: number;\n block_hashtable_size: number;\n dsi9_rom_offset: number;\n dsi9_size: number;\n dsi7_rom_offset: number;\n dsi7_size: number;\n modcrypt1_start: number;\n modcrypt1_size: number;\n modcrypt2_start: number;\n modcrypt2_size: number;\n total_rom_size: number;\n trimmedRom: boolean;\n decrypted: boolean;\n hmac_arm9: Buffer;\n hmac_arm7: Buffer;\n hmac_digest_master: Buffer;\n}\n\nexport interface SignedTwlHeader {\n hmac_digest_master: Buffer;\n rsa_signature: Buffer;\n}\n\nexport interface OverlayRange {\n offset: number;\n size: number;\n}\n\nexport const HMAC_SHA1_KEY = Buffer.from(\n '2106c0deba98ce3fa692e39d46f2ed0176e3cc08562363facad4ecdf9a6278348f6d633cfe22ca9220889723d2cfaec232678dfeca836498acfd3e3787465824',\n 'hex',\n);\nconst hash = (data: Buffer): Buffer => hmacSha1(HMAC_SHA1_KEY, data);\nfunction slice(data: Buffer, start: number, size: number, label: string): Buffer {\n if (\n !Number.isSafeInteger(start) ||\n !Number.isSafeInteger(size) ||\n start < 0 ||\n size < 0 ||\n start + size > data.length\n )\n throw new RangeError(`${label} outside data range`);\n return data.subarray(start, start + size);\n}\nfunction validate(h: TwlHeader): void {\n for (const field of [\n 'digest_ntr_start',\n 'digest_ntr_size',\n 'digest_twl_start',\n 'digest_twl_size',\n 'sector_hashtable_start',\n 'sector_hashtable_size',\n 'block_hashtable_start',\n 'block_hashtable_size',\n 'dsi9_rom_offset',\n 'dsi9_size',\n 'dsi7_rom_offset',\n 'dsi7_size',\n 'modcrypt1_start',\n 'modcrypt1_size',\n 'modcrypt2_start',\n 'modcrypt2_size',\n 'total_rom_size',\n ] as const) {\n if (!Number.isSafeInteger(h[field]) || h[field] < 0 || h[field] > 0xffffffff) {\n throw new Error(`Invalid TWL ${field}`);\n }\n }\n const s = h.digest_sector_size;\n if (!Number.isSafeInteger(s) || s <= 0 || s > 0x4000 || 0x4000 % s)\n throw new Error('Invalid TWL digest sector size');\n if (\n !Number.isSafeInteger(h.digest_block_sectorcount) ||\n h.digest_block_sectorcount <= 0 ||\n h.digest_block_sectorcount > 0x100000\n )\n throw new Error('Invalid TWL digest block sector count');\n if (h.digest_ntr_size < 0x4000 || h.digest_ntr_size % s || h.digest_twl_size % s)\n throw new Error('Invalid TWL digest region size');\n const hashes = (h.digest_ntr_size + h.digest_twl_size) / s;\n if (\n hashes * 20 > h.sector_hashtable_size ||\n Math.ceil(h.sector_hashtable_size / (h.digest_block_sectorcount * 20)) * 20 >\n h.block_hashtable_size\n )\n throw new Error('TWL hash tables are too small');\n}\nexport class TWL {\n readonly firstDSiHashOffset: number;\n readonly dsiHashSize: number;\n readonly Hashtable1Data: Buffer;\n readonly Hashtable2Data: Buffer;\n readonly Header2Data: Buffer[] | null;\n readonly Overlays9Sha1Hmac: Buffer[];\n readonly twlEncrypted: boolean;\n DSi9Data: Buffer;\n DSi7Data: Buffer;\n constructor(header: TwlHeader, overlays: readonly OverlayRange[], original: Buffer) {\n validate(header);\n const h = header;\n this.firstDSiHashOffset = (h.digest_ntr_size / h.digest_sector_size) * 20;\n this.dsiHashSize = (h.digest_twl_size / h.digest_sector_size) * 20;\n this.Hashtable1Data = Buffer.from(\n slice(original, h.sector_hashtable_start, h.sector_hashtable_size, 'Sector hash table'),\n );\n this.Hashtable2Data = Buffer.from(\n slice(original, h.block_hashtable_start, h.block_hashtable_size, 'Block hash table'),\n );\n this.DSi9Data = Buffer.from(\n slice(original, h.dsi9_rom_offset, Math.max(h.modcrypt1_size, h.dsi9_size), 'ARM9i'),\n );\n this.DSi7Data = Buffer.from(\n slice(original, h.dsi7_rom_offset, Math.max(h.modcrypt2_size, h.dsi7_size), 'ARM7i'),\n );\n this.Header2Data = h.trimmedRom\n ? null\n : Array.from({ length: 3 }, (_, i) =>\n Buffer.from(\n slice(original, h.digest_twl_start - 0x3000 + 0x1000 * i, 0x1000, 'Secondary header'),\n ),\n );\n this.Overlays9Sha1Hmac = overlays.map((o) =>\n hash(slice(original, o.offset, o.size, 'ARM9 overlay')),\n );\n let encrypted = false;\n const modcryptStart = [\n { start: h.modcrypt1_start, size: h.modcrypt1_size },\n { start: h.modcrypt2_start, size: h.modcrypt2_size },\n ].find(\n ({ start, size }) => size > 0 && start >= h.digest_twl_start && start < 0xffffffff,\n )?.start;\n if (modcryptStart !== undefined) {\n const index = Math.floor((modcryptStart - h.digest_twl_start) / h.digest_sector_size);\n const actual = hash(\n slice(\n original,\n h.digest_twl_start + index * h.digest_sector_size,\n h.digest_sector_size,\n 'Modcrypt sector',\n ),\n );\n encrypted = !actual.equals(\n slice(\n this.Hashtable1Data,\n this.firstDSiHashOffset + index * 20,\n 20,\n 'Modcrypt sector hash',\n ),\n );\n }\n if (encrypted) this.cryptSections(h);\n this.twlEncrypted = !!(h.twlInternalFlags & 2);\n }\n private cryptSections(h: TwlHeader, writer?: BinaryWriter): void {\n const key = modcryptKey(h);\n for (const [id, data, start, counter] of [\n [1, this.DSi9Data, h.dsi9_rom_offset, h.hmac_arm9],\n [2, this.DSi7Data, h.dsi7_rom_offset, h.hmac_arm7],\n ] as const) {\n const size = h[`modcrypt${id}_size`];\n if (!size) continue;\n const off = h[`modcrypt${id}_start`] - start;\n const result = aes128CtrCrypt(\n key,\n slice(counter, 0, 16, 'Modcrypt counter'),\n slice(data, off, size, 'Modcrypt payload'),\n );\n if (writer) {\n writer.position = start + off;\n writer.write(result);\n } else result.copy(data, off);\n }\n }\n importArm9iData(data: Buffer | string, offset = 0, size?: number): void {\n this.DSi9Data = this.importData(data, offset, size);\n }\n importArm7iData(data: Buffer | string, offset = 0, size?: number): void {\n this.DSi7Data = this.importData(data, offset, size);\n }\n private importData(data: Buffer | string, offset: number, size?: number): Buffer {\n if (typeof data === 'string') data = readFileSync(data);\n size ??= data.length - offset;\n const src = slice(data, offset, size, 'DSi import');\n const out = Buffer.alloc(Math.ceil(size / 16) * 16, 255);\n src.copy(out);\n return out;\n }\n updateOverlays9Sha1Hmac(\n arm9Data: Buffer,\n header: Arm9Header,\n overlays: readonly Buffer[],\n ): Buffer {\n if (overlays.length !== this.Overlays9Sha1Hmac.length)\n throw new Error('Changing ARM9 overlay count is unsupported');\n const hashes = overlays.map(hash);\n if (hashes.every((h, i) => h.equals(this.Overlays9Sha1Hmac[i]))) return Buffer.from(arm9Data);\n const init = header.reserved2.readUInt32LE(0) & 0x3fff;\n const hdrptr = arm9Data.readUInt32LE(init + 0x14) - header.ARM9ramAddress;\n const unpacked = decompressArm9(arm9Data, header);\n const end = unpacked.data.readUInt32LE(init + 8) - header.ARM9ramAddress;\n let found = -1;\n for (\n let p = Math.min(end - hashes.length * 20, unpacked.data.length - hashes.length * 20);\n p >= 0;\n p--\n ) {\n if (unpacked.data.subarray(p, p + 20).equals(this.Overlays9Sha1Hmac[0])) {\n found = p;\n break;\n }\n }\n if (found < 0)\n throw new Error('ARM9 overlay hashes changed but original hash table was not found');\n hashes.forEach((h, i) => h.copy(unpacked.data, found + i * 20));\n // Original C# inverted this check and tried to compress uncompressed data.\n // Preserve the original storage format: recompress only a compressed ARM9.\n return unpacked.compressed\n ? compressArm9(unpacked.data, header, arm9Data.length - hdrptr)\n : unpacked.data;\n }\n writeTo(writer: BinaryWriter, h: TwlHeader): Buffer {\n validate(h);\n // Fixed DSi regions cannot be shifted safely without rewriting the header.\n if (writer.position > h.sector_hashtable_start) {\n throw new Error('NTR output overlaps the fixed DSi sector hash table');\n }\n if (\n h.sector_hashtable_start + h.sector_hashtable_size > h.block_hashtable_start ||\n h.block_hashtable_start + h.block_hashtable_size > h.dsi9_rom_offset ||\n h.dsi9_rom_offset + this.DSi9Data.length > h.dsi7_rom_offset ||\n h.dsi7_rom_offset + this.DSi7Data.length > h.total_rom_size\n ) {\n throw new Error('DSi sections overlap or exceed the ROM size');\n }\n const fill = (end: number): void => {\n if (writer.position < end) writer.fillTo(end, 255);\n };\n fill(h.sector_hashtable_start);\n writer.position = h.sector_hashtable_start + h.sector_hashtable_size;\n fill(h.block_hashtable_start);\n writer.position = h.block_hashtable_start + h.block_hashtable_size;\n fill(h.dsi9_rom_offset);\n if (this.Header2Data && !h.trimmedRom) {\n writer.position = h.digest_twl_start - 0x3000;\n this.Header2Data.forEach((b) => writer.write(b));\n }\n writer.position = h.dsi9_rom_offset;\n writer.write(this.DSi9Data);\n fill(h.dsi7_rom_offset);\n writer.position = h.dsi7_rom_offset;\n writer.write(this.DSi7Data);\n fill(h.total_rom_size);\n const finalPosition = writer.position;\n const read = (p: number, n: number): Buffer =>\n slice(writer.buffer.subarray(0, writer.length), p, n, 'TWL output digest');\n let secure: Buffer = Buffer.from(read(h.digest_ntr_start, 0x4000));\n if (h.decrypted) secure = encryptSecureArea(h.gameCode, secure);\n let index = 0;\n const put = (b: Buffer): void => {\n writer.position = h.sector_hashtable_start + index++ * 20;\n writer.write(hash(b));\n };\n for (let p = 0; p < 0x4000; p += h.digest_sector_size)\n put(secure.subarray(p, p + h.digest_sector_size));\n for (\n let p = h.digest_ntr_start + 0x4000;\n p < h.digest_ntr_start + h.digest_ntr_size;\n p += h.digest_sector_size\n )\n put(read(p, h.digest_sector_size));\n for (\n let p = h.digest_twl_start;\n p < h.digest_twl_start + h.digest_twl_size;\n p += h.digest_sector_size\n )\n put(read(p, h.digest_sector_size));\n index = 0;\n for (\n let p = h.sector_hashtable_start;\n p < h.sector_hashtable_start + h.sector_hashtable_size;\n p += h.digest_block_sectorcount * 20\n ) {\n const digest = hash(read(p, h.digest_block_sectorcount * 20));\n writer.position = h.block_hashtable_start + index++ * 20;\n writer.write(digest);\n }\n h.hmac_digest_master = hash(read(h.block_hashtable_start, h.block_hashtable_size));\n if (this.twlEncrypted) this.cryptSections(h, writer);\n writer.position = finalPosition;\n return h.hmac_digest_master;\n }\n}\n\n/** Refresh the digest and keep valid RSA signatures; optional no$gba hash mask. */\nexport const updateHeaderSignatures = (\n writer: BinaryWriter,\n header: SignedTwlHeader,\n originalHeader: Buffer,\n keepOriginal: boolean,\n): void => {\n const signedData = Buffer.from(slice(originalHeader, 0, 0xe00, 'Signed header'));\n const digest = slice(header.hmac_digest_master, 0, 20, 'Master digest');\n const signature = slice(header.rsa_signature, 0, 128, 'RSA signature');\n digest.copy(signedData, 0x328);\n const valid = verifyRsaSha1(signedData, signature);\n const position = writer.position;\n writer.position = 0x328;\n writer.write(digest);\n if (!valid) {\n if (!keepOriginal) {\n const mask = Buffer.alloc(128, 0xff);\n mask[0] = 0;\n mask[1] = 1;\n mask[107] = 0;\n hashDigest('sha1', signedData).copy(mask, 108);\n header.rsa_signature = mask;\n }\n writer.position = 0xf80;\n writer.write(header.rsa_signature);\n }\n writer.position = position;\n};\n","// Native TypeScript port of NitroHelper/NDSFile.cs, GPL-3.0.\nimport { readFile, writeFile } from '#nitro-runtime';\nimport { BinaryWriter, bytes, range, DEFAULT_MAX_SIZE } from './binary';\nimport { Header } from './header';\nimport { Banner } from './banner';\nimport { FileAllocationTable, FileNameTable, OverlayTable } from './filesystem';\nimport type { NitroFile, NitroFolder } from './filesystem';\nimport { crc16 } from './crc';\nimport { encryptSecureArea } from './crypto';\nimport { TWL } from './twl';\n\nexport interface RomOptions {\n /** Maximum generated ROM size in bytes. Defaults to 1 GiB. */\n maxOutputSize?: number;\n}\n\nexport interface RomFileInfo {\n /** ROM-relative path, including data/, overlay/, or a system filename. */\n path: string;\n id: number;\n offset: number;\n size: number;\n}\n\nconst key = (path: string): string => path.replaceAll('\\\\', '/').toLowerCase();\n\n/** Parsed Nintendo DS ROM. Replacements do not change the input buffer. */\nexport class NDSFile {\n readonly original: Buffer;\n readonly header: Header;\n readonly banner: Banner;\n readonly fatTable: FileAllocationTable;\n readonly fntTable: FileNameTable;\n readonly overlay9Table: OverlayTable;\n readonly overlay7Table: OverlayTable;\n readonly root: NitroFolder;\n readonly twl: TWL | undefined;\n readonly warnings: string[] = [];\n private readonly paths = new Map<string, { path: string; file: NitroFile }>();\n private readonly maxOutputSize: number;\n\n constructor(input: Uint8Array, options: RomOptions = {}) {\n this.original = bytes(input, 'ROM');\n this.maxOutputSize = options.maxOutputSize ?? DEFAULT_MAX_SIZE;\n this.header = new Header(this.original);\n const h = this.header;\n range(this.original, h.ARM9romOffset, h.ARM9size + (h.nitrocode ? 12 : 0), 'ARM9');\n range(this.original, h.ARM7romOffset, h.ARM7size, 'ARM7');\n this.banner = new Banner(this.original, h.bannerOffset, h.banner_size);\n this.fatTable = new FileAllocationTable(this.original, h.FAToffset, h.FATsize);\n this.fntTable = new FileNameTable(this.fatTable, this.original, h.FNToffset, h.FNTsize);\n this.root = this.fntTable.root;\n this.overlay9Table = new OverlayTable(\n this.original,\n h.ARM9overlayOffset,\n h.ARM9overlaySize,\n true,\n );\n this.overlay7Table = new OverlayTable(\n this.original,\n h.ARM7overlayOffset,\n h.ARM7overlaySize,\n false,\n );\n const arm9Overlays = this.overlay9Table.readBasicOverlays(this.fatTable);\n this.root.folders.push({\n name: 'overlay',\n id: 0xffff,\n files: [...arm9Overlays, ...this.overlay7Table.readBasicOverlays(this.fatTable)],\n folders: [],\n });\n const system = (name: string, offset: number, size: number): void => {\n range(this.original, offset, size, name);\n this.root.files.push({ name, id: 0xffff, offset, size });\n };\n system('header.bin', 0, h.headerSize);\n system('banner.bin', h.bannerOffset, this.banner.raw.length);\n system('fnt.bin', h.FNToffset, h.FNTsize);\n system('fat.bin', h.FAToffset, h.FATsize);\n system('arm9.bin', h.ARM9romOffset, h.ARM9size + (h.nitrocode ? 12 : 0));\n system('arm7.bin', h.ARM7romOffset, h.ARM7size);\n if (h.ARM9overlaySize) system('overarm9.bin', h.ARM9overlayOffset, h.ARM9overlaySize);\n if (h.ARM7overlaySize) system('overarm7.bin', h.ARM7overlayOffset, h.ARM7overlaySize);\n const visit = (folder: NitroFolder, prefix: string): void => {\n for (const file of folder.files) {\n const path = prefix + file.name;\n if (this.paths.has(key(path))) throw new Error(`Duplicate ROM path: ${path}`);\n this.paths.set(key(path), { path, file });\n }\n for (const child of folder.folders) visit(child, prefix + child.name + '/');\n };\n visit(this.root, '');\n if (h.unitCode & 2 && h.twlInternalFlags & 1 && h.tid_high && h.tid_high !== 0xffffffff) {\n // Upstream silently discarded malformed TWL regions. Preserve valid DSi data,\n // and reject malformed data instead of emitting a ROM with missing sections.\n this.twl = new TWL(h, arm9Overlays, this.original);\n }\n }\n\n static async fromFile(path: string, options: RomOptions = {}): Promise<NDSFile> {\n return new NDSFile(await readFile(path), options);\n }\n get data(): NitroFolder {\n return this.root.folders[0];\n }\n get overlay(): NitroFolder {\n return this.root.folders[1];\n }\n\n listFiles(): RomFileInfo[] {\n return [...this.paths.values()].map(({ path, file }) => ({\n path,\n id: file.id,\n offset: file.offset,\n size: file.replacement?.length ?? file.size,\n }));\n }\n hasFile(path: string): boolean {\n return this.paths.has(key(path));\n }\n getFile(path: string): Buffer {\n const entry = this.paths.get(key(path));\n if (!entry) throw new Error(`ROM file not found: ${path}`);\n return Buffer.from(this.fileBytes(entry.file));\n }\n /** Replace an existing file. Adding or deleting filesystem entries is not supported. */\n replaceFile(path: string, content: Uint8Array): void {\n const entry = this.paths.get(key(path));\n if (!entry) throw new Error(`ROM file not found: ${path}`);\n entry.file.replacement = Buffer.from(bytes(content));\n }\n private fileBytes(file: NitroFile): Buffer {\n return file.replacement ?? range(this.original, file.offset, file.size, file.name);\n }\n\n /** Rebuild offsets, allocation table, CRCs and ROM padding. Safe to call repeatedly. */\n toBuffer(): Buffer {\n const fntReplacement = this.root.files.find((file) => file.name === 'fnt.bin')?.replacement;\n if (fntReplacement) {\n const replacementTree = new FileNameTable(\n this.fatTable,\n fntReplacement,\n 0,\n fntReplacement.length,\n );\n const collect = (folder: NitroFolder): number[] =>\n [...folder.files.map((file) => file.id), ...folder.folders.flatMap(collect)].sort(\n (a, b) => a - b,\n );\n if (collect(replacementTree.root).join(',') !== collect(this.data).join(','))\n throw new Error('Replacement FNT must preserve existing file IDs');\n }\n const h = new Header(this.header.toBuffer());\n h.nitrocode = this.header.nitrocode;\n h.decrypted = this.header.decrypted;\n h.trimmedRom = this.header.trimmedRom;\n h.dlp_signature = this.header.dlp_signature;\n const writer = new BinaryWriter(65536, this.maxOutputSize);\n const system = (name: string): NitroFile => {\n const file = this.root.files.find((file) => file.name === name);\n if (!file) throw new Error(`Missing ROM system file: ${name}`);\n return file;\n };\n const replacedHeader = system('header.bin').replacement;\n if (replacedHeader) {\n const replacement = new Header(replacedHeader);\n h.gameTitle = replacement.gameTitle;\n h.gameCode = replacement.gameCode;\n }\n const placements = new Map<number, { start: number; end: number }>();\n const write = (file: NitroFile, padding = true): void => {\n const start = writer.position;\n writer.write(this.fileBytes(file));\n if (file.id !== 0xffff) placements.set(file.id, { start, end: writer.position });\n if (padding) writer.pad(0x200);\n };\n const overlayIds = new Set<number>();\n const writeOverlays = (arm9: boolean): void => {\n const originalTable = arm9 ? this.overlay9Table : this.overlay7Table;\n const name = arm9 ? 'overarm9.bin' : 'overarm7.bin';\n const entry = this.root.files.find((file) => file.name === name);\n if (!entry) return;\n const raw = entry.replacement ?? originalTable.toBuffer();\n const table = new OverlayTable(raw, 0, raw.length, arm9);\n const files = this.overlay.files\n .filter((file) => file.name.startsWith(arm9 ? 'overlay_' : 'overlay7_'))\n .sort((a, b) => a.id - b.id);\n for (const file of files) {\n const item = table.entries.find((item) => item.fileId === file.id);\n if (!item) throw new Error(`Replacement overlay table is missing file id ${file.id}`);\n const size = this.fileBytes(file).length;\n if ((item.reserved >>> 24) & 1 || (!arm9 && item.reserved > 0))\n item.reserved = ((item.reserved & 0xff000000) | (size & 0xffffff)) >>> 0;\n overlayIds.add(file.id);\n }\n if (table.entries.length !== files.length)\n throw new Error('Changing overlay file count is unsupported');\n const encoded = table.toBuffer();\n if (arm9) {\n h.ARM9overlayOffset = writer.position;\n h.ARM9overlaySize = encoded.length;\n } else {\n h.ARM7overlayOffset = writer.position;\n h.ARM7overlaySize = encoded.length;\n }\n writer.write(encoded);\n writer.pad(0x200);\n for (const file of files) write(file);\n };\n writer.position = h.headerSize;\n h.ARM9romOffset = writer.position;\n const arm9 = system('arm9.bin');\n const arm9Bytes = this.fileBytes(arm9);\n if (arm9.replacement) {\n h.nitrocode =\n arm9Bytes.length >= 12 && arm9Bytes.readUInt32LE(arm9Bytes.length - 12) === 0xdec00621;\n }\n h.ARM9size = arm9Bytes.length - (h.nitrocode ? 12 : 0);\n write(arm9);\n h.ARM9overlayOffset = 0;\n writeOverlays(true);\n h.ARM7romOffset = writer.position;\n h.ARM7size = this.fileBytes(system('arm7.bin')).length;\n write(system('arm7.bin'));\n h.ARM7overlayOffset = 0;\n writeOverlays(false);\n h.FNToffset = writer.position;\n h.FNTsize = this.fileBytes(system('fnt.bin')).length;\n write(system('fnt.bin'));\n h.FAToffset = writer.position;\n h.FATsize = this.fatTable.entries.length * 8;\n writer.write(Buffer.alloc(h.FATsize));\n writer.pad(0x200);\n h.bannerOffset = writer.position;\n const bannerFile = system('banner.bin');\n const banner = bannerFile.replacement\n ? new Banner(bannerFile.replacement, 0, bannerFile.replacement.length)\n : this.banner;\n const bannerBytes = banner.toBuffer();\n // NTR has no banner_size field; DSi stores its actual banner length.\n if (h.unitCode & 2 && h.headerSize > 0x200) h.banner_size = bannerBytes.length;\n writer.write(bannerBytes);\n writer.pad(0x200);\n for (const [index, id] of this.fatTable.sortedIDs.entries()) {\n if (overlayIds.has(id)) continue;\n const file = FileNameTable.findFile(id, this.root);\n if (file) write(file, index < this.fatTable.sortedIDs.length - 1);\n else {\n // Games can address FAT entries directly without a NitroFS filename.\n // Keep their payload and allocation instead of silently zeroing the entry.\n const entry = this.fatTable.entries[id];\n if (entry.size > 0) {\n write({ ...entry, name: `FAT entry ${id}` }, index < this.fatTable.sortedIDs.length - 1);\n }\n }\n }\n const logicalEnd = writer.position;\n const fat = Buffer.alloc(h.FATsize);\n for (const [id, location] of placements) {\n fat.writeUInt32LE(location.start, id * 8);\n fat.writeUInt32LE(location.end, id * 8 + 4);\n }\n writer.position = h.FAToffset;\n writer.write(fat);\n writer.position = logicalEnd;\n // An ARM9 replacement can add or remove the decrypted secure-area marker.\n // Both TWL hashing and the header CRC must use the bytes being serialized.\n h.decrypted =\n writer.length >= 0x4008 && writer.buffer.readBigUInt64LE(0x4000) === 0xe7ffdeffe7ffdeffn;\n if (this.twl) this.twl.writeTo(writer, h);\n h.ROMsize = writer.position;\n h.size = 2 ** Math.ceil(Math.log2(Math.max(h.ROMsize + h.dlp_signature.length, 0x20000)));\n const secure = writer.toBuffer().subarray(0x4000, 0x8000);\n h.secureCRC16 = crc16(h.decrypted ? encryptSecureArea(h.gameCode, secure) : secure);\n writer.position = 0;\n writer.write(h.toBuffer());\n writer.position = h.ROMsize;\n writer.write(h.dlp_signature);\n writer.fillTo(h.size);\n return writer.toBuffer();\n }\n async saveAs(path: string): Promise<void> {\n await writeFile(path, this.toBuffer());\n }\n}\n"],"mappings":"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","names":["key","key","a","b","field","field","key","file","arm9","item"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/patch/zip.ts","../src/patch/xdelta.ts","../src/nitro-patch-helper.ts"],"sourcesContent":["import { inflateRawSync } from '#nitro-runtime';\nimport { crc32 } from '../nitro/crc';\n\n/** Resource limits apply to every central-directory entry, including duplicates. */\nexport interface ZipOptions {\n maxUncompressedSize?: number;\n maxEntries?: number;\n}\n\nconst fail = (message: string): never => {\n throw new Error(`ZIP: ${message}`);\n};\nconst utf8 = new TextDecoder('utf-8', { fatal: true });\n// IBM code page 437, byte values 0x80..0xff. ASCII bytes retain their literal values.\nconst cp437 =\n 'ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ';\n\nfunction decodeUtf8(bytes: Uint8Array): string {\n try {\n return utf8.decode(bytes);\n } catch {\n return fail('invalid UTF-8 filename');\n }\n}\nfunction boundOption(value: number | undefined, fallback: number, label: string): number {\n value ??= fallback;\n if (!Number.isSafeInteger(value) || value < 0)\n throw new RangeError(`${label} must be a non-negative safe integer`);\n return value;\n}\nfunction checkRange(bytes: Buffer, offset: number, length: number, end = bytes.length): void {\n if (offset < 0 || offset > end || length > end - offset)\n fail(`truncated or out-of-bounds record at ${offset} (length ${length})`);\n}\nfunction extras(bytes: Buffer): Map<number, Buffer> {\n const fields = new Map<number, Buffer>();\n let offset = 0;\n while (offset < bytes.length) {\n checkRange(bytes, offset, 4);\n const id = bytes.readUInt16LE(offset),\n length = bytes.readUInt16LE(offset + 2);\n offset += 4;\n checkRange(bytes, offset, length);\n if (id === 1) fail('ZIP64 archives are unsupported');\n fields.set(id, bytes.subarray(offset, offset + length));\n offset += length;\n }\n return fields;\n}\nfunction filename(raw: Buffer, flags: number, fields: Map<number, Buffer>): string {\n if (flags & 0x800) return decodeUtf8(raw);\n const unicode = fields.get(0x7075);\n if (unicode && unicode.length >= 5 && unicode[0] === 1 && unicode.readUInt32LE(1) === crc32(raw))\n return decodeUtf8(unicode.subarray(5));\n let result = '';\n for (const byte of raw) result += byte < 128 ? String.fromCharCode(byte) : cp437[byte - 128]!;\n return result;\n}\n\n/**\n * Read stored/deflated, single-disk ZIPs entirely in memory. Central-directory\n * sizes support streamed entries with data descriptors. Paths match PatchHelper:\n * backslashes become slashes, names are lowercase, and the final duplicate wins.\n * ZIP64, encryption, split archives and other compression methods fail explicitly.\n * Format reference: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT\n */\nexport const readZip = (input: Uint8Array, options: ZipOptions = {}): Map<string, Buffer> => {\n if (!(input instanceof Uint8Array))\n throw new TypeError('ZIP input must be a Buffer or Uint8Array');\n const bytes = Buffer.from(input.buffer, input.byteOffset, input.byteLength);\n const maxSize = boundOption(\n options.maxUncompressedSize,\n 1024 * 1024 * 1024,\n 'maxUncompressedSize',\n );\n const maxEntries = boundOption(options.maxEntries, 100000, 'maxEntries');\n let eocd = -1;\n for (let offset = bytes.length - 22; offset >= Math.max(0, bytes.length - 65557); offset--) {\n if (\n bytes.readUInt32LE(offset) === 0x06054b50 &&\n offset + 22 + bytes.readUInt16LE(offset + 20) === bytes.length\n ) {\n eocd = offset;\n break;\n }\n }\n if (eocd < 0) fail('end of central directory not found or truncated');\n const disk = bytes.readUInt16LE(eocd + 4),\n centralDisk = bytes.readUInt16LE(eocd + 6);\n const diskEntries = bytes.readUInt16LE(eocd + 8),\n count = bytes.readUInt16LE(eocd + 10);\n const centralSize = bytes.readUInt32LE(eocd + 12),\n centralOffset = bytes.readUInt32LE(eocd + 16);\n if (\n count === 0xffff ||\n diskEntries === 0xffff ||\n centralSize === 0xffffffff ||\n centralOffset === 0xffffffff ||\n (eocd >= 20 && bytes.readUInt32LE(eocd - 20) === 0x07064b50)\n )\n fail('ZIP64 archives are unsupported');\n if (disk || centralDisk || diskEntries !== count)\n fail('split or multiple-disk archives are unsupported');\n if (count > maxEntries) fail(`entry count exceeds limit ${maxEntries}`);\n checkRange(bytes, centralOffset, centralSize, eocd);\n if (centralOffset + centralSize !== eocd) fail('central directory size/offset mismatch');\n if (count > Math.floor(centralSize / 46)) fail('entry count exceeds central directory size');\n const result = new Map<string, Buffer>();\n const ranges: Array<{ start: number; end: number }> = [];\n let offset = centralOffset,\n totalSize = 0;\n for (let index = 0; index < count; index++) {\n checkRange(bytes, offset, 46, eocd);\n if (bytes.readUInt32LE(offset) !== 0x02014b50) fail('invalid central directory signature');\n const flags = bytes.readUInt16LE(offset + 8),\n method = bytes.readUInt16LE(offset + 10);\n const checksum = bytes.readUInt32LE(offset + 16),\n compressedSize = bytes.readUInt32LE(offset + 20),\n size = bytes.readUInt32LE(offset + 24);\n const nameLength = bytes.readUInt16LE(offset + 28),\n extraLength = bytes.readUInt16LE(offset + 30),\n commentLength = bytes.readUInt16LE(offset + 32);\n const startDisk = bytes.readUInt16LE(offset + 34),\n localOffset = bytes.readUInt32LE(offset + 42);\n if (\n size === 0xffffffff ||\n compressedSize === 0xffffffff ||\n localOffset === 0xffffffff ||\n startDisk === 0xffff\n )\n fail('ZIP64 entry is unsupported');\n if (startDisk) fail('split or multiple-disk entry is unsupported');\n if (flags & 0x2041) fail('encrypted entries are unsupported');\n if (flags & ~0x80e) fail('unsupported general purpose flags');\n if (method !== 0 && method !== 8) fail(`unsupported compression method ${method}`);\n if (size > maxSize - totalSize) fail(`uncompressed size exceeds limit ${maxSize}`);\n totalSize += size;\n checkRange(bytes, offset + 46, nameLength + extraLength + commentLength, eocd);\n const rawName = bytes.subarray(offset + 46, offset + 46 + nameLength);\n const fields = extras(\n bytes.subarray(offset + 46 + nameLength, offset + 46 + nameLength + extraLength),\n );\n const name = filename(rawName, flags, fields).replaceAll('\\\\', '/').toLowerCase();\n offset += 46 + nameLength + extraLength + commentLength;\n\n checkRange(bytes, localOffset, 30, centralOffset);\n if (bytes.readUInt32LE(localOffset) !== 0x04034b50) fail('invalid local header signature');\n if (\n bytes.readUInt16LE(localOffset + 6) !== flags ||\n bytes.readUInt16LE(localOffset + 8) !== method\n )\n fail('local header flags/compression method mismatch');\n const localNameLength = bytes.readUInt16LE(localOffset + 26),\n localExtraLength = bytes.readUInt16LE(localOffset + 28);\n const dataOffset = localOffset + 30 + localNameLength + localExtraLength;\n checkRange(bytes, localOffset + 30, localNameLength + localExtraLength, centralOffset);\n if (!rawName.equals(bytes.subarray(localOffset + 30, localOffset + 30 + localNameLength)))\n fail('local filename differs from central directory');\n extras(bytes.subarray(localOffset + 30 + localNameLength, dataOffset));\n if (\n !(flags & 8) &&\n (bytes.readUInt32LE(localOffset + 14) !== checksum ||\n bytes.readUInt32LE(localOffset + 18) !== compressedSize ||\n bytes.readUInt32LE(localOffset + 22) !== size)\n )\n fail('local header CRC/size mismatch');\n checkRange(bytes, dataOffset, compressedSize, centralOffset);\n let dataEnd = dataOffset + compressedSize;\n if (flags & 8) {\n // A descriptor may omit its signature. Use the CRC and both sizes to\n // disambiguate the rare case of an unsigned CRC equal to the signature.\n checkRange(bytes, dataEnd, 12, centralOffset);\n const matches = (at: number): boolean =>\n at + 12 <= centralOffset &&\n bytes.readUInt32LE(at) === checksum &&\n bytes.readUInt32LE(at + 4) === compressedSize &&\n bytes.readUInt32LE(at + 8) === size;\n if (matches(dataEnd)) dataEnd += 12;\n else if (bytes.readUInt32LE(dataEnd) === 0x08074b50 && matches(dataEnd + 4)) dataEnd += 16;\n else fail('data descriptor CRC/size mismatch');\n }\n ranges.push({ start: localOffset, end: dataEnd });\n const compressed = bytes.subarray(dataOffset, dataOffset + compressedSize);\n let data: Buffer;\n if (method === 0) {\n if (compressedSize !== size) fail('stored entry compressed/uncompressed size mismatch');\n data = Buffer.from(compressed);\n } else {\n try {\n data = inflateRawSync(compressed, { maxOutputLength: Math.max(1, size) });\n } catch (error) {\n return fail(\n `cannot inflate entry ${JSON.stringify(name)} within declared size: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n if (data.length !== size) fail(`uncompressed size mismatch for ${JSON.stringify(name)}`);\n if (crc32(data) !== checksum) fail(`CRC32 mismatch for ${JSON.stringify(name)}`);\n if (name && !name.endsWith('/')) result.set(name, data);\n }\n if (offset !== eocd) fail('central directory entry count/length mismatch');\n ranges.sort((a, b) => a.start - b.start);\n for (let i = 1; i < ranges.length; i++)\n if (ranges[i]!.start < ranges[i - 1]!.end) fail('overlapping local entry ranges');\n return result;\n};\n","/** Native RFC 3284 VCDIFF decoder with the xdelta3 Adler32/app-header extensions.\n * Supports the same default-table, uncompressed format as PleOps.XdeltaSharp 1.3.0.\n * Secondary compression and custom code tables are explicitly unsupported there too.\n */\nconst UINT32_MAX = 0xffffffff;\nconst fail = (message: string): never => {\n throw new Error(`VCDIFF: ${message}`);\n};\n\nclass Reader {\n pos = 0;\n constructor(\n readonly bytes: Buffer,\n readonly label = 'patch',\n ) {}\n get remaining() {\n return this.bytes.length - this.pos;\n }\n byte() {\n if (!this.remaining) fail(`truncated ${this.label}`);\n return this.bytes[this.pos++]!;\n }\n integer(): number {\n let value = 0;\n for (let count = 0; count < 5; count++) {\n const byte = this.byte();\n value = value * 128 + (byte & 127);\n if (value > UINT32_MAX) fail(`integer exceeds 32-bit limit in ${this.label}`);\n if (!(byte & 128)) return value;\n }\n return fail(`invalid variable-length integer in ${this.label}`);\n }\n take(size: number): Buffer {\n if (size > this.remaining)\n fail(`truncated ${this.label}: requested ${size} bytes, ${this.remaining} remain`);\n const result = this.bytes.subarray(this.pos, this.pos + size);\n this.pos += size;\n return result;\n }\n}\n\n// RFC 3284 section 5.6: (operation, size, COPY address mode), up to two per opcode.\ntype Operation = { type: 'ADD' | 'RUN' | 'COPY'; size: number; mode: number };\nconst table: Operation[][] = [];\nconst op = (type: Operation['type'], size: number, mode = 0): Operation => ({ type, size, mode });\ntable.push([op('RUN', 0)]);\nfor (let size = 0; size <= 17; size++) table.push([op('ADD', size)]);\nfor (let mode = 0; mode <= 8; mode++) {\n table.push([op('COPY', 0, mode)]);\n for (let size = 4; size <= 18; size++) table.push([op('COPY', size, mode)]);\n}\nfor (let mode = 0; mode <= 5; mode++) {\n for (let add = 1; add <= 4; add++) {\n for (let copy = 4; copy <= 6; copy++) table.push([op('ADD', add), op('COPY', copy, mode)]);\n }\n}\nfor (let mode = 6; mode <= 8; mode++) {\n for (let add = 1; add <= 4; add++) table.push([op('ADD', add), op('COPY', 4, mode)]);\n}\nfor (let mode = 0; mode <= 8; mode++) table.push([op('COPY', 4, mode), op('ADD', 1)]);\n\nfunction adler32(bytes: Uint8Array): number {\n let a = 1,\n b = 0;\n for (let start = 0; start < bytes.length; start += 5552) {\n const end = Math.min(start + 5552, bytes.length);\n for (let i = start; i < end; i++) {\n a += bytes[i]!;\n b += a;\n }\n a %= 65521;\n b %= 65521;\n }\n return (b * 65536 + a) >>> 0;\n}\n\nfunction asBuffer(value: Uint8Array, name: string): Buffer {\n if (!(value instanceof Uint8Array)) throw new TypeError(`${name} must be a Buffer or Uint8Array`);\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength);\n}\nfunction limit(value: number | undefined, fallback: number, name: string): number {\n value ??= fallback;\n if (!Number.isSafeInteger(value) || value < 0 || value > UINT32_MAX)\n throw new RangeError(`${name} must be an integer between 0 and ${UINT32_MAX}`);\n return value;\n}\n\n/**\n * @param {Buffer|Uint8Array} source Original bytes.\n * @param {Buffer|Uint8Array} patch VCDIFF bytes.\n * @param {{maxOutputSize?: number, maxWindowSize?: number}} [options]\n * @returns {Buffer} Decoded target, only returned after all windows/checksums validate.\n */\nexport interface XdeltaOptions {\n maxOutputSize?: number;\n maxWindowSize?: number;\n}\n\nexport const decodeXdelta = (\n source: Uint8Array,\n patch: Uint8Array,\n options: XdeltaOptions = {},\n): Buffer => {\n const sourceBytes = asBuffer(source, 'source');\n const reader = new Reader(asBuffer(patch, 'patch'));\n const maxOutput = limit(options.maxOutputSize, 1024 * 1024 * 1024, 'maxOutputSize');\n const maxWindow = limit(options.maxWindowSize, 16 * 1024 * 1024, 'maxWindowSize');\n if (!reader.take(3).equals(Buffer.from([0xd6, 0xc3, 0xc4]))) fail('invalid file signature');\n if (reader.byte() !== 0) fail('unsupported version (expected 0)');\n const header = reader.byte();\n if (header & ~7) fail('unrecognized header indicator bits');\n if (header & 1)\n fail('secondary compression is unsupported; recreate the patch using xdelta3 -S none');\n if (header & 2) fail('custom code table is unsupported');\n if (header & 4) reader.take(reader.integer());\n const windows: Buffer[] = [];\n let total = 0;\n\n while (reader.remaining) {\n const indicator = reader.byte();\n if (indicator & ~7 || (indicator & 3) === 3)\n fail('invalid window indicator: source and target are mutually exclusive');\n let dictionary: Buffer = Buffer.alloc(0);\n if (indicator & 3) {\n const length = reader.integer();\n const offset = reader.integer();\n const available = indicator & 1 ? sourceBytes.length : total;\n if (offset > available || length > available - offset)\n fail('source segment exceeds available source/target bounds');\n if (indicator & 1) dictionary = sourceBytes.subarray(offset, offset + length);\n else {\n dictionary = Buffer.allocUnsafe(length);\n let base = 0;\n for (const previous of windows) {\n const start = Math.max(offset, base),\n end = Math.min(offset + length, base + previous.length);\n if (end > start) previous.copy(dictionary, start - offset, start - base, end - base);\n base += previous.length;\n if (base >= offset + length) break;\n }\n }\n }\n const deltaLength = reader.integer();\n const delta = new Reader(reader.take(deltaLength), 'delta window');\n const targetLength = delta.integer();\n if (targetLength > maxWindow)\n fail(`window size ${targetLength} exceeds maximum limit ${maxWindow}`);\n if (targetLength > maxOutput - total) fail(`output size exceeds maximum limit ${maxOutput}`);\n if (dictionary.length + targetLength > UINT32_MAX)\n fail('window address space exceeds 32-bit limit');\n const compressed = delta.byte();\n if (compressed & ~7) fail('unrecognized delta indicator bits');\n if (compressed) fail('secondary compression in delta sections is unsupported');\n const dataLength = delta.integer(),\n instructionLength = delta.integer(),\n addressLength = delta.integer();\n const checksum = indicator & 4 ? delta.take(4).readUInt32BE() : null;\n const data = new Reader(delta.take(dataLength), 'data section');\n const instructions = new Reader(delta.take(instructionLength), 'instruction section');\n const addresses = new Reader(delta.take(addressLength), 'address section');\n if (delta.remaining) fail('delta encoding length does not match section lengths');\n const target = Buffer.allocUnsafe(targetLength);\n const near = new Uint32Array(4),\n same = new Uint32Array(768);\n let nearIndex = 0,\n position = 0;\n while (instructions.remaining) {\n const operations = table[instructions.byte()]!;\n for (const { type, size: fixedSize, mode } of operations) {\n const size = fixedSize || instructions.integer();\n if (size > targetLength - position) fail(`${type} size exceeds target window length`);\n if (type === 'ADD') {\n data.take(size).copy(target, position);\n } else if (type === 'RUN') {\n target.fill(data.byte(), position, position + size);\n } else {\n const here = dictionary.length + position;\n let address;\n if (mode === 0) address = addresses.integer();\n else if (mode === 1) address = here - addresses.integer();\n else if (mode < 6) address = near[mode - 2]! + addresses.integer();\n else address = same[(mode - 6) * 256 + addresses.byte()]!;\n if (address < 0 || address >= here)\n fail(`COPY address ${address} is outside decoded address space ${here}`);\n near[nearIndex] = address;\n nearIndex = (nearIndex + 1) % near.length;\n same[address % same.length] = address;\n let copied = 0;\n if (address < dictionary.length) {\n copied = Math.min(size, dictionary.length - address);\n dictionary.copy(target, position, address, address + copied);\n }\n // Copy only already available bytes per iteration. Doubling handles overlap\n // (including a copy crossing from dictionary to current target) efficiently.\n const from = Math.max(0, address - dictionary.length);\n while (copied < size) {\n const count = Math.min(size - copied, position + copied - from);\n if (count <= 0) fail('COPY references unavailable target bytes');\n target.copy(target, position + copied, from, from + count);\n copied += count;\n }\n }\n position += size;\n }\n }\n if (position !== targetLength)\n fail(`target window length mismatch: decoded ${position}, expected ${targetLength}`);\n if (data.remaining || addresses.remaining) fail('unused bytes in data/address section');\n if (checksum !== null && adler32(target) !== checksum) fail('Adler32 checksum mismatch');\n windows.push(target);\n total += targetLength;\n }\n return Buffer.concat(windows, total);\n};\n","// Native TypeScript port of NitroPatchHelper/PatchHelper.cs, GPL-3.0.\nimport { hashDigest, readFile } from '#nitro-runtime';\nimport { bytes } from './nitro/binary';\nimport { NDSFile } from './nitro/nds-file';\nimport { readZip } from './patch/zip';\nimport { decodeXdelta } from './patch/xdelta';\n\nexport const PatchReturnValue = Object.freeze({\n SUCCESS: 'SUCCESS',\n MD5_MISMATCH: 'MD5_MISMATCH',\n} as const);\nexport type PatchReturnValue = (typeof PatchReturnValue)[keyof typeof PatchReturnValue];\n\nexport interface PatchResult {\n /** Generated ROM bytes. Also returned when the MD5 does not match, as in the original helper. */\n buffer: Buffer;\n returnValue: PatchReturnValue;\n /** MD5 of the original input, before preprocessing. */\n inputMd5: string;\n outputMd5: string;\n}\n\nexport interface PatchOptions {\n /** Maximum generated ROM/Xdelta target size in bytes, default 1 GiB. */\n maxOutputSize?: number;\n /** Maximum target size of an individual VCDIFF window, default 16 MiB. */\n maxWindowSize?: number;\n /** Maximum total uncompressed ZIP bytes, default 1 GiB. */\n maxUncompressedSize?: number;\n /** Maximum ZIP entry count. */\n maxEntries?: number;\n}\n\nexport interface PatchMetadata {\n id?: string;\n author?: string;\n name?: string;\n homepage?: string;\n version?: string;\n isBeta?: boolean;\n}\n\nexport interface PatchReadme {\n format: 'markdown' | 'plaintext';\n content: string;\n}\n\nexport interface PatchInfo {\n metadata: PatchMetadata | null;\n readme: PatchReadme | null;\n}\n\nconst md5 = (data: Uint8Array): string => hashDigest('md5', data).toString('hex');\nconst invalidMetadata = (message: string): null => {\n console.warn(`忽略 metadata.json:${message}`);\n return null;\n};\nconst invalidMetadataField = (field: keyof PatchMetadata, message: string): void => {\n console.warn(`忽略 metadata.json 的 ${field}:${message}`);\n};\n\nconst readMetadata = (files: Map<string, Buffer>): PatchMetadata | null => {\n const file = files.get('metadata.json');\n if (!file) return null;\n\n let metadata: unknown;\n try {\n metadata = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(file));\n } catch (error) {\n return invalidMetadata(\n `格式错误,可能是因为补丁包已损坏:${error instanceof Error ? error.message : String(error)}`,\n );\n }\n if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata))\n return invalidMetadata('根节点必须是对象。');\n\n const value = metadata as Record<string, unknown>;\n const result: PatchMetadata = {};\n for (const field of ['id', 'author', 'name', 'homepage', 'version'] as const) {\n if (typeof value[field] === 'string') result[field] = value[field];\n else invalidMetadataField(field, '必须是字符串。');\n }\n if (typeof value.isBeta === 'boolean') result.isBeta = value.isBeta;\n else invalidMetadataField('isBeta', '必须是布尔值。');\n\n return result;\n};\n\nconst readReadme = (files: Map<string, Buffer>): PatchReadme | null => {\n for (const [filename, format] of [\n ['README.md', 'markdown'],\n ['README.txt', 'plaintext'],\n ] as const) {\n const file = files.get(filename.toLowerCase());\n if (!file) continue;\n try {\n return {\n format,\n content: new TextDecoder('utf-8', { fatal: true }).decode(file),\n };\n } catch (error) {\n console.warn(\n `忽略 ${filename}:不是有效的 UTF-8 文本:${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return null;\n};\n\n/** Read and validate metadata.json from a NitroPatcher ZIP package. */\nexport const readPatchMetadata = (\n patch: Uint8Array,\n options: PatchOptions = {},\n): PatchMetadata | null => readMetadata(readZip(patch, options));\n\n/** Read a root README.md or README.txt from a NitroPatcher ZIP package. */\nexport const readPatchReadme = (\n patch: Uint8Array,\n options: PatchOptions = {},\n): PatchReadme | null => readReadme(readZip(patch, options));\n\n/** Read metadata and README content while parsing the patch package only once. */\nexport const readPatchInfo = (patch: Uint8Array, options: PatchOptions = {}): PatchInfo => {\n const files = readZip(patch, options);\n return { metadata: readMetadata(files), readme: readReadme(files) };\n};\n\n/** Read metadata.json from a NitroPatcher ZIP package on disk. */\nexport const readPatchMetadataFile = async (\n patchPath: string,\n options: PatchOptions = {},\n): Promise<PatchMetadata | null> => readPatchMetadata(await readFile(patchPath), options);\n\n/** Read a patch README from disk. */\nexport const readPatchReadmeFile = async (\n patchPath: string,\n options: PatchOptions = {},\n): Promise<PatchReadme | null> => readPatchReadme(await readFile(patchPath), options);\n\n/** Read patch metadata and README content from disk. */\nexport const readPatchInfoFile = async (\n patchPath: string,\n options: PatchOptions = {},\n): Promise<PatchInfo> => readPatchInfo(await readFile(patchPath), options);\n\n/** Apply an existing NitroPatcher ZIP package entirely in memory. */\nexport const patchBuffer = (\n original: Uint8Array,\n patch: Uint8Array,\n options: PatchOptions = {},\n): PatchResult => {\n const input = bytes(original, 'original ROM');\n const patches = readZip(patch, options);\n const inputMd5 = md5(input);\n const preprocessing = patches.get(`preprocessing/${inputMd5}.xdelta`);\n const rom = new NDSFile(\n preprocessing ? decodeXdelta(input, preprocessing, options) : input,\n options,\n );\n let matched = true;\n const md5File = patches.get('md5.txt');\n if (md5File) {\n matched = false;\n for (const line of md5File.toString('utf8').split('\\n')) {\n const expected = line.trim();\n if (!expected || expected.startsWith('#')) continue;\n // Keep the original format contract: exactly 32 characters, case-insensitive comparison.\n if (expected.length !== 32) throw new Error('md5.txt 格式错误,可能是因为补丁包已损坏。');\n if (expected.toLowerCase() === inputMd5) {\n matched = true;\n break;\n }\n }\n }\n for (const { path } of rom.listFiles()) {\n const normalized = path.replaceAll('\\\\', '/').toLowerCase();\n const delta = patches.get(`xdelta/${normalized}`);\n const replacement = delta\n ? decodeXdelta(rom.getFile(path), delta, options)\n : patches.get(normalized);\n if (replacement) rom.replaceFile(path, replacement);\n }\n const buffer = rom.toBuffer();\n return {\n buffer,\n returnValue: matched ? PatchReturnValue.SUCCESS : PatchReturnValue.MD5_MISMATCH,\n inputMd5,\n outputMd5: md5(buffer),\n };\n};\n\n/** Read input files and apply the patch. Does not write an output file. */\nexport const patchIt = async (\n originalPath: string,\n patchPath: string,\n options: PatchOptions = {},\n): Promise<PatchResult> => {\n const [original, patch] = await Promise.all([readFile(originalPath), readFile(patchPath)]);\n return patchBuffer(original, patch, options);\n};\n\n/** Namespaced counterpart of the original C# helper, sharing the same typed functions. */\nexport const PatchHelper = Object.freeze({\n patchBuffer,\n patchIt,\n readPatchInfo,\n readPatchInfoFile,\n readPatchMetadata,\n readPatchMetadataFile,\n readPatchReadme,\n readPatchReadmeFile,\n});\nexport { decodeXdelta } from './patch/xdelta';\nexport type { XdeltaOptions } from './patch/xdelta';\n"],"mappings":"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","names":["bytes","offset","fail","bytes","filename"]}