pure-md5 0.2.0 → 0.2.2

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.
Files changed (177) hide show
  1. package/README.md +38 -24
  2. package/dist/adapters/ie11.cjs +1 -2
  3. package/dist/adapters/ie11.js +1 -2
  4. package/dist/adapters/node.cjs +1 -2
  5. package/dist/adapters/node.js +1 -2
  6. package/dist/adapters/webcrypto.cjs +1 -2
  7. package/dist/adapters/webcrypto.js +1 -2
  8. package/dist/index.cjs +1 -2
  9. package/dist/index.d.ts +149 -5
  10. package/dist/index.js +3 -2
  11. package/dist/md5.cjs +1 -0
  12. package/dist/md5.d.ts +20 -0
  13. package/dist/md5.js +1 -0
  14. package/dist/stream/md5-stream.cjs +1 -2
  15. package/dist/stream/md5-stream.js +1 -2
  16. package/dist/stream/whatwg-stream.cjs +1 -2
  17. package/dist/stream/whatwg-stream.js +1 -2
  18. package/dist/utils/detect.cjs +1 -2
  19. package/dist/utils/detect.js +3 -2
  20. package/package.json +10 -15
  21. package/pure-md5-0.2.1.tgz +0 -0
  22. package/test-tree-shake.mjs +12 -0
  23. package/.aliases +0 -19
  24. package/.bash_profile +0 -12
  25. package/.bash_prompt +0 -56
  26. package/.changeset/README.md +0 -32
  27. package/.changeset/config.json +0 -16
  28. package/.continue/mcpServers/new-mcp-server.yaml +0 -10
  29. package/.continue/rules +0 -29
  30. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -35
  31. package/.github/ISSUE_TEMPLATE/documentation.md +0 -20
  32. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  33. package/.github/PULL_REQUEST_TEMPLATE.md +0 -35
  34. package/.github/workflows/npm-publish.yml +0 -33
  35. package/.github/workflows/release.yml +0 -42
  36. package/CHANGELOG.md +0 -9
  37. package/CONTRIBUTING.md +0 -203
  38. package/MIGRATION_GUIDE_STREAMS.md +0 -374
  39. package/STREAM_API.md +0 -582
  40. package/STREAM_BENCHMARKS.md +0 -232
  41. package/STREAM_EXAMPLES.md +0 -669
  42. package/STREAM_OPTIMIZATION_REPORT.md +0 -136
  43. package/STREAM_TROUBLESHOOTING.md +0 -537
  44. package/WEB_CRYPTO_TESTS_SUMMARY.md +0 -140
  45. package/WHATWG_STREAMS.md +0 -191
  46. package/__tests__/adapters/node-crypto.test.ts +0 -167
  47. package/__tests__/adapters/web-crypto-node.test.ts +0 -73
  48. package/__tests__/adapters/web-crypto.test.ts +0 -195
  49. package/__tests__/add32.test.ts +0 -33
  50. package/__tests__/fallback.test.ts +0 -345
  51. package/__tests__/hex.test.ts +0 -38
  52. package/__tests__/hex_chr.test.ts +0 -20
  53. package/__tests__/index.test.ts +0 -87
  54. package/__tests__/integration/fixtures/test-file.txt +0 -1
  55. package/__tests__/integration/md5-stream-file.test.ts +0 -293
  56. package/__tests__/integration/node-crypto-file.test.ts +0 -86
  57. package/__tests__/integration/web-crypto.test.ts +0 -38
  58. package/__tests__/md51.test.ts +0 -73
  59. package/__tests__/md5block.test.ts +0 -61
  60. package/__tests__/md5cycle.test.ts +0 -48
  61. package/__tests__/round-functions.test.ts +0 -87
  62. package/__tests__/stream/fs-utils.test.ts +0 -209
  63. package/__tests__/stream/md5-stream-edge-cases.test.ts +0 -461
  64. package/__tests__/stream/md5-stream.test.ts +0 -418
  65. package/__tests__/stream/whatwg-stream.test.ts +0 -355
  66. package/__tests__/stream/whatwg-stream.test.ts.bak2 +0 -335
  67. package/benchmarks/md5-stream.bench.ts +0 -212
  68. package/benchmarks/whatwg-stream.bench.ts +0 -180
  69. package/dist/adapters/ie11.cjs.map +0 -1
  70. package/dist/adapters/ie11.js.map +0 -1
  71. package/dist/adapters/node.cjs.map +0 -1
  72. package/dist/adapters/node.js.map +0 -1
  73. package/dist/adapters/webcrypto.cjs.map +0 -1
  74. package/dist/adapters/webcrypto.js.map +0 -1
  75. package/dist/chunk-2YXXFGBV.js +0 -2
  76. package/dist/chunk-2YXXFGBV.js.map +0 -1
  77. package/dist/chunk-4KSCMS4Q.js +0 -2
  78. package/dist/chunk-4KSCMS4Q.js.map +0 -1
  79. package/dist/chunk-6P2QV5SR.js +0 -4
  80. package/dist/chunk-6P2QV5SR.js.map +0 -1
  81. package/dist/chunk-G5WHEAIQ.js +0 -2
  82. package/dist/chunk-G5WHEAIQ.js.map +0 -1
  83. package/dist/chunk-H2K353LR.js +0 -2
  84. package/dist/chunk-H2K353LR.js.map +0 -1
  85. package/dist/chunk-JKVD5LHZ.js +0 -2
  86. package/dist/chunk-JKVD5LHZ.js.map +0 -1
  87. package/dist/chunk-NWQ4N5RX.js +0 -2
  88. package/dist/chunk-NWQ4N5RX.js.map +0 -1
  89. package/dist/chunk-PHZ7FTYF.js +0 -2
  90. package/dist/chunk-PHZ7FTYF.js.map +0 -1
  91. package/dist/chunk-PNZTVQA7.js +0 -2
  92. package/dist/chunk-PNZTVQA7.js.map +0 -1
  93. package/dist/chunk-R4JB5MBR.js +0 -2
  94. package/dist/chunk-R4JB5MBR.js.map +0 -1
  95. package/dist/chunk-VFOAY6XI.js +0 -2
  96. package/dist/chunk-VFOAY6XI.js.map +0 -1
  97. package/dist/chunk-XB5BQIEX.js +0 -2
  98. package/dist/chunk-XB5BQIEX.js.map +0 -1
  99. package/dist/core/index.cjs +0 -2
  100. package/dist/core/index.cjs.map +0 -1
  101. package/dist/core/index.d.cts +0 -19
  102. package/dist/core/index.d.ts +0 -19
  103. package/dist/core/index.js +0 -2
  104. package/dist/core/index.js.map +0 -1
  105. package/dist/index.cjs.map +0 -1
  106. package/dist/index.d.cts +0 -84
  107. package/dist/index.js.map +0 -1
  108. package/dist/stream/adapter.cjs +0 -2
  109. package/dist/stream/adapter.cjs.map +0 -1
  110. package/dist/stream/adapter.d.cts +0 -63
  111. package/dist/stream/adapter.d.ts +0 -63
  112. package/dist/stream/adapter.js +0 -2
  113. package/dist/stream/adapter.js.map +0 -1
  114. package/dist/stream/fs-utils.cjs +0 -2
  115. package/dist/stream/fs-utils.cjs.map +0 -1
  116. package/dist/stream/fs-utils.d.cts +0 -137
  117. package/dist/stream/fs-utils.d.ts +0 -137
  118. package/dist/stream/fs-utils.js +0 -2
  119. package/dist/stream/fs-utils.js.map +0 -1
  120. package/dist/stream/index.cjs +0 -2
  121. package/dist/stream/index.cjs.map +0 -1
  122. package/dist/stream/index.d.cts +0 -4
  123. package/dist/stream/index.d.ts +0 -4
  124. package/dist/stream/index.js +0 -2
  125. package/dist/stream/index.js.map +0 -1
  126. package/dist/stream/light/index.cjs +0 -2
  127. package/dist/stream/light/index.cjs.map +0 -1
  128. package/dist/stream/light/index.d.cts +0 -4
  129. package/dist/stream/light/index.d.ts +0 -4
  130. package/dist/stream/light/index.js +0 -2
  131. package/dist/stream/light/index.js.map +0 -1
  132. package/dist/stream/md5-stream.cjs.map +0 -1
  133. package/dist/stream/md5-stream.js.map +0 -1
  134. package/dist/stream/whatwg-stream.cjs.map +0 -1
  135. package/dist/stream/whatwg-stream.js.map +0 -1
  136. package/dist/types-edGoGJ5V.d.cts +0 -42
  137. package/dist/types-edGoGJ5V.d.ts +0 -42
  138. package/dist/utils/detect.cjs.map +0 -1
  139. package/dist/utils/detect.js.map +0 -1
  140. package/planning/03-optimization-size-tree-shaking/01-es-modules-tree-shaking.md +0 -152
  141. package/planning/03-optimization-size-tree-shaking/02-consolidate-modules.md +0 -65
  142. package/planning/03-optimization-size-tree-shaking/03-remove-duplicate-add32.md +0 -93
  143. package/planning/03-optimization-size-tree-shaking/04-remove-runtime-check.md +0 -102
  144. package/planning/03-optimization-size-tree-shaking/05-optimize-loops-performance.md +0 -107
  145. package/planning/03-optimization-size-tree-shaking/06-tsup-formats-configuration.md +0 -227
  146. package/planning/03-optimization-size-tree-shaking/07-multiple-build-formats.md +0 -228
  147. package/planning/03-optimization-size-tree-shaking/08-benchmarks-metrics.md +0 -34
  148. package/planning/03-optimization-size-tree-shaking/MIGRATION_GUIDE.md +0 -260
  149. package/planning/03-optimization-size-tree-shaking/README.md +0 -173
  150. package/planning/03-optimization-size-tree-shaking/SUMMARY.md +0 -168
  151. package/planning/04-adapter-backend/03-backend-web-crypto.md +0 -149
  152. package/planning/04-adapter-backend/04-backend-node-crypto.md +0 -181
  153. package/planning/04-adapter-backend/05-backend-pure-js.md +0 -174
  154. package/planning/04-adapter-backend/06-backend-ie11.md +0 -158
  155. package/planning/04-adapter-backend/07-detection-environment.md +0 -232
  156. package/planning/04-adapter-backend/08-detection-backend.md +0 -210
  157. package/planning/04-adapter-backend/09-adapter-unified.md +0 -255
  158. package/planning/04-adapter-backend/10-fallback-mechanism.md +0 -333
  159. package/planning/04-adapter-backend/11-tests-backend-web-crypto.md +0 -191
  160. package/planning/04-adapter-backend/12-tests-backend-node-crypto.md +0 -222
  161. package/planning/04-adapter-backend/README.md +0 -45
  162. package/planning/05-documentation-publishing/01-README-optimization.md +0 -105
  163. package/planning/05-documentation-publishing/02-VitePress-site-evaluation.md +0 -136
  164. package/planning/05-documentation-publishing/03-Changeset-setup.md +0 -192
  165. package/planning/05-documentation-publishing/04-GitHub-templates.md +0 -252
  166. package/planning/05-documentation-publishing/README.md +0 -22
  167. package/planning/05-documentation-publishing/STATUS.md +0 -222
  168. package/planning/prd.md +0 -405
  169. package/planning/streams/01-create-md5stream-class.md +0 -69
  170. package/planning/streams/02-create-factory-api.md +0 -65
  171. package/planning/streams/03-fs-integration.md +0 -37
  172. package/planning/streams/04-whatwg-streams-support.md +0 -37
  173. package/planning/streams/05-audit-optimization.md +0 -121
  174. package/planning/streams/06-comprehensive-tests-docs.md +0 -137
  175. package/planning/streams/07-architecture-integration.md +0 -38
  176. package/planning/streams/README.md +0 -98
  177. package/tsup.config.ts +0 -24
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/add32.ts","../../src/round-functions.ts","../../src/md5cycle.ts","../../src/hex_chr.ts","../../src/hex.ts","../../src/stream/whatwg-stream.ts"],"names":["add32","x","y","add32_default","cmn1","q","a","t","fn","add","cmn2","s","b","result","cmn","ff","c","d","gg","hh","ii","md5cycle","k","fff","ggg","hhh","iii","md5cycle_default","hex_chr","hex_chr_default","rhex","n","j","hex","l","i","hex_default","initialMD5State","MD5ReadableStream","_MD5ReadableStream","source","options","resolve","readable","writable","chunk","controller","_controller","error","data","dataLength","currentBufferLength","neededBytes","bytesToCopy","remainingData","newData","fullBlocks","blockStart","block","idx","remaining","buffer","state","bufferLength","tail","digest","stream","reader","reject","bytesProcessed","process","done","value","file","blob","event","arrayBuffer","createMD5ReadableStream","hashReadableStream","hashStream","totalBytes","hashFile","hashBlob","consumeWithMD5"],"mappings":"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","file":"whatwg-stream.cjs","sourcesContent":["function add32(x: number, y: number): number {\n //let lsw = (x & 0xffff) + (y & 0xffff);\n //let msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n //return (msw << 16) | (lsw & 0xffff);\n return (x + y) & 0xffffffff;\n}\n\nexport default add32;\n","import add32 from './add32';\n\ntype Add32Function = (x: number, y: number) => number;\n\nfunction cmn1(q: number, a: number, x: number, t: number, fn?: Add32Function) {\n const add = fn || add32;\n a = add(add(a, q), add(x, t));\n return a;\n}\n\nfunction cmn2(a: number, s: number, b: number, fn?: Add32Function) {\n const add = fn || add32;\n var result = add((a << s) | (a >>> (32 - s)), b);\n return result;\n}\n\nfunction cmn(\n q: number,\n a: number,\n b: number,\n x: number,\n s: number,\n t: number,\n fn?: Add32Function\n) {\n a = cmn1(q, a, x, t, fn);\n return cmn2(a, s, b, fn);\n}\n\nexport function ff(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn((b & c) | (~b & d), a, b, x, s, t, fn);\n}\n\nexport function gg(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn((b & d) | (c & ~d), a, b, x, s, t, fn);\n}\n\nexport function hh(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn(b ^ c ^ d, a, b, x, s, t, fn);\n}\n\nexport function ii(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn(c ^ (b | ~d), a, b, x, s, t, fn);\n}\n","import add32 from './add32';\nimport { ff, gg, hh, ii } from './round-functions';\n\ntype Add32Function = (x: number, y: number) => number;\n\nfunction md5cycle(x: number[], k: number[], fn?: Add32Function): void {\n if (typeof fn === 'undefined') {\n fn = add32;\n }\n let a = x[0];\n let b = x[1];\n let c = x[2];\n let d = x[3];\n\n const fff = ff.bind(null, fn);\n a = fff(a, b, c, d, k[0], 7, -680876936);\n d = fff(d, a, b, c, k[1], 12, -389564586);\n c = fff(c, d, a, b, k[2], 17, 606105819);\n b = fff(b, c, d, a, k[3], 22, -1044525330);\n a = fff(a, b, c, d, k[4], 7, -176418897);\n d = fff(d, a, b, c, k[5], 12, 1200080426);\n c = fff(c, d, a, b, k[6], 17, -1473231341);\n b = fff(b, c, d, a, k[7], 22, -45705983);\n a = fff(a, b, c, d, k[8], 7, 1770035416);\n d = fff(d, a, b, c, k[9], 12, -1958414417);\n c = fff(c, d, a, b, k[10], 17, -42063);\n b = fff(b, c, d, a, k[11], 22, -1990404162);\n a = fff(a, b, c, d, k[12], 7, 1804603682);\n d = fff(d, a, b, c, k[13], 12, -40341101);\n c = fff(c, d, a, b, k[14], 17, -1502002290);\n b = fff(b, c, d, a, k[15], 22, 1236535329);\n\n const ggg = gg.bind(null, fn);\n a = ggg(a, b, c, d, k[1], 5, -165796510);\n d = ggg(d, a, b, c, k[6], 9, -1069501632);\n c = ggg(c, d, a, b, k[11], 14, 643717713);\n b = ggg(b, c, d, a, k[0], 20, -373897302);\n a = ggg(a, b, c, d, k[5], 5, -701558691);\n d = ggg(d, a, b, c, k[10], 9, 38016083);\n c = ggg(c, d, a, b, k[15], 14, -660478335);\n b = ggg(b, c, d, a, k[4], 20, -405537848);\n a = ggg(a, b, c, d, k[9], 5, 568446438);\n d = ggg(d, a, b, c, k[14], 9, -1019803690);\n c = ggg(c, d, a, b, k[3], 14, -187363961);\n b = ggg(b, c, d, a, k[8], 20, 1163531501);\n a = ggg(a, b, c, d, k[13], 5, -1444681467);\n d = ggg(d, a, b, c, k[2], 9, -51403784);\n c = ggg(c, d, a, b, k[7], 14, 1735328473);\n b = ggg(b, c, d, a, k[12], 20, -1926607734);\n\n const hhh = hh.bind(null, fn);\n a = hhh(a, b, c, d, k[5], 4, -378558);\n d = hhh(d, a, b, c, k[8], 11, -2022574463);\n c = hhh(c, d, a, b, k[11], 16, 1839030562);\n b = hhh(b, c, d, a, k[14], 23, -35309556);\n a = hhh(a, b, c, d, k[1], 4, -1530992060);\n d = hhh(d, a, b, c, k[4], 11, 1272893353);\n c = hhh(c, d, a, b, k[7], 16, -155497632);\n b = hhh(b, c, d, a, k[10], 23, -1094730640);\n a = hhh(a, b, c, d, k[13], 4, 681279174);\n d = hhh(d, a, b, c, k[0], 11, -358537222);\n c = hhh(c, d, a, b, k[3], 16, -722521979);\n b = hhh(b, c, d, a, k[6], 23, 76029189);\n a = hhh(a, b, c, d, k[9], 4, -640364487);\n d = hhh(d, a, b, c, k[12], 11, -421815835);\n c = hhh(c, d, a, b, k[15], 16, 530742520);\n b = hhh(b, c, d, a, k[2], 23, -995338651);\n\n const iii = ii.bind(null, fn);\n a = iii(a, b, c, d, k[0], 6, -198630844);\n d = iii(d, a, b, c, k[7], 10, 1126891415);\n c = iii(c, d, a, b, k[14], 15, -1416354905);\n b = iii(b, c, d, a, k[5], 21, -57434055);\n a = iii(a, b, c, d, k[12], 6, 1700485571);\n d = iii(d, a, b, c, k[3], 10, -1894986606);\n c = iii(c, d, a, b, k[10], 15, -1051523);\n b = iii(b, c, d, a, k[1], 21, -2054922799);\n a = iii(a, b, c, d, k[8], 6, 1873313359);\n d = iii(d, a, b, c, k[15], 10, -30611744);\n c = iii(c, d, a, b, k[6], 15, -1560198380);\n b = iii(b, c, d, a, k[13], 21, 1309151649);\n a = iii(a, b, c, d, k[4], 6, -145523070);\n d = iii(d, a, b, c, k[11], 10, -1120210379);\n c = iii(c, d, a, b, k[2], 15, 718787259);\n b = iii(b, c, d, a, k[9], 21, -343485551);\n\n x[0] = fn(a, x[0]);\n x[1] = fn(b, x[1]);\n x[2] = fn(c, x[2]);\n x[3] = fn(d, x[3]);\n}\n\nexport default md5cycle;\n","const hex_chr: string[] = \"0123456789abcdef\".split(\"\");\n\nexport default hex_chr;\n","import hex_chr from './hex_chr';\n\nfunction rhex(n: number): string {\n let s = '';\n for (let j = 0; j < 4; j++)\n s += hex_chr[(n >> (j * 8 + 4)) & 0x0f] + hex_chr[(n >> (j * 8)) & 0x0f];\n return s;\n}\n\nfunction hex(x: number[]): string {\n const l = x.length;\n const result: string[] = new Array(l);\n for (let i = 0; i < l; i++) result[i] = rhex(x[i]);\n return result.join('');\n}\n\nexport default hex;\n","/**\n * WHATWG Streams support for browser environments\n * Provides streaming MD5 hashing for ReadableStream, File, and Blob objects\n */\n\nimport md5cycle from '../md5cycle';\nimport hex from '../hex';\nimport add32 from '../add32';\n\n/**\n * Result type for MD5 computation\n */\nexport interface MD5Result {\n /**\n * MD5 hash as hex string\n */\n digest: string;\n /**\n * Number of bytes processed\n */\n bytesProcessed: number;\n}\n\n/**\n * Interface for WHATWG Streams MD5 options\n */\nexport interface MD5ReadableStreamOptions {\n /**\n * Custom add32 function for compatibility testing\n */\n add32?: (x: number, y: number) => number;\n}\n\n/**\n * Internal state interface for MD5 computation\n */\nexport interface MD5State {\n state: number[];\n bytesProcessed: number;\n bufferLength: number;\n buffer: Uint8Array;\n}\n\n/**\n * Internal state values\n */\nconst initialMD5State = [1732584193, -271733879, -1732584194, 271733878];\n\n/**\n * MD5ReadableStream - Wrapper for computing MD5 hashes while reading from a ReadableStream\n * \n * This class wraps a ReadableStream and computes MD5 hash while reading data.\n * It follows the ReadableStream API pattern for browser environments.\n */\nexport class MD5ReadableStream {\n private sourceStream: ReadableStream;\n private state: MD5State;\n private add32: (x: number, y: number) => number;\n private result: MD5Result | null = null;\n private resultResolver: ((result: MD5Result) => void) | null = null;\n private resultPromise: Promise<MD5Result>;\n private consumed: boolean = false;\n private readonly bufferCapacity: number = 64;\n private buffer: Uint8Array = new Uint8Array(this.bufferCapacity);\n\n /**\n * Create new MD5ReadableStream instance\n * @param source - Source ReadableStream to hash\n * @param options - Stream options\n */\n constructor(\n source: ReadableStream,\n options: MD5ReadableStreamOptions = {}\n ) {\n this.sourceStream = source;\n \n this.state = {\n state: [...initialMD5State],\n bytesProcessed: 0,\n bufferLength: 0,\n buffer: this.buffer\n };\n \n this.add32 = options.add32 || add32;\n\n // Create promise for result\n this.resultPromise = new Promise<MD5Result>((resolve) => {\n this.resultResolver = resolve;\n });\n }\n\n /**\n * Get a reader for this stream\n * @returns ReadableStreamDefaultReader\n */\n getReader(): ReadableStreamDefaultReader<Uint8Array> {\n if (this.consumed) {\n throw new Error('Cannot get reader from MD5ReadableStream: stream has already been consumed');\n }\n this.consumed = true;\n \n // Create a new stream that processes data and computes MD5\n const { readable, writable } = new TransformStream({\n transform: async (chunk, controller) => {\n await this.processChunk(chunk);\n controller.enqueue(chunk);\n },\n flush: async (_controller) => {\n this.finalize();\n if (this.resultResolver) {\n this.resultResolver(this.result!);\n }\n }\n });\n \n // Pipe source stream to our transform stream\n this.sourceStream.pipeTo(writable).catch((error) => {\n console.error('Error piping stream:', error);\n if (this.resultResolver) {\n this.resultResolver({\n digest: '',\n bytesProcessed: this.state.bytesProcessed\n });\n }\n });\n \n return readable.getReader();\n }\n\n /**\n * Process a data chunk and update MD5 state\n * @param chunk - Data chunk (ArrayBuffer or Uint8Array)\n */\n private async processChunk(\n chunk: ArrayBuffer | Uint8Array | Blob\n ): Promise<void> {\n let data: Uint8Array;\n\n // Convert Blob to ArrayBuffer if needed\n if (chunk instanceof Blob) {\n data = new Uint8Array(await chunk.arrayBuffer());\n } else if (chunk instanceof ArrayBuffer) {\n data = new Uint8Array(chunk);\n } else {\n data = chunk;\n }\n\n // Process the data\n const dataLength = data.length;\n \n if (dataLength === 0) {\n return;\n }\n\n // Combine with remaining buffer if needed\n if (this.state.bufferLength > 0) {\n const currentBufferLength = this.state.bufferLength;\n const neededBytes = 64 - currentBufferLength;\n const bytesToCopy = Math.min(dataLength, neededBytes);\n \n // Copy data to buffer\n for (let i = 0; i < bytesToCopy; i++) {\n this.buffer[currentBufferLength + i] = data[i];\n }\n \n this.state.bufferLength += bytesToCopy;\n \n // If buffer is full, process it\n if (this.state.bufferLength === 64) {\n this._processBufferBlock();\n }\n \n // If we used all data, we're done\n if (bytesToCopy === dataLength) {\n return;\n }\n \n // Move to next position in original data\n // Shift remaining data to beginning of buffer\n const remainingData = dataLength - bytesToCopy;\n const newData = new Uint8Array(remainingData);\n for (let i = 0; i < remainingData; i++) {\n newData[i] = data[bytesToCopy + i];\n }\n data = newData;\n }\n \n // Process full 64-byte blocks directly from data\n const fullBlocks = Math.floor(data.length / 64);\n \n for (let i = 0; i < fullBlocks; i++) {\n const blockStart = i * 64;\n const block: number[] = [];\n \n for (let j = 0; j < 16; j++) {\n const idx = blockStart + j * 4;\n block[j] = \n data[idx] +\n (data[idx + 1] << 8) +\n (data[idx + 2] << 16) +\n (data[idx + 3] << 24);\n }\n \n md5cycle(this.state.state, block, this.add32);\n this.state.bytesProcessed += 64;\n }\n \n // Store remaining bytes in buffer\n const remaining = data.length % 64;\n if (remaining > 0) {\n // Ensure buffer is large enough\n if (this.buffer.length < remaining) {\n this.buffer = new Uint8Array(remaining);\n this.state.buffer = this.buffer;\n }\n \n // Copy remaining bytes to buffer\n for (let i = 0; i < remaining; i++) {\n this.buffer[i] = data[fullBlocks + i];\n }\n this.state.bufferLength = remaining;\n }\n }\n\n /**\n * Process the current buffer as a complete block\n */\n private _processBufferBlock(): void {\n const buffer = this.state.buffer;\n const block: number[] = [];\n \n for (let j = 0; j < 16; j++) {\n const idx = j * 4;\n block[j] = \n buffer[idx] +\n (buffer[idx + 1] << 8) +\n (buffer[idx + 2] << 16) +\n (buffer[idx + 3] << 24);\n }\n \n md5cycle(this.state.state, block, this.add32);\n this.state.bytesProcessed += 64;\n this.state.bufferLength = 0;\n }\n\n /**\n * Finalize MD5 computation\n */\n private finalize(): void {\n const { state, bufferLength, buffer } = this.state;\n \n // Final padding\n const tail: number[] = new Array(16).fill(0);\n \n // Copy remaining buffer\n for (let i = 0; i < bufferLength; i++) {\n tail[i >> 2] |= (buffer[i] & 0xff) << ((i % 4) << 3);\n }\n \n // Append 0x80\n tail[bufferLength >> 2] |= 0x80 << ((bufferLength % 4) << 3);\n \n // If not enough space for length, process current block\n if (bufferLength > 55) {\n md5cycle(state, tail, this.add32);\n for (let i = 0; i < 16; i++) {\n tail[i] = 0;\n }\n }\n \n // Append length (in bits) - include remaining bytes\n tail[14] = (this.state.bytesProcessed + bufferLength) * 8;\n tail[15] = 0; // High 32 bits of length (not used for typical files)\n \n // Final MD5 cycle\n md5cycle(state, tail, this.add32);\n \n // Generate hex digest\n const digest = hex(state);\n \n // Store result\n this.result = {\n digest,\n bytesProcessed: this.state.bytesProcessed + bufferLength\n };\n }\n\n /**\n * Get the MD5 result promise\n * @returns Promise with MD5 result\n */\n public getResult(): Promise<MD5Result> {\n return this.resultPromise;\n }\n\n /**\n * Get current MD5 state (for debugging/testing)\n * @returns Current internal state\n */\n public getCurrentState(): { state: number[]; bytesProcessed: number } {\n return {\n state: [...this.state.state],\n bytesProcessed: this.state.bytesProcessed + this.state.bufferLength\n };\n }\n\n /**\n * Get bytes processed so far\n * @returns Number of bytes processed\n */\n public getBytesProcessed(): number {\n return this.state.bytesProcessed + this.state.bufferLength;\n }\n\n /**\n * Static method to hash a ReadableStream and return MD5 result\n * @param source - Source ReadableStream to hash\n * @param options - Stream options\n * @returns Promise with MD5 result\n */\n static hash(source: ReadableStream, options?: MD5ReadableStreamOptions): Promise<MD5Result> {\n const stream = new MD5ReadableStream(source, options);\n \n // Consume the stream by reading from it\n const reader = stream.getReader();\n \n return new Promise<MD5Result>((resolve, reject) => {\n let bytesProcessed = 0;\n \n reader.read().then(function process({ done, value }: any): void {\n if (done) {\n resolve(stream.getResult());\n return;\n }\n \n bytesProcessed += value.length;\n reader.read().then(process);\n }).catch(reject);\n });\n }\n\n /**\n * Static method to hash a File object\n * @param file - File object to hash\n * @param options - Stream options\n * @returns Promise with MD5 result\n */\n static hashFile(\n file: File,\n options?: MD5ReadableStreamOptions\n ): Promise<MD5Result> {\n // File is already a Blob, so we can use its stream\n const stream = file.stream();\n return MD5ReadableStream.hash(stream, options);\n }\n\n /**\n * Static method to hash a Blob object\n * @param blob - Blob object to hash\n * @param options - Stream options\n * @returns Promise with MD5 result\n */\n static hashBlob(\n blob: Blob,\n options?: MD5ReadableStreamOptions\n ): Promise<MD5Result> {\n // Convert blob to arrayBuffer and process\n return new Promise<MD5Result>((resolve, reject) => {\n const reader = new FileReader();\n \n reader.onload = (event) => {\n try {\n const arrayBuffer = event.target?.result as ArrayBuffer;\n const stream = new ReadableStream({\n start(controller) {\n controller.enqueue(new Uint8Array(arrayBuffer));\n controller.close();\n }\n });\n resolve(MD5ReadableStream.hash(stream, options));\n } catch (error) {\n reject(error);\n }\n };\n \n reader.onerror = () => reject(reader.error);\n reader.readAsArrayBuffer(blob);\n });\n }\n}\n\n/**\n * Factory function to create MD5ReadableStream instance\n * @param source - Source ReadableStream to hash\n * @param options - Stream options\n * @returns New MD5ReadableStream instance\n */\nexport function createMD5ReadableStream(\n source: ReadableStream,\n options?: MD5ReadableStreamOptions\n): MD5ReadableStream {\n return new MD5ReadableStream(source, options);\n}\n\n/**\n * Hash a ReadableStream and return MD5 result\n * @param stream - ReadableStream to hash\n * @param options - Stream options\n * @returns Promise with MD5 result (digest and bytes processed)\n * \n * @example\n * ```ts\n * import { hashReadableStream } from 'pure-md5';\n * \n * const response = await fetch('https://example.com/file.txt');\n * const result = await hashReadableStream(response.body!);\n * console.log('MD5:', result.digest);\n * console.log('Bytes:', result.bytesProcessed);\n * ```\n */\nexport async function hashReadableStream(\n stream: ReadableStream,\n options?: MD5ReadableStreamOptions\n): Promise<MD5Result> {\n const reader = stream.getReader();\n const hashStream = new MD5ReadableStream(stream, options);\n \n // Consume the stream\n let totalBytes = 0;\n while (true) {\n const { done, value } = await reader.read();\n \n if (done) {\n break;\n }\n \n if (value) {\n totalBytes += value.length;\n }\n }\n \n return hashStream.getResult();\n}\n\n/**\n * Hash a File object and return MD5 result\n * @param file - File object to hash\n * @param options - Stream options\n * @returns Promise with MD5 result\n * \n * @example\n * ```ts\n * import { hashFile } from 'pure-md5';\n * \n * const input = document.querySelector('input[type=\"file\"]');\n * input.addEventListener('change', async (e) => {\n * const file = (e.target as HTMLInputElement).files![0];\n * const result = await hashFile(file);\n * console.log('MD5:', result.digest);\n * });\n * ```\n */\nexport async function hashFile(\n file: File,\n options?: MD5ReadableStreamOptions\n): Promise<MD5Result> {\n return MD5ReadableStream.hashFile(file, options);\n}\n\n/**\n * Hash a Blob object and return MD5 result\n * @param blob - Blob object to hash\n * @param options - Stream options\n * @returns Promise with MD5 result\n * \n * @example\n * ```ts\n * import { hashBlob } from 'pure-md5';\n * \n * const canvas = document.querySelector('canvas');\n * canvas.toBlob(async (blob) => {\n * const result = await hashBlob(blob!);\n * console.log('MD5:', result.digest);\n * });\n * ```\n */\nexport async function hashBlob(\n blob: Blob,\n options?: MD5ReadableStreamOptions\n): Promise<MD5Result> {\n return MD5ReadableStream.hashBlob(blob, options);\n}\n\n/**\n * Consume a ReadableStream while computing MD5\n * @param source - Source ReadableStream to consume and hash\n * @param options - Stream options\n * @returns Promise with MD5 result\n */\nexport async function consumeWithMD5(\n source: ReadableStream,\n options?: MD5ReadableStreamOptions\n): Promise<MD5Result> {\n const reader = source.getReader();\n const hashStream = new MD5ReadableStream(source, options);\n \n // Consume the stream\n let totalBytes = 0;\n while (true) {\n const { done, value } = await reader.read();\n \n if (done) {\n break;\n }\n \n if (value) {\n totalBytes += value.length;\n }\n }\n \n return hashStream.getResult();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"whatwg-stream.js"}
@@ -1,42 +0,0 @@
1
- /**
2
- * Backend interface for MD5 operations
3
- */
4
- interface MD5Backend {
5
- /**
6
- * Name of the backend
7
- */
8
- name: string;
9
- /**
10
- * Version of the backend
11
- */
12
- version: string;
13
- /**
14
- * Hash string data
15
- * @param data - String to hash
16
- * @returns MD5 hash as hex string
17
- */
18
- hash(data: string): string | Promise<string>;
19
- /**
20
- * Hash binary data (ArrayBuffer, Uint8Array)
21
- * @param data - Binary data to hash
22
- * @returns MD5 hash as hex string
23
- */
24
- hashBinary(data: ArrayBuffer | Uint8Array): string | Promise<string>;
25
- /**
26
- * Update hash with additional data (for streaming)
27
- * @param data - Data to add to hash
28
- */
29
- update(data: string | ArrayBuffer | Uint8Array): void | Promise<void>;
30
- /**
31
- * Get final hash digest
32
- * @param encoding - Output encoding ('hex' or 'buffer')
33
- * @returns Hash digest
34
- */
35
- digest(encoding?: 'hex' | 'buffer'): string | Uint8Array | Promise<string | Uint8Array>;
36
- /**
37
- * Reset the hash state
38
- */
39
- reset(): void | Promise<void>;
40
- }
41
-
42
- export type { MD5Backend as M };
@@ -1,42 +0,0 @@
1
- /**
2
- * Backend interface for MD5 operations
3
- */
4
- interface MD5Backend {
5
- /**
6
- * Name of the backend
7
- */
8
- name: string;
9
- /**
10
- * Version of the backend
11
- */
12
- version: string;
13
- /**
14
- * Hash string data
15
- * @param data - String to hash
16
- * @returns MD5 hash as hex string
17
- */
18
- hash(data: string): string | Promise<string>;
19
- /**
20
- * Hash binary data (ArrayBuffer, Uint8Array)
21
- * @param data - Binary data to hash
22
- * @returns MD5 hash as hex string
23
- */
24
- hashBinary(data: ArrayBuffer | Uint8Array): string | Promise<string>;
25
- /**
26
- * Update hash with additional data (for streaming)
27
- * @param data - Data to add to hash
28
- */
29
- update(data: string | ArrayBuffer | Uint8Array): void | Promise<void>;
30
- /**
31
- * Get final hash digest
32
- * @param encoding - Output encoding ('hex' or 'buffer')
33
- * @returns Hash digest
34
- */
35
- digest(encoding?: 'hex' | 'buffer'): string | Uint8Array | Promise<string | Uint8Array>;
36
- /**
37
- * Reset the hash state
38
- */
39
- reset(): void | Promise<void>;
40
- }
41
-
42
- export type { MD5Backend as M };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/hex_chr.ts","../../src/hex.ts","../../src/add32.ts","../../src/round-functions.ts","../../src/md5cycle.ts","../../src/md5blk.ts","../../src/md51.ts","../../src/core/index.ts","../../src/adapters/webcrypto.ts","../../src/adapters/node.ts","../../src/adapters/ie11.ts","../../src/adapters/pure-js.ts","../../src/stream/md5-stream.ts","../../src/stream/adapter.ts","../../src/utils/detect.ts"],"names":["hex_chr","hex_chr_default","rhex","n","s","j","hex","x","l","result","i","hex_default","add32","y","add32_default","cmn1","q","a","t","fn","add","cmn2","b","cmn","ff","c","d","gg","hh","ii","md5cycle","k","fff","ggg","hhh","iii","md5cycle_default","md5blk","md5blks","md5blk_default","md51","state","tail","sl","md51_default","md5Core","string","WebCryptoBackend","data","text","_data","_encoding","NodeCryptoBackend","nodeCrypto","buffer","IE11Backend","win","hashBuffer","PureJSBackend","encoding","bytes","MD5Stream","_MD5Stream","Transform","options","chunk","callback","dataLength","currentBufferLength","neededBytes","bytesToCopy","remainingData","remainingBuffer","fullBlocks","blockStart","block","idx","remaining","error","bufferLength","digest","source","stream","pipeThroughMD5","resolve","reject","results","StreamBackend","nodeStream","hexDigest","RuntimeEnvironment","detectEnvironment","isNode","isBrowser","isWebWorker","checkBackendAvailability","backendName","webCryptoAvailable","nodeCryptoAvailable","ie11Available","getAllAvailableBackends","backends","available","backend","isAvailable","BACKEND_PRIORITY","getBestAvailableBackend","availableBackends","sortedPriority","name","BackendDetector","_BackendDetector","detectedBackend","detector","FallbackManager","fallbackOrder","operation","errors","fallbackManager","robustHash","fm","errorMessage","e","MetricsCollector","sum","m","key","metrics"],"mappings":"mSAAA,IAAMA,CAAAA,CAAoB,mBAAmB,KAAA,CAAM,EAAE,EAE9CC,CAAAA,CAAQD,CAAAA,CCAf,SAASE,CAAAA,CAAKC,CAAAA,CAAmB,CAC/B,IAAIC,CAAAA,CAAI,EAAA,CACR,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,EAAGA,CAAAA,EAAAA,CACrBD,CAAAA,EAAKH,CAAAA,CAASE,CAAAA,EAAME,CAAAA,CAAI,CAAA,CAAI,EAAM,EAAI,CAAA,CAAIJ,EAASE,CAAAA,EAAME,CAAAA,CAAI,EAAM,EAAI,CAAA,CACzE,OAAOD,CACT,CAEA,SAASE,EAAIC,CAAAA,CAAqB,CAChC,IAAMC,CAAAA,CAAID,CAAAA,CAAE,MAAA,CACNE,EAAmB,IAAI,KAAA,CAAMD,CAAC,CAAA,CACpC,IAAA,IAASE,CAAAA,CAAI,EAAGA,CAAAA,CAAIF,CAAAA,CAAGE,IAAKD,CAAAA,CAAOC,CAAC,EAAIR,CAAAA,CAAKK,CAAAA,CAAEG,CAAC,CAAC,CAAA,CACjD,OAAOD,EAAO,IAAA,CAAK,EAAE,CACvB,CAEA,IAAOE,CAAAA,CAAQL,EChBf,SAASM,CAAAA,CAAML,CAAAA,CAAWM,CAAAA,CAAmB,CAI3C,OAAQN,EAAIM,CAAAA,CAAK,UACnB,CAEA,IAAOC,CAAAA,CAAQF,ECHf,SAASG,CAAAA,CAAKC,CAAAA,CAAWC,CAAAA,CAAWV,CAAAA,CAAWW,CAAAA,CAAWC,EAAoB,CAC5E,IAAMC,CAAAA,CAAMD,CAAAA,EAAML,CAAAA,CAClB,OAAAG,EAAIG,CAAAA,CAAIA,CAAAA,CAAIH,CAAAA,CAAGD,CAAC,CAAA,CAAGI,CAAAA,CAAIb,EAAGW,CAAC,CAAC,EACrBD,CACT,CAEA,SAASI,CAAAA,CAAK,CAAA,CAAWjB,CAAAA,CAAWkB,CAAAA,CAAWH,CAAAA,CAAoB,CAEjE,IAAIV,CAAAA,CAAAA,CADQU,CAAAA,EAAML,CAAAA,EACA,CAAA,EAAKV,CAAAA,CAAM,CAAA,GAAO,GAAKA,CAAAA,CAAKkB,CAAC,CAAA,CAC/C,OAAOb,CACT,CAEA,SAASc,CAAAA,CACPP,CAAAA,CACAC,EACAK,CAAAA,CACAf,CAAAA,CACAH,EACAc,CAAAA,CACAC,CAAAA,CACA,CACA,OAAAF,CAAAA,CAAIF,CAAAA,CAAKC,EAAGC,CAAAA,CAAGV,CAAAA,CAAGW,CAAAA,CAAGC,CAAE,CAAA,CAChBE,CAAAA,CAAKJ,EAAGb,CAAAA,CAAGkB,CAAAA,CAAGH,CAAE,CACzB,CAEO,SAASK,EACdL,CAAAA,CACAF,CAAAA,CACAK,EACAG,CAAAA,CACAC,CAAAA,CACAnB,EACAH,CAAAA,CACAc,CAAAA,CACQ,CACR,OAAOK,CAAAA,CAAKD,CAAAA,CAAIG,EAAM,CAACH,CAAAA,CAAII,CAAAA,CAAIT,CAAAA,CAAGK,CAAAA,CAAGf,CAAAA,CAAGH,EAAGc,CAAAA,CAAGC,CAAE,CAClD,CAEO,SAASQ,CAAAA,CACdR,EACAF,CAAAA,CACAK,CAAAA,CACAG,EACAC,CAAAA,CACAnB,CAAAA,CACAH,EACAc,CAAAA,CACQ,CACR,OAAOK,CAAAA,CAAKD,CAAAA,CAAII,CAAAA,CAAMD,EAAI,CAACC,CAAAA,CAAIT,CAAAA,CAAGK,CAAAA,CAAGf,CAAAA,CAAGH,CAAAA,CAAGc,EAAGC,CAAE,CAClD,CAEO,SAASS,CAAAA,CACdT,CAAAA,CACAF,EACAK,CAAAA,CACAG,CAAAA,CACAC,EACAnB,CAAAA,CACAH,CAAAA,CACAc,EACQ,CACR,OAAOK,CAAAA,CAAID,CAAAA,CAAIG,CAAAA,CAAIC,CAAAA,CAAGT,EAAGK,CAAAA,CAAGf,CAAAA,CAAGH,CAAAA,CAAGc,CAAAA,CAAGC,CAAE,CACzC,CAEO,SAASU,CAAAA,CACdV,CAAAA,CACAF,CAAAA,CACAK,CAAAA,CACAG,CAAAA,CACAC,EACAnB,CAAAA,CACAH,CAAAA,CACAc,EACQ,CACR,OAAOK,EAAIE,CAAAA,EAAKH,CAAAA,CAAI,CAACI,CAAAA,CAAAA,CAAIT,CAAAA,CAAGK,CAAAA,CAAGf,EAAGH,CAAAA,CAAGc,CAAAA,CAAGC,CAAE,CAC5C,CC1EA,SAASW,EAASvB,CAAAA,CAAawB,CAAAA,CAAaZ,CAAAA,CAA0B,CAChE,OAAOA,CAAAA,CAAO,MAChBA,CAAAA,CAAKL,CAAAA,CAAAA,CAEP,IAAIG,CAAAA,CAAIV,CAAAA,CAAE,CAAC,CAAA,CACPe,CAAAA,CAAIf,CAAAA,CAAE,CAAC,CAAA,CACPkB,CAAAA,CAAIlB,EAAE,CAAC,CAAA,CACPmB,CAAAA,CAAInB,CAAAA,CAAE,CAAC,CAAA,CAELyB,EAAMR,CAAAA,CAAG,IAAA,CAAK,IAAA,CAAML,CAAE,CAAA,CAC5BF,CAAAA,CAAIe,EAAIf,CAAAA,CAAGK,CAAAA,CAAGG,EAAGC,CAAAA,CAAGK,CAAAA,CAAE,CAAC,CAAA,CAAG,CAAA,CAAG,UAAU,CAAA,CACvCL,CAAAA,CAAIM,CAAAA,CAAIN,EAAGT,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGM,CAAAA,CAAE,CAAC,CAAA,CAAG,GAAI,UAAU,CAAA,CACxCN,CAAAA,CAAIO,CAAAA,CAAIP,CAAAA,CAAGC,CAAAA,CAAGT,EAAGK,CAAAA,CAAGS,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,SAAS,CAAA,CACvCT,CAAAA,CAAIU,CAAAA,CAAIV,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGT,EAAGc,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,WAAW,CAAA,CACzCd,EAAIe,CAAAA,CAAIf,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGK,CAAAA,CAAE,CAAC,CAAA,CAAG,CAAA,CAAG,UAAU,CAAA,CACvCL,CAAAA,CAAIM,EAAIN,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGM,CAAAA,CAAE,CAAC,EAAG,EAAA,CAAI,UAAU,CAAA,CACxCN,CAAAA,CAAIO,CAAAA,CAAIP,CAAAA,CAAGC,EAAGT,CAAAA,CAAGK,CAAAA,CAAGS,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,WAAW,CAAA,CACzCT,CAAAA,CAAIU,EAAIV,CAAAA,CAAGG,CAAAA,CAAGC,EAAGT,CAAAA,CAAGc,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,SAAS,EACvCd,CAAAA,CAAIe,CAAAA,CAAIf,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGK,EAAE,CAAC,CAAA,CAAG,CAAA,CAAG,UAAU,CAAA,CACvCL,CAAAA,CAAIM,EAAIN,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGM,CAAAA,CAAE,CAAC,EAAG,EAAA,CAAI,WAAW,CAAA,CACzCN,CAAAA,CAAIO,CAAAA,CAAIP,CAAAA,CAAGC,EAAGT,CAAAA,CAAGK,CAAAA,CAAGS,CAAAA,CAAE,EAAE,CAAA,CAAG,EAAA,CAAI,MAAM,CAAA,CACrCT,CAAAA,CAAIU,CAAAA,CAAIV,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGT,EAAGc,CAAAA,CAAE,EAAE,EAAG,EAAA,CAAI,WAAW,EAC1Cd,CAAAA,CAAIe,CAAAA,CAAIf,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGK,EAAE,EAAE,CAAA,CAAG,CAAA,CAAG,UAAU,CAAA,CACxCL,CAAAA,CAAIM,EAAIN,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGM,CAAAA,CAAE,EAAE,EAAG,EAAA,CAAI,SAAS,EACxCN,CAAAA,CAAIO,CAAAA,CAAIP,EAAGC,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGS,CAAAA,CAAE,EAAE,CAAA,CAAG,GAAI,WAAW,CAAA,CAC1CT,CAAAA,CAAIU,CAAAA,CAAIV,CAAAA,CAAGG,CAAAA,CAAGC,EAAGT,CAAAA,CAAGc,CAAAA,CAAE,EAAE,CAAA,CAAG,EAAA,CAAI,UAAU,EAEzC,IAAME,CAAAA,CAAMN,EAAG,IAAA,CAAK,IAAA,CAAMR,CAAE,CAAA,CAC5BF,CAAAA,CAAIgB,CAAAA,CAAIhB,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGC,EAAGK,CAAAA,CAAE,CAAC,CAAA,CAAG,CAAA,CAAG,UAAU,CAAA,CACvCL,EAAIO,CAAAA,CAAIP,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGM,CAAAA,CAAE,CAAC,CAAA,CAAG,CAAA,CAAG,WAAW,CAAA,CACxCN,CAAAA,CAAIQ,EAAIR,CAAAA,CAAGC,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGS,CAAAA,CAAE,EAAE,EAAG,EAAA,CAAI,SAAS,CAAA,CACxCT,CAAAA,CAAIW,CAAAA,CAAIX,CAAAA,CAAGG,EAAGC,CAAAA,CAAGT,CAAAA,CAAGc,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,UAAU,CAAA,CACxCd,CAAAA,CAAIgB,EAAIhB,CAAAA,CAAGK,CAAAA,CAAGG,EAAGC,CAAAA,CAAGK,CAAAA,CAAE,CAAC,CAAA,CAAG,CAAA,CAAG,UAAU,EACvCL,CAAAA,CAAIO,CAAAA,CAAIP,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGM,EAAE,EAAE,CAAA,CAAG,CAAA,CAAG,QAAQ,CAAA,CACtCN,CAAAA,CAAIQ,EAAIR,CAAAA,CAAGC,CAAAA,CAAGT,EAAGK,CAAAA,CAAGS,CAAAA,CAAE,EAAE,CAAA,CAAG,EAAA,CAAI,UAAU,CAAA,CACzCT,CAAAA,CAAIW,CAAAA,CAAIX,EAAGG,CAAAA,CAAGC,CAAAA,CAAGT,CAAAA,CAAGc,CAAAA,CAAE,CAAC,CAAA,CAAG,GAAI,UAAU,CAAA,CACxCd,CAAAA,CAAIgB,CAAAA,CAAIhB,CAAAA,CAAGK,CAAAA,CAAGG,EAAGC,CAAAA,CAAGK,CAAAA,CAAE,CAAC,CAAA,CAAG,CAAA,CAAG,SAAS,CAAA,CACtCL,CAAAA,CAAIO,CAAAA,CAAIP,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGG,EAAGM,CAAAA,CAAE,EAAE,CAAA,CAAG,CAAA,CAAG,WAAW,CAAA,CACzCN,EAAIQ,CAAAA,CAAIR,CAAAA,CAAGC,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGS,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,UAAU,CAAA,CACxCT,CAAAA,CAAIW,EAAIX,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGT,CAAAA,CAAGc,CAAAA,CAAE,CAAC,EAAG,EAAA,CAAI,UAAU,CAAA,CACxCd,CAAAA,CAAIgB,CAAAA,CAAIhB,CAAAA,CAAGK,EAAGG,CAAAA,CAAGC,CAAAA,CAAGK,CAAAA,CAAE,EAAE,CAAA,CAAG,CAAA,CAAG,WAAW,CAAA,CACzCL,CAAAA,CAAIO,EAAIP,CAAAA,CAAGT,CAAAA,CAAGK,EAAGG,CAAAA,CAAGM,CAAAA,CAAE,CAAC,CAAA,CAAG,CAAA,CAAG,SAAS,EACtCN,CAAAA,CAAIQ,CAAAA,CAAIR,CAAAA,CAAGC,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGS,EAAE,CAAC,CAAA,CAAG,EAAA,CAAI,UAAU,CAAA,CACxCT,CAAAA,CAAIW,EAAIX,CAAAA,CAAGG,CAAAA,CAAGC,EAAGT,CAAAA,CAAGc,CAAAA,CAAE,EAAE,CAAA,CAAG,EAAA,CAAI,WAAW,CAAA,CAE1C,IAAMG,CAAAA,CAAMN,EAAG,IAAA,CAAK,IAAA,CAAMT,CAAE,CAAA,CAC5BF,CAAAA,CAAIiB,CAAAA,CAAIjB,EAAGK,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGK,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAG,OAAO,CAAA,CACpCL,EAAIQ,CAAAA,CAAIR,CAAAA,CAAGT,EAAGK,CAAAA,CAAGG,CAAAA,CAAGM,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,WAAW,CAAA,CACzCN,CAAAA,CAAIS,CAAAA,CAAIT,CAAAA,CAAGC,CAAAA,CAAGT,CAAAA,CAAGK,EAAGS,CAAAA,CAAE,EAAE,CAAA,CAAG,EAAA,CAAI,UAAU,CAAA,CACzCT,EAAIY,CAAAA,CAAIZ,CAAAA,CAAGG,EAAGC,CAAAA,CAAGT,CAAAA,CAAGc,EAAE,EAAE,CAAA,CAAG,EAAA,CAAI,SAAS,CAAA,CACxCd,CAAAA,CAAIiB,EAAIjB,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGK,CAAAA,CAAE,CAAC,EAAG,CAAA,CAAG,WAAW,CAAA,CACxCL,CAAAA,CAAIQ,CAAAA,CAAIR,CAAAA,CAAGT,EAAGK,CAAAA,CAAGG,CAAAA,CAAGM,EAAE,CAAC,CAAA,CAAG,GAAI,UAAU,CAAA,CACxCN,CAAAA,CAAIS,CAAAA,CAAIT,CAAAA,CAAGC,CAAAA,CAAGT,EAAGK,CAAAA,CAAGS,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,UAAU,EACxCT,CAAAA,CAAIY,CAAAA,CAAIZ,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGT,CAAAA,CAAGc,EAAE,EAAE,CAAA,CAAG,GAAI,WAAW,CAAA,CAC1Cd,EAAIiB,CAAAA,CAAIjB,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGK,CAAAA,CAAE,EAAE,CAAA,CAAG,CAAA,CAAG,SAAS,CAAA,CACvCL,CAAAA,CAAIQ,CAAAA,CAAIR,EAAGT,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGM,CAAAA,CAAE,CAAC,CAAA,CAAG,GAAI,UAAU,CAAA,CACxCN,EAAIS,CAAAA,CAAIT,CAAAA,CAAGC,EAAGT,CAAAA,CAAGK,CAAAA,CAAGS,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,UAAU,CAAA,CACxCT,CAAAA,CAAIY,CAAAA,CAAIZ,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGT,EAAGc,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,QAAQ,CAAA,CACtCd,EAAIiB,CAAAA,CAAIjB,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGK,CAAAA,CAAE,CAAC,CAAA,CAAG,CAAA,CAAG,UAAU,CAAA,CACvCL,CAAAA,CAAIQ,CAAAA,CAAIR,EAAGT,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGM,CAAAA,CAAE,EAAE,CAAA,CAAG,GAAI,UAAU,CAAA,CACzCN,CAAAA,CAAIS,CAAAA,CAAIT,CAAAA,CAAGC,CAAAA,CAAGT,EAAGK,CAAAA,CAAGS,CAAAA,CAAE,EAAE,CAAA,CAAG,EAAA,CAAI,SAAS,CAAA,CACxCT,CAAAA,CAAIY,CAAAA,CAAIZ,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGT,EAAGc,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,UAAU,CAAA,CAExC,IAAMI,CAAAA,CAAMN,CAAAA,CAAG,IAAA,CAAK,IAAA,CAAMV,CAAE,CAAA,CAC5BF,EAAIkB,CAAAA,CAAIlB,CAAAA,CAAGK,EAAGG,CAAAA,CAAGC,CAAAA,CAAGK,EAAE,CAAC,CAAA,CAAG,CAAA,CAAG,UAAU,CAAA,CACvCL,CAAAA,CAAIS,EAAIT,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGM,CAAAA,CAAE,CAAC,EAAG,EAAA,CAAI,UAAU,CAAA,CACxCN,CAAAA,CAAIU,CAAAA,CAAIV,CAAAA,CAAGC,EAAGT,CAAAA,CAAGK,CAAAA,CAAGS,EAAE,EAAE,CAAA,CAAG,GAAI,WAAW,CAAA,CAC1CT,CAAAA,CAAIa,CAAAA,CAAIb,CAAAA,CAAGG,CAAAA,CAAGC,EAAGT,CAAAA,CAAGc,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,SAAS,EACvCd,CAAAA,CAAIkB,CAAAA,CAAIlB,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGC,CAAAA,CAAGK,EAAE,EAAE,CAAA,CAAG,EAAG,UAAU,CAAA,CACxCL,EAAIS,CAAAA,CAAIT,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGM,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,WAAW,CAAA,CACzCN,CAAAA,CAAIU,CAAAA,CAAIV,EAAGC,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGS,CAAAA,CAAE,EAAE,CAAA,CAAG,GAAI,QAAQ,CAAA,CACvCT,EAAIa,CAAAA,CAAIb,CAAAA,CAAGG,EAAGC,CAAAA,CAAGT,CAAAA,CAAGc,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,WAAW,CAAA,CACzCd,CAAAA,CAAIkB,CAAAA,CAAIlB,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGC,EAAGK,CAAAA,CAAE,CAAC,CAAA,CAAG,CAAA,CAAG,UAAU,CAAA,CACvCL,EAAIS,CAAAA,CAAIT,CAAAA,CAAGT,EAAGK,CAAAA,CAAGG,CAAAA,CAAGM,EAAE,EAAE,CAAA,CAAG,EAAA,CAAI,SAAS,CAAA,CACxCN,CAAAA,CAAIU,EAAIV,CAAAA,CAAGC,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGS,CAAAA,CAAE,CAAC,EAAG,EAAA,CAAI,WAAW,CAAA,CACzCT,CAAAA,CAAIa,CAAAA,CAAIb,CAAAA,CAAGG,EAAGC,CAAAA,CAAGT,CAAAA,CAAGc,EAAE,EAAE,CAAA,CAAG,GAAI,UAAU,CAAA,CACzCd,CAAAA,CAAIkB,CAAAA,CAAIlB,CAAAA,CAAGK,CAAAA,CAAGG,EAAGC,CAAAA,CAAGK,CAAAA,CAAE,CAAC,CAAA,CAAG,CAAA,CAAG,UAAU,EACvCL,CAAAA,CAAIS,CAAAA,CAAIT,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGG,CAAAA,CAAGM,EAAE,EAAE,CAAA,CAAG,GAAI,WAAW,CAAA,CAC1CN,EAAIU,CAAAA,CAAIV,CAAAA,CAAGC,CAAAA,CAAGT,CAAAA,CAAGK,CAAAA,CAAGS,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAA,CAAI,SAAS,CAAA,CACvCT,CAAAA,CAAIa,CAAAA,CAAIb,EAAGG,CAAAA,CAAGC,CAAAA,CAAGT,CAAAA,CAAGc,CAAAA,CAAE,CAAC,CAAA,CAAG,GAAI,UAAU,CAAA,CAExCxB,EAAE,CAAC,CAAA,CAAIY,EAAGF,CAAAA,CAAGV,CAAAA,CAAE,CAAC,CAAC,CAAA,CACjBA,CAAAA,CAAE,CAAC,CAAA,CAAIY,CAAAA,CAAGG,CAAAA,CAAGf,CAAAA,CAAE,CAAC,CAAC,EACjBA,CAAAA,CAAE,CAAC,CAAA,CAAIY,CAAAA,CAAGM,CAAAA,CAAGlB,CAAAA,CAAE,CAAC,CAAC,CAAA,CACjBA,EAAE,CAAC,CAAA,CAAIY,EAAGO,CAAAA,CAAGnB,CAAAA,CAAE,CAAC,CAAC,EACnB,CAEA,IAAO6B,CAAAA,CAAQN,CAAAA,CC5Ff,SAASO,CAAAA,CAAOjC,CAAAA,CAAqB,CACnC,IAAIkC,CAAAA,CAAoB,EAAC,CACzB,IAAA,IAAS5B,CAAAA,CAAI,CAAA,CAAGA,EAAI,EAAA,CAAIA,CAAAA,EAAK,EAC3B4B,CAAAA,CAAQ5B,CAAAA,EAAK,CAAC,CAAA,CAAA,CACXN,CAAAA,CAAE,UAAA,CAAWM,CAAC,CAAA,EAAK,CAAA,GAAA,CAClBN,EAAE,UAAA,CAAWM,CAAAA,CAAI,CAAC,CAAA,EAAK,CAAA,GAAM,CAAA,CAAA,EAAA,CAC7BN,EAAE,UAAA,CAAWM,CAAAA,CAAI,CAAC,CAAA,EAAK,CAAA,GAAM,EAAA,CAAA,EAAA,CAC7BN,EAAE,UAAA,CAAWM,CAAAA,CAAI,CAAC,CAAA,EAAK,CAAA,GAAM,IAEnC,OAAO4B,CACT,CAEA,IAAOC,CAAAA,CAAQF,CAAAA,CCPf,SAASG,CAAAA,CAAKpC,CAAAA,CAAWQ,CAAAA,CAAiC,CACxD,IAAMT,CAAAA,CAAIC,EAAE,MAAA,CACNqC,CAAAA,CAAQ,CAAC,UAAA,CAAY,UAAA,CAAY,WAAA,CAAa,SAAS,CAAA,CACzD/B,CAAAA,CACJ,IAAKA,CAAAA,CAAI,EAAA,CAAIA,GAAKP,CAAAA,CAAGO,CAAAA,EAAK,EAAA,CACxB0B,CAAAA,CAASK,CAAAA,CAAOF,CAAAA,CAAOnC,EAAE,SAAA,CAAUM,CAAAA,CAAI,EAAA,CAAIA,CAAC,CAAC,CAAA,CAAGE,CAAK,CAAA,CAEvDR,CAAAA,CAAIA,CAAAA,CAAE,SAAA,CAAUM,CAAAA,CAAI,EAAE,EACtB,IAAIgC,CAAAA,CAAO,CAAC,CAAA,CAAG,CAAA,CAAG,EAAG,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,EAAG,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAC,EACxDC,CAAAA,CAAKvC,CAAAA,CAAE,MAAA,CACT,IAAKM,CAAAA,CAAI,CAAA,CAAGA,EAAIiC,CAAAA,CAAIjC,CAAAA,EAAAA,CAAKgC,EAAKhC,CAAAA,EAAK,CAAC,IAAMN,CAAAA,CAAE,UAAA,CAAWM,CAAC,CAAA,CAAI,GAAA,IAAWA,CAAAA,CAAI,GAAM,CAAA,CAAA,CAEjF,GADAgC,CAAAA,CAAKhC,CAAAA,EAAK,CAAC,CAAA,EAAK,MAAUA,CAAAA,CAAI,CAAA,EAAM,CAAA,CAAA,CAChCA,CAAAA,CAAI,EAAA,CAGN,IAFA0B,EAASK,CAAAA,CAAOC,CAAAA,CAAM9B,CAAK,CAAA,CAC3BF,CAAAA,CAAI,EAAA,CACGA,KACLgC,CAAAA,CAAKhC,CAAC,CAAA,CAAI,CAAA,CAGd,OAAAgC,CAAAA,CAAK,EAAE,CAAA,CAAIvC,CAAAA,CAAI,CAAA,CACfiC,CAAAA,CAASK,CAAAA,CAAOC,CAAAA,CAAM9B,CAAK,CAAA,CACpB6B,CACT,CAEA,IAAOG,CAAAA,CAAQJ,CAAAA,CCbR,SAASK,CAAAA,CAAQC,CAAAA,CAAwB,CAG9C,OAAOnC,CAAAA,CAAIiC,EAAKE,CAAAA,CADLhC,CACe,CAAC,CAC7B,CCVO,IAAMiC,EAAN,KAA6C,CAA7C,WAAA,EAAA,CACL,IAAA,CAAA,IAAA,CAAe,WAAA,CACf,IAAA,CAAA,OAAA,CAAkB,SAElB,OAAO,WAAA,EAAuB,CAE5B,OAAO,OAAO,MAAA,CAAW,KACvB,OAAO,MAAA,CAAO,OAAW,GAAA,EACzB,OAAO,OAAO,MAAA,CAAO,MAAA,EAAW,UACpC,CAEA,MAAM,IAAA,CAAKC,EAA+B,CAExC,OAAOH,CAAAA,CAAQG,CAAI,CACrB,CAEA,MAAM,UAAA,CAAWA,CAAAA,CAAiD,CAEhE,IAAMC,CAAAA,CAAOD,CAAAA,YAAgB,YACzB,IAAI,WAAA,GAAc,MAAA,CAAOA,CAAI,EAC7B,IAAI,WAAA,EAAY,CAAE,MAAA,CAAOA,CAAI,CAAA,CACjC,OAAOH,CAAAA,CAAQI,CAAI,CACrB,CAEA,MAAA,CAAOC,CAAAA,CAAgE,CACrE,MAAM,IAAI,KAAA,CAAM,mDAAmD,CACrE,CAEA,OAAOC,CAAAA,CAAkF,CACvF,MAAM,IAAI,KAAA,CAAM,2CAA2C,CAC7D,CAEA,KAAA,EAA8B,CAE9B,CACF,CAAA,CCtCO,IAAMC,CAAAA,CAAN,KAA8C,CAA9C,WAAA,EAAA,CACL,IAAA,CAAA,IAAA,CAAe,YAAA,CACf,aAAkB,QAAA,CAElB,OAAO,WAAA,EAAuB,CAC5B,GAAI,CAEF,OAAO,OADY,CAAA,CAAQ,QAAa,CAAA,CACf,UAAA,EAAe,UAC1C,CAAA,KAAQ,CACN,OAAO,MACT,CACF,CAEA,KAAKJ,CAAAA,CAAsB,CAEzB,OADmB,CAAA,CAAQ,QAAa,CAAA,CACtB,WAAW,KAAK,CAAA,CAAE,MAAA,CAAOA,CAAI,CAAA,CAAE,MAAA,CAAO,KAAK,CAC/D,CAEA,MAAM,UAAA,CAAWA,CAAAA,CAAiD,CAChE,IAAMK,CAAAA,CAAa,CAAA,CAAQ,QAAa,CAAA,CAClCC,CAAAA,CAASN,aAAgB,UAAA,CAAaA,CAAAA,CAAO,IAAI,UAAA,CAAWA,CAAI,CAAA,CACtE,OAAOK,CAAAA,CAAW,UAAA,CAAW,KAAK,CAAA,CAAE,MAAA,CAAOC,CAAM,EAAE,MAAA,CAAO,KAAK,CACjE,CAEA,MAAA,CAAOJ,EAAgE,CAGvE,CAEA,MAAA,CAAOC,CAAAA,CAAkF,CACvF,MAAM,IAAI,KAAA,CAAM,uCAAuC,CACzD,CAEA,KAAA,EAA8B,CAE9B,CACF,CAAA,CChCO,IAAMI,CAAAA,CAAN,KAAwC,CAAxC,WAAA,EAAA,CACL,UAAe,MAAA,CACf,IAAA,CAAA,OAAA,CAAkB,SAElB,OAAO,WAAA,EAAuB,CAC5B,GAAI,OAAO,MAAA,CAAW,GAAA,CACpB,OAAO,MAAA,CAET,IAAMC,CAAAA,CAAM,MAAA,CACZ,OAAO,OAAOA,CAAAA,CAAI,QAAA,CAAa,KAC7B,OAAOA,CAAAA,CAAI,QAAA,CAAS,MAAA,CAAW,GAAA,EAC/B,OAAOA,EAAI,QAAA,CAAS,MAAA,CAAO,QAAW,UAC1C,CAEA,MAAM,IAAA,CAAKR,CAAAA,CAA+B,CAExC,IAAMM,CAAAA,CADU,IAAI,aAAY,CACT,MAAA,CAAON,CAAI,CAAA,CAClC,OAAO,MAAM,KAAK,UAAA,CAAWM,CAAM,CACrC,CAEA,MAAM,UAAA,CAAWN,EAAiD,CAChE,IAAMQ,EAAM,MAAA,CACNF,CAAAA,CAASN,aAAgB,UAAA,CAAaA,CAAAA,CAAK,MAAA,CAAwBA,CAAAA,CACnES,CAAAA,CAAa,MAAMD,EAAI,QAAA,CAAU,MAAA,CAAO,MAAA,CAAO,KAAA,CAAOF,CAAM,CAAA,CAClE,OAAO,IAAA,CAAK,WAAA,CAAYG,CAAU,CACpC,CAEQ,WAAA,CAAYH,EAA6B,CAC/C,OAAO,MAAM,IAAA,CAAK,IAAI,WAAWA,CAAM,CAAC,CAAA,CACrC,GAAA,CAAKhC,CAAAA,EAAMA,CAAAA,CAAE,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,EAC1C,IAAA,CAAK,EAAE,CACZ,CAEA,MAAA,CAAO4B,CAAAA,CAAgE,CACrE,MAAM,IAAI,MAAM,6CAA6C,CAC/D,CAEA,MAAA,CAAOC,CAAAA,CAAkF,CACvF,MAAM,IAAI,KAAA,CAAM,qCAAqC,CACvD,CAEA,KAAA,EAA8B,CAE9B,CACF,CAAA,CC/CO,IAAMO,CAAAA,CAAN,KAA0C,CAS/C,WAAA,EAAc,CARd,IAAA,CAAA,IAAA,CAAe,SACf,IAAA,CAAA,OAAA,CAAkB,OAAA,CAQhB,KAAK,KAAA,CAAQ,CAAE,KAAM,EAAA,CAAI,QAAA,CAAU,KAAM,EAC3C,CAEA,IAAA,CAAKV,EAAsB,CACzB,OAAOH,CAAAA,CAAQG,CAAI,CACrB,CAEA,MAAM,UAAA,CAAWA,CAAAA,CAAiD,CAChE,IAAMC,CAAAA,CACJD,CAAAA,YAAgB,YACZ,IAAI,WAAA,GAAc,MAAA,CAAOA,CAAI,EAC7B,IAAI,WAAA,EAAY,CAAE,MAAA,CAAOA,CAAI,CAAA,CACnC,OAAOH,CAAAA,CAAQI,CAAI,CACrB,CAEA,MAAA,CAAOD,CAAAA,CAA+D,CAChE,IAAA,CAAK,KAAA,CAAM,QAAA,GAEb,IAAA,CAAK,KAAA,CAAQ,CAAE,KAAM,EAAA,CAAI,QAAA,CAAU,KAAM,CAAA,CAAA,CAGvCA,CAAAA,YAAgB,YAClB,IAAA,CAAK,KAAA,CAAM,IAAA,EAAQ,IAAI,WAAA,EAAY,CAAE,OAAOA,CAAI,CAAA,CACvCA,CAAAA,YAAgB,UAAA,CACzB,IAAA,CAAK,KAAA,CAAM,MAAQ,IAAI,WAAA,EAAY,CAAE,MAAA,CAAOA,CAAI,CAAA,CAEhD,KAAK,KAAA,CAAM,IAAA,EAAQA,EAEvB,CAEA,MAAA,CAAOW,CAAAA,CAAiF,CACtF,IAAMlD,CAAAA,CAASoC,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,EAGtC,OAFA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAW,IAAA,CAElBc,CAAAA,GAAa,SACR,IAAA,CAAK,WAAA,CAAYlD,CAAM,CAAA,CAEzBA,CACT,CAEA,OAA8B,CAC5B,IAAA,CAAK,MAAQ,CAAE,IAAA,CAAM,GAAI,QAAA,CAAU,KAAM,EAC3C,CAEA,OAAO,WAAA,EAAuB,CAC5B,OAAO,KACT,CAEQ,WAAA,CAAYH,CAAAA,CAAyB,CAC3C,IAAMsD,CAAAA,CAAkB,EAAC,CACzB,IAAA,IAASlD,CAAAA,CAAI,CAAA,CAAGA,EAAIJ,CAAAA,CAAI,MAAA,CAAQI,GAAK,CAAA,CACnCkD,CAAAA,CAAM,KAAK,QAAA,CAAStD,CAAAA,CAAI,SAAA,CAAUI,CAAAA,CAAGA,CAAAA,CAAI,CAAC,EAAG,EAAE,CAAC,CAAA,CAElD,OAAO,IAAI,UAAA,CAAWkD,CAAK,CAC7B,CACF,CAAA,CC1BO,IAAMC,CAAAA,CAAN,MAAMC,CAAAA,SAAkBC,gBAAU,CAWvC,WAAA,CAAYC,CAAAA,CAA4B,CACtC,KAAA,CAAM,CACJ,kBAAA,CAAoB,MACpB,kBAAA,CAAoB,KACtB,CAAC,CAAA,CAZH,IAAA,CAAiB,eAAA,CAAkB,CAAC,UAAA,CAAY,UAAA,CAAY,WAAA,CAAa,SAAS,CAAA,CAClF,IAAA,CAAiB,eAAyB,EAAA,CAC1C,IAAA,CAAQ,OAAqB,IAAI,UAAA,CAAW,KAAK,cAAc,CAAA,CAY7D,IAAA,CAAK,KAAA,CAAQA,CAAAA,EAAS,KAAA,EAASlD,EAC/B,IAAA,CAAK,KAAA,CAAQ,CACX,KAAA,CAAO,CAAC,GAAG,KAAK,eAAe,CAAA,CAC/B,cAAA,CAAgB,CAAA,CAChB,YAAA,CAAc,CAAA,CACd,OAAQ,IAAA,CAAK,MACf,EACF,CAOA,UAAA,CAAWmD,EAAed,CAAAA,CAA2Be,CAAAA,CAAmC,CACtF,GAAI,CACF,IAAIlB,EAAOiB,CAAAA,CACLE,CAAAA,CAAanB,CAAAA,CAAK,MAAA,CAExB,GAAImB,CAAAA,GAAe,EAAG,CACpBD,CAAAA,EAAS,CACT,MACF,CAGA,GAAI,KAAK,KAAA,CAAM,YAAA,CAAe,EAAG,CAC/B,IAAME,EAAsB,IAAA,CAAK,KAAA,CAAM,YAAA,CACjCC,CAAAA,CAAc,EAAA,CAAKD,CAAAA,CACnBE,EAAc,IAAA,CAAK,GAAA,CAAIH,CAAAA,CAAYE,CAAW,CAAA,CAGpD,IAAA,IAAS3D,EAAI,CAAA,CAAGA,CAAAA,CAAI4D,CAAAA,CAAa5D,CAAAA,EAAAA,CAC/B,IAAA,CAAK,MAAA,CAAO0D,EAAsB1D,CAAC,CAAA,CAAIsC,EAAKtC,CAAC,CAAA,CAW/C,GARA,IAAA,CAAK,KAAA,CAAM,YAAA,EAAgB4D,CAAAA,CAGvB,IAAA,CAAK,KAAA,CAAM,eAAiB,EAAA,EAC9B,IAAA,CAAK,mBAAA,EAAoB,CAIvBA,CAAAA,GAAgBH,CAAAA,CAAY,CAC9BD,CAAAA,EAAS,CACT,MACF,CAIA,IAAMK,CAAAA,CAAgBJ,EAAaG,CAAAA,CACnC,IAAA,IAAS5D,EAAI,CAAA,CAAGA,CAAAA,CAAI6D,EAAe7D,CAAAA,EAAAA,CACjCsC,CAAAA,CAAKtC,CAAC,CAAA,CAAIsC,CAAAA,CAAKsB,CAAAA,CAAc5D,CAAC,CAAA,CAGhC,IAAM8D,CAAAA,CAAkB,MAAA,CAAO,KAAA,CAAMD,CAAa,EAClD,IAAA,IAAS7D,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI6D,CAAAA,CAAe7D,CAAAA,EAAAA,CACjC8D,EAAgB9D,CAAC,CAAA,CAAIsC,EAAKtC,CAAC,CAAA,CAE7BsC,EAAOwB,EACT,CAGA,IAAMC,CAAAA,CAAa,IAAA,CAAK,KAAA,CAAMzB,EAAK,MAAA,CAAS,EAAE,CAAA,CAE9C,IAAA,IAAStC,CAAAA,CAAI,CAAA,CAAGA,EAAI+D,CAAAA,CAAY/D,CAAAA,EAAAA,CAAK,CACnC,IAAMgE,CAAAA,CAAahE,CAAAA,CAAI,GACjBiE,CAAAA,CAAkB,GAExB,IAAA,IAAStE,CAAAA,CAAI,EAAGA,CAAAA,CAAI,EAAA,CAAIA,CAAAA,EAAAA,CAAK,CAC3B,IAAMuE,CAAAA,CAAMF,EAAarE,CAAAA,CAAI,CAAA,CAC7BsE,CAAAA,CAAMtE,CAAC,CAAA,CACL2C,CAAAA,CAAK4B,CAAG,CAAA,EACP5B,CAAAA,CAAK4B,CAAAA,CAAM,CAAC,CAAA,EAAK,CAAA,CAAA,EACjB5B,EAAK4B,CAAAA,CAAM,CAAC,GAAK,EAAA,CAAA,EACjB5B,CAAAA,CAAK4B,EAAM,CAAC,CAAA,EAAK,EAAA,EACtB,CAEAxC,CAAAA,CAAS,IAAA,CAAK,MAAM,KAAA,CAAOuC,CAAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAC5C,IAAA,CAAK,MAAM,cAAA,EAAkB,GAC/B,CAGA,IAAME,CAAAA,CAAY7B,CAAAA,CAAK,OAAS,EAAA,CAChC,GAAI6B,EAAY,CAAA,CAAG,CAEb,KAAK,MAAA,CAAO,MAAA,CAASA,CAAAA,GACvB,IAAA,CAAK,MAAA,CAAS,IAAI,WAAWA,CAAS,CAAA,CACtC,IAAA,CAAK,KAAA,CAAM,MAAA,CAAS,IAAA,CAAK,QAI3B,IAAA,IAASnE,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAImE,CAAAA,CAAWnE,CAAAA,EAAAA,CAC7B,KAAK,MAAA,CAAOA,CAAC,EAAIsC,CAAAA,CAAKyB,CAAAA,CAAa,GAAK/D,CAAC,CAAA,CAE3C,IAAA,CAAK,KAAA,CAAM,YAAA,CAAemE,EAC5B,CAEAX,CAAAA,GACF,CAAA,MAASY,CAAAA,CAAO,CACdZ,CAAAA,CAASY,CAAc,EACzB,CACF,CAKQ,mBAAA,EAA4B,CAClC,IAAMxB,EAAS,IAAA,CAAK,KAAA,CAAM,OACpBqB,CAAAA,CAAkB,GAExB,IAAA,IAAStE,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,EAAA,CAAIA,CAAAA,EAAAA,CAAK,CAC3B,IAAMuE,CAAAA,CAAMvE,CAAAA,CAAI,CAAA,CAChBsE,CAAAA,CAAMtE,CAAC,EACLiD,CAAAA,CAAOsB,CAAG,CAAA,EACTtB,CAAAA,CAAOsB,CAAAA,CAAM,CAAC,GAAK,CAAA,CAAA,EACnBtB,CAAAA,CAAOsB,EAAM,CAAC,CAAA,EAAK,KACnBtB,CAAAA,CAAOsB,CAAAA,CAAM,CAAC,CAAA,EAAK,EAAA,EACxB,CAEAxC,EAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAOuC,CAAAA,CAAO,IAAA,CAAK,KAAK,EAC5C,IAAA,CAAK,KAAA,CAAM,cAAA,EAAkB,EAAA,CAC7B,IAAA,CAAK,KAAA,CAAM,aAAe,EAC5B,CAMA,MAAA,CAAOT,CAAAA,CAAmC,CACxC,GAAI,CACF,GAAM,CAAE,KAAA,CAAAzB,CAAAA,CAAO,YAAA,CAAAsC,CAAAA,CAAc,OAAAzB,CAAO,CAAA,CAAI,IAAA,CAAK,KAAA,CAGvCZ,CAAAA,CAAiB,IAAI,MAAM,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,CAG3C,IAAA,IAAShC,EAAI,CAAA,CAAGA,CAAAA,CAAIqE,EAAcrE,CAAAA,EAAAA,CAChCgC,CAAAA,CAAKhC,GAAK,CAAC,CAAA,EAAA,CAAM4C,CAAAA,CAAO5C,CAAC,CAAA,CAAI,GAAA,IAAWA,EAAI,CAAA,EAAM,CAAA,CAAA,CAOpD,GAHAgC,CAAAA,CAAKqC,CAAAA,EAAgB,CAAC,GAAK,GAAA,GAAUA,CAAAA,CAAe,CAAA,EAAM,CAAA,CAAA,CAGtDA,CAAAA,CAAe,EAAA,CAAI,CACrB3C,CAAAA,CAASK,CAAAA,CAAOC,EAAM,IAAA,CAAK,KAAK,EAChC,IAAA,IAAShC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,EAAA,CAAIA,CAAAA,EAAAA,CACtBgC,EAAKhC,CAAC,CAAA,CAAI,EAEd,CAGAgC,CAAAA,CAAK,EAAE,GAAK,IAAA,CAAK,KAAA,CAAM,cAAA,CAAiBqC,CAAAA,EAAgB,CAAA,CACxDrC,CAAAA,CAAK,EAAE,CAAA,CAAI,CAAA,CAGXN,EAASK,CAAAA,CAAOC,CAAAA,CAAM,KAAK,KAAK,CAAA,CAGhC,IAAMsC,CAAAA,CAASrE,CAAAA,CAAI8B,CAAK,EAGxB,IAAA,CAAK,IAAA,CAAK,KAAA,CAAO,CACf,MAAA,CAAAuC,CAAAA,CACA,eAAgB,IAAA,CAAK,KAAA,CAAM,cAAA,CAAiBD,CAC9C,CAAC,CAAA,CAEDb,IACF,CAAA,MAASY,EAAO,CACdZ,CAAAA,CAASY,CAAc,EACzB,CACF,CAMO,eAAA,EAA+D,CACpE,OAAO,CACL,KAAA,CAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,KAAK,EAC3B,cAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,cAAA,CAAiB,IAAA,CAAK,KAAA,CAAM,YACzD,CACF,CAMO,mBAA4B,CACjC,OAAO,KAAK,KAAA,CAAM,cAAA,CAAiB,IAAA,CAAK,KAAA,CAAM,YAChD,CAOO,OAAc,CAEnB,IAAA,CAAK,KAAA,CAAQ,CACX,KAAA,CAAO,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA,CAC/B,cAAA,CAAgB,CAAA,CAChB,YAAA,CAAc,EACd,MAAA,CAAQ,IAAA,CAAK,MACf,CAAA,CACA,IAAA,CAAK,OAAS,IAAI,UAAA,CAAW,IAAA,CAAK,cAAc,CAAA,CAChD,IAAA,CAAK,MAAM,MAAA,CAAS,IAAA,CAAK,MAAA,CACzB,IAAA,CAAK,KAAA,CAAM,YAAA,CAAe,EAC5B,CAQA,OAAO,UAAA,CACLG,CAAAA,CACAjB,CAAAA,CACmD,CACnD,IAAMkB,CAAAA,CAAS,IAAIpB,EAAUE,CAAO,CAAA,CAC9BvD,EAAS0E,CAAAA,CAAe,IAAA,CAAKD,CAAAA,CAAQD,CAAM,CAAA,CAEjD,OAAO,CAAE,MAAA,CAAAC,CAAAA,CAAQ,MAAA,CAAAzE,CAAO,CAC1B,CACF,EA+BA,eAAsB0E,CAAAA,CAEpBF,CAAAA,CACoB,CACpB,OAAO,IAAI,QAAQ,CAACG,CAAAA,CAASC,IAAW,CACtC,IAAMC,EAAuB,EAAC,CAE9BL,CAAAA,CACG,IAAA,CAAK,IAAI,CAAA,CACT,GAAG,KAAA,CAAQxE,CAAAA,EAAsB,CAChC6E,CAAAA,CAAQ,IAAA,CAAK7E,CAAM,EACrB,CAAC,CAAA,CACA,EAAA,CAAG,OAAA,CAAS4E,CAAM,CAAA,CAClB,GAAG,QAAA,CAAU,IAAM,CAClBD,CAAAA,CAAQE,CAAAA,CAAQ,CAAC,CAAC,EACpB,CAAC,EACL,CAAC,CACH,CC7TO,IAAMC,CAAAA,CAAN,KAA0C,CAA1C,WAAA,EAAA,CACL,IAAA,CAAA,IAAA,CAAe,SACf,IAAA,CAAA,OAAA,CAAkB,OAAA,CAElB,IAAA,CAAQ,KAAA,CAAmC,KAAA,CAM3C,cAAA,CAAeL,EAAyB,CACtC,IAAA,CAAK,MAAQ,CACX,MAAA,CAAAA,EACA,IAAA,CAAM,MACR,EACF,CAMA,gBAAA,CAAiBA,CAAAA,CAA+B,CAC9C,IAAA,CAAK,KAAA,CAAQ,CACX,MAAA,CAAAA,CAAAA,CACA,IAAA,CAAM,QACR,EACF,CAOA,MAAM,IAAA,CAAKlC,CAAAA,CAA+B,CACxC,IAAMkC,CAAAA,CAAS,IAAIrB,EAOnB,OAAA,CANe,MAAM,IAAI,OAAA,CAAmB,CAACuB,CAAAA,CAASC,CAAAA,GAAW,CAC/DH,CAAAA,CACG,GAAG,KAAA,CAAQzE,CAAAA,EAAW2E,CAAAA,CAAQ3E,CAAM,CAAC,CAAA,CACrC,GAAG,OAAA,CAAS4E,CAAM,CAAA,CAClB,GAAA,CAAIrC,CAAI,EACb,CAAC,CAAA,EACa,MAChB,CAOA,MAAM,UAAA,CAAWA,EAAiD,CAChE,IAAMkC,CAAAA,CAAS,IAAIrB,CAAAA,CAEfP,CAAAA,CACJ,OAAIN,CAAAA,YAAgB,UAAA,CAClBM,CAAAA,CAAS,MAAA,CAAO,IAAA,CAAKN,CAAI,EAChBA,CAAAA,YAAgB,WAAA,CACzBM,CAAAA,CAAS,MAAA,CAAO,IAAA,CAAK,IAAI,WAAWN,CAAI,CAAC,EAEzCM,CAAAA,CAAS,MAAA,CAAO,KAAKN,CAAI,CAAA,CAAA,CAEZ,MAAM,IAAI,OAAA,CAAmB,CAACoC,EAASC,CAAAA,GAAW,CAC/DH,CAAAA,CACG,EAAA,CAAG,KAAA,CAAQzE,CAAAA,EAAW2E,EAAQ3E,CAAM,CAAC,CAAA,CACrC,EAAA,CAAG,OAAA,CAAS4E,CAAM,EAClB,GAAA,CAAI/B,CAAM,EACf,CAAC,CAAA,EACa,MAChB,CAMA,MAAA,CAAON,CAAAA,CAA+D,CACpE,GAAI,CAAC,KAAK,KAAA,CACR,MAAM,IAAI,KAAA,CAAM,oFAAoF,CAAA,CAGtG,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,GAAS,MAAA,CAAQ,CAC9B,IAAMwC,EAAa,IAAA,CAAK,KAAA,CAAM,OAE1BlC,CAAAA,CACA,OAAON,GAAS,QAAA,EAETA,CAAAA,YAAgB,UAAA,CADzBM,CAAAA,CAAS,MAAA,CAAO,IAAA,CAAKN,CAAI,CAAA,CAGhBA,CAAAA,YAAgB,WAAA,CACzBM,CAAAA,CAAS,MAAA,CAAO,IAAA,CAAK,IAAI,UAAA,CAAWN,CAAI,CAAC,CAAA,CAEzCM,CAAAA,CAAS,MAAA,CAAO,KAAKN,CAAI,CAAA,CAE3BwC,CAAAA,CAAW,KAAA,CAAMlC,CAAM,EACzB,CAEF,CAOA,MAAA,CAAOK,CAAAA,CAAiF,CACtF,GAAI,CAAC,KAAK,KAAA,CACR,MAAM,IAAI,KAAA,CAAM,oFAAoF,CAAA,CAGtG,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,GAAS,MAAA,CAAQ,CAC9B,IAAM6B,EAAa,IAAA,CAAK,KAAA,CAAM,OAC9B,OAAAA,CAAAA,CAAW,KAAI,CAER,IAAI,OAAA,CAAgB,CAACJ,CAAAA,CAASC,CAAAA,GAAW,CAC9CG,CAAAA,CACG,EAAA,CAAG,KAAA,CAAQ/E,CAAAA,EAAW,CACrB,GAAIkD,IAAa,QAAA,CAAU,CACzB,IAAM8B,CAAAA,CAAYhF,CAAAA,CAAO,MAAA,CACnBmD,EAAkB,EAAC,CACzB,QAASlD,CAAAA,CAAI,CAAA,CAAGA,EAAI+E,CAAAA,CAAU,MAAA,CAAQ/E,CAAAA,EAAK,CAAA,CACzCkD,CAAAA,CAAM,IAAA,CAAK,SAAS6B,CAAAA,CAAU,SAAA,CAAU/E,CAAAA,CAAGA,CAAAA,CAAI,CAAC,CAAA,CAAG,EAAE,CAAC,CAAA,CAGxD0E,CAAAA,CAAQ,MAAA,CAAO,IAAA,CAAKxB,CAAK,CAAQ,EACnC,CAAA,KACEwB,EAAQ3E,CAAAA,CAAO,MAAM,EAEzB,CAAC,CAAA,CACA,EAAA,CAAG,OAAA,CAAS4E,CAAM,EACvB,CAAC,CACH,CAAA,KAEE,OADqB,IAAA,CAAK,KAAA,CAAM,MAAA,CACZ,WAAU,CAAE,IAAA,CAAK5E,CAAAA,EAAUA,CAAAA,CAAO,MAAM,CAEhE,CAKA,KAAA,EAA8B,CACvB,KAAK,KAAA,EAIN,IAAA,CAAK,MAAM,IAAA,GAAS,MAAA,EACrB,IAAA,CAAK,KAAA,CAAM,MAAA,CAAqB,KAAA,GAGrC,CAMA,OAAO,WAAA,EAAuB,CAC5B,OAAO,KACT,CACF,CAAA,CCpKO,IAAKiF,CAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,EAAA,IAAA,CAAO,MAAA,CACPA,EAAA,SAAA,CAAY,WAAA,CACZA,EAAA,OAAA,CAAU,SAAA,CAJAA,CAAAA,CAAAA,EAAAA,CAAAA,EAAA,EAAA,EAOL,SAASC,EAAAA,EAAwC,CAEtD,OAAI,OAAO,OAAA,CAAY,GAAA,EAAe,OAAA,CAAQ,QAAA,EAAY,QAAQ,QAAA,CAAS,IAAA,CAClE,MAAA,CAIL,OAAO,aAAA,CAAkB,GAAA,CACpB,YAIL,OAAO,MAAA,CAAW,KAAe,MAAA,CAAO,QAAA,CACnC,UAGF,SACT,CAEO,SAASC,EAAAA,EAAkB,CAChC,OAAO,OAAO,OAAA,CAAY,GAAA,EACxB,OAAA,CAAQ,QAAA,GAAa,MAAA,EACrB,MAAA,GAAU,QAAQ,QACtB,CAEO,SAASC,EAAAA,EAAqB,CACnC,OAAO,OAAO,MAAA,CAAW,GAAA,EACvB,OAAO,QAAA,CAAa,GACxB,CAEO,SAASC,EAAAA,EAAuB,CACrC,OAAO,OAAO,aAAA,CAAkB,GAClC,CAQA,eAAsBC,CAAAA,CAAyBC,CAAAA,CAAmD,CAChG,OAAQA,GACN,KAAK,WAAA,CACH,IAAMC,CAAAA,CAAqBlD,CAAAA,CAAiB,aAAY,CACxD,OAAO,CACL,OAAA,CAAS,WAAA,CACT,UAAWkD,CAAAA,CACX,MAAA,CAAQA,CAAAA,CAAqB,MAAA,CAAY,8BAC3C,CAAA,CAEF,KAAK,YAAA,CACH,IAAMC,CAAAA,CAAsB9C,CAAAA,CAAkB,WAAA,EAAY,CAC1D,OAAO,CACL,OAAA,CAAS,YAAA,CACT,SAAA,CAAW8C,CAAAA,CACX,MAAA,CAAQA,EAAsB,MAAA,CAAY,8BAC5C,EAEF,KAAK,MAAA,CACH,IAAMC,CAAAA,CAAgB5C,CAAAA,CAAY,WAAA,EAAY,CAC9C,OAAO,CACL,QAAS,MAAA,CACT,SAAA,CAAW4C,CAAAA,CACX,MAAA,CAAQA,CAAAA,CAAgB,MAAA,CAAY,6BACtC,CAAA,CAEF,KAAK,QAAA,CACH,OAAO,CACL,OAAA,CAAS,SACT,SAAA,CAAW,IAAA,CACX,OAAQ,kBACV,CAAA,CAEF,KAAK,QAAA,CAEH,IAAMP,CAAAA,CAAS,OAAO,OAAA,CAAY,GAAA,EAAe,QAAQ,QAAA,EAAY,MAAA,GAAU,OAAA,CAAQ,QAAA,CACjFC,CAAAA,CAAY,OAAO,OAAW,GAAA,CACpC,OAAO,CACL,OAAA,CAAS,QAAA,CACT,SAAA,CAAWD,GAAUC,CAAAA,CACrB,MAAA,CAASD,GAAUC,CAAAA,CAAa,MAAA,CAAY,uBAC9C,CAAA,CAEF,QACE,OAAO,CACL,OAAA,CAASG,CAAAA,EAAe,UACxB,SAAA,CAAW,KAAA,CACX,MAAA,CAAQ,iBACV,CACJ,CACF,CAEA,eAAsBI,CAAAA,EAA6C,CACjE,IAAMC,CAAAA,CAAW,CAAC,YAAa,YAAA,CAAc,MAAA,CAAQ,SAAU,QAAQ,CAAA,CACjEC,EAAsB,EAAC,CAE7B,IAAA,IAAWC,CAAAA,IAAWF,CAAAA,CAAU,CAC9B,GAAM,CAAE,SAAA,CAAWG,CAAY,CAAA,CAAI,MAAMT,CAAAA,CAAyBQ,CAAO,CAAA,CACrEC,CAAAA,EACFF,CAAAA,CAAU,IAAA,CAAKC,CAAO,EAE1B,CAEA,OAAOD,CACT,CAQO,IAAMG,CAAAA,CAAsC,CACjD,CACE,IAAA,CAAM,YAAA,CACN,QAAA,CAAU,CAAA,CACV,WAAA,CAAa,iCACf,CAAA,CACA,CACE,IAAA,CAAM,WAAA,CACN,QAAA,CAAU,CAAA,CACV,YAAa,6CACf,CAAA,CACA,CACE,IAAA,CAAM,MAAA,CACN,QAAA,CAAU,EACV,WAAA,CAAa,wBACf,EACA,CACE,IAAA,CAAM,SACN,QAAA,CAAU,CAAA,CACV,WAAA,CAAa,2DACf,CAAA,CACA,CACE,KAAM,QAAA,CACN,QAAA,CAAU,CAAA,CACV,WAAA,CAAa,4CACf,CACF,EAEO,SAASC,CAAAA,CAAwBC,CAAAA,CAAqC,CAC3E,IAAMC,CAAAA,CAAiB,CAAC,GAAGH,CAAgB,EAAE,IAAA,CAAK,CAACxF,EAAGK,CAAAA,GAAML,CAAAA,CAAE,QAAA,CAAWK,CAAAA,CAAE,QAAQ,CAAA,CAEnF,OAAW,CAAE,IAAA,CAAAuF,CAAK,CAAA,GAAKD,CAAAA,CACrB,GAAID,EAAkB,QAAA,CAASE,CAAI,CAAA,CACjC,OAAOA,CAAAA,CAIX,OAAO,QACT,CAKO,IAAMC,CAAAA,CAAN,MAAMC,CAAgB,CAGnB,aAAc,CAAC,CAEvB,OAAO,WAAA,EAA+B,CACpC,OAAKA,EAAgB,QAAA,GACnBA,CAAAA,CAAgB,QAAA,CAAW,IAAIA,CAAAA,CAAAA,CAE1BA,CAAAA,CAAgB,QACzB,CAEA,MAAM,mBAAA,CAAoBF,CAAAA,CAA4B,CACpD,OAAQA,GACN,KAAK,aACH,OAAO,IAAIzD,EACb,KAAK,WAAA,CACH,OAAO,IAAIL,CAAAA,CACb,KAAK,OACH,OAAO,IAAIQ,CAAAA,CACb,KAAK,QAAA,CACH,OAAO,IAAIgC,CAAAA,CAEb,QACE,OAAO,IAAI7B,CACf,CACF,CAEA,MAAM,aAAA,CAAcsD,EAAwC,CAC1D,IAAMhB,EAAcgB,CAAAA,EAAmBN,CAAAA,CAAwB,MAAMN,CAAAA,EAAyB,CAAA,CAC9F,OAAO,IAAA,CAAK,mBAAA,CAAoBJ,CAAW,CAC7C,CACF,CAAA,CAEaiB,GAAWH,CAAAA,CAAgB,WAAA,EAAY,CAYvCI,CAAAA,CAAN,KAAsB,CAI3B,YAAYC,CAAAA,CAA0B,CAAC,aAAc,WAAA,CAAa,QAAA,CAAU,OAAQ,QAAQ,CAAA,CAAG,CAC7F,IAAA,CAAK,QAAA,CAAWL,CAAAA,CAAgB,aAAY,CAC5C,IAAA,CAAK,aAAA,CAAgBK,EACvB,CAKA,MAAM,QAAWC,CAAAA,CAAqE,CACpF,IAAMC,CAAAA,CAA8C,EAAC,CAErD,QAAWrB,CAAAA,IAAe,IAAA,CAAK,cAC7B,GAAI,CACF,IAAMO,CAAAA,CAAU,MAAM,IAAA,CAAK,QAAA,CAAS,mBAAA,CAAoBP,CAAW,EAC7DvF,CAAAA,CAAS,MAAM2G,CAAAA,CAAUb,CAAO,CAAA,CACtC,OAAO,CACL,OAAA,CAAS,CAAA,CAAA,CACT,OAAA,CAASP,CAAAA,CACT,IAAA,CAAMvF,CACR,CACF,CAAA,MAASqE,CAAAA,CAAO,CAId,GAHAuC,CAAAA,CAAO,KAAK,CAAE,OAAA,CAASrB,CAAAA,CAAa,KAAA,CAAOlB,CAAe,CAAC,EAGvDkB,CAAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,aAAA,CAAc,MAAA,CAAS,CAAC,CAAA,CAClE,OAAO,CACL,OAAA,CAAS,KAAA,CACT,OAAA,CAASA,EACT,IAAA,CAAM,IAAA,CACN,OAAAqB,CACF,CAEJ,CAGF,OAAO,CACL,OAAA,CAAS,KAAA,CACT,OAAA,CAAS,EAAA,CACT,KAAM,IAAA,CACN,MAAA,CAAAA,CACF,CACF,CAKA,MAAM,KAAKrE,CAAAA,CAA+C,CACxD,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAOuD,GAAYA,CAAAA,CAAQ,IAAA,CAAKvD,CAAI,CAAC,CAC3D,CAKA,MAAM,UAAA,CAAWA,CAAAA,CAAiE,CAChF,OAAO,IAAA,CAAK,QAAQ,MAAOuD,CAAAA,EAAYA,CAAAA,CAAQ,UAAA,CAAWvD,CAAI,CAAC,CACjE,CAKA,MAAM,cAAA,EAAkC,CACtC,IAAMsD,CAAAA,CAAY,MAAM,IAAA,CAAK,oBAAA,GAC7B,OAAIA,CAAAA,CAAU,SAAW,CAAA,CAChB,QAAA,CAEFA,CAAAA,CAAU,CAAC,CACpB,CAKA,MAAM,oBAAA,EAA0C,CAC9C,IAAMA,CAAAA,CAAsB,EAAC,CAE7B,QAAWN,CAAAA,IAAe,IAAA,CAAK,aAAA,CAC7B,GAAI,CACF,MAAM,KAAK,QAAA,CAAS,mBAAA,CAAoBA,CAAW,CAAA,CACnDM,CAAAA,CAAU,KAAKN,CAAW,EAC5B,CAAA,KAAQ,CAER,CAGF,OAAOM,CACT,CAKA,UAAA,EAAgE,CAE9D,OAAO,EACT,CACF,CAAA,CAEagB,EAAAA,CAAkB,IAAIJ,EAKnC,eAAsBK,EAAAA,CACpBvE,EACAgB,CAAAA,CAII,GACa,CACjB,IAAMwD,EAAK,IAAIN,CAAAA,CAEf,GAAIlD,CAAAA,CAAQ,YAAA,CAGV,OAAA,CADgB,MAAMwD,CAAAA,CAAG,QAAA,CAAS,mBAAA,CAAoBxD,CAAAA,CAAQ,YAAY,CAAA,EAC3D,KAAKhB,CAAI,CAAA,CAG1B,GAAIgB,CAAAA,CAAQ,QAAA,GAAa,KAAA,CAGvB,QADgB,MAAMwD,CAAAA,CAAG,SAAS,aAAA,EAAc,EACjC,KAAKxE,CAAI,CAAA,CAI1B,IAAMvC,CAAAA,CAAS,MAAM+G,CAAAA,CAAG,KAAKxE,CAAI,CAAA,CAEjC,GAAIvC,CAAAA,CAAO,OAAA,CACT,OACEuD,EAAQ,cAAA,EACRvD,CAAAA,CAAO,OAAA,GAAY,YAAA,EACnBA,CAAAA,CAAO,OAAA,GAAY,aAEnB,OAAA,CAAQ,IAAA,CAAK,8BAA8BA,CAAAA,CAAO,OAAO,EAAE,CAAA,CAEtDA,CAAAA,CAAO,IAAA,CAIhB,IAAMgH,CAAAA,CAAehH,CAAAA,CAAO,OACxBA,CAAAA,CAAO,MAAA,CAAO,GAAA,CAAKiH,CAAAA,EAAM,CAAA,EAAGA,CAAAA,CAAE,OAAO,CAAA,EAAA,EAAKA,CAAAA,CAAE,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA,CACtE,sBAEJ,MAAM,IAAI,MAAM,CAAA,oCAAA,EAAuCD,CAAY,CAAA,CAAE,CACvE,CAUO,IAAME,EAAN,KAAuB,CAAvB,WAAA,EAAA,CACL,IAAA,CAAQ,OAAA,CAA0C,CAChD,WAAY,CAAE,OAAA,CAAS,CAAA,CAAG,IAAA,CAAM,CAAE,CAAA,CAClC,UAAW,CAAE,OAAA,CAAS,EAAG,IAAA,CAAM,CAAE,EACjC,IAAA,CAAM,CAAE,OAAA,CAAS,CAAA,CAAG,IAAA,CAAM,CAAE,EAC5B,MAAA,CAAQ,CAAE,OAAA,CAAS,CAAA,CAAG,IAAA,CAAM,CAAE,EAC9B,MAAA,CAAQ,CAAE,OAAA,CAAS,CAAA,CAAG,IAAA,CAAM,CAAE,CAChC,EAAA,CAEA,aAAA,CAAcpB,EAAuB,CAC/B,IAAA,CAAK,QAAQA,CAAO,CAAA,EACtB,IAAA,CAAK,OAAA,CAAQA,CAAO,CAAA,CAAE,UAE1B,CAEA,UAAA,CAAWA,CAAAA,CAAuB,CAC5B,IAAA,CAAK,OAAA,CAAQA,CAAO,CAAA,EACtB,IAAA,CAAK,OAAA,CAAQA,CAAO,CAAA,CAAE,IAAA,GAE1B,CAEA,UAAA,EAA6C,CAC3C,OAAO,IAAA,CAAK,OACd,CAEA,YAAqB,CAOnB,OACE,CAAA,kBAAA,EAPY,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,CACxC,CAACqB,CAAAA,CAAKC,CAAAA,GAAMD,CAAAA,CAAMC,EAAE,OAAA,CAAUA,CAAAA,CAAE,IAAA,CAChC,CACF,CAI4B;AAAA,CAAA,CAC1B,OAAO,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,CACxB,GAAA,CAAI,CAAC,EAAGA,CAAC,CAAA,GAAM,CAAA,EAAGA,EAAE,OAAO,CAAA,UAAA,EAAaA,EAAE,IAAI,CAAA,KAAA,CAAO,EACrD,IAAA,CAAK;AAAA,CAAI,CAEhB,CAEA,KAAA,EAAc,CACZ,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,CAASC,CAAAA,EAAQ,CACzC,IAAA,CAAK,OAAA,CAAQA,CAAG,CAAA,CAAI,CAAE,OAAA,CAAS,CAAA,CAAG,IAAA,CAAM,CAAE,EAC5C,CAAC,EACH,CACF,CAAA,CAEaC,EAAAA,CAAU,IAAIJ","file":"detect.cjs","sourcesContent":["const hex_chr: string[] = \"0123456789abcdef\".split(\"\");\n\nexport default hex_chr;\n","import hex_chr from './hex_chr';\n\nfunction rhex(n: number): string {\n let s = '';\n for (let j = 0; j < 4; j++)\n s += hex_chr[(n >> (j * 8 + 4)) & 0x0f] + hex_chr[(n >> (j * 8)) & 0x0f];\n return s;\n}\n\nfunction hex(x: number[]): string {\n const l = x.length;\n const result: string[] = new Array(l);\n for (let i = 0; i < l; i++) result[i] = rhex(x[i]);\n return result.join('');\n}\n\nexport default hex;\n","function add32(x: number, y: number): number {\n //let lsw = (x & 0xffff) + (y & 0xffff);\n //let msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n //return (msw << 16) | (lsw & 0xffff);\n return (x + y) & 0xffffffff;\n}\n\nexport default add32;\n","import add32 from './add32';\n\ntype Add32Function = (x: number, y: number) => number;\n\nfunction cmn1(q: number, a: number, x: number, t: number, fn?: Add32Function) {\n const add = fn || add32;\n a = add(add(a, q), add(x, t));\n return a;\n}\n\nfunction cmn2(a: number, s: number, b: number, fn?: Add32Function) {\n const add = fn || add32;\n var result = add((a << s) | (a >>> (32 - s)), b);\n return result;\n}\n\nfunction cmn(\n q: number,\n a: number,\n b: number,\n x: number,\n s: number,\n t: number,\n fn?: Add32Function\n) {\n a = cmn1(q, a, x, t, fn);\n return cmn2(a, s, b, fn);\n}\n\nexport function ff(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn((b & c) | (~b & d), a, b, x, s, t, fn);\n}\n\nexport function gg(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn((b & d) | (c & ~d), a, b, x, s, t, fn);\n}\n\nexport function hh(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn(b ^ c ^ d, a, b, x, s, t, fn);\n}\n\nexport function ii(\n fn: Add32Function,\n a: number,\n b: number,\n c: number,\n d: number,\n x: number,\n s: number,\n t: number\n): number {\n return cmn(c ^ (b | ~d), a, b, x, s, t, fn);\n}\n","import add32 from './add32';\nimport { ff, gg, hh, ii } from './round-functions';\n\ntype Add32Function = (x: number, y: number) => number;\n\nfunction md5cycle(x: number[], k: number[], fn?: Add32Function): void {\n if (typeof fn === 'undefined') {\n fn = add32;\n }\n let a = x[0];\n let b = x[1];\n let c = x[2];\n let d = x[3];\n\n const fff = ff.bind(null, fn);\n a = fff(a, b, c, d, k[0], 7, -680876936);\n d = fff(d, a, b, c, k[1], 12, -389564586);\n c = fff(c, d, a, b, k[2], 17, 606105819);\n b = fff(b, c, d, a, k[3], 22, -1044525330);\n a = fff(a, b, c, d, k[4], 7, -176418897);\n d = fff(d, a, b, c, k[5], 12, 1200080426);\n c = fff(c, d, a, b, k[6], 17, -1473231341);\n b = fff(b, c, d, a, k[7], 22, -45705983);\n a = fff(a, b, c, d, k[8], 7, 1770035416);\n d = fff(d, a, b, c, k[9], 12, -1958414417);\n c = fff(c, d, a, b, k[10], 17, -42063);\n b = fff(b, c, d, a, k[11], 22, -1990404162);\n a = fff(a, b, c, d, k[12], 7, 1804603682);\n d = fff(d, a, b, c, k[13], 12, -40341101);\n c = fff(c, d, a, b, k[14], 17, -1502002290);\n b = fff(b, c, d, a, k[15], 22, 1236535329);\n\n const ggg = gg.bind(null, fn);\n a = ggg(a, b, c, d, k[1], 5, -165796510);\n d = ggg(d, a, b, c, k[6], 9, -1069501632);\n c = ggg(c, d, a, b, k[11], 14, 643717713);\n b = ggg(b, c, d, a, k[0], 20, -373897302);\n a = ggg(a, b, c, d, k[5], 5, -701558691);\n d = ggg(d, a, b, c, k[10], 9, 38016083);\n c = ggg(c, d, a, b, k[15], 14, -660478335);\n b = ggg(b, c, d, a, k[4], 20, -405537848);\n a = ggg(a, b, c, d, k[9], 5, 568446438);\n d = ggg(d, a, b, c, k[14], 9, -1019803690);\n c = ggg(c, d, a, b, k[3], 14, -187363961);\n b = ggg(b, c, d, a, k[8], 20, 1163531501);\n a = ggg(a, b, c, d, k[13], 5, -1444681467);\n d = ggg(d, a, b, c, k[2], 9, -51403784);\n c = ggg(c, d, a, b, k[7], 14, 1735328473);\n b = ggg(b, c, d, a, k[12], 20, -1926607734);\n\n const hhh = hh.bind(null, fn);\n a = hhh(a, b, c, d, k[5], 4, -378558);\n d = hhh(d, a, b, c, k[8], 11, -2022574463);\n c = hhh(c, d, a, b, k[11], 16, 1839030562);\n b = hhh(b, c, d, a, k[14], 23, -35309556);\n a = hhh(a, b, c, d, k[1], 4, -1530992060);\n d = hhh(d, a, b, c, k[4], 11, 1272893353);\n c = hhh(c, d, a, b, k[7], 16, -155497632);\n b = hhh(b, c, d, a, k[10], 23, -1094730640);\n a = hhh(a, b, c, d, k[13], 4, 681279174);\n d = hhh(d, a, b, c, k[0], 11, -358537222);\n c = hhh(c, d, a, b, k[3], 16, -722521979);\n b = hhh(b, c, d, a, k[6], 23, 76029189);\n a = hhh(a, b, c, d, k[9], 4, -640364487);\n d = hhh(d, a, b, c, k[12], 11, -421815835);\n c = hhh(c, d, a, b, k[15], 16, 530742520);\n b = hhh(b, c, d, a, k[2], 23, -995338651);\n\n const iii = ii.bind(null, fn);\n a = iii(a, b, c, d, k[0], 6, -198630844);\n d = iii(d, a, b, c, k[7], 10, 1126891415);\n c = iii(c, d, a, b, k[14], 15, -1416354905);\n b = iii(b, c, d, a, k[5], 21, -57434055);\n a = iii(a, b, c, d, k[12], 6, 1700485571);\n d = iii(d, a, b, c, k[3], 10, -1894986606);\n c = iii(c, d, a, b, k[10], 15, -1051523);\n b = iii(b, c, d, a, k[1], 21, -2054922799);\n a = iii(a, b, c, d, k[8], 6, 1873313359);\n d = iii(d, a, b, c, k[15], 10, -30611744);\n c = iii(c, d, a, b, k[6], 15, -1560198380);\n b = iii(b, c, d, a, k[13], 21, 1309151649);\n a = iii(a, b, c, d, k[4], 6, -145523070);\n d = iii(d, a, b, c, k[11], 10, -1120210379);\n c = iii(c, d, a, b, k[2], 15, 718787259);\n b = iii(b, c, d, a, k[9], 21, -343485551);\n\n x[0] = fn(a, x[0]);\n x[1] = fn(b, x[1]);\n x[2] = fn(c, x[2]);\n x[3] = fn(d, x[3]);\n}\n\nexport default md5cycle;\n","function md5blk(s: string): number[] {\n let md5blks: number[] = [];\n for (let i = 0; i < 64; i += 4) {\n md5blks[i >> 2] =\n (s.charCodeAt(i) || 0) +\n ((s.charCodeAt(i + 1) || 0) << 8) +\n ((s.charCodeAt(i + 2) || 0) << 16) +\n ((s.charCodeAt(i + 3) || 0) << 24);\n }\n return md5blks;\n}\n\nexport default md5blk;\n","import md5cycle from './md5cycle';\nimport md5blk from './md5blk';\n\ntype Add32Function = (x: number, y: number) => number;\n\nfunction md51(s: string, add32?: Add32Function): number[] {\n const n = s.length;\n const state = [1732584193, -271733879, -1732584194, 271733878];\n let i;\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk(s.substring(i - 64, i)), add32);\n }\n s = s.substring(i - 64);\n var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n sl = s.length;\n for (i = 0; i < sl; i++) tail[i >> 2] |= (s.charCodeAt(i) & 0xff) << ((i % 4) << 3);\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail, add32);\n i = 16;\n while (i--) {\n tail[i] = 0;\n }\n }\n tail[14] = n * 8;\n md5cycle(state, tail, add32);\n return state;\n}\n\nexport default md51;\n","/**\n * Core MD5 implementation - Pure JavaScript\n * No dependencies, no environment detection\n * This is the minimal, tree-shakeable core\n */\n\nimport hex from '../hex';\nimport md51 from '../md51';\nimport md5buf from '../md5buf';\nimport add32 from '../add32';\n\n/**\n * Compute MD5 hash of a string\n * @param string - Input string to hash\n * @returns MD5 hash as hex string\n */\nexport function md5Core(string: string): string {\n // Use the original implementation\n const fn = add32;\n return hex(md51(string, fn));\n}\n\n/**\n * Compute MD5 hash of a Buffer\n * @param buffer - Input Buffer to hash\n * @returns MD5 hash as hex string\n */\nexport function md5Buffer(buffer: Buffer): string {\n const fn = add32;\n return hex(md5buf(buffer, fn));\n}\n\nexport { md5Core as md5 };\n","/**\n * Web Crypto API Backend\n * Uses browser's native Web Crypto API for MD5 hashing\n * Note: Web Crypto API does not support MD5 in most browsers, so this backend\n * falls back to pure JS implementation\n */\n\nimport { MD5Backend } from \"./types.js\";\nimport { md5Core } from \"../core/index.js\";\n\nexport class WebCryptoBackend implements MD5Backend {\n name: string = \"webcrypto\";\n version: string = \"1.0.0\";\n\n static isAvailable(): boolean {\n // Check if Web Crypto API is available\n return typeof crypto !== \"undefined\" &&\n typeof crypto.subtle !== \"undefined\" &&\n typeof crypto.subtle.digest === \"function\";\n }\n\n async hash(data: string): Promise<string> {\n // Web Crypto API doesn't support MD5, so use pure JS implementation\n return md5Core(data);\n }\n\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n // Web Crypto API doesn't support MD5, so use pure JS implementation\n const text = data instanceof ArrayBuffer\n ? new TextDecoder().decode(data)\n : new TextDecoder().decode(data);\n return md5Core(text);\n }\n\n update(_data: string | ArrayBuffer | Uint8Array): void | Promise<void> {\n throw new Error(\"Web Crypto API does not support streaming updates\");\n }\n\n digest(_encoding?: \"hex\" | \"buffer\"): string | Uint8Array | Promise<string | Uint8Array> {\n throw new Error(\"Web Crypto API does not support streaming\");\n }\n\n reset(): void | Promise<void> {\n // No state to reset\n }\n}\n","/**\n * Node.js Crypto Backend\n * Uses Node.js native crypto module for MD5 hashing\n */\n\nimport { MD5Backend } from \"./types.js\";\n\nexport class NodeCryptoBackend implements MD5Backend {\n name: string = \"nodecrypto\";\n version: string = \"1.0.0\";\n\n static isAvailable(): boolean {\n try {\n const nodeCrypto = require(\"node:crypto\");\n return typeof nodeCrypto.createHash === \"function\";\n } catch {\n return false;\n }\n }\n\n hash(data: string): string {\n const nodeCrypto = require(\"node:crypto\");\n return nodeCrypto.createHash(\"md5\").update(data).digest(\"hex\");\n }\n\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n const nodeCrypto = require(\"node:crypto\");\n const buffer = data instanceof Uint8Array ? data : new Uint8Array(data);\n return nodeCrypto.createHash(\"md5\").update(buffer).digest(\"hex\");\n }\n\n update(_data: string | ArrayBuffer | Uint8Array): void | Promise<void> {\n // Node crypto handles streaming internally\n // This is here for interface compatibility\n }\n\n digest(_encoding?: \"hex\" | \"buffer\"): string | Uint8Array | Promise<string | Uint8Array> {\n throw new Error(\"Node crypto streaming not implemented\");\n }\n\n reset(): void | Promise<void> {\n // No state to reset\n }\n}\n","/**\n * IE11 msCrypto Backend\n * Uses Internet Explorer 11 msCrypto API for MD5 hashing\n */\n\nimport { MD5Backend } from \"./types.js\";\n\ninterface WinWithMsCrypto extends Window {\n msCrypto?: Crypto;\n}\n\nexport class IE11Backend implements MD5Backend {\n name: string = \"ie11\";\n version: string = \"1.0.0\";\n\n static isAvailable(): boolean {\n if (typeof window === \"undefined\") {\n return false;\n }\n const win = window as WinWithMsCrypto;\n return typeof win.msCrypto !== \"undefined\" &&\n typeof win.msCrypto.subtle !== \"undefined\" &&\n typeof win.msCrypto.subtle.digest === \"function\";\n }\n\n async hash(data: string): Promise<string> {\n const encoder = new TextEncoder();\n const buffer = encoder.encode(data);\n return await this.hashBinary(buffer);\n }\n\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n const win = window as WinWithMsCrypto;\n const buffer = data instanceof Uint8Array ? data.buffer as ArrayBuffer : data;\n const hashBuffer = await win.msCrypto!.subtle.digest(\"MD5\", buffer);\n return this.bufferToHex(hashBuffer);\n }\n\n private bufferToHex(buffer: ArrayBuffer): string {\n return Array.from(new Uint8Array(buffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n update(_data: string | ArrayBuffer | Uint8Array): void | Promise<void> {\n throw new Error(\"msCrypto does not support streaming updates\");\n }\n\n digest(_encoding?: \"hex\" | \"buffer\"): string | Uint8Array | Promise<string | Uint8Array> {\n throw new Error(\"msCrypto does not support streaming\");\n }\n\n reset(): void | Promise<void> {\n // No state to reset\n }\n}\n","/**\n * Pure JavaScript Backend\n * Uses the internal md5Core implementation\n */\n\nimport { MD5Backend } from \"./types.js\";\nimport { md5Core } from \"../core/index.js\";\n\nexport class PureJSBackend implements MD5Backend {\n name: string = \"purejs\";\n version: string = \"0.1.0\";\n\n private state: {\n data: string;\n finished: boolean;\n };\n\n constructor() {\n this.state = { data: \"\", finished: false };\n }\n\n hash(data: string): string {\n return md5Core(data);\n }\n\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n const text =\n data instanceof ArrayBuffer\n ? new TextDecoder().decode(data)\n : new TextDecoder().decode(data);\n return md5Core(text);\n }\n\n update(data: string | ArrayBuffer | Uint8Array): void | Promise<void> {\n if (this.state.finished) {\n // Reset if already finished\n this.state = { data: \"\", finished: false };\n }\n\n if (data instanceof ArrayBuffer) {\n this.state.data += new TextDecoder().decode(data);\n } else if (data instanceof Uint8Array) {\n this.state.data += new TextDecoder().decode(data);\n } else {\n this.state.data += data;\n }\n }\n\n digest(encoding?: \"hex\" | \"buffer\"): string | Uint8Array | Promise<string | Uint8Array> {\n const result = md5Core(this.state.data);\n this.state.finished = true;\n\n if (encoding === \"buffer\") {\n return this.hexToBuffer(result);\n }\n return result;\n }\n\n reset(): void | Promise<void> {\n this.state = { data: \"\", finished: false };\n }\n\n static isAvailable(): boolean {\n return true; // Always available\n }\n\n private hexToBuffer(hex: string): Uint8Array {\n const bytes: number[] = [];\n for (let i = 0; i < hex.length; i += 2) {\n bytes.push(parseInt(hex.substring(i, i + 2), 16));\n }\n return new Uint8Array(bytes);\n }\n}\n","/**\n * MD5Stream - Node.js Transform stream for MD5 hash computation\n * Provides streaming MD5 hashing with minimal overhead\n */\n\nimport { Transform, TransformCallback } from 'stream';\nimport md5cycle from '../md5cycle';\nimport hex from '../hex';\nimport add32 from '../add32';\n\n/**\n * State interface for MD5 computation\n */\ninterface MD5State {\n state: number[];\n bytesProcessed: number;\n bufferLength: number;\n buffer: Uint8Array;\n}\n\n/**\n * Options for MD5Stream constructor\n */\ninterface MD5StreamOptions {\n /**\n * Custom add32 function for compatibility testing\n */\n add32?: (x: number, y: number) => number;\n}\n\n/**\n * MD5Stream - Node.js Transform stream for computing MD5 hashes\n * \n * Usage example:\n * ```ts\n * import fs from 'fs';\n * import { MD5Stream } from 'pure-md5';\n * \n * const stream = new MD5Stream();\n * stream.on('md5', (result) => {\n * console.log('MD5:', result.digest);\n * console.log('Bytes:', result.bytesProcessed);\n * });\n * \n * fs.createReadStream('file.txt').pipe(stream);\n * ```\n */\nexport class MD5Stream extends Transform {\n private state: MD5State;\n private add32: (x: number, y: number) => number;\n private readonly initialMD5State = [1732584193, -271733879, -1732584194, 271733878];\n private readonly bufferCapacity: number = 64;\n private buffer: Uint8Array = new Uint8Array(this.bufferCapacity);\n\n /**\n * Create new MD5Stream instance\n * @param options - Stream options\n */\n constructor(options?: MD5StreamOptions) {\n super({\n readableObjectMode: false,\n writableObjectMode: false\n });\n\n this.add32 = options?.add32 || add32;\n this.state = {\n state: [...this.initialMD5State],\n bytesProcessed: 0,\n bufferLength: 0,\n buffer: this.buffer\n };\n }\n\n /**\n * Process data chunk and update MD5 state\n * @param chunk - Data chunk to process\n * @param callback - Callback to signal chunk processing complete\n */\n _transform(chunk: Buffer, _encoding: BufferEncoding, callback: TransformCallback): void {\n try {\n let data = chunk as Buffer;\n const dataLength = data.length;\n \n if (dataLength === 0) {\n callback();\n return;\n }\n\n // Combine with remaining buffer if needed\n if (this.state.bufferLength > 0) {\n const currentBufferLength = this.state.bufferLength;\n const neededBytes = 64 - currentBufferLength;\n const bytesToCopy = Math.min(dataLength, neededBytes);\n \n // Copy data to buffer\n for (let i = 0; i < bytesToCopy; i++) {\n this.buffer[currentBufferLength + i] = data[i];\n }\n \n this.state.bufferLength += bytesToCopy;\n \n // If buffer is full, process it\n if (this.state.bufferLength === 64) {\n this._processBufferBlock();\n }\n \n // If we used all data, we're done\n if (bytesToCopy === dataLength) {\n callback();\n return;\n }\n \n // Move to next position in original data\n // Shift remaining data to beginning of buffer\n const remainingData = dataLength - bytesToCopy;\n for (let i = 0; i < remainingData; i++) {\n data[i] = data[bytesToCopy + i];\n }\n // Create a new buffer with only the remaining data\n const remainingBuffer = Buffer.alloc(remainingData);\n for (let i = 0; i < remainingData; i++) {\n remainingBuffer[i] = data[i];\n }\n data = remainingBuffer;\n }\n \n // Process full 64-byte blocks directly from data\n const fullBlocks = Math.floor(data.length / 64);\n \n for (let i = 0; i < fullBlocks; i++) {\n const blockStart = i * 64;\n const block: number[] = [];\n \n for (let j = 0; j < 16; j++) {\n const idx = blockStart + j * 4;\n block[j] = \n data[idx] +\n (data[idx + 1] << 8) +\n (data[idx + 2] << 16) +\n (data[idx + 3] << 24);\n }\n \n md5cycle(this.state.state, block, this.add32);\n this.state.bytesProcessed += 64;\n }\n \n // Store remaining bytes in buffer\n const remaining = data.length % 64;\n if (remaining > 0) {\n // Ensure buffer is large enough\n if (this.buffer.length < remaining) {\n this.buffer = new Uint8Array(remaining);\n this.state.buffer = this.buffer;\n }\n \n // Copy remaining bytes to buffer\n for (let i = 0; i < remaining; i++) {\n this.buffer[i] = data[fullBlocks * 64 + i];\n }\n this.state.bufferLength = remaining;\n }\n \n callback();\n } catch (error) {\n callback(error as Error);\n }\n }\n\n /**\n * Process the current buffer as a complete block\n */\n private _processBufferBlock(): void {\n const buffer = this.state.buffer;\n const block: number[] = [];\n \n for (let j = 0; j < 16; j++) {\n const idx = j * 4;\n block[j] = \n buffer[idx] +\n (buffer[idx + 1] << 8) +\n (buffer[idx + 2] << 16) +\n (buffer[idx + 3] << 24);\n }\n \n md5cycle(this.state.state, block, this.add32);\n this.state.bytesProcessed += 64;\n this.state.bufferLength = 0;\n }\n\n /**\n * Finalize MD5 computation and emit result\n * @param callback - Callback to signal flush complete\n */\n _flush(callback: TransformCallback): void {\n try {\n const { state, bufferLength, buffer } = this.state;\n \n // Final padding\n const tail: number[] = new Array(16).fill(0);\n \n // Copy remaining buffer\n for (let i = 0; i < bufferLength; i++) {\n tail[i >> 2] |= (buffer[i] & 0xff) << ((i % 4) << 3);\n }\n \n // Append 0x80\n tail[bufferLength >> 2] |= 0x80 << ((bufferLength % 4) << 3);\n \n // If not enough space for length, process current block\n if (bufferLength > 55) {\n md5cycle(state, tail, this.add32);\n for (let i = 0; i < 16; i++) {\n tail[i] = 0;\n }\n }\n \n // Append length (in bits) - include remaining bytes\n tail[14] = (this.state.bytesProcessed + bufferLength) * 8;\n tail[15] = 0; // High 32 bits of length (not used for typical files)\n \n // Final MD5 cycle\n md5cycle(state, tail, this.add32);\n \n // Generate hex digest\n const digest = hex(state);\n \n // Emit result\n this.emit('md5', {\n digest,\n bytesProcessed: this.state.bytesProcessed + bufferLength\n });\n \n callback();\n } catch (error) {\n callback(error as Error);\n }\n }\n\n /**\n * Get current MD5 state (for debugging/testing)\n * @returns Current internal state\n */\n public getCurrentState(): { state: number[]; bytesProcessed: number } {\n return {\n state: [...this.state.state],\n bytesProcessed: this.state.bytesProcessed + this.state.bufferLength\n };\n }\n\n /**\n * Get bytes processed so far\n * @returns Number of bytes processed\n */\n public getBytesProcessed(): number {\n return this.state.bytesProcessed + this.state.bufferLength;\n }\n\n /**\n * Reset the stream state\n * Note: This resets the internal MD5 state but not the stream's ended state.\n * For full stream reset, use destroy() and create a new instance.\n */\n public reset(): void {\n // Reset internal MD5 state\n this.state = {\n state: [...this.initialMD5State],\n bytesProcessed: 0,\n bufferLength: 0,\n buffer: this.buffer\n };\n this.buffer = new Uint8Array(this.bufferCapacity);\n this.state.buffer = this.buffer;\n this.state.bufferLength = 0;\n }\n\n /**\n * Static method to create MD5Stream from existing readable stream\n * @param source - Source readable stream\n * @param options - MD5Stream options\n * @returns Object containing stream and result promise\n */\n static fromStream(\n source: import('stream').Readable,\n options?: MD5StreamOptions\n ): { stream: MD5Stream; result: Promise<MD5Result> } {\n const stream = new MD5Stream(options);\n const result = pipeThroughMD5.call(stream, source);\n \n return { stream, result };\n }\n}\n\n/**\n * Factory function to create MD5Stream instance\n * @param options - MD5Stream options\n * @returns New MD5Stream instance\n */\nexport function createMD5Stream(options?: MD5StreamOptions): MD5Stream {\n return new MD5Stream(options);\n}\n\n/**\n * Result type for MD5 computation\n */\nexport interface MD5Result {\n /**\n * MD5 hash as hex string\n */\n digest: string;\n /**\n * Number of bytes processed\n */\n bytesProcessed: number;\n}\n\n/**\n * Pipe through MD5 stream helper\n * @param this - MD5Stream instance\n * @param source - Source readable stream to process\n * @returns Promise with MD5 result\n */\nexport async function pipeThroughMD5(\n this: MD5Stream,\n source: import('stream').Readable\n): Promise<MD5Result> {\n return new Promise((resolve, reject) => {\n const results: MD5Result[] = [];\n \n source\n .pipe(this)\n .on('md5', (result: MD5Result) => {\n results.push(result);\n })\n .on('error', reject)\n .on('finish', () => {\n resolve(results[0]);\n });\n });\n}\n\n/**\n * Static method to create MD5Stream from existing readable stream\n * @param source - Source readable stream\n * @param options - MD5Stream options\n * @returns Object containing stream and result promise\n */\nexport function fromStream(\n source: import('stream').Readable,\n options?: MD5StreamOptions\n): { stream: MD5Stream; result: Promise<MD5Result> } {\n const stream = new MD5Stream(options);\n const result = pipeThroughMD5.call(stream, source);\n \n return { stream, result };\n}\n","/**\n * Stream Backend Adapter\n * Integrates MD5 stream computation with backend detection system\n */\n\nimport { MD5Backend } from '../adapters/types.js';\nimport { MD5Stream, MD5Result } from './md5-stream.js';\nimport { MD5ReadableStream as WHATWGMD5Stream } from './whatwg-stream.js';\n\n/**\n * Stream backend state\n */\ninterface StreamBackendState {\n stream: MD5Stream | WHATWGMD5Stream;\n type: 'node' | 'whatwg';\n}\n\n/**\n * Stream backend for MD5 operations that supports streaming\n * Can be used with both Node.js streams and WHATWG streams\n */\nexport class StreamBackend implements MD5Backend {\n name: string = 'stream';\n version: string = '0.1.0';\n \n private state: StreamBackendState | null = null;\n \n /**\n * Initialize with Node.js stream\n * @param stream Node.js Transform stream\n */\n initNodeStream(stream: MD5Stream): void {\n this.state = {\n stream,\n type: 'node'\n };\n }\n \n /**\n * Initialize with WHATWG stream\n * @param stream WHATWG ReadableStream\n */\n initWhatWGStream(stream: WHATWGMD5Stream): void {\n this.state = {\n stream,\n type: 'whatwg'\n };\n }\n \n /**\n * Hash string data (converts to stream internally)\n * @param data String to hash\n * @returns MD5 hash as hex string\n */\n async hash(data: string): Promise<string> {\n const stream = new MD5Stream();\n const result = await new Promise<MD5Result>((resolve, reject) => {\n stream\n .on('md5', (result) => resolve(result))\n .on('error', reject)\n .end(data);\n });\n return result.digest;\n }\n \n /**\n * Hash binary data (converts to stream internally)\n * @param data Binary data to hash\n * @returns MD5 hash as hex string\n */\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<string> {\n const stream = new MD5Stream();\n // Convert ArrayBuffer to Buffer first\n let buffer: Buffer;\n if (data instanceof Uint8Array) {\n buffer = Buffer.from(data);\n } else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(new Uint8Array(data));\n } else {\n buffer = Buffer.from(data);\n }\n const result = await new Promise<MD5Result>((resolve, reject) => {\n stream\n .on('md5', (result) => resolve(result))\n .on('error', reject)\n .end(buffer);\n });\n return result.digest;\n }\n \n /**\n * Update hash with additional data (streaming)\n * @param data Data to add to hash\n */\n update(data: string | ArrayBuffer | Uint8Array): void | Promise<void> {\n if (!this.state) {\n throw new Error('Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.');\n }\n \n if (this.state.type === 'node') {\n const nodeStream = this.state.stream as MD5Stream;\n // Convert to Buffer properly based on type\n let buffer: Buffer;\n if (typeof data === 'string') {\n buffer = Buffer.from(data);\n } else if (data instanceof Uint8Array) {\n buffer = Buffer.from(data);\n } else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(new Uint8Array(data));\n } else {\n buffer = Buffer.from(data);\n }\n nodeStream.write(buffer);\n }\n // WHATWG streams don't support update in the same way\n }\n \n /**\n * Get final hash digest\n * @param encoding Output encoding ('hex' or 'buffer')\n * @returns Hash digest\n */\n digest(encoding?: 'hex' | 'buffer'): string | Uint8Array | Promise<string | Uint8Array> {\n if (!this.state) {\n throw new Error('Stream backend not initialized. Call initNodeStream() or initWhatWGStream() first.');\n }\n \n if (this.state.type === 'node') {\n const nodeStream = this.state.stream as MD5Stream;\n nodeStream.end();\n \n return new Promise<string>((resolve, reject) => {\n nodeStream\n .on('md5', (result) => {\n if (encoding === 'buffer') {\n const hexDigest = result.digest;\n const bytes: number[] = [];\n for (let i = 0; i < hexDigest.length; i += 2) {\n bytes.push(parseInt(hexDigest.substring(i, i + 2), 16));\n }\n // Type assertion to avoid TypeScript error\n resolve(Buffer.from(bytes) as any);\n } else {\n resolve(result.digest);\n }\n })\n .on('error', reject);\n });\n } else {\n const whatwgStream = this.state.stream as WHATWGMD5Stream;\n return whatwgStream.getResult().then(result => result.digest);\n }\n }\n \n /**\n * Reset the hash state\n */\n reset(): void | Promise<void> {\n if (!this.state) {\n return;\n }\n \n if (this.state.type === 'node') {\n (this.state.stream as MD5Stream).reset();\n }\n // WHATWG streams don't support reset\n }\n \n /**\n * Check if backend is available\n * @returns Always true for stream backend\n */\n static isAvailable(): boolean {\n return true; // Stream backend is always available\n }\n}\n","/**\n * Backend Detection Utilities\n * Detects available backends and environment\n */\n\nimport { WebCryptoBackend } from \"../adapters/webcrypto.js\";\nimport { NodeCryptoBackend } from \"../adapters/node.js\";\nimport { IE11Backend } from \"../adapters/ie11.js\";\nimport { PureJSBackend } from \"../adapters/pure-js.js\";\nimport { StreamBackend } from \"../stream/adapter.js\";\n\nexport enum RuntimeEnvironment {\n BROWSER = \"browser\",\n NODE = \"node\",\n WEBWORKER = \"webworker\",\n UNKNOWN = \"unknown\"\n}\n\nexport function detectEnvironment(): RuntimeEnvironment {\n // Check Node.js environment\n if (typeof process !== \"undefined\" && process.versions && process.versions.node) {\n return RuntimeEnvironment.NODE;\n }\n\n // Check web worker\n if (typeof importScripts !== \"undefined\") {\n return RuntimeEnvironment.WEBWORKER;\n }\n\n // Check browser\n if (typeof window !== \"undefined\" && window.document) {\n return RuntimeEnvironment.BROWSER;\n }\n\n return RuntimeEnvironment.UNKNOWN;\n}\n\nexport function isNode(): boolean {\n return typeof process !== \"undefined\" &&\n process.versions !== undefined &&\n \"node\" in process.versions;\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\" &&\n typeof document !== \"undefined\";\n}\n\nexport function isWebWorker(): boolean {\n return typeof importScripts !== \"undefined\";\n}\n\nexport interface BackendAvailability {\n backend: string;\n available: boolean;\n reason?: string;\n}\n\nexport async function checkBackendAvailability(backendName: string): Promise<BackendAvailability> {\n switch (backendName) {\n case \"webcrypto\":\n const webCryptoAvailable = WebCryptoBackend.isAvailable();\n return {\n backend: \"webcrypto\",\n available: webCryptoAvailable,\n reason: webCryptoAvailable ? undefined : \"Web Crypto API not available\"\n };\n\n case \"nodecrypto\":\n const nodeCryptoAvailable = NodeCryptoBackend.isAvailable();\n return {\n backend: \"nodecrypto\",\n available: nodeCryptoAvailable,\n reason: nodeCryptoAvailable ? undefined : \"Node.js crypto not available\"\n };\n\n case \"ie11\":\n const ie11Available = IE11Backend.isAvailable();\n return {\n backend: \"ie11\",\n available: ie11Available,\n reason: ie11Available ? undefined : \"IE11 msCrypto not available\"\n };\n\n case \"purejs\":\n return {\n backend: \"purejs\",\n available: true,\n reason: \"Always available\"\n };\n\n case \"stream\":\n // Stream backend is always available (uses Node.js streams or WHATWG streams)\n const isNode = typeof process !== 'undefined' && process.versions && 'node' in process.versions;\n const isBrowser = typeof window !== 'undefined';\n return {\n backend: \"stream\",\n available: isNode || isBrowser,\n reason: (isNode || isBrowser) ? undefined : \"Streams not available\"\n };\n\n default:\n return {\n backend: backendName || 'unknown',\n available: false,\n reason: 'Unknown backend'\n };\n }\n}\n\nexport async function getAllAvailableBackends(): Promise<string[]> {\n const backends = [\"webcrypto\", \"nodecrypto\", \"ie11\", \"purejs\", \"stream\"];\n const available: string[] = [];\n\n for (const backend of backends) {\n const { available: isAvailable } = await checkBackendAvailability(backend);\n if (isAvailable) {\n available.push(backend);\n }\n }\n\n return available;\n}\n\nexport interface BackendPriority {\n name: string;\n priority: number;\n description: string;\n}\n\nexport const BACKEND_PRIORITY: BackendPriority[] = [\n {\n name: \"nodecrypto\",\n priority: 1,\n description: \"Node.js native crypto (fastest)\"\n },\n {\n name: \"webcrypto\",\n priority: 2,\n description: \"Web Crypto API (fast, hardware accelerated)\"\n },\n {\n name: \"ie11\",\n priority: 3,\n description: \"IE11 msCrypto (legacy)\"\n },\n {\n name: \"stream\",\n priority: 4,\n description: \"Streaming backend (for large files and memory efficiency)\"\n },\n {\n name: \"purejs\",\n priority: 5,\n description: \"Pure JavaScript (always available, slower)\"\n }\n];\n\nexport function getBestAvailableBackend(availableBackends: string[]): string {\n const sortedPriority = [...BACKEND_PRIORITY].sort((a, b) => a.priority - b.priority);\n\n for (const { name } of sortedPriority) {\n if (availableBackends.includes(name)) {\n return name;\n }\n }\n\n return \"purejs\"; // Fallback\n}\n\n/**\n * Backend Detector for creating instances\n */\nexport class BackendDetector {\n private static instance: BackendDetector;\n\n private constructor() {}\n\n static getInstance(): BackendDetector {\n if (!BackendDetector.instance) {\n BackendDetector.instance = new BackendDetector();\n }\n return BackendDetector.instance;\n }\n\n async createBackendByName(name: string): Promise<any> {\n switch (name) {\n case \"nodecrypto\":\n return new NodeCryptoBackend();\n case \"webcrypto\":\n return new WebCryptoBackend();\n case \"ie11\":\n return new IE11Backend();\n case \"stream\":\n return new StreamBackend();\n case \"purejs\":\n default:\n return new PureJSBackend();\n }\n }\n\n async createBackend(detectedBackend?: string): Promise<any> {\n const backendName = detectedBackend || getBestAvailableBackend(await getAllAvailableBackends());\n return this.createBackendByName(backendName);\n }\n}\n\nexport const detector = BackendDetector.getInstance();\n\n/**\n * Fallback Manager with retry logic\n */\nexport interface FallbackResult<T> {\n success: boolean;\n backend: string;\n data: T;\n errors?: { backend: string; error: Error }[];\n}\n\nexport class FallbackManager {\n public detector: BackendDetector;\n private fallbackOrder: string[];\n\n constructor(fallbackOrder: string[] = [\"nodecrypto\", \"webcrypto\", \"stream\", \"ie11\", \"purejs\"]) {\n this.detector = BackendDetector.getInstance();\n this.fallbackOrder = fallbackOrder;\n }\n\n /**\n * Execute operation with fallback mechanism\n */\n async execute<T>(operation: (backend: any) => Promise<T>): Promise<FallbackResult<T>> {\n const errors: { backend: string; error: Error }[] = [];\n\n for (const backendName of this.fallbackOrder) {\n try {\n const backend = await this.detector.createBackendByName(backendName);\n const result = await operation(backend);\n return {\n success: true,\n backend: backendName,\n data: result\n };\n } catch (error) {\n errors.push({ backend: backendName, error: error as Error });\n\n // Don't fallback if last backend failed\n if (backendName === this.fallbackOrder[this.fallbackOrder.length - 1]) {\n return {\n success: false,\n backend: backendName,\n data: null as unknown as T,\n errors\n };\n }\n }\n }\n\n return {\n success: false,\n backend: \"\",\n data: null as unknown as T,\n errors\n };\n }\n\n /**\n * Hash with fallback mechanism\n */\n async hash(data: string): Promise<FallbackResult<string>> {\n return this.execute(async (backend) => backend.hash(data));\n }\n\n /**\n * Hash binary data with fallback\n */\n async hashBinary(data: ArrayBuffer | Uint8Array): Promise<FallbackResult<string>> {\n return this.execute(async (backend) => backend.hashBinary(data));\n }\n\n /**\n * Get the best available backend\n */\n async getBestBackend(): Promise<string> {\n const available = await this.getAvailableBackends();\n if (available.length === 0) {\n return \"purejs\"; // Fallback\n }\n return available[0]; // First is best\n }\n\n /**\n * Get available backends in priority order\n */\n async getAvailableBackends(): Promise<string[]> {\n const available: string[] = [];\n\n for (const backendName of this.fallbackOrder) {\n try {\n await this.detector.createBackendByName(backendName);\n available.push(backendName);\n } catch {\n // Backend not available\n }\n }\n\n return available;\n }\n\n /**\n * Get backend metrics for monitoring\n */\n getMetrics(): Record<string, { success: number; fail: number }> {\n // Implementation for tracking usage\n return {};\n }\n}\n\nexport const fallbackManager = new FallbackManager();\n\n/**\n * Robust hash function with fallback support\n */\nexport async function robustHash(\n data: string,\n options: {\n fallback?: boolean;\n reportFallback?: boolean;\n forceBackend?: string;\n } = {}\n): Promise<string> {\n const fm = new FallbackManager();\n\n if (options.forceBackend) {\n // Use specific backend without fallback\n const backend = await fm.detector.createBackendByName(options.forceBackend);\n return backend.hash(data);\n }\n\n if (options.fallback === false) {\n // Use default backend without fallback\n const backend = await fm.detector.createBackend();\n return backend.hash(data);\n }\n\n // Use fallback\n const result = await fm.hash(data);\n\n if (result.success) {\n if (\n options.reportFallback &&\n result.backend !== \"nodecrypto\" &&\n result.backend !== \"webcrypto\"\n ) {\n console.info(`MD5 used fallback backend: ${result.backend}`);\n }\n return result.data;\n }\n\n // All backends failed\n const errorMessage = result.errors\n ? result.errors.map((e) => `${e.backend}: ${e.error.message}`).join(\", \")\n : \"All backends failed\";\n\n throw new Error(`MD5 hash failed after all attempts: ${errorMessage}`);\n}\n\n/**\n * Metrics collector for backend usage\n */\ninterface BackendMetrics {\n success: number;\n fail: number;\n}\n\nexport class MetricsCollector {\n private metrics: Record<string, BackendMetrics> = {\n nodecrypto: { success: 0, fail: 0 },\n webcrypto: { success: 0, fail: 0 },\n ie11: { success: 0, fail: 0 },\n stream: { success: 0, fail: 0 },\n purejs: { success: 0, fail: 0 }\n };\n\n recordSuccess(backend: string): void {\n if (this.metrics[backend]) {\n this.metrics[backend].success++;\n }\n }\n\n recordFail(backend: string): void {\n if (this.metrics[backend]) {\n this.metrics[backend].fail++;\n }\n }\n\n getMetrics(): Record<string, BackendMetrics> {\n return this.metrics;\n }\n\n getSummary(): string {\n const total = Object.values(this.metrics).reduce(\n (sum, m) => sum + m.success + m.fail,\n 0\n );\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return (\n `Total operations: ${total}\\n` +\n Object.entries(this.metrics)\n .map(([, m]) => `${m.success} success, ${m.fail} fail`)\n .join(\"\\n\")\n );\n }\n\n reset(): void {\n Object.keys(this.metrics).forEach((key) => {\n this.metrics[key] = { success: 0, fail: 0 };\n });\n }\n}\n\nexport const metrics = new MetricsCollector();\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"detect.js"}
@@ -1,152 +0,0 @@
1
- # Task 1: Migration from Webpack to tsup
2
-
3
- ## Context
4
-
5
- The current build stack is outdated and excessive:
6
-
7
- - **Webpack 4.34.0** (2019)
8
- - **TypeScript 3.5.2** (2019)
9
- - **Babel** for TypeScript transpilation (double transpilation)
10
- - **13 dev dependencies** for building a simple library
11
-
12
- **tsup** - modern bundler for TypeScript libraries:
13
-
14
- - ⚡ 10-100 times faster than Webpack
15
- - 📦 Native TypeScript support (without Babel)
16
- - 🌳 Excellent tree-shaking
17
- - 🔧 Zero/minimal configuration
18
- - 📄 Automatic .d.ts file generation
19
-
20
- ## Goal
21
-
22
- Replace the outdated Webpack+Babel+TypeScript stack with modern tsup for:
23
-
24
- 1. Faster builds
25
- 2. Better tree-shaking
26
- 3. Reduced dependencies
27
- 4. Simplified configuration
28
-
29
- ## Required Actions
30
-
31
- ### Step 1: Install tsup and Update TypeScript
32
-
33
- 1. Install tsup and update TypeScript:
34
- ```bash
35
- npm install -D tsup typescript@latest
36
- ```
37
- 2. Verify installation: `npx tsup --version`
38
-
39
- ### Step 2: Remove Outdated Dependencies
40
-
41
- 1. Remove Webpack, Babel, and related packages:
42
- ```bash
43
- npm uninstall -D webpack webpack-cli babel-loader \
44
- @babel/core @babel/preset-env @babel/preset-typescript \
45
- @babel/plugin-proposal-class-properties @babel/plugin-proposal-object-rest-spread
46
- ```
47
- 2. Remove unnecessary configuration files:
48
- - `webpack.config.js`
49
- - `.babelrc`
50
-
51
- ### Step 3: Configure tsup
52
-
53
- 1. Create `tsup.config.ts` (or use default settings):
54
-
55
- ```typescript
56
- import { defineConfig } from 'tsup';
57
-
58
- export default defineConfig({
59
- entry: ['src/index.ts'],
60
- format: ['cjs', 'esm'], // CommonJS and ES modules
61
- dts: true, // .d.ts file generation
62
- sourcemap: true, // Source maps for debugging
63
- clean: true, // Clean output directory
64
- minify: true, // Minification
65
- treeshake: true // Aggressive tree-shaking
66
- });
67
- ```
68
-
69
- ### Step 4: Update TypeScript Configuration
70
-
71
- 1. Update `tsconfig.json`:
72
- - Set `"target": "es2020"` (modern standard)
73
- - Set `"module": "esnext"` for ES modules
74
- - Add `"moduleResolution": "node"`
75
- - Update other settings for TypeScript 5+
76
-
77
- ### Step 5: Update package.json
78
-
79
- 1. Update scripts:
80
- ```json
81
- "scripts": {
82
- "build": "tsup",
83
- "build:watch": "tsup --watch",
84
- "build:prod": "tsup --minify",
85
- "dev": "tsup --watch"
86
- }
87
- ```
88
- 2. Update exports fields:
89
- ```json
90
- "exports": {
91
- ".": {
92
- "import": "./dist/index.mjs",
93
- "require": "./dist/index.js",
94
- "types": "./dist/index.d.ts"
95
- }
96
- },
97
- "main": "./dist/index.js",
98
- "module": "./dist/index.mjs",
99
- "types": "./dist/index.d.ts"
100
- ```
101
-
102
- ### Step 6: Verify Build
103
-
104
- 1. Run first build: `npm run build`
105
- 2. Verify files created in `dist/`:
106
- - `index.js` (CommonJS)
107
- - `index.mjs` (ES modules)
108
- - `index.d.ts` (TypeScript types)
109
- 3. Check file sizes
110
-
111
- ### Step 7: Verify Compatibility
112
-
113
- 1. Run tests: `npm test`
114
- 2. Check import in Node.js:
115
- ```bash
116
- node -e "const { md5 } = require('./dist/index.js'); console.log(md5('test'))"
117
- ```
118
- 3. Check import as ES module
119
-
120
- ### Step 8: Update .gitignore
121
-
122
- 1. Add `dist/` to .gitignore (if not already)
123
- 2. Remove `lib/` from .gitignore (no longer used)
124
-
125
- ## Expected Result
126
-
127
- - Builds are 10-100 times faster
128
- - Dev dependencies reduced from 13 to 3-5 packages
129
- - CommonJS and ES module builds created
130
- - .d.ts files automatically generated
131
- - All tests pass
132
- - Backward compatibility maintained
133
-
134
- ## Progress Check
135
-
136
- - [ ] tsup and TypeScript installed
137
- - [ ] Outdated dependencies removed
138
- - [ ] tsup.config.ts created and configured
139
- - [ ] tsconfig.json updated
140
- - [ ] package.json scripts updated
141
- - [ ] Build works (files created in dist/)
142
- - [ ] Import works in Node.js and as ES module
143
- - [ ] .gitignore updated
144
-
145
- ## Notes
146
-
147
- 1. tsup uses `dist/` as output directory by default
148
- 2. For UMD format generation, add `format: ['cjs', 'esm', 'iife']`
149
- 3. Can configure different entry points for different formats
150
- 4. Verify that tree-shaking works correctly
151
-
152
- ## Next Step
@@ -1,65 +0,0 @@
1
- # Применение консолидации мелких модулей
2
-
3
- Я помогу вам консолидировать мелкие модули. Давайте выполним требуемые действия.
4
-
5
- ## Шаг 1: Создать `src/round-functions.ts`
6
-
7
- return cmn((b & c) | (~b & d), a, b, x, s, t, fn);
8
- }
9
-
10
- export function gg(fn, a: number, b: number, c: number, d: number, x: number, s: number, t: number) {
11
- return cmn((b & d) | (c & ~d), a, b, x, s, t, fn);
12
- }
13
-
14
- // ... аналогично для hh и ii
15
-
16
- ```
17
-
18
- ### Шаг 2: Объединить hex и rhex
19
- 1. Открыть `src/rhex.ts` и посмотреть его содержимое
20
- 2. Решить: инлайнить rhex в `hex.ts` или объединить в один модуль
21
- 3. Если rhex маленький (~10 строк), инлайнить его в `hex.ts`
22
- 4. Обновить импорты в `hex.ts`
23
- 5. Удалить `rhex.ts` если он больше не нужен
24
-
25
- ### Шаг 3: Рассмотреть инлайнинг cmn
26
- 1. Проанализировать использование `cmn.ts`
27
- 2. Если используется только в round-functions, рассмотреть инлайнинг
28
- 3. Если оставить отдельно, убедиться что экспорт правильный
29
-
30
- ### Шаг 4: Обновить все импорты
31
- 1. Проверить все файлы в `src/` на импорты обновленных модулей
32
- 2. Обновить импорты:
33
- - В `md5cycle.ts`: импортировать из `./round-functions`
34
- - В `hex.ts`: убрать импорт rhex если инлайнили
35
- - В других файлах: проверить актуальность импортов
36
-
37
- ### Шаг 5: Проверить сборку и тесты
38
- 1. Запустить `npm run build`
39
- 2. Проверить что сборка проходит без ошибок
40
- 3. Запустить `npm test`
41
- 4. Убедиться что все тесты проходят
42
-
43
- ## Ожидаемый результат
44
- - Количество файлов в `src/` уменьшено с 16 до ~10-12
45
- - Улучшено tree-shaking (меньше отдельных модулей)
46
- - Сохранена функциональность
47
- - Все тесты проходят
48
-
49
- ## Проверка прогресса
50
- - [x] Создан `round-functions.ts` с ff, gg, hh, ii
51
- - [x] Удалены ff.ts, gg.ts, hh.ts, ii.ts
52
- - [x] Объединены/инлайнен hex и rhex
53
- - [x] Обновлены все импорты
54
- - [x] Сборка проходит без ошибок
55
- - [x] Все тесты проходят
56
- - [x] Размер бандла не увеличился
57
-
58
- ## Примечания
59
- 1. Сохранять исходные имена функций для обратной совместимости
60
- 2. Проверить типы TypeScript после объединения
61
- 3. Убедиться что tree-shaking все еще работает
62
-
63
- ## Следующий шаг
64
- После консолидации модулей перейти к Задаче 3: Устранение дублирования кода.
65
- ```