typescript-virtual-container 1.2.9 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/.vscode/settings.json +0 -1
  2. package/README.md +141 -50
  3. package/biome.json +7 -0
  4. package/dist/SSHMimic/exec.d.ts.map +1 -1
  5. package/dist/SSHMimic/executor.d.ts.map +1 -1
  6. package/dist/SSHMimic/executor.js +32 -16
  7. package/dist/SSHMimic/index.d.ts.map +1 -1
  8. package/dist/SSHMimic/index.js +20 -6
  9. package/dist/VirtualFileSystem/binaryPack.d.ts.map +1 -1
  10. package/dist/VirtualFileSystem/binaryPack.js +29 -6
  11. package/dist/VirtualFileSystem/index.d.ts.map +1 -1
  12. package/dist/VirtualFileSystem/index.js +36 -13
  13. package/dist/VirtualPackageManager/index.d.ts.map +1 -1
  14. package/dist/VirtualPackageManager/index.js +192 -43
  15. package/dist/VirtualShell/index.d.ts +10 -4
  16. package/dist/VirtualShell/index.d.ts.map +1 -1
  17. package/dist/VirtualShell/index.js +18 -7
  18. package/dist/VirtualShell/shell.d.ts.map +1 -1
  19. package/dist/VirtualShell/shell.js +3 -1
  20. package/dist/VirtualShell/shellParser.d.ts.map +1 -1
  21. package/dist/VirtualUserManager/index.d.ts.map +1 -1
  22. package/dist/commands/adduser.d.ts +6 -0
  23. package/dist/commands/adduser.d.ts.map +1 -1
  24. package/dist/commands/adduser.js +6 -0
  25. package/dist/commands/alias.d.ts +5 -0
  26. package/dist/commands/alias.d.ts.map +1 -1
  27. package/dist/commands/alias.js +5 -0
  28. package/dist/commands/apt.d.ts +5 -0
  29. package/dist/commands/apt.d.ts.map +1 -1
  30. package/dist/commands/apt.js +32 -9
  31. package/dist/commands/awk.d.ts +11 -0
  32. package/dist/commands/awk.d.ts.map +1 -1
  33. package/dist/commands/awk.js +15 -2
  34. package/dist/commands/base64.d.ts +5 -0
  35. package/dist/commands/base64.d.ts.map +1 -1
  36. package/dist/commands/base64.js +9 -1
  37. package/dist/commands/cat.d.ts +5 -0
  38. package/dist/commands/cat.d.ts.map +1 -1
  39. package/dist/commands/cat.js +10 -2
  40. package/dist/commands/cd.d.ts +5 -0
  41. package/dist/commands/cd.d.ts.map +1 -1
  42. package/dist/commands/cd.js +5 -0
  43. package/dist/commands/chmod.d.ts +5 -0
  44. package/dist/commands/chmod.d.ts.map +1 -1
  45. package/dist/commands/chmod.js +5 -0
  46. package/dist/commands/cp.d.ts +5 -0
  47. package/dist/commands/cp.d.ts.map +1 -1
  48. package/dist/commands/cp.js +5 -0
  49. package/dist/commands/curl.d.ts +5 -0
  50. package/dist/commands/curl.d.ts.map +1 -1
  51. package/dist/commands/curl.js +34 -6
  52. package/dist/commands/cut.d.ts +5 -0
  53. package/dist/commands/cut.d.ts.map +1 -1
  54. package/dist/commands/cut.js +8 -1
  55. package/dist/commands/date.d.ts +5 -0
  56. package/dist/commands/date.d.ts.map +1 -1
  57. package/dist/commands/date.js +7 -1
  58. package/dist/commands/declare.d.ts +3 -0
  59. package/dist/commands/declare.d.ts.map +1 -0
  60. package/dist/commands/declare.js +39 -0
  61. package/dist/commands/diff.d.ts +5 -0
  62. package/dist/commands/diff.d.ts.map +1 -1
  63. package/dist/commands/diff.js +5 -0
  64. package/dist/commands/dpkg.d.ts +5 -0
  65. package/dist/commands/dpkg.d.ts.map +1 -1
  66. package/dist/commands/dpkg.js +24 -7
  67. package/dist/commands/du.d.ts.map +1 -1
  68. package/dist/commands/du.js +8 -2
  69. package/dist/commands/echo.d.ts +5 -0
  70. package/dist/commands/echo.d.ts.map +1 -1
  71. package/dist/commands/echo.js +13 -4
  72. package/dist/commands/env.d.ts +5 -0
  73. package/dist/commands/env.d.ts.map +1 -1
  74. package/dist/commands/env.js +11 -1
  75. package/dist/commands/exit.d.ts +5 -0
  76. package/dist/commands/exit.d.ts.map +1 -1
  77. package/dist/commands/exit.js +12 -2
  78. package/dist/commands/export.d.ts.map +1 -1
  79. package/dist/commands/export.js +3 -1
  80. package/dist/commands/find.d.ts +5 -0
  81. package/dist/commands/find.d.ts.map +1 -1
  82. package/dist/commands/find.js +5 -0
  83. package/dist/commands/free.d.ts +5 -0
  84. package/dist/commands/free.d.ts.map +1 -1
  85. package/dist/commands/free.js +5 -0
  86. package/dist/commands/grep.d.ts +5 -0
  87. package/dist/commands/grep.d.ts.map +1 -1
  88. package/dist/commands/grep.js +12 -2
  89. package/dist/commands/gzip.d.ts +5 -0
  90. package/dist/commands/gzip.d.ts.map +1 -1
  91. package/dist/commands/gzip.js +18 -2
  92. package/dist/commands/head.d.ts +5 -0
  93. package/dist/commands/head.d.ts.map +1 -1
  94. package/dist/commands/head.js +5 -0
  95. package/dist/commands/help.d.ts.map +1 -1
  96. package/dist/commands/help.js +98 -45
  97. package/dist/commands/history.d.ts +5 -0
  98. package/dist/commands/history.d.ts.map +1 -1
  99. package/dist/commands/history.js +5 -0
  100. package/dist/commands/hostname.d.ts +5 -0
  101. package/dist/commands/hostname.d.ts.map +1 -1
  102. package/dist/commands/hostname.js +5 -0
  103. package/dist/commands/id.d.ts.map +1 -1
  104. package/dist/commands/id.js +4 -1
  105. package/dist/commands/index.d.ts +2 -17
  106. package/dist/commands/index.d.ts.map +1 -1
  107. package/dist/commands/index.js +2 -340
  108. package/dist/commands/ls.d.ts.map +1 -1
  109. package/dist/commands/ls.js +3 -1
  110. package/dist/commands/lsb-release.d.ts.map +1 -1
  111. package/dist/commands/lsb-release.js +8 -2
  112. package/dist/commands/nano.js +1 -1
  113. package/dist/commands/neofetch.js +1 -1
  114. package/dist/commands/node.d.ts +9 -0
  115. package/dist/commands/node.d.ts.map +1 -0
  116. package/dist/commands/node.js +316 -0
  117. package/dist/commands/npm.d.ts +19 -0
  118. package/dist/commands/npm.d.ts.map +1 -0
  119. package/dist/commands/npm.js +109 -0
  120. package/dist/commands/ping.d.ts.map +1 -1
  121. package/dist/commands/ping.js +3 -1
  122. package/dist/commands/printf.d.ts +3 -0
  123. package/dist/commands/printf.d.ts.map +1 -0
  124. package/dist/commands/printf.js +113 -0
  125. package/dist/commands/ps.d.ts.map +1 -1
  126. package/dist/commands/ps.js +4 -1
  127. package/dist/commands/python.d.ts +30 -0
  128. package/dist/commands/python.d.ts.map +1 -0
  129. package/dist/commands/python.js +2058 -0
  130. package/dist/commands/read.d.ts +3 -0
  131. package/dist/commands/read.d.ts.map +1 -0
  132. package/dist/commands/read.js +34 -0
  133. package/dist/commands/registry.d.ts +8 -0
  134. package/dist/commands/registry.d.ts.map +1 -0
  135. package/dist/commands/registry.js +229 -0
  136. package/dist/commands/runtime.d.ts +6 -0
  137. package/dist/commands/runtime.d.ts.map +1 -0
  138. package/dist/commands/runtime.js +280 -0
  139. package/dist/commands/sed.d.ts.map +1 -1
  140. package/dist/commands/sed.js +11 -3
  141. package/dist/commands/set.d.ts.map +1 -1
  142. package/dist/commands/set.js +9 -3
  143. package/dist/commands/sh.d.ts.map +1 -1
  144. package/dist/commands/sh.js +57 -36
  145. package/dist/commands/shift.d.ts +5 -0
  146. package/dist/commands/shift.d.ts.map +1 -0
  147. package/dist/commands/shift.js +52 -0
  148. package/dist/commands/sleep.d.ts.map +1 -1
  149. package/dist/commands/sort.d.ts.map +1 -1
  150. package/dist/commands/sort.js +4 -2
  151. package/dist/commands/source.d.ts.map +1 -1
  152. package/dist/commands/source.js +5 -2
  153. package/dist/commands/sudo.js +1 -1
  154. package/dist/commands/tar.d.ts.map +1 -1
  155. package/dist/commands/tar.js +11 -3
  156. package/dist/commands/tee.d.ts.map +1 -1
  157. package/dist/commands/tee.js +8 -6
  158. package/dist/commands/test.d.ts.map +1 -1
  159. package/dist/commands/test.js +46 -24
  160. package/dist/commands/tr.d.ts.map +1 -1
  161. package/dist/commands/tr.js +3 -1
  162. package/dist/commands/true.d.ts +4 -0
  163. package/dist/commands/true.d.ts.map +1 -0
  164. package/dist/commands/true.js +14 -0
  165. package/dist/commands/type.d.ts.map +1 -1
  166. package/dist/commands/type.js +1 -1
  167. package/dist/commands/uname.d.ts.map +1 -1
  168. package/dist/commands/uname.js +4 -1
  169. package/dist/commands/uniq.d.ts.map +1 -1
  170. package/dist/commands/uptime.d.ts.map +1 -1
  171. package/dist/commands/uptime.js +4 -1
  172. package/dist/commands/wget.d.ts.map +1 -1
  173. package/dist/commands/wget.js +32 -7
  174. package/dist/commands/which.d.ts.map +1 -1
  175. package/dist/commands/xargs.d.ts.map +1 -1
  176. package/dist/commands/xargs.js +1 -1
  177. package/dist/index.d.ts +15 -14
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +9 -9
  180. package/dist/modules/linuxRootfs.d.ts +18 -1
  181. package/dist/modules/linuxRootfs.d.ts.map +1 -1
  182. package/dist/modules/linuxRootfs.js +160 -17
  183. package/dist/standalone-wo-sftp.d.ts +2 -0
  184. package/dist/standalone-wo-sftp.d.ts.map +1 -0
  185. package/dist/standalone-wo-sftp.js +30 -0
  186. package/dist/utils/expand.d.ts +50 -0
  187. package/dist/utils/expand.d.ts.map +1 -0
  188. package/dist/utils/expand.js +183 -0
  189. package/dist/utils/vfsDiff.d.ts +90 -0
  190. package/dist/utils/vfsDiff.d.ts.map +1 -0
  191. package/dist/utils/vfsDiff.js +177 -0
  192. package/package.json +2 -1
  193. package/src/SSHMimic/exec.ts +10 -1
  194. package/src/SSHMimic/executor.ts +104 -18
  195. package/src/SSHMimic/index.ts +49 -15
  196. package/src/VirtualFileSystem/binaryPack.ts +35 -8
  197. package/src/VirtualFileSystem/index.ts +78 -28
  198. package/src/VirtualPackageManager/index.ts +208 -49
  199. package/src/VirtualShell/index.ts +35 -7
  200. package/src/VirtualShell/shell.ts +23 -3
  201. package/src/VirtualShell/shellParser.ts +134 -36
  202. package/src/VirtualUserManager/index.ts +7 -2
  203. package/src/commands/adduser.ts +6 -0
  204. package/src/commands/alias.ts +5 -1
  205. package/src/commands/apt.ts +47 -17
  206. package/src/commands/awk.ts +20 -6
  207. package/src/commands/base64.ts +13 -2
  208. package/src/commands/cat.ts +13 -5
  209. package/src/commands/cd.ts +5 -0
  210. package/src/commands/chmod.ts +5 -0
  211. package/src/commands/cp.ts +5 -0
  212. package/src/commands/curl.ts +56 -12
  213. package/src/commands/cut.ts +8 -1
  214. package/src/commands/date.ts +7 -1
  215. package/src/commands/declare.ts +44 -0
  216. package/src/commands/diff.ts +17 -3
  217. package/src/commands/dpkg.ts +33 -11
  218. package/src/commands/du.ts +17 -5
  219. package/src/commands/echo.ts +22 -9
  220. package/src/commands/env.ts +11 -1
  221. package/src/commands/exit.ts +12 -2
  222. package/src/commands/export.ts +3 -1
  223. package/src/commands/find.ts +5 -0
  224. package/src/commands/free.ts +9 -2
  225. package/src/commands/grep.ts +12 -2
  226. package/src/commands/gzip.ts +28 -4
  227. package/src/commands/head.ts +5 -0
  228. package/src/commands/help.ts +121 -47
  229. package/src/commands/history.ts +7 -2
  230. package/src/commands/hostname.ts +5 -0
  231. package/src/commands/id.ts +4 -1
  232. package/src/commands/index.ts +9 -360
  233. package/src/commands/ls.ts +5 -3
  234. package/src/commands/lsb-release.ts +8 -2
  235. package/src/commands/nano.ts +1 -1
  236. package/src/commands/neofetch.ts +1 -1
  237. package/src/commands/node.ts +341 -0
  238. package/src/commands/npm.ts +132 -0
  239. package/src/commands/ping.ts +6 -2
  240. package/src/commands/printf.ts +112 -0
  241. package/src/commands/ps.ts +21 -9
  242. package/src/commands/python.ts +2229 -0
  243. package/src/commands/read.ts +41 -0
  244. package/src/commands/registry.ts +244 -0
  245. package/src/commands/runtime.ts +353 -0
  246. package/src/commands/sed.ts +27 -9
  247. package/src/commands/set.ts +9 -3
  248. package/src/commands/sh.ts +159 -55
  249. package/src/commands/shift.ts +53 -0
  250. package/src/commands/sleep.ts +2 -1
  251. package/src/commands/sort.ts +10 -6
  252. package/src/commands/source.ts +15 -3
  253. package/src/commands/sudo.ts +1 -1
  254. package/src/commands/tar.ts +28 -7
  255. package/src/commands/tee.ts +7 -1
  256. package/src/commands/test.ts +61 -26
  257. package/src/commands/tr.ts +3 -1
  258. package/src/commands/true.ts +17 -0
  259. package/src/commands/type.ts +6 -3
  260. package/src/commands/uname.ts +5 -1
  261. package/src/commands/uniq.ts +8 -2
  262. package/src/commands/uptime.ts +4 -1
  263. package/src/commands/wget.ts +51 -12
  264. package/src/commands/which.ts +5 -2
  265. package/src/commands/xargs.ts +11 -2
  266. package/src/index.ts +23 -24
  267. package/src/modules/linuxRootfs.ts +233 -30
  268. package/src/standalone-wo-sftp.ts +38 -0
  269. package/src/utils/expand.ts +238 -0
  270. package/src/utils/vfsDiff.ts +275 -0
  271. package/standalone-wo-sftp.js +507 -0
  272. package/standalone-wo-sftp.js.map +7 -0
  273. package/standalone.js +253 -191
  274. package/standalone.js.map +4 -4
  275. package/tests/bun-test-shim.ts +9 -1
  276. package/tests/command-helpers.test.ts +1 -5
  277. package/tests/new-features.test.ts +415 -5
  278. package/tests/parser-executor.test.ts +27 -27
  279. package/tests/sftp.test.ts +122 -42
  280. package/tests/users.test.ts +23 -5
  281. package/CHANGELOG.md +0 -150
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["node_modules/asn1/lib/ber/errors.js", "node_modules/asn1/lib/ber/types.js", "node_modules/safer-buffer/safer.js", "node_modules/asn1/lib/ber/reader.js", "node_modules/asn1/lib/ber/writer.js", "node_modules/asn1/lib/ber/index.js", "node_modules/asn1/lib/index.js", "node_modules/tweetnacl/nacl-fast.js", "node_modules/bcrypt-pbkdf/index.js", "node_modules/ssh2/lib/protocol/constants.js", "node_modules/ssh2/lib/protocol/utils.js", "node_modules/ssh2/lib/protocol/crypto/poly1305.js", "node_modules/ssh2/lib/protocol/crypto.js", "node_modules/ssh2/lib/protocol/keyParser.js", "node_modules/ssh2/lib/agent.js", "node_modules/ssh2/lib/protocol/zlib.js", "node_modules/ssh2/lib/protocol/handlers.misc.js", "node_modules/ssh2/lib/protocol/handlers.js", "node_modules/ssh2/lib/protocol/kex.js", "node_modules/ssh2/package.json", "node_modules/ssh2/lib/protocol/Protocol.js", "node_modules/ssh2/lib/protocol/node-fs-compat.js", "node_modules/ssh2/lib/protocol/SFTP.js", "node_modules/ssh2/lib/Channel.js", "node_modules/ssh2/lib/utils.js", "node_modules/ssh2/lib/client.js", "node_modules/ssh2/lib/http-agents.js", "node_modules/ssh2/lib/server.js", "node_modules/ssh2/lib/keygen.js", "node_modules/ssh2/lib/index.js", "src/VirtualShell/index.ts", "src/commands/adduser.ts", "src/commands/command-helpers.ts", "src/commands/alias.ts", "src/commands/helpers.ts", "src/commands/apt.ts", "src/commands/awk.ts", "src/commands/base64.ts", "src/commands/cat.ts", "src/commands/cd.ts", "src/commands/chmod.ts", "src/commands/clear.ts", "src/commands/cp.ts", "src/commands/curl.ts", "src/commands/cut.ts", "src/commands/date.ts", "src/commands/declare.ts", "src/commands/deluser.ts", "src/commands/df.ts", "src/commands/diff.ts", "src/commands/dpkg.ts", "src/commands/du.ts", "src/utils/expand.ts", "src/commands/echo.ts", "src/commands/env.ts", "src/commands/exit.ts", "src/commands/export.ts", "src/commands/find.ts", "src/commands/free.ts", "src/commands/grep.ts", "src/commands/groups.ts", "src/commands/gzip.ts", "src/commands/head.ts", "src/commands/help.ts", "src/commands/history.ts", "src/commands/hostname.ts", "src/commands/htop.ts", "src/commands/id.ts", "src/commands/kill.ts", "src/commands/ln.ts", "src/commands/ls.ts", "src/commands/lsb-release.ts", "src/commands/man.ts", "src/commands/mkdir.ts", "src/commands/mv.ts", "src/commands/nano.ts", "src/modules/neofetch.ts", "src/commands/set.ts", "src/commands/neofetch.ts", "src/commands/node.ts", "src/commands/npm.ts", "src/commands/passwd.ts", "src/commands/ping.ts", "src/commands/printf.ts", "src/commands/ps.ts", "src/commands/pwd.ts", "src/commands/python.ts", "src/commands/read.ts", "src/commands/rm.ts", "src/commands/sed.ts", "src/SSHMimic/executor.ts", "src/VirtualShell/shellParser.ts", "src/commands/runtime.ts", "src/commands/sh.ts", "src/commands/shift.ts", "src/commands/sleep.ts", "src/commands/sort.ts", "src/commands/source.ts", "src/commands/su.ts", "src/commands/sudo.ts", "src/commands/tail.ts", "src/commands/tar.ts", "src/commands/tee.ts", "src/commands/test.ts", "src/commands/touch.ts", "src/commands/tr.ts", "src/commands/tree.ts", "src/commands/true.ts", "src/commands/type.ts", "src/commands/uname.ts", "src/commands/uniq.ts", "src/commands/unset.ts", "src/commands/uptime.ts", "src/commands/wc.ts", "src/commands/wget.ts", "src/commands/which.ts", "src/SSHMimic/loginFormat.ts", "src/commands/who.ts", "src/commands/whoami.ts", "src/commands/xargs.ts", "src/commands/registry.ts", "src/modules/linuxRootfs.ts", "src/utils/perfLogger.ts", "src/VirtualFileSystem/index.ts", "src/VirtualFileSystem/binaryPack.ts", "src/VirtualFileSystem/path.ts", "src/VirtualPackageManager/index.ts", "src/VirtualUserManager/index.ts", "src/VirtualShell/shell.ts", "src/modules/shellInteractive.ts", "src/modules/shellRuntime.ts", "src/SSHMimic/prompt.ts", "src/SSHMimic/index.ts", "src/SSHMimic/exec.ts", "src/SSHMimic/hostKey.ts", "src/SSHMimic/sftp.ts", "src/standalone-wo-sftp.ts"],
4
+ "sourcesContent": ["// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\n\nmodule.exports = {\n\n newInvalidAsn1Error: function (msg) {\n var e = new Error();\n e.name = 'InvalidAsn1Error';\n e.message = msg || '';\n return e;\n }\n\n};\n", "// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\n\nmodule.exports = {\n EOC: 0,\n Boolean: 1,\n Integer: 2,\n BitString: 3,\n OctetString: 4,\n Null: 5,\n OID: 6,\n ObjectDescriptor: 7,\n External: 8,\n Real: 9, // float\n Enumeration: 10,\n PDV: 11,\n Utf8String: 12,\n RelativeOID: 13,\n Sequence: 16,\n Set: 17,\n NumericString: 18,\n PrintableString: 19,\n T61String: 20,\n VideotexString: 21,\n IA5String: 22,\n UTCTime: 23,\n GeneralizedTime: 24,\n GraphicString: 25,\n VisibleString: 26,\n GeneralString: 28,\n UniversalString: 29,\n CharacterString: 30,\n BMPString: 31,\n Constructor: 32,\n Context: 128\n};\n", "/* eslint-disable node/no-deprecated-api */\n\n'use strict'\n\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\nvar safer = {}\n\nvar key\n\nfor (key in buffer) {\n if (!buffer.hasOwnProperty(key)) continue\n if (key === 'SlowBuffer' || key === 'Buffer') continue\n safer[key] = buffer[key]\n}\n\nvar Safer = safer.Buffer = {}\nfor (key in Buffer) {\n if (!Buffer.hasOwnProperty(key)) continue\n if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue\n Safer[key] = Buffer[key]\n}\n\nsafer.Buffer.prototype = Buffer.prototype\n\nif (!Safer.from || Safer.from === Uint8Array.from) {\n Safer.from = function (value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('The \"value\" argument must not be of type number. Received type ' + typeof value)\n }\n if (value && typeof value.length === 'undefined') {\n throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value)\n }\n return Buffer(value, encodingOrOffset, length)\n }\n}\n\nif (!Safer.alloc) {\n Safer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('The \"size\" argument must be of type number. Received type ' + typeof size)\n }\n if (size < 0 || size >= 2 * (1 << 30)) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n var buf = Buffer(size)\n if (!fill || fill.length === 0) {\n buf.fill(0)\n } else if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n return buf\n }\n}\n\nif (!safer.kStringMaxLength) {\n try {\n safer.kStringMaxLength = process.binding('buffer').kStringMaxLength\n } catch (e) {\n // we can't determine kStringMaxLength in environments where process.binding\n // is unsupported, so let's not set it\n }\n}\n\nif (!safer.constants) {\n safer.constants = {\n MAX_LENGTH: safer.kMaxLength\n }\n if (safer.kStringMaxLength) {\n safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength\n }\n}\n\nmodule.exports = safer\n", "// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\nvar assert = require('assert');\nvar Buffer = require('safer-buffer').Buffer;\n\nvar ASN1 = require('./types');\nvar errors = require('./errors');\n\n\n// --- Globals\n\nvar newInvalidAsn1Error = errors.newInvalidAsn1Error;\n\n\n\n// --- API\n\nfunction Reader(data) {\n if (!data || !Buffer.isBuffer(data))\n throw new TypeError('data must be a node Buffer');\n\n this._buf = data;\n this._size = data.length;\n\n // These hold the \"current\" state\n this._len = 0;\n this._offset = 0;\n}\n\nObject.defineProperty(Reader.prototype, 'length', {\n enumerable: true,\n get: function () { return (this._len); }\n});\n\nObject.defineProperty(Reader.prototype, 'offset', {\n enumerable: true,\n get: function () { return (this._offset); }\n});\n\nObject.defineProperty(Reader.prototype, 'remain', {\n get: function () { return (this._size - this._offset); }\n});\n\nObject.defineProperty(Reader.prototype, 'buffer', {\n get: function () { return (this._buf.slice(this._offset)); }\n});\n\n\n/**\n * Reads a single byte and advances offset; you can pass in `true` to make this\n * a \"peek\" operation (i.e., get the byte, but don't advance the offset).\n *\n * @param {Boolean} peek true means don't move offset.\n * @return {Number} the next byte, null if not enough data.\n */\nReader.prototype.readByte = function (peek) {\n if (this._size - this._offset < 1)\n return null;\n\n var b = this._buf[this._offset] & 0xff;\n\n if (!peek)\n this._offset += 1;\n\n return b;\n};\n\n\nReader.prototype.peek = function () {\n return this.readByte(true);\n};\n\n\n/**\n * Reads a (potentially) variable length off the BER buffer. This call is\n * not really meant to be called directly, as callers have to manipulate\n * the internal buffer afterwards.\n *\n * As a result of this call, you can call `Reader.length`, until the\n * next thing called that does a readLength.\n *\n * @return {Number} the amount of offset to advance the buffer.\n * @throws {InvalidAsn1Error} on bad ASN.1\n */\nReader.prototype.readLength = function (offset) {\n if (offset === undefined)\n offset = this._offset;\n\n if (offset >= this._size)\n return null;\n\n var lenB = this._buf[offset++] & 0xff;\n if (lenB === null)\n return null;\n\n if ((lenB & 0x80) === 0x80) {\n lenB &= 0x7f;\n\n if (lenB === 0)\n throw newInvalidAsn1Error('Indefinite length not supported');\n\n if (lenB > 4)\n throw newInvalidAsn1Error('encoding too long');\n\n if (this._size - offset < lenB)\n return null;\n\n this._len = 0;\n for (var i = 0; i < lenB; i++)\n this._len = (this._len << 8) + (this._buf[offset++] & 0xff);\n\n } else {\n // Wasn't a variable length\n this._len = lenB;\n }\n\n return offset;\n};\n\n\n/**\n * Parses the next sequence in this BER buffer.\n *\n * To get the length of the sequence, call `Reader.length`.\n *\n * @return {Number} the sequence's tag.\n */\nReader.prototype.readSequence = function (tag) {\n var seq = this.peek();\n if (seq === null)\n return null;\n if (tag !== undefined && tag !== seq)\n throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +\n ': got 0x' + seq.toString(16));\n\n var o = this.readLength(this._offset + 1); // stored in `length`\n if (o === null)\n return null;\n\n this._offset = o;\n return seq;\n};\n\n\nReader.prototype.readInt = function () {\n return this._readTag(ASN1.Integer);\n};\n\n\nReader.prototype.readBoolean = function () {\n return (this._readTag(ASN1.Boolean) === 0 ? false : true);\n};\n\n\nReader.prototype.readEnumeration = function () {\n return this._readTag(ASN1.Enumeration);\n};\n\n\nReader.prototype.readString = function (tag, retbuf) {\n if (!tag)\n tag = ASN1.OctetString;\n\n var b = this.peek();\n if (b === null)\n return null;\n\n if (b !== tag)\n throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +\n ': got 0x' + b.toString(16));\n\n var o = this.readLength(this._offset + 1); // stored in `length`\n\n if (o === null)\n return null;\n\n if (this.length > this._size - o)\n return null;\n\n this._offset = o;\n\n if (this.length === 0)\n return retbuf ? Buffer.alloc(0) : '';\n\n var str = this._buf.slice(this._offset, this._offset + this.length);\n this._offset += this.length;\n\n return retbuf ? str : str.toString('utf8');\n};\n\nReader.prototype.readOID = function (tag) {\n if (!tag)\n tag = ASN1.OID;\n\n var b = this.readString(tag, true);\n if (b === null)\n return null;\n\n var values = [];\n var value = 0;\n\n for (var i = 0; i < b.length; i++) {\n var byte = b[i] & 0xff;\n\n value <<= 7;\n value += byte & 0x7f;\n if ((byte & 0x80) === 0) {\n values.push(value);\n value = 0;\n }\n }\n\n value = values.shift();\n values.unshift(value % 40);\n values.unshift((value / 40) >> 0);\n\n return values.join('.');\n};\n\n\nReader.prototype._readTag = function (tag) {\n assert.ok(tag !== undefined);\n\n var b = this.peek();\n\n if (b === null)\n return null;\n\n if (b !== tag)\n throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +\n ': got 0x' + b.toString(16));\n\n var o = this.readLength(this._offset + 1); // stored in `length`\n if (o === null)\n return null;\n\n if (this.length > 4)\n throw newInvalidAsn1Error('Integer too long: ' + this.length);\n\n if (this.length > this._size - o)\n return null;\n this._offset = o;\n\n var fb = this._buf[this._offset];\n var value = 0;\n\n for (var i = 0; i < this.length; i++) {\n value <<= 8;\n value |= (this._buf[this._offset++] & 0xff);\n }\n\n if ((fb & 0x80) === 0x80 && i !== 4)\n value -= (1 << (i * 8));\n\n return value >> 0;\n};\n\n\n\n// --- Exported API\n\nmodule.exports = Reader;\n", "// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\nvar assert = require('assert');\nvar Buffer = require('safer-buffer').Buffer;\nvar ASN1 = require('./types');\nvar errors = require('./errors');\n\n\n// --- Globals\n\nvar newInvalidAsn1Error = errors.newInvalidAsn1Error;\n\nvar DEFAULT_OPTS = {\n size: 1024,\n growthFactor: 8\n};\n\n\n// --- Helpers\n\nfunction merge(from, to) {\n assert.ok(from);\n assert.equal(typeof (from), 'object');\n assert.ok(to);\n assert.equal(typeof (to), 'object');\n\n var keys = Object.getOwnPropertyNames(from);\n keys.forEach(function (key) {\n if (to[key])\n return;\n\n var value = Object.getOwnPropertyDescriptor(from, key);\n Object.defineProperty(to, key, value);\n });\n\n return to;\n}\n\n\n\n// --- API\n\nfunction Writer(options) {\n options = merge(DEFAULT_OPTS, options || {});\n\n this._buf = Buffer.alloc(options.size || 1024);\n this._size = this._buf.length;\n this._offset = 0;\n this._options = options;\n\n // A list of offsets in the buffer where we need to insert\n // sequence tag/len pairs.\n this._seq = [];\n}\n\nObject.defineProperty(Writer.prototype, 'buffer', {\n get: function () {\n if (this._seq.length)\n throw newInvalidAsn1Error(this._seq.length + ' unended sequence(s)');\n\n return (this._buf.slice(0, this._offset));\n }\n});\n\nWriter.prototype.writeByte = function (b) {\n if (typeof (b) !== 'number')\n throw new TypeError('argument must be a Number');\n\n this._ensure(1);\n this._buf[this._offset++] = b;\n};\n\n\nWriter.prototype.writeInt = function (i, tag) {\n if (typeof (i) !== 'number')\n throw new TypeError('argument must be a Number');\n if (typeof (tag) !== 'number')\n tag = ASN1.Integer;\n\n var sz = 4;\n\n while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) &&\n (sz > 1)) {\n sz--;\n i <<= 8;\n }\n\n if (sz > 4)\n throw newInvalidAsn1Error('BER ints cannot be > 0xffffffff');\n\n this._ensure(2 + sz);\n this._buf[this._offset++] = tag;\n this._buf[this._offset++] = sz;\n\n while (sz-- > 0) {\n this._buf[this._offset++] = ((i & 0xff000000) >>> 24);\n i <<= 8;\n }\n\n};\n\n\nWriter.prototype.writeNull = function () {\n this.writeByte(ASN1.Null);\n this.writeByte(0x00);\n};\n\n\nWriter.prototype.writeEnumeration = function (i, tag) {\n if (typeof (i) !== 'number')\n throw new TypeError('argument must be a Number');\n if (typeof (tag) !== 'number')\n tag = ASN1.Enumeration;\n\n return this.writeInt(i, tag);\n};\n\n\nWriter.prototype.writeBoolean = function (b, tag) {\n if (typeof (b) !== 'boolean')\n throw new TypeError('argument must be a Boolean');\n if (typeof (tag) !== 'number')\n tag = ASN1.Boolean;\n\n this._ensure(3);\n this._buf[this._offset++] = tag;\n this._buf[this._offset++] = 0x01;\n this._buf[this._offset++] = b ? 0xff : 0x00;\n};\n\n\nWriter.prototype.writeString = function (s, tag) {\n if (typeof (s) !== 'string')\n throw new TypeError('argument must be a string (was: ' + typeof (s) + ')');\n if (typeof (tag) !== 'number')\n tag = ASN1.OctetString;\n\n var len = Buffer.byteLength(s);\n this.writeByte(tag);\n this.writeLength(len);\n if (len) {\n this._ensure(len);\n this._buf.write(s, this._offset);\n this._offset += len;\n }\n};\n\n\nWriter.prototype.writeBuffer = function (buf, tag) {\n if (typeof (tag) !== 'number')\n throw new TypeError('tag must be a number');\n if (!Buffer.isBuffer(buf))\n throw new TypeError('argument must be a buffer');\n\n this.writeByte(tag);\n this.writeLength(buf.length);\n this._ensure(buf.length);\n buf.copy(this._buf, this._offset, 0, buf.length);\n this._offset += buf.length;\n};\n\n\nWriter.prototype.writeStringArray = function (strings) {\n if ((!strings instanceof Array))\n throw new TypeError('argument must be an Array[String]');\n\n var self = this;\n strings.forEach(function (s) {\n self.writeString(s);\n });\n};\n\n// This is really to solve DER cases, but whatever for now\nWriter.prototype.writeOID = function (s, tag) {\n if (typeof (s) !== 'string')\n throw new TypeError('argument must be a string');\n if (typeof (tag) !== 'number')\n tag = ASN1.OID;\n\n if (!/^([0-9]+\\.){3,}[0-9]+$/.test(s))\n throw new Error('argument is not a valid OID string');\n\n function encodeOctet(bytes, octet) {\n if (octet < 128) {\n bytes.push(octet);\n } else if (octet < 16384) {\n bytes.push((octet >>> 7) | 0x80);\n bytes.push(octet & 0x7F);\n } else if (octet < 2097152) {\n bytes.push((octet >>> 14) | 0x80);\n bytes.push(((octet >>> 7) | 0x80) & 0xFF);\n bytes.push(octet & 0x7F);\n } else if (octet < 268435456) {\n bytes.push((octet >>> 21) | 0x80);\n bytes.push(((octet >>> 14) | 0x80) & 0xFF);\n bytes.push(((octet >>> 7) | 0x80) & 0xFF);\n bytes.push(octet & 0x7F);\n } else {\n bytes.push(((octet >>> 28) | 0x80) & 0xFF);\n bytes.push(((octet >>> 21) | 0x80) & 0xFF);\n bytes.push(((octet >>> 14) | 0x80) & 0xFF);\n bytes.push(((octet >>> 7) | 0x80) & 0xFF);\n bytes.push(octet & 0x7F);\n }\n }\n\n var tmp = s.split('.');\n var bytes = [];\n bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10));\n tmp.slice(2).forEach(function (b) {\n encodeOctet(bytes, parseInt(b, 10));\n });\n\n var self = this;\n this._ensure(2 + bytes.length);\n this.writeByte(tag);\n this.writeLength(bytes.length);\n bytes.forEach(function (b) {\n self.writeByte(b);\n });\n};\n\n\nWriter.prototype.writeLength = function (len) {\n if (typeof (len) !== 'number')\n throw new TypeError('argument must be a Number');\n\n this._ensure(4);\n\n if (len <= 0x7f) {\n this._buf[this._offset++] = len;\n } else if (len <= 0xff) {\n this._buf[this._offset++] = 0x81;\n this._buf[this._offset++] = len;\n } else if (len <= 0xffff) {\n this._buf[this._offset++] = 0x82;\n this._buf[this._offset++] = len >> 8;\n this._buf[this._offset++] = len;\n } else if (len <= 0xffffff) {\n this._buf[this._offset++] = 0x83;\n this._buf[this._offset++] = len >> 16;\n this._buf[this._offset++] = len >> 8;\n this._buf[this._offset++] = len;\n } else {\n throw newInvalidAsn1Error('Length too long (> 4 bytes)');\n }\n};\n\nWriter.prototype.startSequence = function (tag) {\n if (typeof (tag) !== 'number')\n tag = ASN1.Sequence | ASN1.Constructor;\n\n this.writeByte(tag);\n this._seq.push(this._offset);\n this._ensure(3);\n this._offset += 3;\n};\n\n\nWriter.prototype.endSequence = function () {\n var seq = this._seq.pop();\n var start = seq + 3;\n var len = this._offset - start;\n\n if (len <= 0x7f) {\n this._shift(start, len, -2);\n this._buf[seq] = len;\n } else if (len <= 0xff) {\n this._shift(start, len, -1);\n this._buf[seq] = 0x81;\n this._buf[seq + 1] = len;\n } else if (len <= 0xffff) {\n this._buf[seq] = 0x82;\n this._buf[seq + 1] = len >> 8;\n this._buf[seq + 2] = len;\n } else if (len <= 0xffffff) {\n this._shift(start, len, 1);\n this._buf[seq] = 0x83;\n this._buf[seq + 1] = len >> 16;\n this._buf[seq + 2] = len >> 8;\n this._buf[seq + 3] = len;\n } else {\n throw newInvalidAsn1Error('Sequence too long');\n }\n};\n\n\nWriter.prototype._shift = function (start, len, shift) {\n assert.ok(start !== undefined);\n assert.ok(len !== undefined);\n assert.ok(shift);\n\n this._buf.copy(this._buf, start + shift, start, start + len);\n this._offset += shift;\n};\n\nWriter.prototype._ensure = function (len) {\n assert.ok(len);\n\n if (this._size - this._offset < len) {\n var sz = this._size * this._options.growthFactor;\n if (sz - this._offset < len)\n sz += len;\n\n var buf = Buffer.alloc(sz);\n\n this._buf.copy(buf, 0, 0, this._offset);\n this._buf = buf;\n this._size = sz;\n }\n};\n\n\n\n// --- Exported API\n\nmodule.exports = Writer;\n", "// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\nvar errors = require('./errors');\nvar types = require('./types');\n\nvar Reader = require('./reader');\nvar Writer = require('./writer');\n\n\n// --- Exports\n\nmodule.exports = {\n\n Reader: Reader,\n\n Writer: Writer\n\n};\n\nfor (var t in types) {\n if (types.hasOwnProperty(t))\n module.exports[t] = types[t];\n}\nfor (var e in errors) {\n if (errors.hasOwnProperty(e))\n module.exports[e] = errors[e];\n}\n", "// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\n// If you have no idea what ASN.1 or BER is, see this:\n// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc\n\nvar Ber = require('./ber/index');\n\n\n\n// --- Exported API\n\nmodule.exports = {\n\n Ber: Ber,\n\n BerReader: Ber.Reader,\n\n BerWriter: Ber.Writer\n\n};\n", "(function(nacl) {\n'use strict';\n\n// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.\n// Public domain.\n//\n// Implementation derived from TweetNaCl version 20140427.\n// See for details: http://tweetnacl.cr.yp.to/\n\nvar gf = function(init) {\n var i, r = new Float64Array(16);\n if (init) for (i = 0; i < init.length; i++) r[i] = init[i];\n return r;\n};\n\n// Pluggable, initialized in high-level API below.\nvar randombytes = function(/* x, n */) { throw new Error('no PRNG'); };\n\nvar _0 = new Uint8Array(16);\nvar _9 = new Uint8Array(32); _9[0] = 9;\n\nvar gf0 = gf(),\n gf1 = gf([1]),\n _121665 = gf([0xdb41, 1]),\n D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),\n D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),\n X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),\n Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),\n I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);\n\nfunction ts64(x, i, h, l) {\n x[i] = (h >> 24) & 0xff;\n x[i+1] = (h >> 16) & 0xff;\n x[i+2] = (h >> 8) & 0xff;\n x[i+3] = h & 0xff;\n x[i+4] = (l >> 24) & 0xff;\n x[i+5] = (l >> 16) & 0xff;\n x[i+6] = (l >> 8) & 0xff;\n x[i+7] = l & 0xff;\n}\n\nfunction vn(x, xi, y, yi, n) {\n var i,d = 0;\n for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i];\n return (1 & ((d - 1) >>> 8)) - 1;\n}\n\nfunction crypto_verify_16(x, xi, y, yi) {\n return vn(x,xi,y,yi,16);\n}\n\nfunction crypto_verify_32(x, xi, y, yi) {\n return vn(x,xi,y,yi,32);\n}\n\nfunction core_salsa20(o, p, k, c) {\n var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,\n j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,\n j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,\n j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,\n j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,\n j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,\n j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,\n j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,\n j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,\n j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,\n j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,\n j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,\n j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,\n j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,\n j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,\n j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;\n\n var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n x15 = j15, u;\n\n for (var i = 0; i < 20; i += 2) {\n u = x0 + x12 | 0;\n x4 ^= u<<7 | u>>>(32-7);\n u = x4 + x0 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x4 | 0;\n x12 ^= u<<13 | u>>>(32-13);\n u = x12 + x8 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x1 | 0;\n x9 ^= u<<7 | u>>>(32-7);\n u = x9 + x5 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x9 | 0;\n x1 ^= u<<13 | u>>>(32-13);\n u = x1 + x13 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x6 | 0;\n x14 ^= u<<7 | u>>>(32-7);\n u = x14 + x10 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x14 | 0;\n x6 ^= u<<13 | u>>>(32-13);\n u = x6 + x2 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x11 | 0;\n x3 ^= u<<7 | u>>>(32-7);\n u = x3 + x15 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x3 | 0;\n x11 ^= u<<13 | u>>>(32-13);\n u = x11 + x7 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n\n u = x0 + x3 | 0;\n x1 ^= u<<7 | u>>>(32-7);\n u = x1 + x0 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x1 | 0;\n x3 ^= u<<13 | u>>>(32-13);\n u = x3 + x2 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x4 | 0;\n x6 ^= u<<7 | u>>>(32-7);\n u = x6 + x5 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x6 | 0;\n x4 ^= u<<13 | u>>>(32-13);\n u = x4 + x7 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x9 | 0;\n x11 ^= u<<7 | u>>>(32-7);\n u = x11 + x10 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x11 | 0;\n x9 ^= u<<13 | u>>>(32-13);\n u = x9 + x8 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x14 | 0;\n x12 ^= u<<7 | u>>>(32-7);\n u = x12 + x15 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x12 | 0;\n x14 ^= u<<13 | u>>>(32-13);\n u = x14 + x13 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n }\n x0 = x0 + j0 | 0;\n x1 = x1 + j1 | 0;\n x2 = x2 + j2 | 0;\n x3 = x3 + j3 | 0;\n x4 = x4 + j4 | 0;\n x5 = x5 + j5 | 0;\n x6 = x6 + j6 | 0;\n x7 = x7 + j7 | 0;\n x8 = x8 + j8 | 0;\n x9 = x9 + j9 | 0;\n x10 = x10 + j10 | 0;\n x11 = x11 + j11 | 0;\n x12 = x12 + j12 | 0;\n x13 = x13 + j13 | 0;\n x14 = x14 + j14 | 0;\n x15 = x15 + j15 | 0;\n\n o[ 0] = x0 >>> 0 & 0xff;\n o[ 1] = x0 >>> 8 & 0xff;\n o[ 2] = x0 >>> 16 & 0xff;\n o[ 3] = x0 >>> 24 & 0xff;\n\n o[ 4] = x1 >>> 0 & 0xff;\n o[ 5] = x1 >>> 8 & 0xff;\n o[ 6] = x1 >>> 16 & 0xff;\n o[ 7] = x1 >>> 24 & 0xff;\n\n o[ 8] = x2 >>> 0 & 0xff;\n o[ 9] = x2 >>> 8 & 0xff;\n o[10] = x2 >>> 16 & 0xff;\n o[11] = x2 >>> 24 & 0xff;\n\n o[12] = x3 >>> 0 & 0xff;\n o[13] = x3 >>> 8 & 0xff;\n o[14] = x3 >>> 16 & 0xff;\n o[15] = x3 >>> 24 & 0xff;\n\n o[16] = x4 >>> 0 & 0xff;\n o[17] = x4 >>> 8 & 0xff;\n o[18] = x4 >>> 16 & 0xff;\n o[19] = x4 >>> 24 & 0xff;\n\n o[20] = x5 >>> 0 & 0xff;\n o[21] = x5 >>> 8 & 0xff;\n o[22] = x5 >>> 16 & 0xff;\n o[23] = x5 >>> 24 & 0xff;\n\n o[24] = x6 >>> 0 & 0xff;\n o[25] = x6 >>> 8 & 0xff;\n o[26] = x6 >>> 16 & 0xff;\n o[27] = x6 >>> 24 & 0xff;\n\n o[28] = x7 >>> 0 & 0xff;\n o[29] = x7 >>> 8 & 0xff;\n o[30] = x7 >>> 16 & 0xff;\n o[31] = x7 >>> 24 & 0xff;\n\n o[32] = x8 >>> 0 & 0xff;\n o[33] = x8 >>> 8 & 0xff;\n o[34] = x8 >>> 16 & 0xff;\n o[35] = x8 >>> 24 & 0xff;\n\n o[36] = x9 >>> 0 & 0xff;\n o[37] = x9 >>> 8 & 0xff;\n o[38] = x9 >>> 16 & 0xff;\n o[39] = x9 >>> 24 & 0xff;\n\n o[40] = x10 >>> 0 & 0xff;\n o[41] = x10 >>> 8 & 0xff;\n o[42] = x10 >>> 16 & 0xff;\n o[43] = x10 >>> 24 & 0xff;\n\n o[44] = x11 >>> 0 & 0xff;\n o[45] = x11 >>> 8 & 0xff;\n o[46] = x11 >>> 16 & 0xff;\n o[47] = x11 >>> 24 & 0xff;\n\n o[48] = x12 >>> 0 & 0xff;\n o[49] = x12 >>> 8 & 0xff;\n o[50] = x12 >>> 16 & 0xff;\n o[51] = x12 >>> 24 & 0xff;\n\n o[52] = x13 >>> 0 & 0xff;\n o[53] = x13 >>> 8 & 0xff;\n o[54] = x13 >>> 16 & 0xff;\n o[55] = x13 >>> 24 & 0xff;\n\n o[56] = x14 >>> 0 & 0xff;\n o[57] = x14 >>> 8 & 0xff;\n o[58] = x14 >>> 16 & 0xff;\n o[59] = x14 >>> 24 & 0xff;\n\n o[60] = x15 >>> 0 & 0xff;\n o[61] = x15 >>> 8 & 0xff;\n o[62] = x15 >>> 16 & 0xff;\n o[63] = x15 >>> 24 & 0xff;\n}\n\nfunction core_hsalsa20(o,p,k,c) {\n var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,\n j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,\n j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,\n j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,\n j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,\n j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,\n j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,\n j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,\n j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,\n j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,\n j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,\n j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,\n j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,\n j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,\n j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,\n j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;\n\n var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n x15 = j15, u;\n\n for (var i = 0; i < 20; i += 2) {\n u = x0 + x12 | 0;\n x4 ^= u<<7 | u>>>(32-7);\n u = x4 + x0 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x4 | 0;\n x12 ^= u<<13 | u>>>(32-13);\n u = x12 + x8 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x1 | 0;\n x9 ^= u<<7 | u>>>(32-7);\n u = x9 + x5 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x9 | 0;\n x1 ^= u<<13 | u>>>(32-13);\n u = x1 + x13 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x6 | 0;\n x14 ^= u<<7 | u>>>(32-7);\n u = x14 + x10 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x14 | 0;\n x6 ^= u<<13 | u>>>(32-13);\n u = x6 + x2 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x11 | 0;\n x3 ^= u<<7 | u>>>(32-7);\n u = x3 + x15 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x3 | 0;\n x11 ^= u<<13 | u>>>(32-13);\n u = x11 + x7 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n\n u = x0 + x3 | 0;\n x1 ^= u<<7 | u>>>(32-7);\n u = x1 + x0 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x1 | 0;\n x3 ^= u<<13 | u>>>(32-13);\n u = x3 + x2 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x4 | 0;\n x6 ^= u<<7 | u>>>(32-7);\n u = x6 + x5 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x6 | 0;\n x4 ^= u<<13 | u>>>(32-13);\n u = x4 + x7 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x9 | 0;\n x11 ^= u<<7 | u>>>(32-7);\n u = x11 + x10 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x11 | 0;\n x9 ^= u<<13 | u>>>(32-13);\n u = x9 + x8 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x14 | 0;\n x12 ^= u<<7 | u>>>(32-7);\n u = x12 + x15 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x12 | 0;\n x14 ^= u<<13 | u>>>(32-13);\n u = x14 + x13 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n }\n\n o[ 0] = x0 >>> 0 & 0xff;\n o[ 1] = x0 >>> 8 & 0xff;\n o[ 2] = x0 >>> 16 & 0xff;\n o[ 3] = x0 >>> 24 & 0xff;\n\n o[ 4] = x5 >>> 0 & 0xff;\n o[ 5] = x5 >>> 8 & 0xff;\n o[ 6] = x5 >>> 16 & 0xff;\n o[ 7] = x5 >>> 24 & 0xff;\n\n o[ 8] = x10 >>> 0 & 0xff;\n o[ 9] = x10 >>> 8 & 0xff;\n o[10] = x10 >>> 16 & 0xff;\n o[11] = x10 >>> 24 & 0xff;\n\n o[12] = x15 >>> 0 & 0xff;\n o[13] = x15 >>> 8 & 0xff;\n o[14] = x15 >>> 16 & 0xff;\n o[15] = x15 >>> 24 & 0xff;\n\n o[16] = x6 >>> 0 & 0xff;\n o[17] = x6 >>> 8 & 0xff;\n o[18] = x6 >>> 16 & 0xff;\n o[19] = x6 >>> 24 & 0xff;\n\n o[20] = x7 >>> 0 & 0xff;\n o[21] = x7 >>> 8 & 0xff;\n o[22] = x7 >>> 16 & 0xff;\n o[23] = x7 >>> 24 & 0xff;\n\n o[24] = x8 >>> 0 & 0xff;\n o[25] = x8 >>> 8 & 0xff;\n o[26] = x8 >>> 16 & 0xff;\n o[27] = x8 >>> 24 & 0xff;\n\n o[28] = x9 >>> 0 & 0xff;\n o[29] = x9 >>> 8 & 0xff;\n o[30] = x9 >>> 16 & 0xff;\n o[31] = x9 >>> 24 & 0xff;\n}\n\nfunction crypto_core_salsa20(out,inp,k,c) {\n core_salsa20(out,inp,k,c);\n}\n\nfunction crypto_core_hsalsa20(out,inp,k,c) {\n core_hsalsa20(out,inp,k,c);\n}\n\nvar sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);\n // \"expand 32-byte k\"\n\nfunction crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) {\n var z = new Uint8Array(16), x = new Uint8Array(64);\n var u, i;\n for (i = 0; i < 16; i++) z[i] = 0;\n for (i = 0; i < 8; i++) z[i] = n[i];\n while (b >= 64) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i];\n u = 1;\n for (i = 8; i < 16; i++) {\n u = u + (z[i] & 0xff) | 0;\n z[i] = u & 0xff;\n u >>>= 8;\n }\n b -= 64;\n cpos += 64;\n mpos += 64;\n }\n if (b > 0) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i];\n }\n return 0;\n}\n\nfunction crypto_stream_salsa20(c,cpos,b,n,k) {\n var z = new Uint8Array(16), x = new Uint8Array(64);\n var u, i;\n for (i = 0; i < 16; i++) z[i] = 0;\n for (i = 0; i < 8; i++) z[i] = n[i];\n while (b >= 64) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < 64; i++) c[cpos+i] = x[i];\n u = 1;\n for (i = 8; i < 16; i++) {\n u = u + (z[i] & 0xff) | 0;\n z[i] = u & 0xff;\n u >>>= 8;\n }\n b -= 64;\n cpos += 64;\n }\n if (b > 0) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < b; i++) c[cpos+i] = x[i];\n }\n return 0;\n}\n\nfunction crypto_stream(c,cpos,d,n,k) {\n var s = new Uint8Array(32);\n crypto_core_hsalsa20(s,n,k,sigma);\n var sn = new Uint8Array(8);\n for (var i = 0; i < 8; i++) sn[i] = n[i+16];\n return crypto_stream_salsa20(c,cpos,d,sn,s);\n}\n\nfunction crypto_stream_xor(c,cpos,m,mpos,d,n,k) {\n var s = new Uint8Array(32);\n crypto_core_hsalsa20(s,n,k,sigma);\n var sn = new Uint8Array(8);\n for (var i = 0; i < 8; i++) sn[i] = n[i+16];\n return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s);\n}\n\n/*\n* Port of Andrew Moon's Poly1305-donna-16. Public domain.\n* https://github.com/floodyberry/poly1305-donna\n*/\n\nvar poly1305 = function(key) {\n this.buffer = new Uint8Array(16);\n this.r = new Uint16Array(10);\n this.h = new Uint16Array(10);\n this.pad = new Uint16Array(8);\n this.leftover = 0;\n this.fin = 0;\n\n var t0, t1, t2, t3, t4, t5, t6, t7;\n\n t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0 ) & 0x1fff;\n t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;\n t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;\n this.r[5] = ((t4 >>> 1)) & 0x1ffe;\n t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;\n t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n this.r[9] = ((t7 >>> 5)) & 0x007f;\n\n this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8;\n this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8;\n this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8;\n this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8;\n this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8;\n this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8;\n this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8;\n this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8;\n};\n\npoly1305.prototype.blocks = function(m, mpos, bytes) {\n var hibit = this.fin ? 0 : (1 << 11);\n var t0, t1, t2, t3, t4, t5, t6, t7, c;\n var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9;\n\n var h0 = this.h[0],\n h1 = this.h[1],\n h2 = this.h[2],\n h3 = this.h[3],\n h4 = this.h[4],\n h5 = this.h[5],\n h6 = this.h[6],\n h7 = this.h[7],\n h8 = this.h[8],\n h9 = this.h[9];\n\n var r0 = this.r[0],\n r1 = this.r[1],\n r2 = this.r[2],\n r3 = this.r[3],\n r4 = this.r[4],\n r5 = this.r[5],\n r6 = this.r[6],\n r7 = this.r[7],\n r8 = this.r[8],\n r9 = this.r[9];\n\n while (bytes >= 16) {\n t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0 ) & 0x1fff;\n t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff;\n t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff;\n h5 += ((t4 >>> 1)) & 0x1fff;\n t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff;\n t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n h9 += ((t7 >>> 5)) | hibit;\n\n c = 0;\n\n d0 = c;\n d0 += h0 * r0;\n d0 += h1 * (5 * r9);\n d0 += h2 * (5 * r8);\n d0 += h3 * (5 * r7);\n d0 += h4 * (5 * r6);\n c = (d0 >>> 13); d0 &= 0x1fff;\n d0 += h5 * (5 * r5);\n d0 += h6 * (5 * r4);\n d0 += h7 * (5 * r3);\n d0 += h8 * (5 * r2);\n d0 += h9 * (5 * r1);\n c += (d0 >>> 13); d0 &= 0x1fff;\n\n d1 = c;\n d1 += h0 * r1;\n d1 += h1 * r0;\n d1 += h2 * (5 * r9);\n d1 += h3 * (5 * r8);\n d1 += h4 * (5 * r7);\n c = (d1 >>> 13); d1 &= 0x1fff;\n d1 += h5 * (5 * r6);\n d1 += h6 * (5 * r5);\n d1 += h7 * (5 * r4);\n d1 += h8 * (5 * r3);\n d1 += h9 * (5 * r2);\n c += (d1 >>> 13); d1 &= 0x1fff;\n\n d2 = c;\n d2 += h0 * r2;\n d2 += h1 * r1;\n d2 += h2 * r0;\n d2 += h3 * (5 * r9);\n d2 += h4 * (5 * r8);\n c = (d2 >>> 13); d2 &= 0x1fff;\n d2 += h5 * (5 * r7);\n d2 += h6 * (5 * r6);\n d2 += h7 * (5 * r5);\n d2 += h8 * (5 * r4);\n d2 += h9 * (5 * r3);\n c += (d2 >>> 13); d2 &= 0x1fff;\n\n d3 = c;\n d3 += h0 * r3;\n d3 += h1 * r2;\n d3 += h2 * r1;\n d3 += h3 * r0;\n d3 += h4 * (5 * r9);\n c = (d3 >>> 13); d3 &= 0x1fff;\n d3 += h5 * (5 * r8);\n d3 += h6 * (5 * r7);\n d3 += h7 * (5 * r6);\n d3 += h8 * (5 * r5);\n d3 += h9 * (5 * r4);\n c += (d3 >>> 13); d3 &= 0x1fff;\n\n d4 = c;\n d4 += h0 * r4;\n d4 += h1 * r3;\n d4 += h2 * r2;\n d4 += h3 * r1;\n d4 += h4 * r0;\n c = (d4 >>> 13); d4 &= 0x1fff;\n d4 += h5 * (5 * r9);\n d4 += h6 * (5 * r8);\n d4 += h7 * (5 * r7);\n d4 += h8 * (5 * r6);\n d4 += h9 * (5 * r5);\n c += (d4 >>> 13); d4 &= 0x1fff;\n\n d5 = c;\n d5 += h0 * r5;\n d5 += h1 * r4;\n d5 += h2 * r3;\n d5 += h3 * r2;\n d5 += h4 * r1;\n c = (d5 >>> 13); d5 &= 0x1fff;\n d5 += h5 * r0;\n d5 += h6 * (5 * r9);\n d5 += h7 * (5 * r8);\n d5 += h8 * (5 * r7);\n d5 += h9 * (5 * r6);\n c += (d5 >>> 13); d5 &= 0x1fff;\n\n d6 = c;\n d6 += h0 * r6;\n d6 += h1 * r5;\n d6 += h2 * r4;\n d6 += h3 * r3;\n d6 += h4 * r2;\n c = (d6 >>> 13); d6 &= 0x1fff;\n d6 += h5 * r1;\n d6 += h6 * r0;\n d6 += h7 * (5 * r9);\n d6 += h8 * (5 * r8);\n d6 += h9 * (5 * r7);\n c += (d6 >>> 13); d6 &= 0x1fff;\n\n d7 = c;\n d7 += h0 * r7;\n d7 += h1 * r6;\n d7 += h2 * r5;\n d7 += h3 * r4;\n d7 += h4 * r3;\n c = (d7 >>> 13); d7 &= 0x1fff;\n d7 += h5 * r2;\n d7 += h6 * r1;\n d7 += h7 * r0;\n d7 += h8 * (5 * r9);\n d7 += h9 * (5 * r8);\n c += (d7 >>> 13); d7 &= 0x1fff;\n\n d8 = c;\n d8 += h0 * r8;\n d8 += h1 * r7;\n d8 += h2 * r6;\n d8 += h3 * r5;\n d8 += h4 * r4;\n c = (d8 >>> 13); d8 &= 0x1fff;\n d8 += h5 * r3;\n d8 += h6 * r2;\n d8 += h7 * r1;\n d8 += h8 * r0;\n d8 += h9 * (5 * r9);\n c += (d8 >>> 13); d8 &= 0x1fff;\n\n d9 = c;\n d9 += h0 * r9;\n d9 += h1 * r8;\n d9 += h2 * r7;\n d9 += h3 * r6;\n d9 += h4 * r5;\n c = (d9 >>> 13); d9 &= 0x1fff;\n d9 += h5 * r4;\n d9 += h6 * r3;\n d9 += h7 * r2;\n d9 += h8 * r1;\n d9 += h9 * r0;\n c += (d9 >>> 13); d9 &= 0x1fff;\n\n c = (((c << 2) + c)) | 0;\n c = (c + d0) | 0;\n d0 = c & 0x1fff;\n c = (c >>> 13);\n d1 += c;\n\n h0 = d0;\n h1 = d1;\n h2 = d2;\n h3 = d3;\n h4 = d4;\n h5 = d5;\n h6 = d6;\n h7 = d7;\n h8 = d8;\n h9 = d9;\n\n mpos += 16;\n bytes -= 16;\n }\n this.h[0] = h0;\n this.h[1] = h1;\n this.h[2] = h2;\n this.h[3] = h3;\n this.h[4] = h4;\n this.h[5] = h5;\n this.h[6] = h6;\n this.h[7] = h7;\n this.h[8] = h8;\n this.h[9] = h9;\n};\n\npoly1305.prototype.finish = function(mac, macpos) {\n var g = new Uint16Array(10);\n var c, mask, f, i;\n\n if (this.leftover) {\n i = this.leftover;\n this.buffer[i++] = 1;\n for (; i < 16; i++) this.buffer[i] = 0;\n this.fin = 1;\n this.blocks(this.buffer, 0, 16);\n }\n\n c = this.h[1] >>> 13;\n this.h[1] &= 0x1fff;\n for (i = 2; i < 10; i++) {\n this.h[i] += c;\n c = this.h[i] >>> 13;\n this.h[i] &= 0x1fff;\n }\n this.h[0] += (c * 5);\n c = this.h[0] >>> 13;\n this.h[0] &= 0x1fff;\n this.h[1] += c;\n c = this.h[1] >>> 13;\n this.h[1] &= 0x1fff;\n this.h[2] += c;\n\n g[0] = this.h[0] + 5;\n c = g[0] >>> 13;\n g[0] &= 0x1fff;\n for (i = 1; i < 10; i++) {\n g[i] = this.h[i] + c;\n c = g[i] >>> 13;\n g[i] &= 0x1fff;\n }\n g[9] -= (1 << 13);\n\n mask = (c ^ 1) - 1;\n for (i = 0; i < 10; i++) g[i] &= mask;\n mask = ~mask;\n for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i];\n\n this.h[0] = ((this.h[0] ) | (this.h[1] << 13) ) & 0xffff;\n this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10) ) & 0xffff;\n this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7) ) & 0xffff;\n this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4) ) & 0xffff;\n this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff;\n this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11) ) & 0xffff;\n this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8) ) & 0xffff;\n this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5) ) & 0xffff;\n\n f = this.h[0] + this.pad[0];\n this.h[0] = f & 0xffff;\n for (i = 1; i < 8; i++) {\n f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0;\n this.h[i] = f & 0xffff;\n }\n\n mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff;\n mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff;\n mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff;\n mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff;\n mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff;\n mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff;\n mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff;\n mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff;\n mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff;\n mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff;\n mac[macpos+10] = (this.h[5] >>> 0) & 0xff;\n mac[macpos+11] = (this.h[5] >>> 8) & 0xff;\n mac[macpos+12] = (this.h[6] >>> 0) & 0xff;\n mac[macpos+13] = (this.h[6] >>> 8) & 0xff;\n mac[macpos+14] = (this.h[7] >>> 0) & 0xff;\n mac[macpos+15] = (this.h[7] >>> 8) & 0xff;\n};\n\npoly1305.prototype.update = function(m, mpos, bytes) {\n var i, want;\n\n if (this.leftover) {\n want = (16 - this.leftover);\n if (want > bytes)\n want = bytes;\n for (i = 0; i < want; i++)\n this.buffer[this.leftover + i] = m[mpos+i];\n bytes -= want;\n mpos += want;\n this.leftover += want;\n if (this.leftover < 16)\n return;\n this.blocks(this.buffer, 0, 16);\n this.leftover = 0;\n }\n\n if (bytes >= 16) {\n want = bytes - (bytes % 16);\n this.blocks(m, mpos, want);\n mpos += want;\n bytes -= want;\n }\n\n if (bytes) {\n for (i = 0; i < bytes; i++)\n this.buffer[this.leftover + i] = m[mpos+i];\n this.leftover += bytes;\n }\n};\n\nfunction crypto_onetimeauth(out, outpos, m, mpos, n, k) {\n var s = new poly1305(k);\n s.update(m, mpos, n);\n s.finish(out, outpos);\n return 0;\n}\n\nfunction crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {\n var x = new Uint8Array(16);\n crypto_onetimeauth(x,0,m,mpos,n,k);\n return crypto_verify_16(h,hpos,x,0);\n}\n\nfunction crypto_secretbox(c,m,d,n,k) {\n var i;\n if (d < 32) return -1;\n crypto_stream_xor(c,0,m,0,d,n,k);\n crypto_onetimeauth(c, 16, c, 32, d - 32, c);\n for (i = 0; i < 16; i++) c[i] = 0;\n return 0;\n}\n\nfunction crypto_secretbox_open(m,c,d,n,k) {\n var i;\n var x = new Uint8Array(32);\n if (d < 32) return -1;\n crypto_stream(x,0,32,n,k);\n if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1;\n crypto_stream_xor(m,0,c,0,d,n,k);\n for (i = 0; i < 32; i++) m[i] = 0;\n return 0;\n}\n\nfunction set25519(r, a) {\n var i;\n for (i = 0; i < 16; i++) r[i] = a[i]|0;\n}\n\nfunction car25519(o) {\n var i, v, c = 1;\n for (i = 0; i < 16; i++) {\n v = o[i] + c + 65535;\n c = Math.floor(v / 65536);\n o[i] = v - c * 65536;\n }\n o[0] += c-1 + 37 * (c-1);\n}\n\nfunction sel25519(p, q, b) {\n var t, c = ~(b-1);\n for (var i = 0; i < 16; i++) {\n t = c & (p[i] ^ q[i]);\n p[i] ^= t;\n q[i] ^= t;\n }\n}\n\nfunction pack25519(o, n) {\n var i, j, b;\n var m = gf(), t = gf();\n for (i = 0; i < 16; i++) t[i] = n[i];\n car25519(t);\n car25519(t);\n car25519(t);\n for (j = 0; j < 2; j++) {\n m[0] = t[0] - 0xffed;\n for (i = 1; i < 15; i++) {\n m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1);\n m[i-1] &= 0xffff;\n }\n m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1);\n b = (m[15]>>16) & 1;\n m[14] &= 0xffff;\n sel25519(t, m, 1-b);\n }\n for (i = 0; i < 16; i++) {\n o[2*i] = t[i] & 0xff;\n o[2*i+1] = t[i]>>8;\n }\n}\n\nfunction neq25519(a, b) {\n var c = new Uint8Array(32), d = new Uint8Array(32);\n pack25519(c, a);\n pack25519(d, b);\n return crypto_verify_32(c, 0, d, 0);\n}\n\nfunction par25519(a) {\n var d = new Uint8Array(32);\n pack25519(d, a);\n return d[0] & 1;\n}\n\nfunction unpack25519(o, n) {\n var i;\n for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8);\n o[15] &= 0x7fff;\n}\n\nfunction A(o, a, b) {\n for (var i = 0; i < 16; i++) o[i] = a[i] + b[i];\n}\n\nfunction Z(o, a, b) {\n for (var i = 0; i < 16; i++) o[i] = a[i] - b[i];\n}\n\nfunction M(o, a, b) {\n var v, c,\n t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0,\n t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,\n t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,\n t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,\n b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11],\n b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n\n v = a[0];\n t0 += v * b0;\n t1 += v * b1;\n t2 += v * b2;\n t3 += v * b3;\n t4 += v * b4;\n t5 += v * b5;\n t6 += v * b6;\n t7 += v * b7;\n t8 += v * b8;\n t9 += v * b9;\n t10 += v * b10;\n t11 += v * b11;\n t12 += v * b12;\n t13 += v * b13;\n t14 += v * b14;\n t15 += v * b15;\n v = a[1];\n t1 += v * b0;\n t2 += v * b1;\n t3 += v * b2;\n t4 += v * b3;\n t5 += v * b4;\n t6 += v * b5;\n t7 += v * b6;\n t8 += v * b7;\n t9 += v * b8;\n t10 += v * b9;\n t11 += v * b10;\n t12 += v * b11;\n t13 += v * b12;\n t14 += v * b13;\n t15 += v * b14;\n t16 += v * b15;\n v = a[2];\n t2 += v * b0;\n t3 += v * b1;\n t4 += v * b2;\n t5 += v * b3;\n t6 += v * b4;\n t7 += v * b5;\n t8 += v * b6;\n t9 += v * b7;\n t10 += v * b8;\n t11 += v * b9;\n t12 += v * b10;\n t13 += v * b11;\n t14 += v * b12;\n t15 += v * b13;\n t16 += v * b14;\n t17 += v * b15;\n v = a[3];\n t3 += v * b0;\n t4 += v * b1;\n t5 += v * b2;\n t6 += v * b3;\n t7 += v * b4;\n t8 += v * b5;\n t9 += v * b6;\n t10 += v * b7;\n t11 += v * b8;\n t12 += v * b9;\n t13 += v * b10;\n t14 += v * b11;\n t15 += v * b12;\n t16 += v * b13;\n t17 += v * b14;\n t18 += v * b15;\n v = a[4];\n t4 += v * b0;\n t5 += v * b1;\n t6 += v * b2;\n t7 += v * b3;\n t8 += v * b4;\n t9 += v * b5;\n t10 += v * b6;\n t11 += v * b7;\n t12 += v * b8;\n t13 += v * b9;\n t14 += v * b10;\n t15 += v * b11;\n t16 += v * b12;\n t17 += v * b13;\n t18 += v * b14;\n t19 += v * b15;\n v = a[5];\n t5 += v * b0;\n t6 += v * b1;\n t7 += v * b2;\n t8 += v * b3;\n t9 += v * b4;\n t10 += v * b5;\n t11 += v * b6;\n t12 += v * b7;\n t13 += v * b8;\n t14 += v * b9;\n t15 += v * b10;\n t16 += v * b11;\n t17 += v * b12;\n t18 += v * b13;\n t19 += v * b14;\n t20 += v * b15;\n v = a[6];\n t6 += v * b0;\n t7 += v * b1;\n t8 += v * b2;\n t9 += v * b3;\n t10 += v * b4;\n t11 += v * b5;\n t12 += v * b6;\n t13 += v * b7;\n t14 += v * b8;\n t15 += v * b9;\n t16 += v * b10;\n t17 += v * b11;\n t18 += v * b12;\n t19 += v * b13;\n t20 += v * b14;\n t21 += v * b15;\n v = a[7];\n t7 += v * b0;\n t8 += v * b1;\n t9 += v * b2;\n t10 += v * b3;\n t11 += v * b4;\n t12 += v * b5;\n t13 += v * b6;\n t14 += v * b7;\n t15 += v * b8;\n t16 += v * b9;\n t17 += v * b10;\n t18 += v * b11;\n t19 += v * b12;\n t20 += v * b13;\n t21 += v * b14;\n t22 += v * b15;\n v = a[8];\n t8 += v * b0;\n t9 += v * b1;\n t10 += v * b2;\n t11 += v * b3;\n t12 += v * b4;\n t13 += v * b5;\n t14 += v * b6;\n t15 += v * b7;\n t16 += v * b8;\n t17 += v * b9;\n t18 += v * b10;\n t19 += v * b11;\n t20 += v * b12;\n t21 += v * b13;\n t22 += v * b14;\n t23 += v * b15;\n v = a[9];\n t9 += v * b0;\n t10 += v * b1;\n t11 += v * b2;\n t12 += v * b3;\n t13 += v * b4;\n t14 += v * b5;\n t15 += v * b6;\n t16 += v * b7;\n t17 += v * b8;\n t18 += v * b9;\n t19 += v * b10;\n t20 += v * b11;\n t21 += v * b12;\n t22 += v * b13;\n t23 += v * b14;\n t24 += v * b15;\n v = a[10];\n t10 += v * b0;\n t11 += v * b1;\n t12 += v * b2;\n t13 += v * b3;\n t14 += v * b4;\n t15 += v * b5;\n t16 += v * b6;\n t17 += v * b7;\n t18 += v * b8;\n t19 += v * b9;\n t20 += v * b10;\n t21 += v * b11;\n t22 += v * b12;\n t23 += v * b13;\n t24 += v * b14;\n t25 += v * b15;\n v = a[11];\n t11 += v * b0;\n t12 += v * b1;\n t13 += v * b2;\n t14 += v * b3;\n t15 += v * b4;\n t16 += v * b5;\n t17 += v * b6;\n t18 += v * b7;\n t19 += v * b8;\n t20 += v * b9;\n t21 += v * b10;\n t22 += v * b11;\n t23 += v * b12;\n t24 += v * b13;\n t25 += v * b14;\n t26 += v * b15;\n v = a[12];\n t12 += v * b0;\n t13 += v * b1;\n t14 += v * b2;\n t15 += v * b3;\n t16 += v * b4;\n t17 += v * b5;\n t18 += v * b6;\n t19 += v * b7;\n t20 += v * b8;\n t21 += v * b9;\n t22 += v * b10;\n t23 += v * b11;\n t24 += v * b12;\n t25 += v * b13;\n t26 += v * b14;\n t27 += v * b15;\n v = a[13];\n t13 += v * b0;\n t14 += v * b1;\n t15 += v * b2;\n t16 += v * b3;\n t17 += v * b4;\n t18 += v * b5;\n t19 += v * b6;\n t20 += v * b7;\n t21 += v * b8;\n t22 += v * b9;\n t23 += v * b10;\n t24 += v * b11;\n t25 += v * b12;\n t26 += v * b13;\n t27 += v * b14;\n t28 += v * b15;\n v = a[14];\n t14 += v * b0;\n t15 += v * b1;\n t16 += v * b2;\n t17 += v * b3;\n t18 += v * b4;\n t19 += v * b5;\n t20 += v * b6;\n t21 += v * b7;\n t22 += v * b8;\n t23 += v * b9;\n t24 += v * b10;\n t25 += v * b11;\n t26 += v * b12;\n t27 += v * b13;\n t28 += v * b14;\n t29 += v * b15;\n v = a[15];\n t15 += v * b0;\n t16 += v * b1;\n t17 += v * b2;\n t18 += v * b3;\n t19 += v * b4;\n t20 += v * b5;\n t21 += v * b6;\n t22 += v * b7;\n t23 += v * b8;\n t24 += v * b9;\n t25 += v * b10;\n t26 += v * b11;\n t27 += v * b12;\n t28 += v * b13;\n t29 += v * b14;\n t30 += v * b15;\n\n t0 += 38 * t16;\n t1 += 38 * t17;\n t2 += 38 * t18;\n t3 += 38 * t19;\n t4 += 38 * t20;\n t5 += 38 * t21;\n t6 += 38 * t22;\n t7 += 38 * t23;\n t8 += 38 * t24;\n t9 += 38 * t25;\n t10 += 38 * t26;\n t11 += 38 * t27;\n t12 += 38 * t28;\n t13 += 38 * t29;\n t14 += 38 * t30;\n // t15 left as is\n\n // first car\n c = 1;\n v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;\n v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;\n v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;\n v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;\n v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;\n v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;\n v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;\n v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;\n v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;\n v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;\n v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n t0 += c-1 + 37 * (c-1);\n\n // second car\n c = 1;\n v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;\n v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;\n v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;\n v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;\n v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;\n v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;\n v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;\n v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;\n v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;\n v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;\n v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n t0 += c-1 + 37 * (c-1);\n\n o[ 0] = t0;\n o[ 1] = t1;\n o[ 2] = t2;\n o[ 3] = t3;\n o[ 4] = t4;\n o[ 5] = t5;\n o[ 6] = t6;\n o[ 7] = t7;\n o[ 8] = t8;\n o[ 9] = t9;\n o[10] = t10;\n o[11] = t11;\n o[12] = t12;\n o[13] = t13;\n o[14] = t14;\n o[15] = t15;\n}\n\nfunction S(o, a) {\n M(o, a, a);\n}\n\nfunction inv25519(o, i) {\n var c = gf();\n var a;\n for (a = 0; a < 16; a++) c[a] = i[a];\n for (a = 253; a >= 0; a--) {\n S(c, c);\n if(a !== 2 && a !== 4) M(c, c, i);\n }\n for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction pow2523(o, i) {\n var c = gf();\n var a;\n for (a = 0; a < 16; a++) c[a] = i[a];\n for (a = 250; a >= 0; a--) {\n S(c, c);\n if(a !== 1) M(c, c, i);\n }\n for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction crypto_scalarmult(q, n, p) {\n var z = new Uint8Array(32);\n var x = new Float64Array(80), r, i;\n var a = gf(), b = gf(), c = gf(),\n d = gf(), e = gf(), f = gf();\n for (i = 0; i < 31; i++) z[i] = n[i];\n z[31]=(n[31]&127)|64;\n z[0]&=248;\n unpack25519(x,p);\n for (i = 0; i < 16; i++) {\n b[i]=x[i];\n d[i]=a[i]=c[i]=0;\n }\n a[0]=d[0]=1;\n for (i=254; i>=0; --i) {\n r=(z[i>>>3]>>>(i&7))&1;\n sel25519(a,b,r);\n sel25519(c,d,r);\n A(e,a,c);\n Z(a,a,c);\n A(c,b,d);\n Z(b,b,d);\n S(d,e);\n S(f,a);\n M(a,c,a);\n M(c,b,e);\n A(e,a,c);\n Z(a,a,c);\n S(b,a);\n Z(c,d,f);\n M(a,c,_121665);\n A(a,a,d);\n M(c,c,a);\n M(a,d,f);\n M(d,b,x);\n S(b,e);\n sel25519(a,b,r);\n sel25519(c,d,r);\n }\n for (i = 0; i < 16; i++) {\n x[i+16]=a[i];\n x[i+32]=c[i];\n x[i+48]=b[i];\n x[i+64]=d[i];\n }\n var x32 = x.subarray(32);\n var x16 = x.subarray(16);\n inv25519(x32,x32);\n M(x16,x16,x32);\n pack25519(q,x16);\n return 0;\n}\n\nfunction crypto_scalarmult_base(q, n) {\n return crypto_scalarmult(q, n, _9);\n}\n\nfunction crypto_box_keypair(y, x) {\n randombytes(x, 32);\n return crypto_scalarmult_base(y, x);\n}\n\nfunction crypto_box_beforenm(k, y, x) {\n var s = new Uint8Array(32);\n crypto_scalarmult(s, x, y);\n return crypto_core_hsalsa20(k, _0, s, sigma);\n}\n\nvar crypto_box_afternm = crypto_secretbox;\nvar crypto_box_open_afternm = crypto_secretbox_open;\n\nfunction crypto_box(c, m, d, n, y, x) {\n var k = new Uint8Array(32);\n crypto_box_beforenm(k, y, x);\n return crypto_box_afternm(c, m, d, n, k);\n}\n\nfunction crypto_box_open(m, c, d, n, y, x) {\n var k = new Uint8Array(32);\n crypto_box_beforenm(k, y, x);\n return crypto_box_open_afternm(m, c, d, n, k);\n}\n\nvar K = [\n 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,\n 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,\n 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,\n 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,\n 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,\n 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,\n 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,\n 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,\n 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,\n 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,\n 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,\n 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,\n 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,\n 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,\n 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,\n 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,\n 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,\n 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,\n 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,\n 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,\n 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,\n 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,\n 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,\n 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,\n 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,\n 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,\n 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,\n 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,\n 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,\n 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,\n 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,\n 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,\n 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,\n 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,\n 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,\n 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,\n 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,\n 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,\n 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,\n 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817\n];\n\nfunction crypto_hashblocks_hl(hh, hl, m, n) {\n var wh = new Int32Array(16), wl = new Int32Array(16),\n bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7,\n bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7,\n th, tl, i, j, h, l, a, b, c, d;\n\n var ah0 = hh[0],\n ah1 = hh[1],\n ah2 = hh[2],\n ah3 = hh[3],\n ah4 = hh[4],\n ah5 = hh[5],\n ah6 = hh[6],\n ah7 = hh[7],\n\n al0 = hl[0],\n al1 = hl[1],\n al2 = hl[2],\n al3 = hl[3],\n al4 = hl[4],\n al5 = hl[5],\n al6 = hl[6],\n al7 = hl[7];\n\n var pos = 0;\n while (n >= 128) {\n for (i = 0; i < 16; i++) {\n j = 8 * i + pos;\n wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3];\n wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7];\n }\n for (i = 0; i < 80; i++) {\n bh0 = ah0;\n bh1 = ah1;\n bh2 = ah2;\n bh3 = ah3;\n bh4 = ah4;\n bh5 = ah5;\n bh6 = ah6;\n bh7 = ah7;\n\n bl0 = al0;\n bl1 = al1;\n bl2 = al2;\n bl3 = al3;\n bl4 = al4;\n bl5 = al5;\n bl6 = al6;\n bl7 = al7;\n\n // add\n h = ah7;\n l = al7;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n // Sigma1\n h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32))));\n l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32))));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // Ch\n h = (ah4 & ah5) ^ (~ah4 & ah6);\n l = (al4 & al5) ^ (~al4 & al6);\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // K\n h = K[i*2];\n l = K[i*2+1];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // w\n h = wh[i%16];\n l = wl[i%16];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n th = c & 0xffff | d << 16;\n tl = a & 0xffff | b << 16;\n\n // add\n h = th;\n l = tl;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n // Sigma0\n h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32))));\n l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32))));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // Maj\n h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2);\n l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2);\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n bh7 = (c & 0xffff) | (d << 16);\n bl7 = (a & 0xffff) | (b << 16);\n\n // add\n h = bh3;\n l = bl3;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = th;\n l = tl;\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n bh3 = (c & 0xffff) | (d << 16);\n bl3 = (a & 0xffff) | (b << 16);\n\n ah1 = bh0;\n ah2 = bh1;\n ah3 = bh2;\n ah4 = bh3;\n ah5 = bh4;\n ah6 = bh5;\n ah7 = bh6;\n ah0 = bh7;\n\n al1 = bl0;\n al2 = bl1;\n al3 = bl2;\n al4 = bl3;\n al5 = bl4;\n al6 = bl5;\n al7 = bl6;\n al0 = bl7;\n\n if (i%16 === 15) {\n for (j = 0; j < 16; j++) {\n // add\n h = wh[j];\n l = wl[j];\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = wh[(j+9)%16];\n l = wl[(j+9)%16];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // sigma0\n th = wh[(j+1)%16];\n tl = wl[(j+1)%16];\n h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7);\n l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7)));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // sigma1\n th = wh[(j+14)%16];\n tl = wl[(j+14)%16];\n h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6);\n l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6)));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n wh[j] = (c & 0xffff) | (d << 16);\n wl[j] = (a & 0xffff) | (b << 16);\n }\n }\n }\n\n // add\n h = ah0;\n l = al0;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[0];\n l = hl[0];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[0] = ah0 = (c & 0xffff) | (d << 16);\n hl[0] = al0 = (a & 0xffff) | (b << 16);\n\n h = ah1;\n l = al1;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[1];\n l = hl[1];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[1] = ah1 = (c & 0xffff) | (d << 16);\n hl[1] = al1 = (a & 0xffff) | (b << 16);\n\n h = ah2;\n l = al2;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[2];\n l = hl[2];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[2] = ah2 = (c & 0xffff) | (d << 16);\n hl[2] = al2 = (a & 0xffff) | (b << 16);\n\n h = ah3;\n l = al3;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[3];\n l = hl[3];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[3] = ah3 = (c & 0xffff) | (d << 16);\n hl[3] = al3 = (a & 0xffff) | (b << 16);\n\n h = ah4;\n l = al4;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[4];\n l = hl[4];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[4] = ah4 = (c & 0xffff) | (d << 16);\n hl[4] = al4 = (a & 0xffff) | (b << 16);\n\n h = ah5;\n l = al5;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[5];\n l = hl[5];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[5] = ah5 = (c & 0xffff) | (d << 16);\n hl[5] = al5 = (a & 0xffff) | (b << 16);\n\n h = ah6;\n l = al6;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[6];\n l = hl[6];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[6] = ah6 = (c & 0xffff) | (d << 16);\n hl[6] = al6 = (a & 0xffff) | (b << 16);\n\n h = ah7;\n l = al7;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[7];\n l = hl[7];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[7] = ah7 = (c & 0xffff) | (d << 16);\n hl[7] = al7 = (a & 0xffff) | (b << 16);\n\n pos += 128;\n n -= 128;\n }\n\n return n;\n}\n\nfunction crypto_hash(out, m, n) {\n var hh = new Int32Array(8),\n hl = new Int32Array(8),\n x = new Uint8Array(256),\n i, b = n;\n\n hh[0] = 0x6a09e667;\n hh[1] = 0xbb67ae85;\n hh[2] = 0x3c6ef372;\n hh[3] = 0xa54ff53a;\n hh[4] = 0x510e527f;\n hh[5] = 0x9b05688c;\n hh[6] = 0x1f83d9ab;\n hh[7] = 0x5be0cd19;\n\n hl[0] = 0xf3bcc908;\n hl[1] = 0x84caa73b;\n hl[2] = 0xfe94f82b;\n hl[3] = 0x5f1d36f1;\n hl[4] = 0xade682d1;\n hl[5] = 0x2b3e6c1f;\n hl[6] = 0xfb41bd6b;\n hl[7] = 0x137e2179;\n\n crypto_hashblocks_hl(hh, hl, m, n);\n n %= 128;\n\n for (i = 0; i < n; i++) x[i] = m[b-n+i];\n x[n] = 128;\n\n n = 256-128*(n<112?1:0);\n x[n-9] = 0;\n ts64(x, n-8, (b / 0x20000000) | 0, b << 3);\n crypto_hashblocks_hl(hh, hl, x, n);\n\n for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]);\n\n return 0;\n}\n\nfunction add(p, q) {\n var a = gf(), b = gf(), c = gf(),\n d = gf(), e = gf(), f = gf(),\n g = gf(), h = gf(), t = gf();\n\n Z(a, p[1], p[0]);\n Z(t, q[1], q[0]);\n M(a, a, t);\n A(b, p[0], p[1]);\n A(t, q[0], q[1]);\n M(b, b, t);\n M(c, p[3], q[3]);\n M(c, c, D2);\n M(d, p[2], q[2]);\n A(d, d, d);\n Z(e, b, a);\n Z(f, d, c);\n A(g, d, c);\n A(h, b, a);\n\n M(p[0], e, f);\n M(p[1], h, g);\n M(p[2], g, f);\n M(p[3], e, h);\n}\n\nfunction cswap(p, q, b) {\n var i;\n for (i = 0; i < 4; i++) {\n sel25519(p[i], q[i], b);\n }\n}\n\nfunction pack(r, p) {\n var tx = gf(), ty = gf(), zi = gf();\n inv25519(zi, p[2]);\n M(tx, p[0], zi);\n M(ty, p[1], zi);\n pack25519(r, ty);\n r[31] ^= par25519(tx) << 7;\n}\n\nfunction scalarmult(p, q, s) {\n var b, i;\n set25519(p[0], gf0);\n set25519(p[1], gf1);\n set25519(p[2], gf1);\n set25519(p[3], gf0);\n for (i = 255; i >= 0; --i) {\n b = (s[(i/8)|0] >> (i&7)) & 1;\n cswap(p, q, b);\n add(q, p);\n add(p, p);\n cswap(p, q, b);\n }\n}\n\nfunction scalarbase(p, s) {\n var q = [gf(), gf(), gf(), gf()];\n set25519(q[0], X);\n set25519(q[1], Y);\n set25519(q[2], gf1);\n M(q[3], X, Y);\n scalarmult(p, q, s);\n}\n\nfunction crypto_sign_keypair(pk, sk, seeded) {\n var d = new Uint8Array(64);\n var p = [gf(), gf(), gf(), gf()];\n var i;\n\n if (!seeded) randombytes(sk, 32);\n crypto_hash(d, sk, 32);\n d[0] &= 248;\n d[31] &= 127;\n d[31] |= 64;\n\n scalarbase(p, d);\n pack(pk, p);\n\n for (i = 0; i < 32; i++) sk[i+32] = pk[i];\n return 0;\n}\n\nvar L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);\n\nfunction modL(r, x) {\n var carry, i, j, k;\n for (i = 63; i >= 32; --i) {\n carry = 0;\n for (j = i - 32, k = i - 12; j < k; ++j) {\n x[j] += carry - 16 * x[i] * L[j - (i - 32)];\n carry = (x[j] + 128) >> 8;\n x[j] -= carry * 256;\n }\n x[j] += carry;\n x[i] = 0;\n }\n carry = 0;\n for (j = 0; j < 32; j++) {\n x[j] += carry - (x[31] >> 4) * L[j];\n carry = x[j] >> 8;\n x[j] &= 255;\n }\n for (j = 0; j < 32; j++) x[j] -= carry * L[j];\n for (i = 0; i < 32; i++) {\n x[i+1] += x[i] >> 8;\n r[i] = x[i] & 255;\n }\n}\n\nfunction reduce(r) {\n var x = new Float64Array(64), i;\n for (i = 0; i < 64; i++) x[i] = r[i];\n for (i = 0; i < 64; i++) r[i] = 0;\n modL(r, x);\n}\n\n// Note: difference from C - smlen returned, not passed as argument.\nfunction crypto_sign(sm, m, n, sk) {\n var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);\n var i, j, x = new Float64Array(64);\n var p = [gf(), gf(), gf(), gf()];\n\n crypto_hash(d, sk, 32);\n d[0] &= 248;\n d[31] &= 127;\n d[31] |= 64;\n\n var smlen = n + 64;\n for (i = 0; i < n; i++) sm[64 + i] = m[i];\n for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];\n\n crypto_hash(r, sm.subarray(32), n+32);\n reduce(r);\n scalarbase(p, r);\n pack(sm, p);\n\n for (i = 32; i < 64; i++) sm[i] = sk[i];\n crypto_hash(h, sm, n + 64);\n reduce(h);\n\n for (i = 0; i < 64; i++) x[i] = 0;\n for (i = 0; i < 32; i++) x[i] = r[i];\n for (i = 0; i < 32; i++) {\n for (j = 0; j < 32; j++) {\n x[i+j] += h[i] * d[j];\n }\n }\n\n modL(sm.subarray(32), x);\n return smlen;\n}\n\nfunction unpackneg(r, p) {\n var t = gf(), chk = gf(), num = gf(),\n den = gf(), den2 = gf(), den4 = gf(),\n den6 = gf();\n\n set25519(r[2], gf1);\n unpack25519(r[1], p);\n S(num, r[1]);\n M(den, num, D);\n Z(num, num, r[2]);\n A(den, r[2], den);\n\n S(den2, den);\n S(den4, den2);\n M(den6, den4, den2);\n M(t, den6, num);\n M(t, t, den);\n\n pow2523(t, t);\n M(t, t, num);\n M(t, t, den);\n M(t, t, den);\n M(r[0], t, den);\n\n S(chk, r[0]);\n M(chk, chk, den);\n if (neq25519(chk, num)) M(r[0], r[0], I);\n\n S(chk, r[0]);\n M(chk, chk, den);\n if (neq25519(chk, num)) return -1;\n\n if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]);\n\n M(r[3], r[0], r[1]);\n return 0;\n}\n\nfunction crypto_sign_open(m, sm, n, pk) {\n var i, mlen;\n var t = new Uint8Array(32), h = new Uint8Array(64);\n var p = [gf(), gf(), gf(), gf()],\n q = [gf(), gf(), gf(), gf()];\n\n mlen = -1;\n if (n < 64) return -1;\n\n if (unpackneg(q, pk)) return -1;\n\n for (i = 0; i < n; i++) m[i] = sm[i];\n for (i = 0; i < 32; i++) m[i+32] = pk[i];\n crypto_hash(h, m, n);\n reduce(h);\n scalarmult(p, q, h);\n\n scalarbase(q, sm.subarray(32));\n add(p, q);\n pack(t, p);\n\n n -= 64;\n if (crypto_verify_32(sm, 0, t, 0)) {\n for (i = 0; i < n; i++) m[i] = 0;\n return -1;\n }\n\n for (i = 0; i < n; i++) m[i] = sm[i + 64];\n mlen = n;\n return mlen;\n}\n\nvar crypto_secretbox_KEYBYTES = 32,\n crypto_secretbox_NONCEBYTES = 24,\n crypto_secretbox_ZEROBYTES = 32,\n crypto_secretbox_BOXZEROBYTES = 16,\n crypto_scalarmult_BYTES = 32,\n crypto_scalarmult_SCALARBYTES = 32,\n crypto_box_PUBLICKEYBYTES = 32,\n crypto_box_SECRETKEYBYTES = 32,\n crypto_box_BEFORENMBYTES = 32,\n crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,\n crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,\n crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,\n crypto_sign_BYTES = 64,\n crypto_sign_PUBLICKEYBYTES = 32,\n crypto_sign_SECRETKEYBYTES = 64,\n crypto_sign_SEEDBYTES = 32,\n crypto_hash_BYTES = 64;\n\nnacl.lowlevel = {\n crypto_core_hsalsa20: crypto_core_hsalsa20,\n crypto_stream_xor: crypto_stream_xor,\n crypto_stream: crypto_stream,\n crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,\n crypto_stream_salsa20: crypto_stream_salsa20,\n crypto_onetimeauth: crypto_onetimeauth,\n crypto_onetimeauth_verify: crypto_onetimeauth_verify,\n crypto_verify_16: crypto_verify_16,\n crypto_verify_32: crypto_verify_32,\n crypto_secretbox: crypto_secretbox,\n crypto_secretbox_open: crypto_secretbox_open,\n crypto_scalarmult: crypto_scalarmult,\n crypto_scalarmult_base: crypto_scalarmult_base,\n crypto_box_beforenm: crypto_box_beforenm,\n crypto_box_afternm: crypto_box_afternm,\n crypto_box: crypto_box,\n crypto_box_open: crypto_box_open,\n crypto_box_keypair: crypto_box_keypair,\n crypto_hash: crypto_hash,\n crypto_sign: crypto_sign,\n crypto_sign_keypair: crypto_sign_keypair,\n crypto_sign_open: crypto_sign_open,\n\n crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,\n crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,\n crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,\n crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,\n crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,\n crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,\n crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,\n crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,\n crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,\n crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,\n crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,\n crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,\n crypto_sign_BYTES: crypto_sign_BYTES,\n crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,\n crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,\n crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,\n crypto_hash_BYTES: crypto_hash_BYTES\n};\n\n/* High-level API */\n\nfunction checkLengths(k, n) {\n if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');\n if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');\n}\n\nfunction checkBoxLengths(pk, sk) {\n if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');\n if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');\n}\n\nfunction checkArrayTypes() {\n var t, i;\n for (i = 0; i < arguments.length; i++) {\n if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]')\n throw new TypeError('unexpected type ' + t + ', use Uint8Array');\n }\n}\n\nfunction cleanup(arr) {\n for (var i = 0; i < arr.length; i++) arr[i] = 0;\n}\n\n// TODO: Completely remove this in v0.15.\nif (!nacl.util) {\n nacl.util = {};\n nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() {\n throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js');\n };\n}\n\nnacl.randomBytes = function(n) {\n var b = new Uint8Array(n);\n randombytes(b, n);\n return b;\n};\n\nnacl.secretbox = function(msg, nonce, key) {\n checkArrayTypes(msg, nonce, key);\n checkLengths(key, nonce);\n var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);\n var c = new Uint8Array(m.length);\n for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i];\n crypto_secretbox(c, m, m.length, nonce, key);\n return c.subarray(crypto_secretbox_BOXZEROBYTES);\n};\n\nnacl.secretbox.open = function(box, nonce, key) {\n checkArrayTypes(box, nonce, key);\n checkLengths(key, nonce);\n var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);\n var m = new Uint8Array(c.length);\n for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i];\n if (c.length < 32) return false;\n if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false;\n return m.subarray(crypto_secretbox_ZEROBYTES);\n};\n\nnacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;\nnacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;\nnacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;\n\nnacl.scalarMult = function(n, p) {\n checkArrayTypes(n, p);\n if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');\n var q = new Uint8Array(crypto_scalarmult_BYTES);\n crypto_scalarmult(q, n, p);\n return q;\n};\n\nnacl.scalarMult.base = function(n) {\n checkArrayTypes(n);\n if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n var q = new Uint8Array(crypto_scalarmult_BYTES);\n crypto_scalarmult_base(q, n);\n return q;\n};\n\nnacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;\nnacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;\n\nnacl.box = function(msg, nonce, publicKey, secretKey) {\n var k = nacl.box.before(publicKey, secretKey);\n return nacl.secretbox(msg, nonce, k);\n};\n\nnacl.box.before = function(publicKey, secretKey) {\n checkArrayTypes(publicKey, secretKey);\n checkBoxLengths(publicKey, secretKey);\n var k = new Uint8Array(crypto_box_BEFORENMBYTES);\n crypto_box_beforenm(k, publicKey, secretKey);\n return k;\n};\n\nnacl.box.after = nacl.secretbox;\n\nnacl.box.open = function(msg, nonce, publicKey, secretKey) {\n var k = nacl.box.before(publicKey, secretKey);\n return nacl.secretbox.open(msg, nonce, k);\n};\n\nnacl.box.open.after = nacl.secretbox.open;\n\nnacl.box.keyPair = function() {\n var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);\n crypto_box_keypair(pk, sk);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.box.keyPair.fromSecretKey = function(secretKey) {\n checkArrayTypes(secretKey);\n if (secretKey.length !== crypto_box_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n crypto_scalarmult_base(pk, secretKey);\n return {publicKey: pk, secretKey: new Uint8Array(secretKey)};\n};\n\nnacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;\nnacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;\nnacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;\nnacl.box.nonceLength = crypto_box_NONCEBYTES;\nnacl.box.overheadLength = nacl.secretbox.overheadLength;\n\nnacl.sign = function(msg, secretKey) {\n checkArrayTypes(msg, secretKey);\n if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length);\n crypto_sign(signedMsg, msg, msg.length, secretKey);\n return signedMsg;\n};\n\nnacl.sign.open = function(signedMsg, publicKey) {\n if (arguments.length !== 2)\n throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?');\n checkArrayTypes(signedMsg, publicKey);\n if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n throw new Error('bad public key size');\n var tmp = new Uint8Array(signedMsg.length);\n var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);\n if (mlen < 0) return null;\n var m = new Uint8Array(mlen);\n for (var i = 0; i < m.length; i++) m[i] = tmp[i];\n return m;\n};\n\nnacl.sign.detached = function(msg, secretKey) {\n var signedMsg = nacl.sign(msg, secretKey);\n var sig = new Uint8Array(crypto_sign_BYTES);\n for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n return sig;\n};\n\nnacl.sign.detached.verify = function(msg, sig, publicKey) {\n checkArrayTypes(msg, sig, publicKey);\n if (sig.length !== crypto_sign_BYTES)\n throw new Error('bad signature size');\n if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n throw new Error('bad public key size');\n var sm = new Uint8Array(crypto_sign_BYTES + msg.length);\n var m = new Uint8Array(crypto_sign_BYTES + msg.length);\n var i;\n for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];\n for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];\n return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);\n};\n\nnacl.sign.keyPair = function() {\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n crypto_sign_keypair(pk, sk);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.sign.keyPair.fromSecretKey = function(secretKey) {\n checkArrayTypes(secretKey);\n if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i];\n return {publicKey: pk, secretKey: new Uint8Array(secretKey)};\n};\n\nnacl.sign.keyPair.fromSeed = function(seed) {\n checkArrayTypes(seed);\n if (seed.length !== crypto_sign_SEEDBYTES)\n throw new Error('bad seed size');\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n for (var i = 0; i < 32; i++) sk[i] = seed[i];\n crypto_sign_keypair(pk, sk, true);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;\nnacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;\nnacl.sign.seedLength = crypto_sign_SEEDBYTES;\nnacl.sign.signatureLength = crypto_sign_BYTES;\n\nnacl.hash = function(msg) {\n checkArrayTypes(msg);\n var h = new Uint8Array(crypto_hash_BYTES);\n crypto_hash(h, msg, msg.length);\n return h;\n};\n\nnacl.hash.hashLength = crypto_hash_BYTES;\n\nnacl.verify = function(x, y) {\n checkArrayTypes(x, y);\n // Zero length arguments are considered not equal.\n if (x.length === 0 || y.length === 0) return false;\n if (x.length !== y.length) return false;\n return (vn(x, 0, y, 0, x.length) === 0) ? true : false;\n};\n\nnacl.setPRNG = function(fn) {\n randombytes = fn;\n};\n\n(function() {\n // Initialize PRNG if environment provides CSPRNG.\n // If not, methods calling randombytes will throw.\n var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null;\n if (crypto && crypto.getRandomValues) {\n // Browsers.\n var QUOTA = 65536;\n nacl.setPRNG(function(x, n) {\n var i, v = new Uint8Array(n);\n for (i = 0; i < n; i += QUOTA) {\n crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));\n }\n for (i = 0; i < n; i++) x[i] = v[i];\n cleanup(v);\n });\n } else if (typeof require !== 'undefined') {\n // Node.js.\n crypto = require('crypto');\n if (crypto && crypto.randomBytes) {\n nacl.setPRNG(function(x, n) {\n var i, v = crypto.randomBytes(n);\n for (i = 0; i < n; i++) x[i] = v[i];\n cleanup(v);\n });\n }\n }\n})();\n\n})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {}));\n", "'use strict';\n\nvar crypto_hash_sha512 = require('tweetnacl').lowlevel.crypto_hash;\n\n/*\n * This file is a 1:1 port from the OpenBSD blowfish.c and bcrypt_pbkdf.c. As a\n * result, it retains the original copyright and license. The two files are\n * under slightly different (but compatible) licenses, and are here combined in\n * one file.\n *\n * Credit for the actual porting work goes to:\n * Devi Mandiri <me@devi.web.id>\n */\n\n/*\n * The Blowfish portions are under the following license:\n *\n * Blowfish block cipher for OpenBSD\n * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>\n * All rights reserved.\n *\n * Implementation advice by David Mazieres <dm@lcs.mit.edu>.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * The bcrypt_pbkdf portions are under the following license:\n *\n * Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n/*\n * Performance improvements (Javascript-specific):\n *\n * Copyright 2016, Joyent Inc\n * Author: Alex Wilson <alex.wilson@joyent.com>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n// Ported from OpenBSD bcrypt_pbkdf.c v1.9\n\nvar BLF_J = 0;\n\nvar Blowfish = function() {\n this.S = [\n new Uint32Array([\n 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,\n 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,\n 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,\n 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,\n 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,\n 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,\n 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,\n 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,\n 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,\n 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,\n 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,\n 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,\n 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,\n 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,\n 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,\n 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,\n 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,\n 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,\n 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,\n 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,\n 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,\n 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,\n 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,\n 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,\n 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,\n 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,\n 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,\n 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,\n 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,\n 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,\n 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,\n 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,\n 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,\n 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,\n 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,\n 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,\n 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,\n 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,\n 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,\n 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,\n 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,\n 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,\n 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,\n 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,\n 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,\n 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,\n 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,\n 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,\n 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,\n 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,\n 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,\n 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,\n 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,\n 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,\n 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,\n 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,\n 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,\n 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,\n 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,\n 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,\n 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,\n 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,\n 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,\n 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a]),\n new Uint32Array([\n 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,\n 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,\n 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,\n 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,\n 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,\n 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,\n 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,\n 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,\n 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,\n 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,\n 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,\n 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,\n 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,\n 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,\n 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,\n 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,\n 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,\n 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,\n 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,\n 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,\n 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,\n 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,\n 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,\n 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,\n 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,\n 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,\n 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,\n 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,\n 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,\n 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,\n 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,\n 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,\n 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,\n 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,\n 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,\n 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,\n 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,\n 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,\n 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,\n 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,\n 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,\n 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,\n 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,\n 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,\n 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,\n 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,\n 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,\n 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,\n 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,\n 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,\n 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,\n 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,\n 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,\n 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,\n 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,\n 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,\n 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,\n 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,\n 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,\n 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,\n 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,\n 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,\n 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,\n 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7]),\n new Uint32Array([\n 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,\n 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,\n 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,\n 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,\n 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,\n 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,\n 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,\n 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,\n 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,\n 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,\n 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,\n 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,\n 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,\n 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,\n 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,\n 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,\n 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,\n 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,\n 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,\n 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,\n 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,\n 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,\n 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,\n 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,\n 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,\n 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,\n 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,\n 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,\n 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,\n 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,\n 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,\n 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,\n 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,\n 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,\n 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,\n 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,\n 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,\n 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,\n 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,\n 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,\n 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,\n 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,\n 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,\n 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,\n 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,\n 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,\n 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,\n 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,\n 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,\n 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,\n 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,\n 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,\n 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,\n 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,\n 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,\n 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,\n 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,\n 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,\n 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,\n 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,\n 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,\n 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,\n 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,\n 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0]),\n new Uint32Array([\n 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,\n 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,\n 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,\n 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,\n 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,\n 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,\n 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,\n 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,\n 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,\n 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,\n 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,\n 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,\n 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,\n 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,\n 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,\n 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,\n 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,\n 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,\n 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,\n 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,\n 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,\n 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,\n 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,\n 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,\n 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,\n 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,\n 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,\n 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,\n 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,\n 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,\n 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,\n 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,\n 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,\n 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,\n 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,\n 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,\n 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,\n 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,\n 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,\n 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,\n 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,\n 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,\n 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,\n 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,\n 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,\n 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,\n 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,\n 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,\n 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,\n 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,\n 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,\n 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,\n 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,\n 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,\n 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,\n 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,\n 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,\n 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,\n 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,\n 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,\n 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,\n 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,\n 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,\n 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6])\n ];\n this.P = new Uint32Array([\n 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,\n 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,\n 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,\n 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,\n 0x9216d5d9, 0x8979fb1b]);\n};\n\nfunction F(S, x8, i) {\n return (((S[0][x8[i+3]] +\n S[1][x8[i+2]]) ^\n S[2][x8[i+1]]) +\n S[3][x8[i]]);\n};\n\nBlowfish.prototype.encipher = function(x, x8) {\n if (x8 === undefined) {\n x8 = new Uint8Array(x.buffer);\n if (x.byteOffset !== 0)\n x8 = x8.subarray(x.byteOffset);\n }\n x[0] ^= this.P[0];\n for (var i = 1; i < 16; i += 2) {\n x[1] ^= F(this.S, x8, 0) ^ this.P[i];\n x[0] ^= F(this.S, x8, 4) ^ this.P[i+1];\n }\n var t = x[0];\n x[0] = x[1] ^ this.P[17];\n x[1] = t;\n};\n\nBlowfish.prototype.decipher = function(x) {\n var x8 = new Uint8Array(x.buffer);\n if (x.byteOffset !== 0)\n x8 = x8.subarray(x.byteOffset);\n x[0] ^= this.P[17];\n for (var i = 16; i > 0; i -= 2) {\n x[1] ^= F(this.S, x8, 0) ^ this.P[i];\n x[0] ^= F(this.S, x8, 4) ^ this.P[i-1];\n }\n var t = x[0];\n x[0] = x[1] ^ this.P[0];\n x[1] = t;\n};\n\nfunction stream2word(data, databytes){\n var i, temp = 0;\n for (i = 0; i < 4; i++, BLF_J++) {\n if (BLF_J >= databytes) BLF_J = 0;\n temp = (temp << 8) | data[BLF_J];\n }\n return temp;\n};\n\nBlowfish.prototype.expand0state = function(key, keybytes) {\n var d = new Uint32Array(2), i, k;\n var d8 = new Uint8Array(d.buffer);\n\n for (i = 0, BLF_J = 0; i < 18; i++) {\n this.P[i] ^= stream2word(key, keybytes);\n }\n BLF_J = 0;\n\n for (i = 0; i < 18; i += 2) {\n this.encipher(d, d8);\n this.P[i] = d[0];\n this.P[i+1] = d[1];\n }\n\n for (i = 0; i < 4; i++) {\n for (k = 0; k < 256; k += 2) {\n this.encipher(d, d8);\n this.S[i][k] = d[0];\n this.S[i][k+1] = d[1];\n }\n }\n};\n\nBlowfish.prototype.expandstate = function(data, databytes, key, keybytes) {\n var d = new Uint32Array(2), i, k;\n\n for (i = 0, BLF_J = 0; i < 18; i++) {\n this.P[i] ^= stream2word(key, keybytes);\n }\n\n for (i = 0, BLF_J = 0; i < 18; i += 2) {\n d[0] ^= stream2word(data, databytes);\n d[1] ^= stream2word(data, databytes);\n this.encipher(d);\n this.P[i] = d[0];\n this.P[i+1] = d[1];\n }\n\n for (i = 0; i < 4; i++) {\n for (k = 0; k < 256; k += 2) {\n d[0] ^= stream2word(data, databytes);\n d[1] ^= stream2word(data, databytes);\n this.encipher(d);\n this.S[i][k] = d[0];\n this.S[i][k+1] = d[1];\n }\n }\n BLF_J = 0;\n};\n\nBlowfish.prototype.enc = function(data, blocks) {\n for (var i = 0; i < blocks; i++) {\n this.encipher(data.subarray(i*2));\n }\n};\n\nBlowfish.prototype.dec = function(data, blocks) {\n for (var i = 0; i < blocks; i++) {\n this.decipher(data.subarray(i*2));\n }\n};\n\nvar BCRYPT_BLOCKS = 8,\n BCRYPT_HASHSIZE = 32;\n\nfunction bcrypt_hash(sha2pass, sha2salt, out) {\n var state = new Blowfish(),\n cdata = new Uint32Array(BCRYPT_BLOCKS), i,\n ciphertext = new Uint8Array([79,120,121,99,104,114,111,109,97,116,105,\n 99,66,108,111,119,102,105,115,104,83,119,97,116,68,121,110,97,109,\n 105,116,101]); //\"OxychromaticBlowfishSwatDynamite\"\n\n state.expandstate(sha2salt, 64, sha2pass, 64);\n for (i = 0; i < 64; i++) {\n state.expand0state(sha2salt, 64);\n state.expand0state(sha2pass, 64);\n }\n\n for (i = 0; i < BCRYPT_BLOCKS; i++)\n cdata[i] = stream2word(ciphertext, ciphertext.byteLength);\n for (i = 0; i < 64; i++)\n state.enc(cdata, cdata.byteLength / 8);\n\n for (i = 0; i < BCRYPT_BLOCKS; i++) {\n out[4*i+3] = cdata[i] >>> 24;\n out[4*i+2] = cdata[i] >>> 16;\n out[4*i+1] = cdata[i] >>> 8;\n out[4*i+0] = cdata[i];\n }\n};\n\nfunction bcrypt_pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds) {\n var sha2pass = new Uint8Array(64),\n sha2salt = new Uint8Array(64),\n out = new Uint8Array(BCRYPT_HASHSIZE),\n tmpout = new Uint8Array(BCRYPT_HASHSIZE),\n countsalt = new Uint8Array(saltlen+4),\n i, j, amt, stride, dest, count,\n origkeylen = keylen;\n\n if (rounds < 1)\n return -1;\n if (passlen === 0 || saltlen === 0 || keylen === 0 ||\n keylen > (out.byteLength * out.byteLength) || saltlen > (1<<20))\n return -1;\n\n stride = Math.floor((keylen + out.byteLength - 1) / out.byteLength);\n amt = Math.floor((keylen + stride - 1) / stride);\n\n for (i = 0; i < saltlen; i++)\n countsalt[i] = salt[i];\n\n crypto_hash_sha512(sha2pass, pass, passlen);\n\n for (count = 1; keylen > 0; count++) {\n countsalt[saltlen+0] = count >>> 24;\n countsalt[saltlen+1] = count >>> 16;\n countsalt[saltlen+2] = count >>> 8;\n countsalt[saltlen+3] = count;\n\n crypto_hash_sha512(sha2salt, countsalt, saltlen + 4);\n bcrypt_hash(sha2pass, sha2salt, tmpout);\n for (i = out.byteLength; i--;)\n out[i] = tmpout[i];\n\n for (i = 1; i < rounds; i++) {\n crypto_hash_sha512(sha2salt, tmpout, tmpout.byteLength);\n bcrypt_hash(sha2pass, sha2salt, tmpout);\n for (j = 0; j < out.byteLength; j++)\n out[j] ^= tmpout[j];\n }\n\n amt = Math.min(amt, keylen);\n for (i = 0; i < amt; i++) {\n dest = i * stride + (count - 1);\n if (dest >= origkeylen)\n break;\n key[dest] = out[i];\n }\n keylen -= i;\n }\n\n return 0;\n};\n\nmodule.exports = {\n BLOCKS: BCRYPT_BLOCKS,\n HASHSIZE: BCRYPT_HASHSIZE,\n hash: bcrypt_hash,\n pbkdf: bcrypt_pbkdf\n};\n", "'use strict';\n\nconst crypto = require('crypto');\n\nlet cpuInfo;\ntry {\n cpuInfo = require('cpu-features')();\n} catch {}\n\nconst { bindingAvailable, CIPHER_INFO, MAC_INFO } = require('./crypto.js');\n\nconst eddsaSupported = (() => {\n if (typeof crypto.sign === 'function'\n && typeof crypto.verify === 'function') {\n const key =\n '-----BEGIN PRIVATE KEY-----\\r\\nMC4CAQAwBQYDK2VwBCIEIHKj+sVa9WcD'\n + '/q2DJUJaf43Kptc8xYuUQA4bOFj9vC8T\\r\\n-----END PRIVATE KEY-----';\n const data = Buffer.from('a');\n let sig;\n let verified;\n try {\n sig = crypto.sign(null, data, key);\n verified = crypto.verify(null, data, key, sig);\n } catch {}\n return (Buffer.isBuffer(sig) && sig.length === 64 && verified === true);\n }\n\n return false;\n})();\n\nconst curve25519Supported = (typeof crypto.diffieHellman === 'function'\n && typeof crypto.generateKeyPairSync === 'function'\n && typeof crypto.createPublicKey === 'function');\n\nconst DEFAULT_KEX = [\n // https://tools.ietf.org/html/rfc5656#section-10.1\n 'ecdh-sha2-nistp256',\n 'ecdh-sha2-nistp384',\n 'ecdh-sha2-nistp521',\n\n // https://tools.ietf.org/html/rfc4419#section-4\n 'diffie-hellman-group-exchange-sha256',\n\n // https://tools.ietf.org/html/rfc8268\n 'diffie-hellman-group14-sha256',\n 'diffie-hellman-group15-sha512',\n 'diffie-hellman-group16-sha512',\n 'diffie-hellman-group17-sha512',\n 'diffie-hellman-group18-sha512',\n];\nif (curve25519Supported) {\n DEFAULT_KEX.unshift('curve25519-sha256');\n DEFAULT_KEX.unshift('curve25519-sha256@libssh.org');\n}\nconst SUPPORTED_KEX = DEFAULT_KEX.concat([\n // https://tools.ietf.org/html/rfc4419#section-4\n 'diffie-hellman-group-exchange-sha1',\n\n 'diffie-hellman-group14-sha1', // REQUIRED\n 'diffie-hellman-group1-sha1', // REQUIRED\n]);\n\n\nconst DEFAULT_SERVER_HOST_KEY = [\n 'ecdsa-sha2-nistp256',\n 'ecdsa-sha2-nistp384',\n 'ecdsa-sha2-nistp521',\n 'rsa-sha2-512', // RFC 8332\n 'rsa-sha2-256', // RFC 8332\n 'ssh-rsa',\n];\nif (eddsaSupported)\n DEFAULT_SERVER_HOST_KEY.unshift('ssh-ed25519');\nconst SUPPORTED_SERVER_HOST_KEY = DEFAULT_SERVER_HOST_KEY.concat([\n 'ssh-dss',\n]);\n\n\nconst canUseCipher = (() => {\n const ciphers = crypto.getCiphers();\n return (name) => ciphers.includes(CIPHER_INFO[name].sslName);\n})();\nlet DEFAULT_CIPHER = [\n // http://tools.ietf.org/html/rfc5647\n 'aes128-gcm@openssh.com',\n 'aes256-gcm@openssh.com',\n\n // http://tools.ietf.org/html/rfc4344#section-4\n 'aes128-ctr',\n 'aes192-ctr',\n 'aes256-ctr',\n];\nif (cpuInfo && cpuInfo.flags && !cpuInfo.flags.aes) {\n // We know for sure the CPU does not support AES acceleration\n if (bindingAvailable)\n DEFAULT_CIPHER.unshift('chacha20-poly1305@openssh.com');\n else\n DEFAULT_CIPHER.push('chacha20-poly1305@openssh.com');\n} else if (bindingAvailable && cpuInfo && cpuInfo.arch === 'x86') {\n // Places chacha20-poly1305 immediately after GCM ciphers since GCM ciphers\n // seem to outperform it on x86, but it seems to be faster than CTR ciphers\n DEFAULT_CIPHER.splice(4, 0, 'chacha20-poly1305@openssh.com');\n} else {\n DEFAULT_CIPHER.push('chacha20-poly1305@openssh.com');\n}\nDEFAULT_CIPHER = DEFAULT_CIPHER.filter(canUseCipher);\nconst SUPPORTED_CIPHER = DEFAULT_CIPHER.concat([\n 'aes256-cbc',\n 'aes192-cbc',\n 'aes128-cbc',\n 'blowfish-cbc',\n '3des-cbc',\n 'aes128-gcm',\n 'aes256-gcm',\n\n // http://tools.ietf.org/html/rfc4345#section-4:\n 'arcfour256',\n 'arcfour128',\n\n 'cast128-cbc',\n 'arcfour',\n].filter(canUseCipher));\n\n\nconst canUseMAC = (() => {\n const hashes = crypto.getHashes();\n return (name) => hashes.includes(MAC_INFO[name].sslName);\n})();\nconst DEFAULT_MAC = [\n 'hmac-sha2-256-etm@openssh.com',\n 'hmac-sha2-512-etm@openssh.com',\n 'hmac-sha1-etm@openssh.com',\n 'hmac-sha2-256',\n 'hmac-sha2-512',\n 'hmac-sha1',\n].filter(canUseMAC);\nconst SUPPORTED_MAC = DEFAULT_MAC.concat([\n 'hmac-md5',\n 'hmac-sha2-256-96', // first 96 bits of HMAC-SHA256\n 'hmac-sha2-512-96', // first 96 bits of HMAC-SHA512\n 'hmac-ripemd160',\n 'hmac-sha1-96', // first 96 bits of HMAC-SHA1\n 'hmac-md5-96', // first 96 bits of HMAC-MD5\n].filter(canUseMAC));\n\nconst DEFAULT_COMPRESSION = [\n 'none',\n 'zlib@openssh.com', // ZLIB (LZ77) compression, except\n // compression/decompression does not start until after\n // successful user authentication\n 'zlib', // ZLIB (LZ77) compression\n];\nconst SUPPORTED_COMPRESSION = DEFAULT_COMPRESSION.concat([\n]);\n\n\nconst COMPAT = {\n BAD_DHGEX: 1 << 0,\n OLD_EXIT: 1 << 1,\n DYN_RPORT_BUG: 1 << 2,\n BUG_DHGEX_LARGE: 1 << 3,\n IMPLY_RSA_SHA2_SIGALGS: 1 << 4,\n};\n\nmodule.exports = {\n MESSAGE: {\n // Transport layer protocol -- generic (1-19)\n DISCONNECT: 1,\n IGNORE: 2,\n UNIMPLEMENTED: 3,\n DEBUG: 4,\n SERVICE_REQUEST: 5,\n SERVICE_ACCEPT: 6,\n EXT_INFO: 7, // RFC 8308\n\n // Transport layer protocol -- algorithm negotiation (20-29)\n KEXINIT: 20,\n NEWKEYS: 21,\n\n // Transport layer protocol -- key exchange method-specific (30-49)\n KEXDH_INIT: 30,\n KEXDH_REPLY: 31,\n\n KEXDH_GEX_GROUP: 31,\n KEXDH_GEX_INIT: 32,\n KEXDH_GEX_REPLY: 33,\n KEXDH_GEX_REQUEST: 34,\n\n KEXECDH_INIT: 30,\n KEXECDH_REPLY: 31,\n\n // User auth protocol -- generic (50-59)\n USERAUTH_REQUEST: 50,\n USERAUTH_FAILURE: 51,\n USERAUTH_SUCCESS: 52,\n USERAUTH_BANNER: 53,\n\n // User auth protocol -- user auth method-specific (60-79)\n USERAUTH_PASSWD_CHANGEREQ: 60,\n\n USERAUTH_PK_OK: 60,\n\n USERAUTH_INFO_REQUEST: 60,\n USERAUTH_INFO_RESPONSE: 61,\n\n // Connection protocol -- generic (80-89)\n GLOBAL_REQUEST: 80,\n REQUEST_SUCCESS: 81,\n REQUEST_FAILURE: 82,\n\n // Connection protocol -- channel-related (90-127)\n CHANNEL_OPEN: 90,\n CHANNEL_OPEN_CONFIRMATION: 91,\n CHANNEL_OPEN_FAILURE: 92,\n CHANNEL_WINDOW_ADJUST: 93,\n CHANNEL_DATA: 94,\n CHANNEL_EXTENDED_DATA: 95,\n CHANNEL_EOF: 96,\n CHANNEL_CLOSE: 97,\n CHANNEL_REQUEST: 98,\n CHANNEL_SUCCESS: 99,\n CHANNEL_FAILURE: 100\n\n // Reserved for client protocols (128-191)\n\n // Local extensions (192-155)\n },\n DISCONNECT_REASON: {\n HOST_NOT_ALLOWED_TO_CONNECT: 1,\n PROTOCOL_ERROR: 2,\n KEY_EXCHANGE_FAILED: 3,\n RESERVED: 4,\n MAC_ERROR: 5,\n COMPRESSION_ERROR: 6,\n SERVICE_NOT_AVAILABLE: 7,\n PROTOCOL_VERSION_NOT_SUPPORTED: 8,\n HOST_KEY_NOT_VERIFIABLE: 9,\n CONNECTION_LOST: 10,\n BY_APPLICATION: 11,\n TOO_MANY_CONNECTIONS: 12,\n AUTH_CANCELED_BY_USER: 13,\n NO_MORE_AUTH_METHODS_AVAILABLE: 14,\n ILLEGAL_USER_NAME: 15,\n },\n DISCONNECT_REASON_STR: undefined,\n CHANNEL_OPEN_FAILURE: {\n ADMINISTRATIVELY_PROHIBITED: 1,\n CONNECT_FAILED: 2,\n UNKNOWN_CHANNEL_TYPE: 3,\n RESOURCE_SHORTAGE: 4\n },\n TERMINAL_MODE: {\n TTY_OP_END: 0, // Indicates end of options.\n VINTR: 1, // Interrupt character; 255 if none. Similarly for the\n // other characters. Not all of these characters are\n // supported on all systems.\n VQUIT: 2, // The quit character (sends SIGQUIT signal on POSIX\n // systems).\n VERASE: 3, // Erase the character to left of the cursor.\n VKILL: 4, // Kill the current input line.\n VEOF: 5, // End-of-file character (sends EOF from the\n // terminal).\n VEOL: 6, // End-of-line character in addition to carriage\n // return and/or linefeed.\n VEOL2: 7, // Additional end-of-line character.\n VSTART: 8, // Continues paused output (normally control-Q).\n VSTOP: 9, // Pauses output (normally control-S).\n VSUSP: 10, // Suspends the current program.\n VDSUSP: 11, // Another suspend character.\n VREPRINT: 12, // Reprints the current input line.\n VWERASE: 13, // Erases a word left of cursor.\n VLNEXT: 14, // Enter the next character typed literally, even if\n // it is a special character\n VFLUSH: 15, // Character to flush output.\n VSWTCH: 16, // Switch to a different shell layer.\n VSTATUS: 17, // Prints system status line (load, command, pid,\n // etc).\n VDISCARD: 18, // Toggles the flushing of terminal output.\n IGNPAR: 30, // The ignore parity flag. The parameter SHOULD be 0\n // if this flag is FALSE, and 1 if it is TRUE.\n PARMRK: 31, // Mark parity and framing errors.\n INPCK: 32, // Enable checking of parity errors.\n ISTRIP: 33, // Strip 8th bit off characters.\n INLCR: 34, // Map NL into CR on input.\n IGNCR: 35, // Ignore CR on input.\n ICRNL: 36, // Map CR to NL on input.\n IUCLC: 37, // Translate uppercase characters to lowercase.\n IXON: 38, // Enable output flow control.\n IXANY: 39, // Any char will restart after stop.\n IXOFF: 40, // Enable input flow control.\n IMAXBEL: 41, // Ring bell on input queue full.\n ISIG: 50, // Enable signals INTR, QUIT, [D]SUSP.\n ICANON: 51, // Canonicalize input lines.\n XCASE: 52, // Enable input and output of uppercase characters by\n // preceding their lowercase equivalents with \"\\\".\n ECHO: 53, // Enable echoing.\n ECHOE: 54, // Visually erase chars.\n ECHOK: 55, // Kill character discards current line.\n ECHONL: 56, // Echo NL even if ECHO is off.\n NOFLSH: 57, // Don't flush after interrupt.\n TOSTOP: 58, // Stop background jobs from output.\n IEXTEN: 59, // Enable extensions.\n ECHOCTL: 60, // Echo control characters as ^(Char).\n ECHOKE: 61, // Visual erase for line kill.\n PENDIN: 62, // Retype pending input.\n OPOST: 70, // Enable output processing.\n OLCUC: 71, // Convert lowercase to uppercase.\n ONLCR: 72, // Map NL to CR-NL.\n OCRNL: 73, // Translate carriage return to newline (output).\n ONOCR: 74, // Translate newline to carriage return-newline\n // (output).\n ONLRET: 75, // Newline performs a carriage return (output).\n CS7: 90, // 7 bit mode.\n CS8: 91, // 8 bit mode.\n PARENB: 92, // Parity enable.\n PARODD: 93, // Odd parity, else even.\n TTY_OP_ISPEED: 128, // Specifies the input baud rate in bits per second.\n TTY_OP_OSPEED: 129, // Specifies the output baud rate in bits per second.\n },\n CHANNEL_EXTENDED_DATATYPE: {\n STDERR: 1,\n },\n\n SIGNALS: [\n 'ABRT', 'ALRM', 'FPE', 'HUP', 'ILL', 'INT', 'QUIT', 'SEGV', 'TERM', 'USR1',\n 'USR2', 'KILL', 'PIPE'\n ].reduce((cur, val) => ({ ...cur, [val]: 1 }), {}),\n\n COMPAT,\n COMPAT_CHECKS: [\n [ 'Cisco-1.25', COMPAT.BAD_DHGEX ],\n [ /^Cisco-1[.]/, COMPAT.BUG_DHGEX_LARGE ],\n [ /^[0-9.]+$/, COMPAT.OLD_EXIT ], // old SSH.com implementations\n [ /^OpenSSH_5[.][0-9]+/, COMPAT.DYN_RPORT_BUG ],\n [ /^OpenSSH_7[.]4/, COMPAT.IMPLY_RSA_SHA2_SIGALGS ],\n ],\n\n // KEX proposal-related\n DEFAULT_KEX,\n SUPPORTED_KEX,\n DEFAULT_SERVER_HOST_KEY,\n SUPPORTED_SERVER_HOST_KEY,\n DEFAULT_CIPHER,\n SUPPORTED_CIPHER,\n DEFAULT_MAC,\n SUPPORTED_MAC,\n DEFAULT_COMPRESSION,\n SUPPORTED_COMPRESSION,\n\n curve25519Supported,\n eddsaSupported,\n};\n\nmodule.exports.DISCONNECT_REASON_BY_VALUE =\n Array.from(Object.entries(module.exports.DISCONNECT_REASON))\n .reduce((obj, [key, value]) => ({ ...obj, [value]: key }), {});\n", "'use strict';\n\nconst Ber = require('asn1').Ber;\n\nlet DISCONNECT_REASON;\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TypedArrayFill = Object.getPrototypeOf(Uint8Array.prototype).fill;\n\nfunction readUInt32BE(buf, offset) {\n return (buf[offset++] * 16777216)\n + (buf[offset++] * 65536)\n + (buf[offset++] * 256)\n + buf[offset];\n}\n\nfunction bufferCopy(src, dest, srcStart, srcEnd, destStart) {\n if (!destStart)\n destStart = 0;\n if (srcEnd > src.length)\n srcEnd = src.length;\n let nb = srcEnd - srcStart;\n const destLeft = (dest.length - destStart);\n if (nb > destLeft)\n nb = destLeft;\n dest.set(new Uint8Array(src.buffer, src.byteOffset + srcStart, nb),\n destStart);\n return nb;\n}\n\nfunction bufferSlice(buf, start, end) {\n if (end === undefined)\n end = buf.length;\n return new FastBuffer(buf.buffer, buf.byteOffset + start, end - start);\n}\n\nfunction makeBufferParser() {\n let pos = 0;\n let buffer;\n\n const self = {\n init: (buf, start) => {\n buffer = buf;\n pos = (typeof start === 'number' ? start : 0);\n },\n pos: () => pos,\n length: () => (buffer ? buffer.length : 0),\n avail: () => (buffer && pos < buffer.length ? buffer.length - pos : 0),\n clear: () => {\n buffer = undefined;\n },\n readUInt32BE: () => {\n if (!buffer || pos + 3 >= buffer.length)\n return;\n return (buffer[pos++] * 16777216)\n + (buffer[pos++] * 65536)\n + (buffer[pos++] * 256)\n + buffer[pos++];\n },\n readUInt64BE: (behavior) => {\n if (!buffer || pos + 7 >= buffer.length)\n return;\n switch (behavior) {\n case 'always':\n return BigInt(`0x${buffer.hexSlice(pos, pos += 8)}`);\n case 'maybe':\n if (buffer[pos] > 0x1F)\n return BigInt(`0x${buffer.hexSlice(pos, pos += 8)}`);\n // FALLTHROUGH\n default:\n return (buffer[pos++] * 72057594037927940)\n + (buffer[pos++] * 281474976710656)\n + (buffer[pos++] * 1099511627776)\n + (buffer[pos++] * 4294967296)\n + (buffer[pos++] * 16777216)\n + (buffer[pos++] * 65536)\n + (buffer[pos++] * 256)\n + buffer[pos++];\n }\n },\n skip: (n) => {\n if (buffer && n > 0)\n pos += n;\n },\n skipString: () => {\n const len = self.readUInt32BE();\n if (len === undefined)\n return;\n pos += len;\n return (pos <= buffer.length ? len : undefined);\n },\n readByte: () => {\n if (buffer && pos < buffer.length)\n return buffer[pos++];\n },\n readBool: () => {\n if (buffer && pos < buffer.length)\n return !!buffer[pos++];\n },\n readList: () => {\n const list = self.readString(true);\n if (list === undefined)\n return;\n return (list ? list.split(',') : []);\n },\n readString: (dest, maxLen) => {\n if (typeof dest === 'number') {\n maxLen = dest;\n dest = undefined;\n }\n\n const len = self.readUInt32BE();\n if (len === undefined)\n return;\n\n if ((buffer.length - pos) < len\n || (typeof maxLen === 'number' && len > maxLen)) {\n return;\n }\n\n if (dest) {\n if (Buffer.isBuffer(dest))\n return bufferCopy(buffer, dest, pos, pos += len);\n return buffer.utf8Slice(pos, pos += len);\n }\n return bufferSlice(buffer, pos, pos += len);\n },\n readRaw: (len) => {\n if (!buffer)\n return;\n if (typeof len !== 'number')\n return bufferSlice(buffer, pos, pos += (buffer.length - pos));\n if ((buffer.length - pos) >= len)\n return bufferSlice(buffer, pos, pos += len);\n },\n };\n\n return self;\n}\n\nfunction makeError(msg, level, fatal) {\n const err = new Error(msg);\n if (typeof level === 'boolean') {\n fatal = level;\n err.level = 'protocol';\n } else {\n err.level = level || 'protocol';\n }\n err.fatal = !!fatal;\n return err;\n}\n\nfunction writeUInt32BE(buf, value, offset) {\n buf[offset++] = (value >>> 24);\n buf[offset++] = (value >>> 16);\n buf[offset++] = (value >>> 8);\n buf[offset++] = value;\n return offset;\n}\n\nconst utilBufferParser = makeBufferParser();\n\nmodule.exports = {\n bufferCopy,\n bufferSlice,\n FastBuffer,\n bufferFill: (buf, value, start, end) => {\n return TypedArrayFill.call(buf, value, start, end);\n },\n makeError,\n doFatalError: (protocol, msg, level, reason) => {\n let err;\n if (DISCONNECT_REASON === undefined)\n ({ DISCONNECT_REASON } = require('./constants.js'));\n if (msg instanceof Error) {\n // doFatalError(protocol, err[, reason])\n err = msg;\n if (typeof level !== 'number')\n reason = DISCONNECT_REASON.PROTOCOL_ERROR;\n else\n reason = level;\n } else {\n // doFatalError(protocol, msg[, level[, reason]])\n err = makeError(msg, level, true);\n }\n if (typeof reason !== 'number')\n reason = DISCONNECT_REASON.PROTOCOL_ERROR;\n protocol.disconnect(reason);\n protocol._destruct();\n protocol._onError(err);\n return Infinity;\n },\n readUInt32BE,\n writeUInt32BE,\n writeUInt32LE: (buf, value, offset) => {\n buf[offset++] = value;\n buf[offset++] = (value >>> 8);\n buf[offset++] = (value >>> 16);\n buf[offset++] = (value >>> 24);\n return offset;\n },\n makeBufferParser,\n bufferParser: makeBufferParser(),\n readString: (buffer, start, dest, maxLen) => {\n if (typeof dest === 'number') {\n maxLen = dest;\n dest = undefined;\n }\n\n if (start === undefined)\n start = 0;\n\n const left = (buffer.length - start);\n if (start < 0 || start >= buffer.length || left < 4)\n return;\n\n const len = readUInt32BE(buffer, start);\n if (left < (4 + len) || (typeof maxLen === 'number' && len > maxLen))\n return;\n\n start += 4;\n const end = start + len;\n buffer._pos = end;\n\n if (dest) {\n if (Buffer.isBuffer(dest))\n return bufferCopy(buffer, dest, start, end);\n return buffer.utf8Slice(start, end);\n }\n return bufferSlice(buffer, start, end);\n },\n sigSSHToASN1: (sig, type) => {\n switch (type) {\n case 'ssh-dss': {\n if (sig.length > 40)\n return sig;\n // Change bare signature r and s values to ASN.1 BER values for OpenSSL\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n let r = sig.slice(0, 20);\n let s = sig.slice(20);\n if (r[0] & 0x80) {\n const rNew = Buffer.allocUnsafe(21);\n rNew[0] = 0x00;\n r.copy(rNew, 1);\n r = rNew;\n } else if (r[0] === 0x00 && !(r[1] & 0x80)) {\n r = r.slice(1);\n }\n if (s[0] & 0x80) {\n const sNew = Buffer.allocUnsafe(21);\n sNew[0] = 0x00;\n s.copy(sNew, 1);\n s = sNew;\n } else if (s[0] === 0x00 && !(s[1] & 0x80)) {\n s = s.slice(1);\n }\n asnWriter.writeBuffer(r, Ber.Integer);\n asnWriter.writeBuffer(s, Ber.Integer);\n asnWriter.endSequence();\n return asnWriter.buffer;\n }\n case 'ecdsa-sha2-nistp256':\n case 'ecdsa-sha2-nistp384':\n case 'ecdsa-sha2-nistp521': {\n utilBufferParser.init(sig, 0);\n const r = utilBufferParser.readString();\n const s = utilBufferParser.readString();\n utilBufferParser.clear();\n if (r === undefined || s === undefined)\n return;\n\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n asnWriter.writeBuffer(r, Ber.Integer);\n asnWriter.writeBuffer(s, Ber.Integer);\n asnWriter.endSequence();\n return asnWriter.buffer;\n }\n default:\n return sig;\n }\n },\n convertSignature: (signature, keyType) => {\n switch (keyType) {\n case 'ssh-dss': {\n if (signature.length <= 40)\n return signature;\n // This is a quick and dirty way to get from BER encoded r and s that\n // OpenSSL gives us, to just the bare values back to back (40 bytes\n // total) like OpenSSH (and possibly others) are expecting\n const asnReader = new Ber.Reader(signature);\n asnReader.readSequence();\n let r = asnReader.readString(Ber.Integer, true);\n let s = asnReader.readString(Ber.Integer, true);\n let rOffset = 0;\n let sOffset = 0;\n if (r.length < 20) {\n const rNew = Buffer.allocUnsafe(20);\n rNew.set(r, 1);\n r = rNew;\n r[0] = 0;\n }\n if (s.length < 20) {\n const sNew = Buffer.allocUnsafe(20);\n sNew.set(s, 1);\n s = sNew;\n s[0] = 0;\n }\n if (r.length > 20 && r[0] === 0)\n rOffset = 1;\n if (s.length > 20 && s[0] === 0)\n sOffset = 1;\n const newSig =\n Buffer.allocUnsafe((r.length - rOffset) + (s.length - sOffset));\n bufferCopy(r, newSig, rOffset, r.length, 0);\n bufferCopy(s, newSig, sOffset, s.length, r.length - rOffset);\n return newSig;\n }\n case 'ecdsa-sha2-nistp256':\n case 'ecdsa-sha2-nistp384':\n case 'ecdsa-sha2-nistp521': {\n if (signature[0] === 0)\n return signature;\n // Convert SSH signature parameters to ASN.1 BER values for OpenSSL\n const asnReader = new Ber.Reader(signature);\n asnReader.readSequence();\n const r = asnReader.readString(Ber.Integer, true);\n const s = asnReader.readString(Ber.Integer, true);\n if (r === null || s === null)\n return;\n const newSig = Buffer.allocUnsafe(4 + r.length + 4 + s.length);\n writeUInt32BE(newSig, r.length, 0);\n newSig.set(r, 4);\n writeUInt32BE(newSig, s.length, 4 + r.length);\n newSig.set(s, 4 + 4 + r.length);\n return newSig;\n }\n }\n\n return signature;\n },\n sendPacket: (proto, packet, bypass) => {\n if (!bypass && proto._kexinit !== undefined) {\n // We're currently in the middle of a handshake\n\n if (proto._queue === undefined)\n proto._queue = [];\n proto._queue.push(packet);\n proto._debug && proto._debug('Outbound: ... packet queued');\n return false;\n }\n proto._cipher.encrypt(packet);\n return true;\n },\n};\n", "\nvar createPoly1305 = (function() {\n var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;\n if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;\n return (\nfunction(createPoly1305) {\n createPoly1305 = createPoly1305 || {};\n\n\nvar b;b||(b=typeof createPoly1305 !== 'undefined' ? createPoly1305 : {});var q,r;b.ready=new Promise(function(a,c){q=a;r=c});var u={},w;for(w in b)b.hasOwnProperty(w)&&(u[w]=b[w]);var x=\"object\"===typeof window,y=\"function\"===typeof importScripts,z=\"object\"===typeof process&&\"object\"===typeof process.versions&&\"string\"===typeof process.versions.node,B=\"\",C,D,E,F,G;\nif(z)B=y?require(\"path\").dirname(B)+\"/\":__dirname+\"/\",C=function(a,c){var d=H(a);if(d)return c?d:d.toString();F||(F=require(\"fs\"));G||(G=require(\"path\"));a=G.normalize(a);return F.readFileSync(a,c?null:\"utf8\")},E=function(a){a=C(a,!0);a.buffer||(a=new Uint8Array(a));assert(a.buffer);return a},D=function(a,c,d){var e=H(a);e&&c(e);F||(F=require(\"fs\"));G||(G=require(\"path\"));a=G.normalize(a);F.readFile(a,function(f,l){f?d(f):c(l.buffer)})},1<process.argv.length&&process.argv[1].replace(/\\\\/g,\"/\"),process.argv.slice(2),\nb.inspect=function(){return\"[Emscripten Module object]\"};else if(x||y)y?B=self.location.href:\"undefined\"!==typeof document&&document.currentScript&&(B=document.currentScript.src),_scriptDir&&(B=_scriptDir),0!==B.indexOf(\"blob:\")?B=B.substr(0,B.lastIndexOf(\"/\")+1):B=\"\",C=function(a){try{var c=new XMLHttpRequest;c.open(\"GET\",a,!1);c.send(null);return c.responseText}catch(f){if(a=H(a)){c=[];for(var d=0;d<a.length;d++){var e=a[d];255<e&&(ba&&assert(!1,\"Character code \"+e+\" (\"+String.fromCharCode(e)+\") at offset \"+\nd+\" not in 0x00-0xFF.\"),e&=255);c.push(String.fromCharCode(e))}return c.join(\"\")}throw f;}},y&&(E=function(a){try{var c=new XMLHttpRequest;c.open(\"GET\",a,!1);c.responseType=\"arraybuffer\";c.send(null);return new Uint8Array(c.response)}catch(d){if(a=H(a))return a;throw d;}}),D=function(a,c,d){var e=new XMLHttpRequest;e.open(\"GET\",a,!0);e.responseType=\"arraybuffer\";e.onload=function(){if(200==e.status||0==e.status&&e.response)c(e.response);else{var f=H(a);f?c(f.buffer):d()}};e.onerror=d;e.send(null)};\nb.print||console.log.bind(console);var I=b.printErr||console.warn.bind(console);for(w in u)u.hasOwnProperty(w)&&(b[w]=u[w]);u=null;var J;b.wasmBinary&&(J=b.wasmBinary);var noExitRuntime=b.noExitRuntime||!0;\"object\"!==typeof WebAssembly&&K(\"no native wasm support detected\");var L,M=!1;function assert(a,c){a||K(\"Assertion failed: \"+c)}function N(a){var c=b[\"_\"+a];assert(c,\"Cannot call unknown function \"+a+\", make sure it is exported\");return c}\nfunction ca(a,c,d,e){var f={string:function(g){var p=0;if(null!==g&&void 0!==g&&0!==g){var n=(g.length<<2)+1;p=O(n);var k=p,h=P;if(0<n){n=k+n-1;for(var v=0;v<g.length;++v){var m=g.charCodeAt(v);if(55296<=m&&57343>=m){var oa=g.charCodeAt(++v);m=65536+((m&1023)<<10)|oa&1023}if(127>=m){if(k>=n)break;h[k++]=m}else{if(2047>=m){if(k+1>=n)break;h[k++]=192|m>>6}else{if(65535>=m){if(k+2>=n)break;h[k++]=224|m>>12}else{if(k+3>=n)break;h[k++]=240|m>>18;h[k++]=128|m>>12&63}h[k++]=128|m>>6&63}h[k++]=128|m&63}}h[k]=\n0}}return p},array:function(g){var p=O(g.length);Q.set(g,p);return p}},l=N(a),A=[];a=0;if(e)for(var t=0;t<e.length;t++){var aa=f[d[t]];aa?(0===a&&(a=da()),A[t]=aa(e[t])):A[t]=e[t]}d=l.apply(null,A);d=function(g){if(\"string\"===c)if(g){for(var p=P,n=g+NaN,k=g;p[k]&&!(k>=n);)++k;if(16<k-g&&p.subarray&&ea)g=ea.decode(p.subarray(g,k));else{for(n=\"\";g<k;){var h=p[g++];if(h&128){var v=p[g++]&63;if(192==(h&224))n+=String.fromCharCode((h&31)<<6|v);else{var m=p[g++]&63;h=224==(h&240)?(h&15)<<12|v<<6|m:(h&7)<<\n18|v<<12|m<<6|p[g++]&63;65536>h?n+=String.fromCharCode(h):(h-=65536,n+=String.fromCharCode(55296|h>>10,56320|h&1023))}}else n+=String.fromCharCode(h)}g=n}}else g=\"\";else g=\"boolean\"===c?!!g:g;return g}(d);0!==a&&fa(a);return d}var ea=\"undefined\"!==typeof TextDecoder?new TextDecoder(\"utf8\"):void 0,ha,Q,P;\nfunction ia(){var a=L.buffer;ha=a;b.HEAP8=Q=new Int8Array(a);b.HEAP16=new Int16Array(a);b.HEAP32=new Int32Array(a);b.HEAPU8=P=new Uint8Array(a);b.HEAPU16=new Uint16Array(a);b.HEAPU32=new Uint32Array(a);b.HEAPF32=new Float32Array(a);b.HEAPF64=new Float64Array(a)}var R,ja=[],ka=[],la=[];function ma(){var a=b.preRun.shift();ja.unshift(a)}var S=0,T=null,U=null;b.preloadedImages={};b.preloadedAudios={};\nfunction K(a){if(b.onAbort)b.onAbort(a);I(a);M=!0;a=new WebAssembly.RuntimeError(\"abort(\"+a+\"). Build with -s ASSERTIONS=1 for more info.\");r(a);throw a;}var V=\"data:application/octet-stream;base64,\",W;W=\"data:application/octet-stream;base64,AGFzbQEAAAABIAZgAX8Bf2ADf39/AGABfwBgAABgAAF/YAZ/f39/f38AAgcBAWEBYQAAAwsKAAEDAQAAAgQFAgQFAXABAQEFBwEBgAKAgAIGCQF/AUGAjMACCwclCQFiAgABYwADAWQACQFlAAgBZgAHAWcABgFoAAUBaQAKAWoBAAqGTQpPAQJ/QYAIKAIAIgEgAEEDakF8cSICaiEAAkAgAkEAIAAgAU0bDQAgAD8AQRB0SwRAIAAQAEUNAQtBgAggADYCACABDwtBhAhBMDYCAEF/C4wFAg5+Cn8gACgCJCEUIAAoAiAhFSAAKAIcIREgACgCGCESIAAoAhQhEyACQRBPBEAgAC0ATEVBGHQhFyAAKAIEIhZBBWytIQ8gACgCCCIYQQVsrSENIAAoAgwiGUEFbK0hCyAAKAIQIhpBBWytIQkgADUCACEIIBqtIRAgGa0hDiAYrSEMIBatIQoDQCASIAEtAAMiEiABLQAEQQh0ciABLQAFQRB0ciABLQAGIhZBGHRyQQJ2Qf///x9xaq0iAyAOfiABLwAAIAEtAAJBEHRyIBNqIBJBGHRBgICAGHFqrSIEIBB+fCARIAEtAAdBCHQgFnIgAS0ACEEQdHIgAS0ACSIRQRh0ckEEdkH///8fcWqtIgUgDH58IAEtAApBCHQgEXIgAS0AC0EQdHIgAS0ADEEYdHJBBnYgFWqtIgYgCn58IBQgF2ogAS8ADSABLQAPQRB0cmqtIgcgCH58IAMgDH4gBCAOfnwgBSAKfnwgBiAIfnwgByAJfnwgAyAKfiAEIAx+fCAFIAh+fCAGIAl+fCAHIAt+fCADIAh+IAQgCn58IAUgCX58IAYgC358IAcgDX58IAMgCX4gBCAIfnwgBSALfnwgBiANfnwgByAPfnwiA0IaiEL/////D4N8IgRCGohC/////w+DfCIFQhqIQv////8Pg3wiBkIaiEL/////D4N8IgdCGoinQQVsIAOnQf///x9xaiITQRp2IASnQf///x9xaiESIAWnQf///x9xIREgBqdB////H3EhFSAHp0H///8fcSEUIBNB////H3EhEyABQRBqIQEgAkEQayICQQ9LDQALCyAAIBQ2AiQgACAVNgIgIAAgETYCHCAAIBI2AhggACATNgIUCwMAAQu2BAEGfwJAIAAoAjgiBARAIABBPGohBQJAIAJBECAEayIDIAIgA0kbIgZFDQAgBkEDcSEHAkAgBkEBa0EDSQRAQQAhAwwBCyAGQXxxIQhBACEDA0AgBSADIARqaiABIANqLQAAOgAAIAUgA0EBciIEIAAoAjhqaiABIARqLQAAOgAAIAUgA0ECciIEIAAoAjhqaiABIARqLQAAOgAAIAUgA0EDciIEIAAoAjhqaiABIARqLQAAOgAAIANBBGohAyAAKAI4IQQgCEEEayIIDQALCyAHRQ0AA0AgBSADIARqaiABIANqLQAAOgAAIANBAWohAyAAKAI4IQQgB0EBayIHDQALCyAAIAQgBmoiAzYCOCADQRBJDQEgACAFQRAQAiAAQQA2AjggAiAGayECIAEgBmohAQsgAkEQTwRAIAAgASACQXBxIgMQAiACQQ9xIQIgASADaiEBCyACRQ0AIAJBA3EhBCAAQTxqIQVBACEDIAJBAWtBA08EQCACQXxxIQcDQCAFIAAoAjggA2pqIAEgA2otAAA6AAAgBSADQQFyIgYgACgCOGpqIAEgBmotAAA6AAAgBSADQQJyIgYgACgCOGpqIAEgBmotAAA6AAAgBSADQQNyIgYgACgCOGpqIAEgBmotAAA6AAAgA0EEaiEDIAdBBGsiBw0ACwsgBARAA0AgBSAAKAI4IANqaiABIANqLQAAOgAAIANBAWohAyAEQQFrIgQNAAsLIAAgACgCOCACajYCOAsLoS0BDH8jAEEQayIMJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEH0AU0EQEGICCgCACIFQRAgAEELakF4cSAAQQtJGyIIQQN2IgJ2IgFBA3EEQCABQX9zQQFxIAJqIgNBA3QiAUG4CGooAgAiBEEIaiEAAkAgBCgCCCICIAFBsAhqIgFGBEBBiAggBUF+IAN3cTYCAAwBCyACIAE2AgwgASACNgIICyAEIANBA3QiAUEDcjYCBCABIARqIgEgASgCBEEBcjYCBAwNCyAIQZAIKAIAIgpNDQEgAQRAAkBBAiACdCIAQQAgAGtyIAEgAnRxIgBBACAAa3FBAWsiACAAQQx2QRBxIgJ2IgFBBXZBCHEiACACciABIAB2IgFBAnZBBHEiAHIgASAAdiIBQQF2QQJxIgByIAEgAHYiAUEBdkEBcSIAciABIAB2aiIDQQN0IgBBuAhqKAIAIgQoAggiASAAQbAIaiIARgRAQYgIIAVBfiADd3EiBTYCAAwBCyABIAA2AgwgACABNgIICyAEQQhqIQAgBCAIQQNyNgIEIAQgCGoiAiADQQN0IgEgCGsiA0EBcjYCBCABIARqIAM2AgAgCgRAIApBA3YiAUEDdEGwCGohB0GcCCgCACEEAn8gBUEBIAF0IgFxRQRAQYgIIAEgBXI2AgAgBwwBCyAHKAIICyEBIAcgBDYCCCABIAQ2AgwgBCAHNgIMIAQgATYCCAtBnAggAjYCAEGQCCADNgIADA0LQYwIKAIAIgZFDQEgBkEAIAZrcUEBayIAIABBDHZBEHEiAnYiAUEFdkEIcSIAIAJyIAEgAHYiAUECdkEEcSIAciABIAB2IgFBAXZBAnEiAHIgASAAdiIBQQF2QQFxIgByIAEgAHZqQQJ0QbgKaigCACIBKAIEQXhxIAhrIQMgASECA0ACQCACKAIQIgBFBEAgAigCFCIARQ0BCyAAKAIEQXhxIAhrIgIgAyACIANJIgIbIQMgACABIAIbIQEgACECDAELCyABIAhqIgkgAU0NAiABKAIYIQsgASABKAIMIgRHBEAgASgCCCIAQZgIKAIASRogACAENgIMIAQgADYCCAwMCyABQRRqIgIoAgAiAEUEQCABKAIQIgBFDQQgAUEQaiECCwNAIAIhByAAIgRBFGoiAigCACIADQAgBEEQaiECIAQoAhAiAA0ACyAHQQA2AgAMCwtBfyEIIABBv39LDQAgAEELaiIAQXhxIQhBjAgoAgAiCUUNAEEAIAhrIQMCQAJAAkACf0EAIAhBgAJJDQAaQR8gCEH///8HSw0AGiAAQQh2IgAgAEGA/j9qQRB2QQhxIgJ0IgAgAEGA4B9qQRB2QQRxIgF0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAEgAnIgAHJrIgBBAXQgCCAAQRVqdkEBcXJBHGoLIgVBAnRBuApqKAIAIgJFBEBBACEADAELQQAhACAIQQBBGSAFQQF2ayAFQR9GG3QhAQNAAkAgAigCBEF4cSAIayIHIANPDQAgAiEEIAciAw0AQQAhAyACIQAMAwsgACACKAIUIgcgByACIAFBHXZBBHFqKAIQIgJGGyAAIAcbIQAgAUEBdCEBIAINAAsLIAAgBHJFBEBBACEEQQIgBXQiAEEAIABrciAJcSIARQ0DIABBACAAa3FBAWsiACAAQQx2QRBxIgJ2IgFBBXZBCHEiACACciABIAB2IgFBAnZBBHEiAHIgASAAdiIBQQF2QQJxIgByIAEgAHYiAUEBdkEBcSIAciABIAB2akECdEG4CmooAgAhAAsgAEUNAQsDQCAAKAIEQXhxIAhrIgEgA0khAiABIAMgAhshAyAAIAQgAhshBCAAKAIQIgEEfyABBSAAKAIUCyIADQALCyAERQ0AIANBkAgoAgAgCGtPDQAgBCAIaiIGIARNDQEgBCgCGCEFIAQgBCgCDCIBRwRAIAQoAggiAEGYCCgCAEkaIAAgATYCDCABIAA2AggMCgsgBEEUaiICKAIAIgBFBEAgBCgCECIARQ0EIARBEGohAgsDQCACIQcgACIBQRRqIgIoAgAiAA0AIAFBEGohAiABKAIQIgANAAsgB0EANgIADAkLIAhBkAgoAgAiAk0EQEGcCCgCACEDAkAgAiAIayIBQRBPBEBBkAggATYCAEGcCCADIAhqIgA2AgAgACABQQFyNgIEIAIgA2ogATYCACADIAhBA3I2AgQMAQtBnAhBADYCAEGQCEEANgIAIAMgAkEDcjYCBCACIANqIgAgACgCBEEBcjYCBAsgA0EIaiEADAsLIAhBlAgoAgAiBkkEQEGUCCAGIAhrIgE2AgBBoAhBoAgoAgAiAiAIaiIANgIAIAAgAUEBcjYCBCACIAhBA3I2AgQgAkEIaiEADAsLQQAhACAIQS9qIgkCf0HgCygCAARAQegLKAIADAELQewLQn83AgBB5AtCgKCAgICABDcCAEHgCyAMQQxqQXBxQdiq1aoFczYCAEH0C0EANgIAQcQLQQA2AgBBgCALIgFqIgVBACABayIHcSICIAhNDQpBwAsoAgAiBARAQbgLKAIAIgMgAmoiASADTQ0LIAEgBEsNCwtBxAstAABBBHENBQJAAkBBoAgoAgAiAwRAQcgLIQADQCADIAAoAgAiAU8EQCABIAAoAgRqIANLDQMLIAAoAggiAA0ACwtBABABIgFBf0YNBiACIQVB5AsoAgAiA0EBayIAIAFxBEAgAiABayAAIAFqQQAgA2txaiEFCyAFIAhNDQYgBUH+////B0sNBkHACygCACIEBEBBuAsoAgAiAyAFaiIAIANNDQcgACAESw0HCyAFEAEiACABRw0BDAgLIAUgBmsgB3EiBUH+////B0sNBSAFEAEiASAAKAIAIAAoAgRqRg0EIAEhAAsCQCAAQX9GDQAgCEEwaiAFTQ0AQegLKAIAIgEgCSAFa2pBACABa3EiAUH+////B0sEQCAAIQEMCAsgARABQX9HBEAgASAFaiEFIAAhAQwIC0EAIAVrEAEaDAULIAAiAUF/Rw0GDAQLAAtBACEEDAcLQQAhAQwFCyABQX9HDQILQcQLQcQLKAIAQQRyNgIACyACQf7///8HSw0BIAIQASEBQQAQASEAIAFBf0YNASAAQX9GDQEgACABTQ0BIAAgAWsiBSAIQShqTQ0BC0G4C0G4CygCACAFaiIANgIAQbwLKAIAIABJBEBBvAsgADYCAAsCQAJAAkBBoAgoAgAiBwRAQcgLIQADQCABIAAoAgAiAyAAKAIEIgJqRg0CIAAoAggiAA0ACwwCC0GYCCgCACIAQQAgACABTRtFBEBBmAggATYCAAtBACEAQcwLIAU2AgBByAsgATYCAEGoCEF/NgIAQawIQeALKAIANgIAQdQLQQA2AgADQCAAQQN0IgNBuAhqIANBsAhqIgI2AgAgA0G8CGogAjYCACAAQQFqIgBBIEcNAAtBlAggBUEoayIDQXggAWtBB3FBACABQQhqQQdxGyIAayICNgIAQaAIIAAgAWoiADYCACAAIAJBAXI2AgQgASADakEoNgIEQaQIQfALKAIANgIADAILIAAtAAxBCHENACADIAdLDQAgASAHTQ0AIAAgAiAFajYCBEGgCCAHQXggB2tBB3FBACAHQQhqQQdxGyIAaiICNgIAQZQIQZQIKAIAIAVqIgEgAGsiADYCACACIABBAXI2AgQgASAHakEoNgIEQaQIQfALKAIANgIADAELQZgIKAIAIAFLBEBBmAggATYCAAsgASAFaiECQcgLIQACQAJAAkACQAJAAkADQCACIAAoAgBHBEAgACgCCCIADQEMAgsLIAAtAAxBCHFFDQELQcgLIQADQCAHIAAoAgAiAk8EQCACIAAoAgRqIgQgB0sNAwsgACgCCCEADAALAAsgACABNgIAIAAgACgCBCAFajYCBCABQXggAWtBB3FBACABQQhqQQdxG2oiCSAIQQNyNgIEIAJBeCACa0EHcUEAIAJBCGpBB3EbaiIFIAggCWoiBmshAiAFIAdGBEBBoAggBjYCAEGUCEGUCCgCACACaiIANgIAIAYgAEEBcjYCBAwDCyAFQZwIKAIARgRAQZwIIAY2AgBBkAhBkAgoAgAgAmoiADYCACAGIABBAXI2AgQgACAGaiAANgIADAMLIAUoAgQiAEEDcUEBRgRAIABBeHEhBwJAIABB/wFNBEAgBSgCCCIDIABBA3YiAEEDdEGwCGpGGiADIAUoAgwiAUYEQEGICEGICCgCAEF+IAB3cTYCAAwCCyADIAE2AgwgASADNgIIDAELIAUoAhghCAJAIAUgBSgCDCIBRwRAIAUoAggiACABNgIMIAEgADYCCAwBCwJAIAVBFGoiACgCACIDDQAgBUEQaiIAKAIAIgMNAEEAIQEMAQsDQCAAIQQgAyIBQRRqIgAoAgAiAw0AIAFBEGohACABKAIQIgMNAAsgBEEANgIACyAIRQ0AAkAgBSAFKAIcIgNBAnRBuApqIgAoAgBGBEAgACABNgIAIAENAUGMCEGMCCgCAEF+IAN3cTYCAAwCCyAIQRBBFCAIKAIQIAVGG2ogATYCACABRQ0BCyABIAg2AhggBSgCECIABEAgASAANgIQIAAgATYCGAsgBSgCFCIARQ0AIAEgADYCFCAAIAE2AhgLIAUgB2ohBSACIAdqIQILIAUgBSgCBEF+cTYCBCAGIAJBAXI2AgQgAiAGaiACNgIAIAJB/wFNBEAgAkEDdiIAQQN0QbAIaiECAn9BiAgoAgAiAUEBIAB0IgBxRQRAQYgIIAAgAXI2AgAgAgwBCyACKAIICyEAIAIgBjYCCCAAIAY2AgwgBiACNgIMIAYgADYCCAwDC0EfIQAgAkH///8HTQRAIAJBCHYiACAAQYD+P2pBEHZBCHEiA3QiACAAQYDgH2pBEHZBBHEiAXQiACAAQYCAD2pBEHZBAnEiAHRBD3YgASADciAAcmsiAEEBdCACIABBFWp2QQFxckEcaiEACyAGIAA2AhwgBkIANwIQIABBAnRBuApqIQQCQEGMCCgCACIDQQEgAHQiAXFFBEBBjAggASADcjYCACAEIAY2AgAgBiAENgIYDAELIAJBAEEZIABBAXZrIABBH0YbdCEAIAQoAgAhAQNAIAEiAygCBEF4cSACRg0DIABBHXYhASAAQQF0IQAgAyABQQRxaiIEKAIQIgENAAsgBCAGNgIQIAYgAzYCGAsgBiAGNgIMIAYgBjYCCAwCC0GUCCAFQShrIgNBeCABa0EHcUEAIAFBCGpBB3EbIgBrIgI2AgBBoAggACABaiIANgIAIAAgAkEBcjYCBCABIANqQSg2AgRBpAhB8AsoAgA2AgAgByAEQScgBGtBB3FBACAEQSdrQQdxG2pBL2siACAAIAdBEGpJGyICQRs2AgQgAkHQCykCADcCECACQcgLKQIANwIIQdALIAJBCGo2AgBBzAsgBTYCAEHICyABNgIAQdQLQQA2AgAgAkEYaiEAA0AgAEEHNgIEIABBCGohASAAQQRqIQAgASAESQ0ACyACIAdGDQMgAiACKAIEQX5xNgIEIAcgAiAHayIEQQFyNgIEIAIgBDYCACAEQf8BTQRAIARBA3YiAEEDdEGwCGohAgJ/QYgIKAIAIgFBASAAdCIAcUUEQEGICCAAIAFyNgIAIAIMAQsgAigCCAshACACIAc2AgggACAHNgIMIAcgAjYCDCAHIAA2AggMBAtBHyEAIAdCADcCECAEQf///wdNBEAgBEEIdiIAIABBgP4/akEQdkEIcSICdCIAIABBgOAfakEQdkEEcSIBdCIAIABBgIAPakEQdkECcSIAdEEPdiABIAJyIAByayIAQQF0IAQgAEEVanZBAXFyQRxqIQALIAcgADYCHCAAQQJ0QbgKaiEDAkBBjAgoAgAiAkEBIAB0IgFxRQRAQYwIIAEgAnI2AgAgAyAHNgIAIAcgAzYCGAwBCyAEQQBBGSAAQQF2ayAAQR9GG3QhACADKAIAIQEDQCABIgIoAgRBeHEgBEYNBCAAQR12IQEgAEEBdCEAIAIgAUEEcWoiAygCECIBDQALIAMgBzYCECAHIAI2AhgLIAcgBzYCDCAHIAc2AggMAwsgAygCCCIAIAY2AgwgAyAGNgIIIAZBADYCGCAGIAM2AgwgBiAANgIICyAJQQhqIQAMBQsgAigCCCIAIAc2AgwgAiAHNgIIIAdBADYCGCAHIAI2AgwgByAANgIIC0GUCCgCACIAIAhNDQBBlAggACAIayIBNgIAQaAIQaAIKAIAIgIgCGoiADYCACAAIAFBAXI2AgQgAiAIQQNyNgIEIAJBCGohAAwDC0GECEEwNgIAQQAhAAwCCwJAIAVFDQACQCAEKAIcIgJBAnRBuApqIgAoAgAgBEYEQCAAIAE2AgAgAQ0BQYwIIAlBfiACd3EiCTYCAAwCCyAFQRBBFCAFKAIQIARGG2ogATYCACABRQ0BCyABIAU2AhggBCgCECIABEAgASAANgIQIAAgATYCGAsgBCgCFCIARQ0AIAEgADYCFCAAIAE2AhgLAkAgA0EPTQRAIAQgAyAIaiIAQQNyNgIEIAAgBGoiACAAKAIEQQFyNgIEDAELIAQgCEEDcjYCBCAGIANBAXI2AgQgAyAGaiADNgIAIANB/wFNBEAgA0EDdiIAQQN0QbAIaiECAn9BiAgoAgAiAUEBIAB0IgBxRQRAQYgIIAAgAXI2AgAgAgwBCyACKAIICyEAIAIgBjYCCCAAIAY2AgwgBiACNgIMIAYgADYCCAwBC0EfIQAgA0H///8HTQRAIANBCHYiACAAQYD+P2pBEHZBCHEiAnQiACAAQYDgH2pBEHZBBHEiAXQiACAAQYCAD2pBEHZBAnEiAHRBD3YgASACciAAcmsiAEEBdCADIABBFWp2QQFxckEcaiEACyAGIAA2AhwgBkIANwIQIABBAnRBuApqIQICQAJAIAlBASAAdCIBcUUEQEGMCCABIAlyNgIAIAIgBjYCACAGIAI2AhgMAQsgA0EAQRkgAEEBdmsgAEEfRht0IQAgAigCACEIA0AgCCIBKAIEQXhxIANGDQIgAEEddiECIABBAXQhACABIAJBBHFqIgIoAhAiCA0ACyACIAY2AhAgBiABNgIYCyAGIAY2AgwgBiAGNgIIDAELIAEoAggiACAGNgIMIAEgBjYCCCAGQQA2AhggBiABNgIMIAYgADYCCAsgBEEIaiEADAELAkAgC0UNAAJAIAEoAhwiAkECdEG4CmoiACgCACABRgRAIAAgBDYCACAEDQFBjAggBkF+IAJ3cTYCAAwCCyALQRBBFCALKAIQIAFGG2ogBDYCACAERQ0BCyAEIAs2AhggASgCECIABEAgBCAANgIQIAAgBDYCGAsgASgCFCIARQ0AIAQgADYCFCAAIAQ2AhgLAkAgA0EPTQRAIAEgAyAIaiIAQQNyNgIEIAAgAWoiACAAKAIEQQFyNgIEDAELIAEgCEEDcjYCBCAJIANBAXI2AgQgAyAJaiADNgIAIAoEQCAKQQN2IgBBA3RBsAhqIQRBnAgoAgAhAgJ/QQEgAHQiACAFcUUEQEGICCAAIAVyNgIAIAQMAQsgBCgCCAshACAEIAI2AgggACACNgIMIAIgBDYCDCACIAA2AggLQZwIIAk2AgBBkAggAzYCAAsgAUEIaiEACyAMQRBqJAAgAAsQACMAIABrQXBxIgAkACAACwYAIAAkAAsEACMAC4AJAgh/BH4jAEGQAWsiBiQAIAYgBS0AA0EYdEGAgIAYcSAFLwAAIAUtAAJBEHRycjYCACAGIAUoAANBAnZBg/7/H3E2AgQgBiAFKAAGQQR2Qf+B/x9xNgIIIAYgBSgACUEGdkH//8AfcTYCDCAFLwANIQggBS0ADyEJIAZCADcCFCAGQgA3AhwgBkEANgIkIAYgCCAJQRB0QYCAPHFyNgIQIAYgBSgAEDYCKCAGIAUoABQ2AiwgBiAFKAAYNgIwIAUoABwhBSAGQQA6AEwgBkEANgI4IAYgBTYCNCAGIAEgAhAEIAQEQCAGIAMgBBAECyAGKAI4IgEEQCAGQTxqIgIgAWpBAToAACABQQFqQQ9NBEAgASAGakE9aiEEAkBBDyABayIDRQ0AIAMgBGoiAUEBa0EAOgAAIARBADoAACADQQNJDQAgAUECa0EAOgAAIARBADoAASABQQNrQQA6AAAgBEEAOgACIANBB0kNACABQQRrQQA6AAAgBEEAOgADIANBCUkNACAEQQAgBGtBA3EiAWoiBEEANgIAIAQgAyABa0F8cSIBaiIDQQRrQQA2AgAgAUEJSQ0AIARBADYCCCAEQQA2AgQgA0EIa0EANgIAIANBDGtBADYCACABQRlJDQAgBEEANgIYIARBADYCFCAEQQA2AhAgBEEANgIMIANBEGtBADYCACADQRRrQQA2AgAgA0EYa0EANgIAIANBHGtBADYCACABIARBBHFBGHIiAWsiA0EgSQ0AIAEgBGohAQNAIAFCADcDGCABQgA3AxAgAUIANwMIIAFCADcDACABQSBqIQEgA0EgayIDQR9LDQALCwsgBkEBOgBMIAYgAkEQEAILIAY1AjQhECAGNQIwIREgBjUCLCEOIAAgBjUCKCAGKAIkIAYoAiAgBigCHCAGKAIYIgNBGnZqIgJBGnZqIgFBGnZqIgtBgICAYHIgAUH///8fcSINIAJB////H3EiCCAGKAIUIAtBGnZBBWxqIgFB////H3EiCUEFaiIFQRp2IANB////H3EgAUEadmoiA2oiAUEadmoiAkEadmoiBEEadmoiDEEfdSIHIANxIAEgDEEfdkEBayIDQf///x9xIgpxciIBQRp0IAUgCnEgByAJcXJyrXwiDzwAACAAIA9CGIg8AAMgACAPQhCIPAACIAAgD0IIiDwAASAAIA4gByAIcSACIApxciICQRR0IAFBBnZyrXwgD0IgiHwiDjwABCAAIA5CGIg8AAcgACAOQhCIPAAGIAAgDkIIiDwABSAAIBEgByANcSAEIApxciIBQQ50IAJBDHZyrXwgDkIgiHwiDjwACCAAIA5CGIg8AAsgACAOQhCIPAAKIAAgDkIIiDwACSAAIBAgAyAMcSAHIAtxckEIdCABQRJ2cq18IA5CIIh8Ig48AAwgACAOQhiIPAAPIAAgDkIQiDwADiAAIA5CCIg8AA0gBkIANwIwIAZCADcCKCAGQgA3AiAgBkIANwIYIAZCADcCECAGQgA3AgggBkIANwIAIAZBkAFqJAALpwwBB38CQCAARQ0AIABBCGsiAyAAQQRrKAIAIgFBeHEiAGohBQJAIAFBAXENACABQQNxRQ0BIAMgAygCACIBayIDQZgIKAIASQ0BIAAgAWohACADQZwIKAIARwRAIAFB/wFNBEAgAygCCCICIAFBA3YiBEEDdEGwCGpGGiACIAMoAgwiAUYEQEGICEGICCgCAEF+IAR3cTYCAAwDCyACIAE2AgwgASACNgIIDAILIAMoAhghBgJAIAMgAygCDCIBRwRAIAMoAggiAiABNgIMIAEgAjYCCAwBCwJAIANBFGoiAigCACIEDQAgA0EQaiICKAIAIgQNAEEAIQEMAQsDQCACIQcgBCIBQRRqIgIoAgAiBA0AIAFBEGohAiABKAIQIgQNAAsgB0EANgIACyAGRQ0BAkAgAyADKAIcIgJBAnRBuApqIgQoAgBGBEAgBCABNgIAIAENAUGMCEGMCCgCAEF+IAJ3cTYCAAwDCyAGQRBBFCAGKAIQIANGG2ogATYCACABRQ0CCyABIAY2AhggAygCECICBEAgASACNgIQIAIgATYCGAsgAygCFCICRQ0BIAEgAjYCFCACIAE2AhgMAQsgBSgCBCIBQQNxQQNHDQBBkAggADYCACAFIAFBfnE2AgQgAyAAQQFyNgIEIAAgA2ogADYCAA8LIAMgBU8NACAFKAIEIgFBAXFFDQACQCABQQJxRQRAIAVBoAgoAgBGBEBBoAggAzYCAEGUCEGUCCgCACAAaiIANgIAIAMgAEEBcjYCBCADQZwIKAIARw0DQZAIQQA2AgBBnAhBADYCAA8LIAVBnAgoAgBGBEBBnAggAzYCAEGQCEGQCCgCACAAaiIANgIAIAMgAEEBcjYCBCAAIANqIAA2AgAPCyABQXhxIABqIQACQCABQf8BTQRAIAUoAggiAiABQQN2IgRBA3RBsAhqRhogAiAFKAIMIgFGBEBBiAhBiAgoAgBBfiAEd3E2AgAMAgsgAiABNgIMIAEgAjYCCAwBCyAFKAIYIQYCQCAFIAUoAgwiAUcEQCAFKAIIIgJBmAgoAgBJGiACIAE2AgwgASACNgIIDAELAkAgBUEUaiICKAIAIgQNACAFQRBqIgIoAgAiBA0AQQAhAQwBCwNAIAIhByAEIgFBFGoiAigCACIEDQAgAUEQaiECIAEoAhAiBA0ACyAHQQA2AgALIAZFDQACQCAFIAUoAhwiAkECdEG4CmoiBCgCAEYEQCAEIAE2AgAgAQ0BQYwIQYwIKAIAQX4gAndxNgIADAILIAZBEEEUIAYoAhAgBUYbaiABNgIAIAFFDQELIAEgBjYCGCAFKAIQIgIEQCABIAI2AhAgAiABNgIYCyAFKAIUIgJFDQAgASACNgIUIAIgATYCGAsgAyAAQQFyNgIEIAAgA2ogADYCACADQZwIKAIARw0BQZAIIAA2AgAPCyAFIAFBfnE2AgQgAyAAQQFyNgIEIAAgA2ogADYCAAsgAEH/AU0EQCAAQQN2IgFBA3RBsAhqIQACf0GICCgCACICQQEgAXQiAXFFBEBBiAggASACcjYCACAADAELIAAoAggLIQIgACADNgIIIAIgAzYCDCADIAA2AgwgAyACNgIIDwtBHyECIANCADcCECAAQf///wdNBEAgAEEIdiIBIAFBgP4/akEQdkEIcSIBdCICIAJBgOAfakEQdkEEcSICdCIEIARBgIAPakEQdkECcSIEdEEPdiABIAJyIARyayIBQQF0IAAgAUEVanZBAXFyQRxqIQILIAMgAjYCHCACQQJ0QbgKaiEBAkACQAJAQYwIKAIAIgRBASACdCIHcUUEQEGMCCAEIAdyNgIAIAEgAzYCACADIAE2AhgMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgASgCACEBA0AgASIEKAIEQXhxIABGDQIgAkEddiEBIAJBAXQhAiAEIAFBBHFqIgdBEGooAgAiAQ0ACyAHIAM2AhAgAyAENgIYCyADIAM2AgwgAyADNgIIDAELIAQoAggiACADNgIMIAQgAzYCCCADQQA2AhggAyAENgIMIAMgADYCCAtBqAhBqAgoAgBBAWsiAEF/IAAbNgIACwsLCQEAQYEICwIGUA==\";if(!W.startsWith(V)){var na=W;W=b.locateFile?b.locateFile(na,B):B+na}function pa(){var a=W;try{if(a==W&&J)return new Uint8Array(J);var c=H(a);if(c)return c;if(E)return E(a);throw\"both async and sync fetching of the wasm failed\";}catch(d){K(d)}}\nfunction qa(){if(!J&&(x||y)){if(\"function\"===typeof fetch&&!W.startsWith(\"file://\"))return fetch(W,{credentials:\"same-origin\"}).then(function(a){if(!a.ok)throw\"failed to load wasm binary file at '\"+W+\"'\";return a.arrayBuffer()}).catch(function(){return pa()});if(D)return new Promise(function(a,c){D(W,function(d){a(new Uint8Array(d))},c)})}return Promise.resolve().then(function(){return pa()})}\nfunction X(a){for(;0<a.length;){var c=a.shift();if(\"function\"==typeof c)c(b);else{var d=c.m;\"number\"===typeof d?void 0===c.l?R.get(d)():R.get(d)(c.l):d(void 0===c.l?null:c.l)}}}\nvar ba=!1,ra=\"function\"===typeof atob?atob:function(a){var c=\"\",d=0;a=a.replace(/[^A-Za-z0-9\\+\\/=]/g,\"\");do{var e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));var f=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));var l=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));var A=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));e=e<<\n2|f>>4;f=(f&15)<<4|l>>2;var t=(l&3)<<6|A;c+=String.fromCharCode(e);64!==l&&(c+=String.fromCharCode(f));64!==A&&(c+=String.fromCharCode(t))}while(d<a.length);return c};\nfunction H(a){if(a.startsWith(V)){a=a.slice(V.length);if(\"boolean\"===typeof z&&z){var c=Buffer.from(a,\"base64\");c=new Uint8Array(c.buffer,c.byteOffset,c.byteLength)}else try{var d=ra(a),e=new Uint8Array(d.length);for(a=0;a<d.length;++a)e[a]=d.charCodeAt(a);c=e}catch(f){throw Error(\"Converting base64 string to bytes failed.\");}return c}}\nvar sa={a:function(a){var c=P.length;a>>>=0;if(2147483648<a)return!1;for(var d=1;4>=d;d*=2){var e=c*(1+.2/d);e=Math.min(e,a+100663296);e=Math.max(a,e);0<e%65536&&(e+=65536-e%65536);a:{try{L.grow(Math.min(2147483648,e)-ha.byteLength+65535>>>16);ia();var f=1;break a}catch(l){}f=void 0}if(f)return!0}return!1}};\n(function(){function a(f){b.asm=f.exports;L=b.asm.b;ia();R=b.asm.j;ka.unshift(b.asm.c);S--;b.monitorRunDependencies&&b.monitorRunDependencies(S);0==S&&(null!==T&&(clearInterval(T),T=null),U&&(f=U,U=null,f()))}function c(f){a(f.instance)}function d(f){return qa().then(function(l){return WebAssembly.instantiate(l,e)}).then(f,function(l){I(\"failed to asynchronously prepare wasm: \"+l);K(l)})}var e={a:sa};S++;b.monitorRunDependencies&&b.monitorRunDependencies(S);if(b.instantiateWasm)try{return b.instantiateWasm(e,\na)}catch(f){return I(\"Module.instantiateWasm callback failed with error: \"+f),!1}(function(){return J||\"function\"!==typeof WebAssembly.instantiateStreaming||W.startsWith(V)||W.startsWith(\"file://\")||\"function\"!==typeof fetch?d(c):fetch(W,{credentials:\"same-origin\"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(c,function(l){I(\"wasm streaming compile failed: \"+l);I(\"falling back to ArrayBuffer instantiation\");return d(c)})})})().catch(r);return{}})();\nb.___wasm_call_ctors=function(){return(b.___wasm_call_ctors=b.asm.c).apply(null,arguments)};b._poly1305_auth=function(){return(b._poly1305_auth=b.asm.d).apply(null,arguments)};var da=b.stackSave=function(){return(da=b.stackSave=b.asm.e).apply(null,arguments)},fa=b.stackRestore=function(){return(fa=b.stackRestore=b.asm.f).apply(null,arguments)},O=b.stackAlloc=function(){return(O=b.stackAlloc=b.asm.g).apply(null,arguments)};b._malloc=function(){return(b._malloc=b.asm.h).apply(null,arguments)};\nb._free=function(){return(b._free=b.asm.i).apply(null,arguments)};b.cwrap=function(a,c,d,e){d=d||[];var f=d.every(function(l){return\"number\"===l});return\"string\"!==c&&f&&!e?N(a):function(){return ca(a,c,d,arguments)}};var Y;U=function ta(){Y||Z();Y||(U=ta)};\nfunction Z(){function a(){if(!Y&&(Y=!0,b.calledRun=!0,!M)){X(ka);q(b);if(b.onRuntimeInitialized)b.onRuntimeInitialized();if(b.postRun)for(\"function\"==typeof b.postRun&&(b.postRun=[b.postRun]);b.postRun.length;){var c=b.postRun.shift();la.unshift(c)}X(la)}}if(!(0<S)){if(b.preRun)for(\"function\"==typeof b.preRun&&(b.preRun=[b.preRun]);b.preRun.length;)ma();X(ja);0<S||(b.setStatus?(b.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){b.setStatus(\"\")},1);a()},1)):a())}}b.run=Z;\nif(b.preInit)for(\"function\"==typeof b.preInit&&(b.preInit=[b.preInit]);0<b.preInit.length;)b.preInit.pop()();Z();\n\n\n return createPoly1305.ready\n}\n);\n})();\nif (typeof exports === 'object' && typeof module === 'object')\n module.exports = createPoly1305;\nelse if (typeof define === 'function' && define['amd'])\n define([], function() { return createPoly1305; });\nelse if (typeof exports === 'object')\n exports[\"createPoly1305\"] = createPoly1305;\n", "// TODO:\n// * make max packet size configurable\n// * if decompression is enabled, use `._packet` in decipher instances as\n// input to (sync) zlib inflater with appropriate offset and length to\n// avoid an additional copy of payload data before inflation\n// * factor decompression status into packet length checks\n'use strict';\n\nconst {\n createCipheriv, createDecipheriv, createHmac, randomFillSync, timingSafeEqual\n} = require('crypto');\n\nconst { readUInt32BE, writeUInt32BE } = require('./utils.js');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst MAX_SEQNO = 2 ** 32 - 1;\nconst EMPTY_BUFFER = Buffer.alloc(0);\nconst BUF_INT = Buffer.alloc(4);\nconst DISCARD_CACHE = new Map();\nconst MAX_PACKET_SIZE = 35000;\n\nlet binding;\nlet AESGCMCipher;\nlet ChaChaPolyCipher;\nlet GenericCipher;\nlet AESGCMDecipher;\nlet ChaChaPolyDecipher;\nlet GenericDecipher;\ntry {\n binding = require('./crypto/build/Release/sshcrypto.node');\n ({ AESGCMCipher, ChaChaPolyCipher, GenericCipher,\n AESGCMDecipher, ChaChaPolyDecipher, GenericDecipher } = binding);\n} catch {}\n\nconst CIPHER_STREAM = 1 << 0;\nconst CIPHER_INFO = (() => {\n function info(sslName, blockLen, keyLen, ivLen, authLen, discardLen, flags) {\n return {\n sslName,\n blockLen,\n keyLen,\n ivLen: (ivLen !== 0 || (flags & CIPHER_STREAM)\n ? ivLen\n : blockLen),\n authLen,\n discardLen,\n stream: !!(flags & CIPHER_STREAM),\n };\n }\n\n return {\n 'chacha20-poly1305@openssh.com':\n info('chacha20', 8, 64, 0, 16, 0, CIPHER_STREAM),\n\n 'aes128-gcm': info('aes-128-gcm', 16, 16, 12, 16, 0, CIPHER_STREAM),\n 'aes256-gcm': info('aes-256-gcm', 16, 32, 12, 16, 0, CIPHER_STREAM),\n 'aes128-gcm@openssh.com':\n info('aes-128-gcm', 16, 16, 12, 16, 0, CIPHER_STREAM),\n 'aes256-gcm@openssh.com':\n info('aes-256-gcm', 16, 32, 12, 16, 0, CIPHER_STREAM),\n\n 'aes128-cbc': info('aes-128-cbc', 16, 16, 0, 0, 0, 0),\n 'aes192-cbc': info('aes-192-cbc', 16, 24, 0, 0, 0, 0),\n 'aes256-cbc': info('aes-256-cbc', 16, 32, 0, 0, 0, 0),\n 'rijndael-cbc@lysator.liu.se': info('aes-256-cbc', 16, 32, 0, 0, 0, 0),\n '3des-cbc': info('des-ede3-cbc', 8, 24, 0, 0, 0, 0),\n 'blowfish-cbc': info('bf-cbc', 8, 16, 0, 0, 0, 0),\n 'idea-cbc': info('idea-cbc', 8, 16, 0, 0, 0, 0),\n 'cast128-cbc': info('cast-cbc', 8, 16, 0, 0, 0, 0),\n\n 'aes128-ctr': info('aes-128-ctr', 16, 16, 16, 0, 0, CIPHER_STREAM),\n 'aes192-ctr': info('aes-192-ctr', 16, 24, 16, 0, 0, CIPHER_STREAM),\n 'aes256-ctr': info('aes-256-ctr', 16, 32, 16, 0, 0, CIPHER_STREAM),\n '3des-ctr': info('des-ede3', 8, 24, 8, 0, 0, CIPHER_STREAM),\n 'blowfish-ctr': info('bf-ecb', 8, 16, 8, 0, 0, CIPHER_STREAM),\n 'cast128-ctr': info('cast5-ecb', 8, 16, 8, 0, 0, CIPHER_STREAM),\n\n /* The \"arcfour128\" algorithm is the RC4 cipher, as described in\n [SCHNEIER], using a 128-bit key. The first 1536 bytes of keystream\n generated by the cipher MUST be discarded, and the first byte of the\n first encrypted packet MUST be encrypted using the 1537th byte of\n keystream.\n\n -- http://tools.ietf.org/html/rfc4345#section-4 */\n 'arcfour': info('rc4', 8, 16, 0, 0, 1536, CIPHER_STREAM),\n 'arcfour128': info('rc4', 8, 16, 0, 0, 1536, CIPHER_STREAM),\n 'arcfour256': info('rc4', 8, 32, 0, 0, 1536, CIPHER_STREAM),\n 'arcfour512': info('rc4', 8, 64, 0, 0, 1536, CIPHER_STREAM),\n };\n})();\n\nconst MAC_INFO = (() => {\n function info(sslName, len, actualLen, isETM) {\n return {\n sslName,\n len,\n actualLen,\n isETM,\n };\n }\n\n return {\n 'hmac-md5': info('md5', 16, 16, false),\n 'hmac-md5-96': info('md5', 16, 12, false),\n 'hmac-ripemd160': info('ripemd160', 20, 20, false),\n 'hmac-sha1': info('sha1', 20, 20, false),\n 'hmac-sha1-etm@openssh.com': info('sha1', 20, 20, true),\n 'hmac-sha1-96': info('sha1', 20, 12, false),\n 'hmac-sha2-256': info('sha256', 32, 32, false),\n 'hmac-sha2-256-etm@openssh.com': info('sha256', 32, 32, true),\n 'hmac-sha2-256-96': info('sha256', 32, 12, false),\n 'hmac-sha2-512': info('sha512', 64, 64, false),\n 'hmac-sha2-512-etm@openssh.com': info('sha512', 64, 64, true),\n 'hmac-sha2-512-96': info('sha512', 64, 12, false),\n };\n})();\n\n\n// Should only_be used during the initial handshake\nclass NullCipher {\n constructor(seqno, onWrite) {\n this.outSeqno = seqno;\n this._onWrite = onWrite;\n this._dead = false;\n }\n free() {\n this._dead = true;\n }\n allocPacket(payloadLen) {\n let pktLen = 4 + 1 + payloadLen;\n let padLen = 8 - (pktLen & (8 - 1));\n if (padLen < 4)\n padLen += 8;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n this._onWrite(packet);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\n\nconst POLY1305_ZEROS = Buffer.alloc(32);\nconst POLY1305_OUT_COMPUTE = Buffer.alloc(16);\nlet POLY1305_WASM_MODULE;\nlet POLY1305_RESULT_MALLOC;\nlet poly1305_auth;\nclass ChaChaPolyCipherNative {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._encKeyMain = enc.cipherKey.slice(0, 32);\n this._encKeyPktLen = enc.cipherKey.slice(32);\n this._dead = false;\n }\n free() {\n this._dead = true;\n }\n allocPacket(payloadLen) {\n let pktLen = 4 + 1 + payloadLen;\n let padLen = 8 - ((pktLen - 4) & (8 - 1));\n if (padLen < 4)\n padLen += 8;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n // Generate Poly1305 key\n POLY1305_OUT_COMPUTE[0] = 0; // Set counter to 0 (little endian)\n writeUInt32BE(POLY1305_OUT_COMPUTE, this.outSeqno, 12);\n const polyKey =\n createCipheriv('chacha20', this._encKeyMain, POLY1305_OUT_COMPUTE)\n .update(POLY1305_ZEROS);\n\n // Encrypt packet length\n const pktLenEnc =\n createCipheriv('chacha20', this._encKeyPktLen, POLY1305_OUT_COMPUTE)\n .update(packet.slice(0, 4));\n this._onWrite(pktLenEnc);\n\n // Encrypt rest of packet\n POLY1305_OUT_COMPUTE[0] = 1; // Set counter to 1 (little endian)\n const payloadEnc =\n createCipheriv('chacha20', this._encKeyMain, POLY1305_OUT_COMPUTE)\n .update(packet.slice(4));\n this._onWrite(payloadEnc);\n\n // Calculate Poly1305 MAC\n poly1305_auth(POLY1305_RESULT_MALLOC,\n pktLenEnc,\n pktLenEnc.length,\n payloadEnc,\n payloadEnc.length,\n polyKey);\n const mac = Buffer.allocUnsafe(16);\n mac.set(\n new Uint8Array(POLY1305_WASM_MODULE.HEAPU8.buffer,\n POLY1305_RESULT_MALLOC,\n 16),\n 0\n );\n this._onWrite(mac);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\nclass ChaChaPolyCipherBinding {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._instance = new ChaChaPolyCipher(enc.cipherKey);\n this._dead = false;\n }\n free() {\n this._dead = true;\n this._instance.free();\n }\n allocPacket(payloadLen) {\n let pktLen = 4 + 1 + payloadLen;\n let padLen = 8 - ((pktLen - 4) & (8 - 1));\n if (padLen < 4)\n padLen += 8;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen + 16/* MAC */);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n // Encrypts in-place\n this._instance.encrypt(packet, this.outSeqno);\n\n this._onWrite(packet);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\n\nclass AESGCMCipherNative {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._encSSLName = enc.cipherInfo.sslName;\n this._encKey = enc.cipherKey;\n this._encIV = enc.cipherIV;\n this._dead = false;\n }\n free() {\n this._dead = true;\n }\n allocPacket(payloadLen) {\n let pktLen = 4 + 1 + payloadLen;\n let padLen = 16 - ((pktLen - 4) & (16 - 1));\n if (padLen < 4)\n padLen += 16;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n const cipher = createCipheriv(this._encSSLName, this._encKey, this._encIV);\n cipher.setAutoPadding(false);\n\n const lenData = packet.slice(0, 4);\n cipher.setAAD(lenData);\n this._onWrite(lenData);\n\n // Encrypt pad length, payload, and padding\n const encrypted = cipher.update(packet.slice(4));\n this._onWrite(encrypted);\n const final = cipher.final();\n // XXX: final.length === 0 always?\n if (final.length)\n this._onWrite(final);\n\n // Generate MAC\n const tag = cipher.getAuthTag();\n this._onWrite(tag);\n\n // Increment counter in IV by 1 for next packet\n ivIncrement(this._encIV);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\nclass AESGCMCipherBinding {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._instance = new AESGCMCipher(enc.cipherInfo.sslName,\n enc.cipherKey,\n enc.cipherIV);\n this._dead = false;\n }\n free() {\n this._dead = true;\n this._instance.free();\n }\n allocPacket(payloadLen) {\n let pktLen = 4 + 1 + payloadLen;\n let padLen = 16 - ((pktLen - 4) & (16 - 1));\n if (padLen < 4)\n padLen += 16;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen + 16/* authTag */);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n // Encrypts in-place\n this._instance.encrypt(packet);\n\n this._onWrite(packet);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\n\nclass GenericCipherNative {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._encBlockLen = enc.cipherInfo.blockLen;\n this._cipherInstance = createCipheriv(enc.cipherInfo.sslName,\n enc.cipherKey,\n enc.cipherIV);\n this._macSSLName = enc.macInfo.sslName;\n this._macKey = enc.macKey;\n this._macActualLen = enc.macInfo.actualLen;\n this._macETM = enc.macInfo.isETM;\n this._aadLen = (this._macETM ? 4 : 0);\n this._dead = false;\n\n const discardLen = enc.cipherInfo.discardLen;\n if (discardLen) {\n let discard = DISCARD_CACHE.get(discardLen);\n if (discard === undefined) {\n discard = Buffer.alloc(discardLen);\n DISCARD_CACHE.set(discardLen, discard);\n }\n this._cipherInstance.update(discard);\n }\n }\n free() {\n this._dead = true;\n }\n allocPacket(payloadLen) {\n const blockLen = this._encBlockLen;\n\n let pktLen = 4 + 1 + payloadLen;\n let padLen = blockLen - ((pktLen - this._aadLen) & (blockLen - 1));\n if (padLen < 4)\n padLen += blockLen;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n let mac;\n if (this._macETM) {\n // Encrypt pad length, payload, and padding\n const lenBytes = new Uint8Array(packet.buffer, packet.byteOffset, 4);\n const encrypted = this._cipherInstance.update(\n new Uint8Array(packet.buffer,\n packet.byteOffset + 4,\n packet.length - 4)\n );\n\n this._onWrite(lenBytes);\n this._onWrite(encrypted);\n\n // TODO: look into storing seqno as 4-byte buffer and incrementing like we\n // do for AES-GCM IVs to avoid having to (re)write all 4 bytes every time\n mac = createHmac(this._macSSLName, this._macKey);\n writeUInt32BE(BUF_INT, this.outSeqno, 0);\n mac.update(BUF_INT);\n mac.update(lenBytes);\n mac.update(encrypted);\n } else {\n // Encrypt length field, pad length, payload, and padding\n const encrypted = this._cipherInstance.update(packet);\n this._onWrite(encrypted);\n\n // TODO: look into storing seqno as 4-byte buffer and incrementing like we\n // do for AES-GCM IVs to avoid having to (re)write all 4 bytes every time\n mac = createHmac(this._macSSLName, this._macKey);\n writeUInt32BE(BUF_INT, this.outSeqno, 0);\n mac.update(BUF_INT);\n mac.update(packet);\n }\n\n let digest = mac.digest();\n if (digest.length > this._macActualLen)\n digest = digest.slice(0, this._macActualLen);\n this._onWrite(digest);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\nclass GenericCipherBinding {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._encBlockLen = enc.cipherInfo.blockLen;\n this._macLen = enc.macInfo.len;\n this._macActualLen = enc.macInfo.actualLen;\n this._aadLen = (enc.macInfo.isETM ? 4 : 0);\n this._instance = new GenericCipher(enc.cipherInfo.sslName,\n enc.cipherKey,\n enc.cipherIV,\n enc.macInfo.sslName,\n enc.macKey,\n enc.macInfo.isETM);\n this._dead = false;\n }\n free() {\n this._dead = true;\n this._instance.free();\n }\n allocPacket(payloadLen) {\n const blockLen = this._encBlockLen;\n\n let pktLen = 4 + 1 + payloadLen;\n let padLen = blockLen - ((pktLen - this._aadLen) & (blockLen - 1));\n if (padLen < 4)\n padLen += blockLen;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen + this._macLen);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n // Encrypts in-place\n this._instance.encrypt(packet, this.outSeqno);\n\n if (this._macActualLen < this._macLen) {\n packet = new FastBuffer(packet.buffer,\n packet.byteOffset,\n (packet.length\n - (this._macLen - this._macActualLen)));\n }\n this._onWrite(packet);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\n\nclass NullDecipher {\n constructor(seqno, onPayload) {\n this.inSeqno = seqno;\n this._onPayload = onPayload;\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._packetPos = 0;\n }\n free() {}\n decrypt(data, p, dataLen) {\n while (p < dataLen) {\n // Read packet length\n if (this._lenBytes < 4) {\n let nb = Math.min(4 - this._lenBytes, dataLen - p);\n\n this._lenBytes += nb;\n while (nb--)\n this._len = (this._len << 8) + data[p++];\n\n if (this._lenBytes < 4)\n return;\n\n if (this._len > MAX_PACKET_SIZE\n || this._len < 8\n || (4 + this._len & 7) !== 0) {\n throw new Error('Bad packet length');\n }\n if (p >= dataLen)\n return;\n }\n\n // Read padding length, payload, and padding\n if (this._packetPos < this._len) {\n const nb = Math.min(this._len - this._packetPos, dataLen - p);\n let chunk;\n if (p !== 0 || nb !== dataLen)\n chunk = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n chunk = data;\n if (nb === this._len) {\n this._packet = chunk;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(chunk, this._packetPos);\n }\n p += nb;\n this._packetPos += nb;\n if (this._packetPos < this._len)\n return;\n }\n\n const payload = (!this._packet\n ? EMPTY_BUFFER\n : new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length\n - this._packet[0] - 1));\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._packetPos = 0;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\nclass ChaChaPolyDecipherNative {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._decKeyMain = dec.decipherKey.slice(0, 32);\n this._decKeyPktLen = dec.decipherKey.slice(32);\n this._len = 0;\n this._lenBuf = Buffer.alloc(4);\n this._lenPos = 0;\n this._packet = null;\n this._pktLen = 0;\n this._mac = Buffer.allocUnsafe(16);\n this._calcMac = Buffer.allocUnsafe(16);\n this._macPos = 0;\n }\n free() {}\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read packet length\n if (this._lenPos < 4) {\n let nb = Math.min(4 - this._lenPos, dataLen - p);\n while (nb--)\n this._lenBuf[this._lenPos++] = data[p++];\n if (this._lenPos < 4)\n return;\n\n POLY1305_OUT_COMPUTE[0] = 0; // Set counter to 0 (little endian)\n writeUInt32BE(POLY1305_OUT_COMPUTE, this.inSeqno, 12);\n\n const decLenBytes =\n createDecipheriv('chacha20', this._decKeyPktLen, POLY1305_OUT_COMPUTE)\n .update(this._lenBuf);\n this._len = readUInt32BE(decLenBytes, 0);\n\n if (this._len > MAX_PACKET_SIZE\n || this._len < 8\n || (this._len & 7) !== 0) {\n throw new Error('Bad packet length');\n }\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n if (p >= dataLen)\n return;\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let encrypted;\n if (p !== 0 || nb !== dataLen)\n encrypted = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n encrypted = data;\n if (nb === this._len) {\n this._packet = encrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(encrypted, this._pktLen);\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read Poly1305 MAC\n {\n const nb = Math.min(16 - this._macPos, dataLen - p);\n // TODO: avoid copying if entire MAC is in current chunk\n if (p !== 0 || nb !== dataLen) {\n this._mac.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._macPos\n );\n } else {\n this._mac.set(data, this._macPos);\n }\n p += nb;\n this._macPos += nb;\n if (this._macPos < 16)\n return;\n }\n\n // Generate Poly1305 key\n POLY1305_OUT_COMPUTE[0] = 0; // Set counter to 0 (little endian)\n writeUInt32BE(POLY1305_OUT_COMPUTE, this.inSeqno, 12);\n const polyKey =\n createCipheriv('chacha20', this._decKeyMain, POLY1305_OUT_COMPUTE)\n .update(POLY1305_ZEROS);\n\n // Calculate and compare Poly1305 MACs\n poly1305_auth(POLY1305_RESULT_MALLOC,\n this._lenBuf,\n 4,\n this._packet,\n this._packet.length,\n polyKey);\n\n this._calcMac.set(\n new Uint8Array(POLY1305_WASM_MODULE.HEAPU8.buffer,\n POLY1305_RESULT_MALLOC,\n 16),\n 0\n );\n if (!timingSafeEqual(this._calcMac, this._mac))\n throw new Error('Invalid MAC');\n\n // Decrypt packet\n POLY1305_OUT_COMPUTE[0] = 1; // Set counter to 1 (little endian)\n const packet =\n createDecipheriv('chacha20', this._decKeyMain, POLY1305_OUT_COMPUTE)\n .update(this._packet);\n\n const payload = new FastBuffer(packet.buffer,\n packet.byteOffset + 1,\n packet.length - packet[0] - 1);\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._len = 0;\n this._lenPos = 0;\n this._packet = null;\n this._pktLen = 0;\n this._macPos = 0;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\nclass ChaChaPolyDecipherBinding {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._instance = new ChaChaPolyDecipher(dec.decipherKey);\n this._len = 0;\n this._lenBuf = Buffer.alloc(4);\n this._lenPos = 0;\n this._packet = null;\n this._pktLen = 0;\n this._mac = Buffer.allocUnsafe(16);\n this._macPos = 0;\n }\n free() {\n this._instance.free();\n }\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read packet length\n if (this._lenPos < 4) {\n let nb = Math.min(4 - this._lenPos, dataLen - p);\n while (nb--)\n this._lenBuf[this._lenPos++] = data[p++];\n if (this._lenPos < 4)\n return;\n\n this._len = this._instance.decryptLen(this._lenBuf, this.inSeqno);\n\n if (this._len > MAX_PACKET_SIZE\n || this._len < 8\n || (this._len & 7) !== 0) {\n throw new Error('Bad packet length');\n }\n\n if (p >= dataLen)\n return;\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let encrypted;\n if (p !== 0 || nb !== dataLen)\n encrypted = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n encrypted = data;\n if (nb === this._len) {\n this._packet = encrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(encrypted, this._pktLen);\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read Poly1305 MAC\n {\n const nb = Math.min(16 - this._macPos, dataLen - p);\n // TODO: avoid copying if entire MAC is in current chunk\n if (p !== 0 || nb !== dataLen) {\n this._mac.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._macPos\n );\n } else {\n this._mac.set(data, this._macPos);\n }\n p += nb;\n this._macPos += nb;\n if (this._macPos < 16)\n return;\n }\n\n this._instance.decrypt(this._packet, this._mac, this.inSeqno);\n\n const payload = new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length - this._packet[0] - 1);\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._len = 0;\n this._lenPos = 0;\n this._packet = null;\n this._pktLen = 0;\n this._macPos = 0;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\nclass AESGCMDecipherNative {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._decipherInstance = null;\n this._decipherSSLName = dec.decipherInfo.sslName;\n this._decipherKey = dec.decipherKey;\n this._decipherIV = dec.decipherIV;\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._packetPos = 0;\n this._pktLen = 0;\n this._tag = Buffer.allocUnsafe(16);\n this._tagPos = 0;\n }\n free() {}\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read packet length (unencrypted, but AAD)\n if (this._lenBytes < 4) {\n let nb = Math.min(4 - this._lenBytes, dataLen - p);\n this._lenBytes += nb;\n while (nb--)\n this._len = (this._len << 8) + data[p++];\n if (this._lenBytes < 4)\n return;\n\n if ((this._len + 20) > MAX_PACKET_SIZE\n || this._len < 16\n || (this._len & 15) !== 0) {\n throw new Error('Bad packet length');\n }\n\n this._decipherInstance = createDecipheriv(\n this._decipherSSLName,\n this._decipherKey,\n this._decipherIV\n );\n this._decipherInstance.setAutoPadding(false);\n this._decipherInstance.setAAD(intToBytes(this._len));\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n if (p >= dataLen)\n return;\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let decrypted;\n if (p !== 0 || nb !== dataLen) {\n decrypted = this._decipherInstance.update(\n new Uint8Array(data.buffer, data.byteOffset + p, nb)\n );\n } else {\n decrypted = this._decipherInstance.update(data);\n }\n if (decrypted.length) {\n if (nb === this._len) {\n this._packet = decrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(decrypted, this._packetPos);\n }\n this._packetPos += decrypted.length;\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read authentication tag\n {\n const nb = Math.min(16 - this._tagPos, dataLen - p);\n if (p !== 0 || nb !== dataLen) {\n this._tag.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._tagPos\n );\n } else {\n this._tag.set(data, this._tagPos);\n }\n p += nb;\n this._tagPos += nb;\n if (this._tagPos < 16)\n return;\n }\n\n {\n // Verify authentication tag\n this._decipherInstance.setAuthTag(this._tag);\n\n const decrypted = this._decipherInstance.final();\n\n // XXX: this should never output any data since stream ciphers always\n // return data from .update() and block ciphers must end on a multiple\n // of the block length, which would have caused an exception to be\n // thrown if the total input was not...\n if (decrypted.length) {\n if (this._packet)\n this._packet.set(decrypted, this._packetPos);\n else\n this._packet = decrypted;\n }\n }\n\n const payload = (!this._packet\n ? EMPTY_BUFFER\n : new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length\n - this._packet[0] - 1));\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n ivIncrement(this._decipherIV);\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._packetPos = 0;\n this._pktLen = 0;\n this._tagPos = 0;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\nclass AESGCMDecipherBinding {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._instance = new AESGCMDecipher(dec.decipherInfo.sslName,\n dec.decipherKey,\n dec.decipherIV);\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._pktLen = 0;\n this._tag = Buffer.allocUnsafe(16);\n this._tagPos = 0;\n }\n free() {}\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read packet length (unencrypted, but AAD)\n if (this._lenBytes < 4) {\n let nb = Math.min(4 - this._lenBytes, dataLen - p);\n this._lenBytes += nb;\n while (nb--)\n this._len = (this._len << 8) + data[p++];\n if (this._lenBytes < 4)\n return;\n\n if ((this._len + 20) > MAX_PACKET_SIZE\n || this._len < 16\n || (this._len & 15) !== 0) {\n throw new Error(`Bad packet length: ${this._len}`);\n }\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n if (p >= dataLen)\n return;\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let encrypted;\n if (p !== 0 || nb !== dataLen)\n encrypted = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n encrypted = data;\n if (nb === this._len) {\n this._packet = encrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(encrypted, this._pktLen);\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read authentication tag\n {\n const nb = Math.min(16 - this._tagPos, dataLen - p);\n if (p !== 0 || nb !== dataLen) {\n this._tag.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._tagPos\n );\n } else {\n this._tag.set(data, this._tagPos);\n }\n p += nb;\n this._tagPos += nb;\n if (this._tagPos < 16)\n return;\n }\n\n this._instance.decrypt(this._packet, this._len, this._tag);\n\n const payload = new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length - this._packet[0] - 1);\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._pktLen = 0;\n this._tagPos = 0;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\n// TODO: test incremental .update()s vs. copying to _packet and doing a single\n// .update() after entire packet read -- a single .update() would allow\n// verifying MAC before decrypting for ETM MACs\nclass GenericDecipherNative {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._decipherInstance = createDecipheriv(dec.decipherInfo.sslName,\n dec.decipherKey,\n dec.decipherIV);\n this._decipherInstance.setAutoPadding(false);\n this._block = Buffer.allocUnsafe(\n dec.macInfo.isETM ? 4 : dec.decipherInfo.blockLen\n );\n this._blockSize = dec.decipherInfo.blockLen;\n this._blockPos = 0;\n this._len = 0;\n this._packet = null;\n this._packetPos = 0;\n this._pktLen = 0;\n this._mac = Buffer.allocUnsafe(dec.macInfo.actualLen);\n this._macPos = 0;\n this._macSSLName = dec.macInfo.sslName;\n this._macKey = dec.macKey;\n this._macActualLen = dec.macInfo.actualLen;\n this._macETM = dec.macInfo.isETM;\n this._macInstance = null;\n\n const discardLen = dec.decipherInfo.discardLen;\n if (discardLen) {\n let discard = DISCARD_CACHE.get(discardLen);\n if (discard === undefined) {\n discard = Buffer.alloc(discardLen);\n DISCARD_CACHE.set(discardLen, discard);\n }\n this._decipherInstance.update(discard);\n }\n }\n free() {}\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read first encrypted block\n if (this._blockPos < this._block.length) {\n const nb = Math.min(this._block.length - this._blockPos, dataLen - p);\n if (p !== 0 || nb !== dataLen || nb < data.length) {\n this._block.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._blockPos\n );\n } else {\n this._block.set(data, this._blockPos);\n }\n\n p += nb;\n this._blockPos += nb;\n if (this._blockPos < this._block.length)\n return;\n\n let decrypted;\n let need;\n if (this._macETM) {\n this._len = need = readUInt32BE(this._block, 0);\n } else {\n // Decrypt first block to get packet length\n decrypted = this._decipherInstance.update(this._block);\n this._len = readUInt32BE(decrypted, 0);\n need = 4 + this._len - this._blockSize;\n }\n\n if (this._len > MAX_PACKET_SIZE\n || this._len < 5\n || (need & (this._blockSize - 1)) !== 0) {\n throw new Error('Bad packet length');\n }\n\n // Create MAC up front to calculate in parallel with decryption\n this._macInstance = createHmac(this._macSSLName, this._macKey);\n\n writeUInt32BE(BUF_INT, this.inSeqno, 0);\n this._macInstance.update(BUF_INT);\n if (this._macETM) {\n this._macInstance.update(this._block);\n } else {\n this._macInstance.update(new Uint8Array(decrypted.buffer,\n decrypted.byteOffset,\n 4));\n this._pktLen = decrypted.length - 4;\n this._packetPos = this._pktLen;\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(\n new Uint8Array(decrypted.buffer,\n decrypted.byteOffset + 4,\n this._packetPos),\n 0\n );\n }\n\n if (p >= dataLen)\n return;\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let encrypted;\n if (p !== 0 || nb !== dataLen)\n encrypted = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n encrypted = data;\n if (this._macETM)\n this._macInstance.update(encrypted);\n const decrypted = this._decipherInstance.update(encrypted);\n if (decrypted.length) {\n if (nb === this._len) {\n this._packet = decrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(decrypted, this._packetPos);\n }\n this._packetPos += decrypted.length;\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read MAC\n {\n const nb = Math.min(this._macActualLen - this._macPos, dataLen - p);\n if (p !== 0 || nb !== dataLen) {\n this._mac.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._macPos\n );\n } else {\n this._mac.set(data, this._macPos);\n }\n p += nb;\n this._macPos += nb;\n if (this._macPos < this._macActualLen)\n return;\n }\n\n // Verify MAC\n if (!this._macETM)\n this._macInstance.update(this._packet);\n let calculated = this._macInstance.digest();\n if (this._macActualLen < calculated.length) {\n calculated = new Uint8Array(calculated.buffer,\n calculated.byteOffset,\n this._macActualLen);\n }\n if (!timingSafeEquals(calculated, this._mac))\n throw new Error('Invalid MAC');\n\n const payload = new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length - this._packet[0] - 1);\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._blockPos = 0;\n this._len = 0;\n this._packet = null;\n this._packetPos = 0;\n this._pktLen = 0;\n this._macPos = 0;\n this._macInstance = null;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\nclass GenericDecipherBinding {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._instance = new GenericDecipher(dec.decipherInfo.sslName,\n dec.decipherKey,\n dec.decipherIV,\n dec.macInfo.sslName,\n dec.macKey,\n dec.macInfo.isETM,\n dec.macInfo.actualLen);\n this._block = Buffer.allocUnsafe(\n dec.macInfo.isETM || dec.decipherInfo.stream\n ? 4\n : dec.decipherInfo.blockLen\n );\n this._blockPos = 0;\n this._len = 0;\n this._packet = null;\n this._pktLen = 0;\n this._mac = Buffer.allocUnsafe(dec.macInfo.actualLen);\n this._macPos = 0;\n this._macActualLen = dec.macInfo.actualLen;\n this._macETM = dec.macInfo.isETM;\n }\n free() {\n this._instance.free();\n }\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read first encrypted block\n if (this._blockPos < this._block.length) {\n const nb = Math.min(this._block.length - this._blockPos, dataLen - p);\n if (p !== 0 || nb !== dataLen || nb < data.length) {\n this._block.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._blockPos\n );\n } else {\n this._block.set(data, this._blockPos);\n }\n\n p += nb;\n this._blockPos += nb;\n if (this._blockPos < this._block.length)\n return;\n\n let need;\n if (this._macETM) {\n this._len = need = readUInt32BE(this._block, 0);\n } else {\n // Decrypt first block to get packet length\n this._instance.decryptBlock(this._block);\n this._len = readUInt32BE(this._block, 0);\n need = 4 + this._len - this._block.length;\n }\n\n if (this._len > MAX_PACKET_SIZE\n || this._len < 5\n || (need & (this._block.length - 1)) !== 0) {\n throw new Error('Bad packet length');\n }\n\n if (!this._macETM) {\n this._pktLen = (this._block.length - 4);\n if (this._pktLen) {\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(\n new Uint8Array(this._block.buffer,\n this._block.byteOffset + 4,\n this._pktLen),\n 0\n );\n }\n }\n\n if (p >= dataLen)\n return;\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let encrypted;\n if (p !== 0 || nb !== dataLen)\n encrypted = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n encrypted = data;\n if (nb === this._len) {\n this._packet = encrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(encrypted, this._pktLen);\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read MAC\n {\n const nb = Math.min(this._macActualLen - this._macPos, dataLen - p);\n if (p !== 0 || nb !== dataLen) {\n this._mac.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._macPos\n );\n } else {\n this._mac.set(data, this._macPos);\n }\n p += nb;\n this._macPos += nb;\n if (this._macPos < this._macActualLen)\n return;\n }\n\n // Decrypt and verify MAC\n this._instance.decrypt(this._packet,\n this.inSeqno,\n this._block,\n this._mac);\n\n const payload = new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length - this._packet[0] - 1);\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._blockPos = 0;\n this._len = 0;\n this._packet = null;\n this._pktLen = 0;\n this._macPos = 0;\n this._macInstance = null;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\n// Increments unsigned, big endian counter (last 8 bytes) of AES-GCM IV\nfunction ivIncrement(iv) {\n // eslint-disable-next-line no-unused-expressions\n ++iv[11] >>> 8\n && ++iv[10] >>> 8\n && ++iv[9] >>> 8\n && ++iv[8] >>> 8\n && ++iv[7] >>> 8\n && ++iv[6] >>> 8\n && ++iv[5] >>> 8\n && ++iv[4] >>> 8;\n}\n\nconst intToBytes = (() => {\n const ret = Buffer.alloc(4);\n return (n) => {\n ret[0] = (n >>> 24);\n ret[1] = (n >>> 16);\n ret[2] = (n >>> 8);\n ret[3] = n;\n return ret;\n };\n})();\n\nfunction timingSafeEquals(a, b) {\n if (a.length !== b.length) {\n timingSafeEqual(a, a);\n return false;\n }\n return timingSafeEqual(a, b);\n}\n\nfunction createCipher(config) {\n if (typeof config !== 'object' || config === null)\n throw new Error('Invalid config');\n\n if (typeof config.outbound !== 'object' || config.outbound === null)\n throw new Error('Invalid outbound');\n\n const outbound = config.outbound;\n\n if (typeof outbound.onWrite !== 'function')\n throw new Error('Invalid outbound.onWrite');\n\n if (typeof outbound.cipherInfo !== 'object' || outbound.cipherInfo === null)\n throw new Error('Invalid outbound.cipherInfo');\n\n if (!Buffer.isBuffer(outbound.cipherKey)\n || outbound.cipherKey.length !== outbound.cipherInfo.keyLen) {\n throw new Error('Invalid outbound.cipherKey');\n }\n\n if (outbound.cipherInfo.ivLen\n && (!Buffer.isBuffer(outbound.cipherIV)\n || outbound.cipherIV.length !== outbound.cipherInfo.ivLen)) {\n throw new Error('Invalid outbound.cipherIV');\n }\n\n if (typeof outbound.seqno !== 'number'\n || outbound.seqno < 0\n || outbound.seqno > MAX_SEQNO) {\n throw new Error('Invalid outbound.seqno');\n }\n\n const forceNative = !!outbound.forceNative;\n\n switch (outbound.cipherInfo.sslName) {\n case 'aes-128-gcm':\n case 'aes-256-gcm':\n return (AESGCMCipher && !forceNative\n ? new AESGCMCipherBinding(config)\n : new AESGCMCipherNative(config));\n case 'chacha20':\n return (ChaChaPolyCipher && !forceNative\n ? new ChaChaPolyCipherBinding(config)\n : new ChaChaPolyCipherNative(config));\n default: {\n if (typeof outbound.macInfo !== 'object' || outbound.macInfo === null)\n throw new Error('Invalid outbound.macInfo');\n if (!Buffer.isBuffer(outbound.macKey)\n || outbound.macKey.length !== outbound.macInfo.len) {\n throw new Error('Invalid outbound.macKey');\n }\n return (GenericCipher && !forceNative\n ? new GenericCipherBinding(config)\n : new GenericCipherNative(config));\n }\n }\n}\n\nfunction createDecipher(config) {\n if (typeof config !== 'object' || config === null)\n throw new Error('Invalid config');\n\n if (typeof config.inbound !== 'object' || config.inbound === null)\n throw new Error('Invalid inbound');\n\n const inbound = config.inbound;\n\n if (typeof inbound.onPayload !== 'function')\n throw new Error('Invalid inbound.onPayload');\n\n if (typeof inbound.decipherInfo !== 'object'\n || inbound.decipherInfo === null) {\n throw new Error('Invalid inbound.decipherInfo');\n }\n\n if (!Buffer.isBuffer(inbound.decipherKey)\n || inbound.decipherKey.length !== inbound.decipherInfo.keyLen) {\n throw new Error('Invalid inbound.decipherKey');\n }\n\n if (inbound.decipherInfo.ivLen\n && (!Buffer.isBuffer(inbound.decipherIV)\n || inbound.decipherIV.length !== inbound.decipherInfo.ivLen)) {\n throw new Error('Invalid inbound.decipherIV');\n }\n\n if (typeof inbound.seqno !== 'number'\n || inbound.seqno < 0\n || inbound.seqno > MAX_SEQNO) {\n throw new Error('Invalid inbound.seqno');\n }\n\n const forceNative = !!inbound.forceNative;\n\n switch (inbound.decipherInfo.sslName) {\n case 'aes-128-gcm':\n case 'aes-256-gcm':\n return (AESGCMDecipher && !forceNative\n ? new AESGCMDecipherBinding(config)\n : new AESGCMDecipherNative(config));\n case 'chacha20':\n return (ChaChaPolyDecipher && !forceNative\n ? new ChaChaPolyDecipherBinding(config)\n : new ChaChaPolyDecipherNative(config));\n default: {\n if (typeof inbound.macInfo !== 'object' || inbound.macInfo === null)\n throw new Error('Invalid inbound.macInfo');\n if (!Buffer.isBuffer(inbound.macKey)\n || inbound.macKey.length !== inbound.macInfo.len) {\n throw new Error('Invalid inbound.macKey');\n }\n return (GenericDecipher && !forceNative\n ? new GenericDecipherBinding(config)\n : new GenericDecipherNative(config));\n }\n }\n}\n\nmodule.exports = {\n CIPHER_INFO,\n MAC_INFO,\n bindingAvailable: !!binding,\n init: (() => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n try {\n POLY1305_WASM_MODULE = await require('./crypto/poly1305.js')();\n POLY1305_RESULT_MALLOC = POLY1305_WASM_MODULE._malloc(16);\n poly1305_auth = POLY1305_WASM_MODULE.cwrap(\n 'poly1305_auth',\n null,\n ['number', 'array', 'number', 'array', 'number', 'array']\n );\n } catch (ex) {\n return reject(ex);\n }\n resolve();\n });\n })(),\n\n NullCipher,\n createCipher,\n NullDecipher,\n createDecipher,\n};\n", "// TODO:\n// * utilize `crypto.create(Private|Public)Key()` and `keyObject.export()`\n// * handle multi-line header values (OpenSSH)?\n// * more thorough validation?\n'use strict';\n\nconst {\n createDecipheriv,\n createECDH,\n createHash,\n createHmac,\n createSign,\n createVerify,\n getCiphers,\n sign: sign_,\n verify: verify_,\n} = require('crypto');\nconst supportedOpenSSLCiphers = getCiphers();\n\nconst { Ber } = require('asn1');\nconst bcrypt_pbkdf = require('bcrypt-pbkdf').pbkdf;\n\nconst { CIPHER_INFO } = require('./crypto.js');\nconst { eddsaSupported, SUPPORTED_CIPHER } = require('./constants.js');\nconst {\n bufferSlice,\n makeBufferParser,\n readString,\n readUInt32BE,\n writeUInt32BE,\n} = require('./utils.js');\n\nconst SYM_HASH_ALGO = Symbol('Hash Algorithm');\nconst SYM_PRIV_PEM = Symbol('Private key PEM');\nconst SYM_PUB_PEM = Symbol('Public key PEM');\nconst SYM_PUB_SSH = Symbol('Public key SSH');\nconst SYM_DECRYPTED = Symbol('Decrypted Key');\n\n// Create OpenSSL cipher name -> SSH cipher name conversion table\nconst CIPHER_INFO_OPENSSL = Object.create(null);\n{\n const keys = Object.keys(CIPHER_INFO);\n for (let i = 0; i < keys.length; ++i) {\n const cipherName = CIPHER_INFO[keys[i]].sslName;\n if (!cipherName || CIPHER_INFO_OPENSSL[cipherName])\n continue;\n CIPHER_INFO_OPENSSL[cipherName] = CIPHER_INFO[keys[i]];\n }\n}\n\nconst binaryKeyParser = makeBufferParser();\n\nfunction makePEM(type, data) {\n data = data.base64Slice(0, data.length);\n let formatted = data.replace(/.{64}/g, '$&\\n');\n if (data.length & 63)\n formatted += '\\n';\n return `-----BEGIN ${type} KEY-----\\n${formatted}-----END ${type} KEY-----`;\n}\n\nfunction combineBuffers(buf1, buf2) {\n const result = Buffer.allocUnsafe(buf1.length + buf2.length);\n result.set(buf1, 0);\n result.set(buf2, buf1.length);\n return result;\n}\n\nfunction skipFields(buf, nfields) {\n const bufLen = buf.length;\n let pos = (buf._pos || 0);\n for (let i = 0; i < nfields; ++i) {\n const left = (bufLen - pos);\n if (pos >= bufLen || left < 4)\n return false;\n const len = readUInt32BE(buf, pos);\n if (left < 4 + len)\n return false;\n pos += 4 + len;\n }\n buf._pos = pos;\n return true;\n}\n\nfunction genOpenSSLRSAPub(n, e) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.2.840.113549.1.1.1'); // rsaEncryption\n // algorithm parameters (RSA has none)\n asnWriter.writeNull();\n asnWriter.endSequence();\n\n // subjectPublicKey\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n asnWriter.startSequence();\n asnWriter.writeBuffer(n, Ber.Integer);\n asnWriter.writeBuffer(e, Ber.Integer);\n asnWriter.endSequence();\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('PUBLIC', asnWriter.buffer);\n}\n\nfunction genOpenSSHRSAPub(n, e) {\n const publicKey = Buffer.allocUnsafe(4 + 7 + 4 + e.length + 4 + n.length);\n\n writeUInt32BE(publicKey, 7, 0);\n publicKey.utf8Write('ssh-rsa', 4, 7);\n\n let i = 4 + 7;\n writeUInt32BE(publicKey, e.length, i);\n publicKey.set(e, i += 4);\n\n writeUInt32BE(publicKey, n.length, i += e.length);\n publicKey.set(n, i + 4);\n\n return publicKey;\n}\n\nconst genOpenSSLRSAPriv = (() => {\n function genRSAASN1Buf(n, e, d, p, q, dmp1, dmq1, iqmp) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n asnWriter.writeInt(0x00, Ber.Integer);\n asnWriter.writeBuffer(n, Ber.Integer);\n asnWriter.writeBuffer(e, Ber.Integer);\n asnWriter.writeBuffer(d, Ber.Integer);\n asnWriter.writeBuffer(p, Ber.Integer);\n asnWriter.writeBuffer(q, Ber.Integer);\n asnWriter.writeBuffer(dmp1, Ber.Integer);\n asnWriter.writeBuffer(dmq1, Ber.Integer);\n asnWriter.writeBuffer(iqmp, Ber.Integer);\n asnWriter.endSequence();\n return asnWriter.buffer;\n }\n\n function bigIntFromBuffer(buf) {\n return BigInt(`0x${buf.hexSlice(0, buf.length)}`);\n }\n\n function bigIntToBuffer(bn) {\n let hex = bn.toString(16);\n if ((hex.length & 1) !== 0) {\n hex = `0${hex}`;\n } else {\n const sigbit = hex.charCodeAt(0);\n // BER/DER integers require leading zero byte to denote a positive value\n // when first byte >= 0x80\n if (sigbit === 56/* '8' */\n || sigbit === 57/* '9' */\n || (sigbit >= 97/* 'a' */ && sigbit <= 102/* 'f' */)) {\n hex = `00${hex}`;\n }\n }\n return Buffer.from(hex, 'hex');\n }\n\n return function genOpenSSLRSAPriv(n, e, d, iqmp, p, q) {\n const bn_d = bigIntFromBuffer(d);\n const dmp1 = bigIntToBuffer(bn_d % (bigIntFromBuffer(p) - 1n));\n const dmq1 = bigIntToBuffer(bn_d % (bigIntFromBuffer(q) - 1n));\n return makePEM('RSA PRIVATE',\n genRSAASN1Buf(n, e, d, p, q, dmp1, dmq1, iqmp));\n };\n})();\n\nfunction genOpenSSLDSAPub(p, q, g, y) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.2.840.10040.4.1'); // id-dsa\n // algorithm parameters\n asnWriter.startSequence();\n asnWriter.writeBuffer(p, Ber.Integer);\n asnWriter.writeBuffer(q, Ber.Integer);\n asnWriter.writeBuffer(g, Ber.Integer);\n asnWriter.endSequence();\n asnWriter.endSequence();\n\n // subjectPublicKey\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n asnWriter.writeBuffer(y, Ber.Integer);\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('PUBLIC', asnWriter.buffer);\n}\n\nfunction genOpenSSHDSAPub(p, q, g, y) {\n const publicKey = Buffer.allocUnsafe(\n 4 + 7 + 4 + p.length + 4 + q.length + 4 + g.length + 4 + y.length\n );\n\n writeUInt32BE(publicKey, 7, 0);\n publicKey.utf8Write('ssh-dss', 4, 7);\n\n let i = 4 + 7;\n writeUInt32BE(publicKey, p.length, i);\n publicKey.set(p, i += 4);\n\n writeUInt32BE(publicKey, q.length, i += p.length);\n publicKey.set(q, i += 4);\n\n writeUInt32BE(publicKey, g.length, i += q.length);\n publicKey.set(g, i += 4);\n\n writeUInt32BE(publicKey, y.length, i += g.length);\n publicKey.set(y, i + 4);\n\n return publicKey;\n}\n\nfunction genOpenSSLDSAPriv(p, q, g, y, x) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n asnWriter.writeInt(0x00, Ber.Integer);\n asnWriter.writeBuffer(p, Ber.Integer);\n asnWriter.writeBuffer(q, Ber.Integer);\n asnWriter.writeBuffer(g, Ber.Integer);\n asnWriter.writeBuffer(y, Ber.Integer);\n asnWriter.writeBuffer(x, Ber.Integer);\n asnWriter.endSequence();\n return makePEM('DSA PRIVATE', asnWriter.buffer);\n}\n\nfunction genOpenSSLEdPub(pub) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.3.101.112'); // id-Ed25519\n asnWriter.endSequence();\n\n // PublicKey\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n // XXX: hack to write a raw buffer without a tag -- yuck\n asnWriter._ensure(pub.length);\n asnWriter._buf.set(pub, asnWriter._offset);\n asnWriter._offset += pub.length;\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('PUBLIC', asnWriter.buffer);\n}\n\nfunction genOpenSSHEdPub(pub) {\n const publicKey = Buffer.allocUnsafe(4 + 11 + 4 + pub.length);\n\n writeUInt32BE(publicKey, 11, 0);\n publicKey.utf8Write('ssh-ed25519', 4, 11);\n\n writeUInt32BE(publicKey, pub.length, 15);\n publicKey.set(pub, 19);\n\n return publicKey;\n}\n\nfunction genOpenSSLEdPriv(priv) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // version\n asnWriter.writeInt(0x00, Ber.Integer);\n\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.3.101.112'); // id-Ed25519\n asnWriter.endSequence();\n\n // PrivateKey\n asnWriter.startSequence(Ber.OctetString);\n asnWriter.writeBuffer(priv, Ber.OctetString);\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('PRIVATE', asnWriter.buffer);\n}\n\nfunction genOpenSSLECDSAPub(oid, Q) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.2.840.10045.2.1'); // id-ecPublicKey\n // algorithm parameters (namedCurve)\n asnWriter.writeOID(oid);\n asnWriter.endSequence();\n\n // subjectPublicKey\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n // XXX: hack to write a raw buffer without a tag -- yuck\n asnWriter._ensure(Q.length);\n asnWriter._buf.set(Q, asnWriter._offset);\n asnWriter._offset += Q.length;\n // end hack\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('PUBLIC', asnWriter.buffer);\n}\n\nfunction genOpenSSHECDSAPub(oid, Q) {\n let curveName;\n switch (oid) {\n case '1.2.840.10045.3.1.7':\n // prime256v1/secp256r1\n curveName = 'nistp256';\n break;\n case '1.3.132.0.34':\n // secp384r1\n curveName = 'nistp384';\n break;\n case '1.3.132.0.35':\n // secp521r1\n curveName = 'nistp521';\n break;\n default:\n return;\n }\n\n const publicKey = Buffer.allocUnsafe(4 + 19 + 4 + 8 + 4 + Q.length);\n\n writeUInt32BE(publicKey, 19, 0);\n publicKey.utf8Write(`ecdsa-sha2-${curveName}`, 4, 19);\n\n writeUInt32BE(publicKey, 8, 23);\n publicKey.utf8Write(curveName, 27, 8);\n\n writeUInt32BE(publicKey, Q.length, 35);\n publicKey.set(Q, 39);\n\n return publicKey;\n}\n\nfunction genOpenSSLECDSAPriv(oid, pub, priv) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // version\n asnWriter.writeInt(0x01, Ber.Integer);\n // privateKey\n asnWriter.writeBuffer(priv, Ber.OctetString);\n // parameters (optional)\n asnWriter.startSequence(0xA0);\n asnWriter.writeOID(oid);\n asnWriter.endSequence();\n // publicKey (optional)\n asnWriter.startSequence(0xA1);\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n // XXX: hack to write a raw buffer without a tag -- yuck\n asnWriter._ensure(pub.length);\n asnWriter._buf.set(pub, asnWriter._offset);\n asnWriter._offset += pub.length;\n // end hack\n asnWriter.endSequence();\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('EC PRIVATE', asnWriter.buffer);\n}\n\nfunction genOpenSSLECDSAPubFromPriv(curveName, priv) {\n const tempECDH = createECDH(curveName);\n tempECDH.setPrivateKey(priv);\n return tempECDH.getPublicKey();\n}\n\nconst BaseKey = {\n sign: (() => {\n if (typeof sign_ === 'function') {\n return function sign(data, algo) {\n const pem = this[SYM_PRIV_PEM];\n if (pem === null)\n return new Error('No private key available');\n if (!algo || typeof algo !== 'string')\n algo = this[SYM_HASH_ALGO];\n try {\n return sign_(algo, data, pem);\n } catch (ex) {\n return ex;\n }\n };\n }\n return function sign(data, algo) {\n const pem = this[SYM_PRIV_PEM];\n if (pem === null)\n return new Error('No private key available');\n if (!algo || typeof algo !== 'string')\n algo = this[SYM_HASH_ALGO];\n const signature = createSign(algo);\n signature.update(data);\n try {\n return signature.sign(pem);\n } catch (ex) {\n return ex;\n }\n };\n })(),\n verify: (() => {\n if (typeof verify_ === 'function') {\n return function verify(data, signature, algo) {\n const pem = this[SYM_PUB_PEM];\n if (pem === null)\n return new Error('No public key available');\n if (!algo || typeof algo !== 'string')\n algo = this[SYM_HASH_ALGO];\n try {\n return verify_(algo, data, pem, signature);\n } catch (ex) {\n return ex;\n }\n };\n }\n return function verify(data, signature, algo) {\n const pem = this[SYM_PUB_PEM];\n if (pem === null)\n return new Error('No public key available');\n if (!algo || typeof algo !== 'string')\n algo = this[SYM_HASH_ALGO];\n const verifier = createVerify(algo);\n verifier.update(data);\n try {\n return verifier.verify(pem, signature);\n } catch (ex) {\n return ex;\n }\n };\n })(),\n isPrivateKey: function isPrivateKey() {\n return (this[SYM_PRIV_PEM] !== null);\n },\n getPrivatePEM: function getPrivatePEM() {\n return this[SYM_PRIV_PEM];\n },\n getPublicPEM: function getPublicPEM() {\n return this[SYM_PUB_PEM];\n },\n getPublicSSH: function getPublicSSH() {\n return this[SYM_PUB_SSH];\n },\n equals: function equals(key) {\n const parsed = parseKey(key);\n if (parsed instanceof Error)\n return false;\n return (\n this.type === parsed.type\n && this[SYM_PRIV_PEM] === parsed[SYM_PRIV_PEM]\n && this[SYM_PUB_PEM] === parsed[SYM_PUB_PEM]\n && this[SYM_PUB_SSH].equals(parsed[SYM_PUB_SSH])\n );\n },\n};\n\n\nfunction OpenSSH_Private(type, comment, privPEM, pubPEM, pubSSH, algo,\n decrypted) {\n this.type = type;\n this.comment = comment;\n this[SYM_PRIV_PEM] = privPEM;\n this[SYM_PUB_PEM] = pubPEM;\n this[SYM_PUB_SSH] = pubSSH;\n this[SYM_HASH_ALGO] = algo;\n this[SYM_DECRYPTED] = decrypted;\n}\nOpenSSH_Private.prototype = BaseKey;\n{\n const regexp = /^-----BEGIN OPENSSH PRIVATE KEY-----(?:\\r\\n|\\n)([\\s\\S]+)(?:\\r\\n|\\n)-----END OPENSSH PRIVATE KEY-----$/;\n OpenSSH_Private.parse = (str, passphrase) => {\n const m = regexp.exec(str);\n if (m === null)\n return null;\n let ret;\n const data = Buffer.from(m[1], 'base64');\n if (data.length < 31) // magic (+ magic null term.) + minimum field lengths\n return new Error('Malformed OpenSSH private key');\n const magic = data.utf8Slice(0, 15);\n if (magic !== 'openssh-key-v1\\0')\n return new Error(`Unsupported OpenSSH key magic: ${magic}`);\n\n const cipherName = readString(data, 15, true);\n if (cipherName === undefined)\n return new Error('Malformed OpenSSH private key');\n if (cipherName !== 'none' && SUPPORTED_CIPHER.indexOf(cipherName) === -1)\n return new Error(`Unsupported cipher for OpenSSH key: ${cipherName}`);\n\n const kdfName = readString(data, data._pos, true);\n if (kdfName === undefined)\n return new Error('Malformed OpenSSH private key');\n if (kdfName !== 'none') {\n if (cipherName === 'none')\n return new Error('Malformed OpenSSH private key');\n if (kdfName !== 'bcrypt')\n return new Error(`Unsupported kdf name for OpenSSH key: ${kdfName}`);\n if (!passphrase) {\n return new Error(\n 'Encrypted private OpenSSH key detected, but no passphrase given'\n );\n }\n } else if (cipherName !== 'none') {\n return new Error('Malformed OpenSSH private key');\n }\n\n let encInfo;\n let cipherKey;\n let cipherIV;\n if (cipherName !== 'none')\n encInfo = CIPHER_INFO[cipherName];\n const kdfOptions = readString(data, data._pos);\n if (kdfOptions === undefined)\n return new Error('Malformed OpenSSH private key');\n if (kdfOptions.length) {\n switch (kdfName) {\n case 'none':\n return new Error('Malformed OpenSSH private key');\n case 'bcrypt': {\n /*\n string salt\n uint32 rounds\n */\n const salt = readString(kdfOptions, 0);\n if (salt === undefined || kdfOptions._pos + 4 > kdfOptions.length)\n return new Error('Malformed OpenSSH private key');\n const rounds = readUInt32BE(kdfOptions, kdfOptions._pos);\n const gen = Buffer.allocUnsafe(encInfo.keyLen + encInfo.ivLen);\n const r = bcrypt_pbkdf(passphrase,\n passphrase.length,\n salt,\n salt.length,\n gen,\n gen.length,\n rounds);\n if (r !== 0)\n return new Error('Failed to generate information to decrypt key');\n cipherKey = bufferSlice(gen, 0, encInfo.keyLen);\n cipherIV = bufferSlice(gen, encInfo.keyLen, gen.length);\n break;\n }\n }\n } else if (kdfName !== 'none') {\n return new Error('Malformed OpenSSH private key');\n }\n\n if (data._pos + 3 >= data.length)\n return new Error('Malformed OpenSSH private key');\n const keyCount = readUInt32BE(data, data._pos);\n data._pos += 4;\n\n if (keyCount > 0) {\n // TODO: place sensible limit on max `keyCount`\n\n // Read public keys first\n for (let i = 0; i < keyCount; ++i) {\n const pubData = readString(data, data._pos);\n if (pubData === undefined)\n return new Error('Malformed OpenSSH private key');\n const type = readString(pubData, 0, true);\n if (type === undefined)\n return new Error('Malformed OpenSSH private key');\n }\n\n let privBlob = readString(data, data._pos);\n if (privBlob === undefined)\n return new Error('Malformed OpenSSH private key');\n\n if (cipherKey !== undefined) {\n // Encrypted private key(s)\n if (privBlob.length < encInfo.blockLen\n || (privBlob.length % encInfo.blockLen) !== 0) {\n return new Error('Malformed OpenSSH private key');\n }\n try {\n const options = { authTagLength: encInfo.authLen };\n const decipher = createDecipheriv(encInfo.sslName,\n cipherKey,\n cipherIV,\n options);\n decipher.setAutoPadding(false);\n if (encInfo.authLen > 0) {\n if (data.length - data._pos < encInfo.authLen)\n return new Error('Malformed OpenSSH private key');\n decipher.setAuthTag(\n bufferSlice(data, data._pos, data._pos += encInfo.authLen)\n );\n }\n privBlob = combineBuffers(decipher.update(privBlob),\n decipher.final());\n } catch (ex) {\n return ex;\n }\n }\n // Nothing should we follow the private key(s), except a possible\n // authentication tag for relevant ciphers\n if (data._pos !== data.length)\n return new Error('Malformed OpenSSH private key');\n\n ret = parseOpenSSHPrivKeys(privBlob, keyCount, cipherKey !== undefined);\n } else {\n ret = [];\n }\n if (ret instanceof Error)\n return ret;\n // This will need to change if/when OpenSSH ever starts storing multiple\n // keys in their key files\n return ret[0];\n };\n\n function parseOpenSSHPrivKeys(data, nkeys, decrypted) {\n const keys = [];\n /*\n uint32 checkint\n uint32 checkint\n string privatekey1\n string comment1\n string privatekey2\n string comment2\n ...\n string privatekeyN\n string commentN\n char 1\n char 2\n char 3\n ...\n char padlen % 255\n */\n if (data.length < 8)\n return new Error('Malformed OpenSSH private key');\n const check1 = readUInt32BE(data, 0);\n const check2 = readUInt32BE(data, 4);\n if (check1 !== check2) {\n if (decrypted) {\n return new Error(\n 'OpenSSH key integrity check failed -- bad passphrase?'\n );\n }\n return new Error('OpenSSH key integrity check failed');\n }\n data._pos = 8;\n let i;\n let oid;\n for (i = 0; i < nkeys; ++i) {\n let algo;\n let privPEM;\n let pubPEM;\n let pubSSH;\n // The OpenSSH documentation for the key format actually lies, the\n // entirety of the private key content is not contained with a string\n // field, it's actually the literal contents of the private key, so to be\n // able to find the end of the key data you need to know the layout/format\n // of each key type ...\n const type = readString(data, data._pos, true);\n if (type === undefined)\n return new Error('Malformed OpenSSH private key');\n\n switch (type) {\n case 'ssh-rsa': {\n /*\n string n -- public\n string e -- public\n string d -- private\n string iqmp -- private\n string p -- private\n string q -- private\n */\n const n = readString(data, data._pos);\n if (n === undefined)\n return new Error('Malformed OpenSSH private key');\n const e = readString(data, data._pos);\n if (e === undefined)\n return new Error('Malformed OpenSSH private key');\n const d = readString(data, data._pos);\n if (d === undefined)\n return new Error('Malformed OpenSSH private key');\n const iqmp = readString(data, data._pos);\n if (iqmp === undefined)\n return new Error('Malformed OpenSSH private key');\n const p = readString(data, data._pos);\n if (p === undefined)\n return new Error('Malformed OpenSSH private key');\n const q = readString(data, data._pos);\n if (q === undefined)\n return new Error('Malformed OpenSSH private key');\n\n pubPEM = genOpenSSLRSAPub(n, e);\n pubSSH = genOpenSSHRSAPub(n, e);\n privPEM = genOpenSSLRSAPriv(n, e, d, iqmp, p, q);\n algo = 'sha1';\n break;\n }\n case 'ssh-dss': {\n /*\n string p -- public\n string q -- public\n string g -- public\n string y -- public\n string x -- private\n */\n const p = readString(data, data._pos);\n if (p === undefined)\n return new Error('Malformed OpenSSH private key');\n const q = readString(data, data._pos);\n if (q === undefined)\n return new Error('Malformed OpenSSH private key');\n const g = readString(data, data._pos);\n if (g === undefined)\n return new Error('Malformed OpenSSH private key');\n const y = readString(data, data._pos);\n if (y === undefined)\n return new Error('Malformed OpenSSH private key');\n const x = readString(data, data._pos);\n if (x === undefined)\n return new Error('Malformed OpenSSH private key');\n\n pubPEM = genOpenSSLDSAPub(p, q, g, y);\n pubSSH = genOpenSSHDSAPub(p, q, g, y);\n privPEM = genOpenSSLDSAPriv(p, q, g, y, x);\n algo = 'sha1';\n break;\n }\n case 'ssh-ed25519': {\n if (!eddsaSupported)\n return new Error(`Unsupported OpenSSH private key type: ${type}`);\n /*\n * string public key\n * string private key + public key\n */\n const edpub = readString(data, data._pos);\n if (edpub === undefined || edpub.length !== 32)\n return new Error('Malformed OpenSSH private key');\n const edpriv = readString(data, data._pos);\n if (edpriv === undefined || edpriv.length !== 64)\n return new Error('Malformed OpenSSH private key');\n\n pubPEM = genOpenSSLEdPub(edpub);\n pubSSH = genOpenSSHEdPub(edpub);\n privPEM = genOpenSSLEdPriv(bufferSlice(edpriv, 0, 32));\n algo = null;\n break;\n }\n case 'ecdsa-sha2-nistp256':\n algo = 'sha256';\n oid = '1.2.840.10045.3.1.7';\n // FALLTHROUGH\n case 'ecdsa-sha2-nistp384':\n if (algo === undefined) {\n algo = 'sha384';\n oid = '1.3.132.0.34';\n }\n // FALLTHROUGH\n case 'ecdsa-sha2-nistp521': {\n if (algo === undefined) {\n algo = 'sha512';\n oid = '1.3.132.0.35';\n }\n /*\n string curve name\n string Q -- public\n string d -- private\n */\n // TODO: validate curve name against type\n if (!skipFields(data, 1)) // Skip curve name\n return new Error('Malformed OpenSSH private key');\n const ecpub = readString(data, data._pos);\n if (ecpub === undefined)\n return new Error('Malformed OpenSSH private key');\n const ecpriv = readString(data, data._pos);\n if (ecpriv === undefined)\n return new Error('Malformed OpenSSH private key');\n\n pubPEM = genOpenSSLECDSAPub(oid, ecpub);\n pubSSH = genOpenSSHECDSAPub(oid, ecpub);\n privPEM = genOpenSSLECDSAPriv(oid, ecpub, ecpriv);\n break;\n }\n default:\n return new Error(`Unsupported OpenSSH private key type: ${type}`);\n }\n\n const privComment = readString(data, data._pos, true);\n if (privComment === undefined)\n return new Error('Malformed OpenSSH private key');\n\n keys.push(\n new OpenSSH_Private(type, privComment, privPEM, pubPEM, pubSSH, algo,\n decrypted)\n );\n }\n let cnt = 0;\n for (i = data._pos; i < data.length; ++i) {\n if (data[i] !== (++cnt % 255))\n return new Error('Malformed OpenSSH private key');\n }\n\n return keys;\n }\n}\n\n\nfunction OpenSSH_Old_Private(type, comment, privPEM, pubPEM, pubSSH, algo,\n decrypted) {\n this.type = type;\n this.comment = comment;\n this[SYM_PRIV_PEM] = privPEM;\n this[SYM_PUB_PEM] = pubPEM;\n this[SYM_PUB_SSH] = pubSSH;\n this[SYM_HASH_ALGO] = algo;\n this[SYM_DECRYPTED] = decrypted;\n}\nOpenSSH_Old_Private.prototype = BaseKey;\n{\n const regexp = /^-----BEGIN (RSA|DSA|EC) PRIVATE KEY-----(?:\\r\\n|\\n)((?:[^:]+:\\s*[\\S].*(?:\\r\\n|\\n))*)([\\s\\S]+)(?:\\r\\n|\\n)-----END (RSA|DSA|EC) PRIVATE KEY-----$/;\n OpenSSH_Old_Private.parse = (str, passphrase) => {\n const m = regexp.exec(str);\n if (m === null)\n return null;\n let privBlob = Buffer.from(m[3], 'base64');\n let headers = m[2];\n let decrypted = false;\n if (headers !== undefined) {\n // encrypted key\n headers = headers.split(/\\r\\n|\\n/g);\n for (let i = 0; i < headers.length; ++i) {\n const header = headers[i];\n let sepIdx = header.indexOf(':');\n if (header.slice(0, sepIdx) === 'DEK-Info') {\n const val = header.slice(sepIdx + 2);\n sepIdx = val.indexOf(',');\n if (sepIdx === -1)\n continue;\n const cipherName = val.slice(0, sepIdx).toLowerCase();\n if (supportedOpenSSLCiphers.indexOf(cipherName) === -1) {\n return new Error(\n `Cipher (${cipherName}) not supported `\n + 'for encrypted OpenSSH private key'\n );\n }\n const encInfo = CIPHER_INFO_OPENSSL[cipherName];\n if (!encInfo) {\n return new Error(\n `Cipher (${cipherName}) not supported `\n + 'for encrypted OpenSSH private key'\n );\n }\n const cipherIV = Buffer.from(val.slice(sepIdx + 1), 'hex');\n if (cipherIV.length !== encInfo.ivLen)\n return new Error('Malformed encrypted OpenSSH private key');\n if (!passphrase) {\n return new Error(\n 'Encrypted OpenSSH private key detected, but no passphrase given'\n );\n }\n const ivSlice = bufferSlice(cipherIV, 0, 8);\n let cipherKey = createHash('md5')\n .update(passphrase)\n .update(ivSlice)\n .digest();\n while (cipherKey.length < encInfo.keyLen) {\n cipherKey = combineBuffers(\n cipherKey,\n createHash('md5')\n .update(cipherKey)\n .update(passphrase)\n .update(ivSlice)\n .digest()\n );\n }\n if (cipherKey.length > encInfo.keyLen)\n cipherKey = bufferSlice(cipherKey, 0, encInfo.keyLen);\n try {\n const decipher = createDecipheriv(cipherName, cipherKey, cipherIV);\n decipher.setAutoPadding(false);\n privBlob = combineBuffers(decipher.update(privBlob),\n decipher.final());\n decrypted = true;\n } catch (ex) {\n return ex;\n }\n }\n }\n }\n\n let type;\n let privPEM;\n let pubPEM;\n let pubSSH;\n let algo;\n let reader;\n let errMsg = 'Malformed OpenSSH private key';\n if (decrypted)\n errMsg += '. Bad passphrase?';\n switch (m[1]) {\n case 'RSA':\n type = 'ssh-rsa';\n privPEM = makePEM('RSA PRIVATE', privBlob);\n try {\n reader = new Ber.Reader(privBlob);\n reader.readSequence();\n reader.readInt(); // skip version\n const n = reader.readString(Ber.Integer, true);\n if (n === null)\n return new Error(errMsg);\n const e = reader.readString(Ber.Integer, true);\n if (e === null)\n return new Error(errMsg);\n pubPEM = genOpenSSLRSAPub(n, e);\n pubSSH = genOpenSSHRSAPub(n, e);\n } catch {\n return new Error(errMsg);\n }\n algo = 'sha1';\n break;\n case 'DSA':\n type = 'ssh-dss';\n privPEM = makePEM('DSA PRIVATE', privBlob);\n try {\n reader = new Ber.Reader(privBlob);\n reader.readSequence();\n reader.readInt(); // skip version\n const p = reader.readString(Ber.Integer, true);\n if (p === null)\n return new Error(errMsg);\n const q = reader.readString(Ber.Integer, true);\n if (q === null)\n return new Error(errMsg);\n const g = reader.readString(Ber.Integer, true);\n if (g === null)\n return new Error(errMsg);\n const y = reader.readString(Ber.Integer, true);\n if (y === null)\n return new Error(errMsg);\n pubPEM = genOpenSSLDSAPub(p, q, g, y);\n pubSSH = genOpenSSHDSAPub(p, q, g, y);\n } catch {\n return new Error(errMsg);\n }\n algo = 'sha1';\n break;\n case 'EC': {\n let ecSSLName;\n let ecPriv;\n let ecOID;\n try {\n reader = new Ber.Reader(privBlob);\n reader.readSequence();\n reader.readInt(); // skip version\n ecPriv = reader.readString(Ber.OctetString, true);\n reader.readByte(); // Skip \"complex\" context type byte\n const offset = reader.readLength(); // Skip context length\n if (offset !== null) {\n reader._offset = offset;\n ecOID = reader.readOID();\n if (ecOID === null)\n return new Error(errMsg);\n switch (ecOID) {\n case '1.2.840.10045.3.1.7':\n // prime256v1/secp256r1\n ecSSLName = 'prime256v1';\n type = 'ecdsa-sha2-nistp256';\n algo = 'sha256';\n break;\n case '1.3.132.0.34':\n // secp384r1\n ecSSLName = 'secp384r1';\n type = 'ecdsa-sha2-nistp384';\n algo = 'sha384';\n break;\n case '1.3.132.0.35':\n // secp521r1\n ecSSLName = 'secp521r1';\n type = 'ecdsa-sha2-nistp521';\n algo = 'sha512';\n break;\n default:\n return new Error(`Unsupported private key EC OID: ${ecOID}`);\n }\n } else {\n return new Error(errMsg);\n }\n } catch {\n return new Error(errMsg);\n }\n privPEM = makePEM('EC PRIVATE', privBlob);\n const pubBlob = genOpenSSLECDSAPubFromPriv(ecSSLName, ecPriv);\n pubPEM = genOpenSSLECDSAPub(ecOID, pubBlob);\n pubSSH = genOpenSSHECDSAPub(ecOID, pubBlob);\n break;\n }\n }\n\n return new OpenSSH_Old_Private(type, '', privPEM, pubPEM, pubSSH, algo,\n decrypted);\n };\n}\n\n\nfunction PPK_Private(type, comment, privPEM, pubPEM, pubSSH, algo, decrypted) {\n this.type = type;\n this.comment = comment;\n this[SYM_PRIV_PEM] = privPEM;\n this[SYM_PUB_PEM] = pubPEM;\n this[SYM_PUB_SSH] = pubSSH;\n this[SYM_HASH_ALGO] = algo;\n this[SYM_DECRYPTED] = decrypted;\n}\nPPK_Private.prototype = BaseKey;\n{\n const EMPTY_PASSPHRASE = Buffer.alloc(0);\n const PPK_IV = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n const PPK_PP1 = Buffer.from([0, 0, 0, 0]);\n const PPK_PP2 = Buffer.from([0, 0, 0, 1]);\n const regexp = /^PuTTY-User-Key-File-2: (ssh-(?:rsa|dss))\\r?\\nEncryption: (aes256-cbc|none)\\r?\\nComment: ([^\\r\\n]*)\\r?\\nPublic-Lines: \\d+\\r?\\n([\\s\\S]+?)\\r?\\nPrivate-Lines: \\d+\\r?\\n([\\s\\S]+?)\\r?\\nPrivate-MAC: ([^\\r\\n]+)/;\n PPK_Private.parse = (str, passphrase) => {\n const m = regexp.exec(str);\n if (m === null)\n return null;\n // m[1] = key type\n // m[2] = encryption type\n // m[3] = comment\n // m[4] = base64-encoded public key data:\n // for \"ssh-rsa\":\n // string \"ssh-rsa\"\n // mpint e (public exponent)\n // mpint n (modulus)\n // for \"ssh-dss\":\n // string \"ssh-dss\"\n // mpint p (modulus)\n // mpint q (prime)\n // mpint g (base number)\n // mpint y (public key parameter: g^x mod p)\n // m[5] = base64-encoded private key data:\n // for \"ssh-rsa\":\n // mpint d (private exponent)\n // mpint p (prime 1)\n // mpint q (prime 2)\n // mpint iqmp ([inverse of q] mod p)\n // for \"ssh-dss\":\n // mpint x (private key parameter)\n // m[6] = SHA1 HMAC over:\n // string name of algorithm (\"ssh-dss\", \"ssh-rsa\")\n // string encryption type\n // string comment\n // string public key data\n // string private-plaintext (including the final padding)\n const cipherName = m[2];\n const encrypted = (cipherName !== 'none');\n if (encrypted && !passphrase) {\n return new Error(\n 'Encrypted PPK private key detected, but no passphrase given'\n );\n }\n\n let privBlob = Buffer.from(m[5], 'base64');\n\n if (encrypted) {\n const encInfo = CIPHER_INFO[cipherName];\n let cipherKey = combineBuffers(\n createHash('sha1').update(PPK_PP1).update(passphrase).digest(),\n createHash('sha1').update(PPK_PP2).update(passphrase).digest()\n );\n if (cipherKey.length > encInfo.keyLen)\n cipherKey = bufferSlice(cipherKey, 0, encInfo.keyLen);\n try {\n const decipher = createDecipheriv(encInfo.sslName, cipherKey, PPK_IV);\n decipher.setAutoPadding(false);\n privBlob = combineBuffers(decipher.update(privBlob),\n decipher.final());\n } catch (ex) {\n return ex;\n }\n }\n\n const type = m[1];\n const comment = m[3];\n const pubBlob = Buffer.from(m[4], 'base64');\n\n const mac = m[6];\n const typeLen = type.length;\n const cipherNameLen = cipherName.length;\n const commentLen = Buffer.byteLength(comment);\n const pubLen = pubBlob.length;\n const privLen = privBlob.length;\n const macData = Buffer.allocUnsafe(4 + typeLen\n + 4 + cipherNameLen\n + 4 + commentLen\n + 4 + pubLen\n + 4 + privLen);\n let p = 0;\n\n writeUInt32BE(macData, typeLen, p);\n macData.utf8Write(type, p += 4, typeLen);\n writeUInt32BE(macData, cipherNameLen, p += typeLen);\n macData.utf8Write(cipherName, p += 4, cipherNameLen);\n writeUInt32BE(macData, commentLen, p += cipherNameLen);\n macData.utf8Write(comment, p += 4, commentLen);\n writeUInt32BE(macData, pubLen, p += commentLen);\n macData.set(pubBlob, p += 4);\n writeUInt32BE(macData, privLen, p += pubLen);\n macData.set(privBlob, p + 4);\n\n if (!passphrase)\n passphrase = EMPTY_PASSPHRASE;\n\n const calcMAC = createHmac(\n 'sha1',\n createHash('sha1')\n .update('putty-private-key-file-mac-key')\n .update(passphrase)\n .digest()\n ).update(macData).digest('hex');\n\n if (calcMAC !== mac) {\n if (encrypted) {\n return new Error(\n 'PPK private key integrity check failed -- bad passphrase?'\n );\n }\n return new Error('PPK private key integrity check failed');\n }\n\n let pubPEM;\n let pubSSH;\n let privPEM;\n pubBlob._pos = 0;\n skipFields(pubBlob, 1); // skip (duplicate) key type\n switch (type) {\n case 'ssh-rsa': {\n const e = readString(pubBlob, pubBlob._pos);\n if (e === undefined)\n return new Error('Malformed PPK public key');\n const n = readString(pubBlob, pubBlob._pos);\n if (n === undefined)\n return new Error('Malformed PPK public key');\n const d = readString(privBlob, 0);\n if (d === undefined)\n return new Error('Malformed PPK private key');\n const p = readString(privBlob, privBlob._pos);\n if (p === undefined)\n return new Error('Malformed PPK private key');\n const q = readString(privBlob, privBlob._pos);\n if (q === undefined)\n return new Error('Malformed PPK private key');\n const iqmp = readString(privBlob, privBlob._pos);\n if (iqmp === undefined)\n return new Error('Malformed PPK private key');\n pubPEM = genOpenSSLRSAPub(n, e);\n pubSSH = genOpenSSHRSAPub(n, e);\n privPEM = genOpenSSLRSAPriv(n, e, d, iqmp, p, q);\n break;\n }\n case 'ssh-dss': {\n const p = readString(pubBlob, pubBlob._pos);\n if (p === undefined)\n return new Error('Malformed PPK public key');\n const q = readString(pubBlob, pubBlob._pos);\n if (q === undefined)\n return new Error('Malformed PPK public key');\n const g = readString(pubBlob, pubBlob._pos);\n if (g === undefined)\n return new Error('Malformed PPK public key');\n const y = readString(pubBlob, pubBlob._pos);\n if (y === undefined)\n return new Error('Malformed PPK public key');\n const x = readString(privBlob, 0);\n if (x === undefined)\n return new Error('Malformed PPK private key');\n\n pubPEM = genOpenSSLDSAPub(p, q, g, y);\n pubSSH = genOpenSSHDSAPub(p, q, g, y);\n privPEM = genOpenSSLDSAPriv(p, q, g, y, x);\n break;\n }\n }\n\n return new PPK_Private(type, comment, privPEM, pubPEM, pubSSH, 'sha1',\n encrypted);\n };\n}\n\n\nfunction OpenSSH_Public(type, comment, pubPEM, pubSSH, algo) {\n this.type = type;\n this.comment = comment;\n this[SYM_PRIV_PEM] = null;\n this[SYM_PUB_PEM] = pubPEM;\n this[SYM_PUB_SSH] = pubSSH;\n this[SYM_HASH_ALGO] = algo;\n this[SYM_DECRYPTED] = false;\n}\nOpenSSH_Public.prototype = BaseKey;\n{\n let regexp;\n if (eddsaSupported)\n regexp = /^(((?:ssh-(?:rsa|dss|ed25519))|ecdsa-sha2-nistp(?:256|384|521))(?:-cert-v0[01]@openssh.com)?) ([A-Z0-9a-z/+=]+)(?:$|\\s+([\\S].*)?)$/;\n else\n regexp = /^(((?:ssh-(?:rsa|dss))|ecdsa-sha2-nistp(?:256|384|521))(?:-cert-v0[01]@openssh.com)?) ([A-Z0-9a-z/+=]+)(?:$|\\s+([\\S].*)?)$/;\n OpenSSH_Public.parse = (str) => {\n const m = regexp.exec(str);\n if (m === null)\n return null;\n // m[1] = full type\n // m[2] = base type\n // m[3] = base64-encoded public key\n // m[4] = comment\n\n const fullType = m[1];\n const baseType = m[2];\n const data = Buffer.from(m[3], 'base64');\n const comment = (m[4] || '');\n\n const type = readString(data, data._pos, true);\n if (type === undefined || type.indexOf(baseType) !== 0)\n return new Error('Malformed OpenSSH public key');\n\n return parseDER(data, baseType, comment, fullType);\n };\n}\n\n\nfunction RFC4716_Public(type, comment, pubPEM, pubSSH, algo) {\n this.type = type;\n this.comment = comment;\n this[SYM_PRIV_PEM] = null;\n this[SYM_PUB_PEM] = pubPEM;\n this[SYM_PUB_SSH] = pubSSH;\n this[SYM_HASH_ALGO] = algo;\n this[SYM_DECRYPTED] = false;\n}\nRFC4716_Public.prototype = BaseKey;\n{\n const regexp = /^---- BEGIN SSH2 PUBLIC KEY ----(?:\\r?\\n)((?:.{0,72}\\r?\\n)+)---- END SSH2 PUBLIC KEY ----$/;\n const RE_DATA = /^[A-Z0-9a-z/+=\\r\\n]+$/;\n const RE_HEADER = /^([\\x21-\\x39\\x3B-\\x7E]{1,64}): ((?:[^\\\\]*\\\\\\r?\\n)*[^\\r\\n]+)\\r?\\n/gm;\n const RE_HEADER_ENDS = /\\\\\\r?\\n/g;\n RFC4716_Public.parse = (str) => {\n let m = regexp.exec(str);\n if (m === null)\n return null;\n\n const body = m[1];\n let dataStart = 0;\n let comment = '';\n\n while (m = RE_HEADER.exec(body)) {\n const headerName = m[1];\n const headerValue = m[2].replace(RE_HEADER_ENDS, '');\n if (headerValue.length > 1024) {\n RE_HEADER.lastIndex = 0;\n return new Error('Malformed RFC4716 public key');\n }\n\n dataStart = RE_HEADER.lastIndex;\n\n if (headerName.toLowerCase() === 'comment') {\n comment = headerValue;\n if (comment.length > 1\n && comment.charCodeAt(0) === 34/* '\"' */\n && comment.charCodeAt(comment.length - 1) === 34/* '\"' */) {\n comment = comment.slice(1, -1);\n }\n }\n }\n\n let data = body.slice(dataStart);\n if (!RE_DATA.test(data))\n return new Error('Malformed RFC4716 public key');\n\n data = Buffer.from(data, 'base64');\n\n const type = readString(data, 0, true);\n if (type === undefined)\n return new Error('Malformed RFC4716 public key');\n\n let pubPEM = null;\n let pubSSH = null;\n switch (type) {\n case 'ssh-rsa': {\n const e = readString(data, data._pos);\n if (e === undefined)\n return new Error('Malformed RFC4716 public key');\n const n = readString(data, data._pos);\n if (n === undefined)\n return new Error('Malformed RFC4716 public key');\n pubPEM = genOpenSSLRSAPub(n, e);\n pubSSH = genOpenSSHRSAPub(n, e);\n break;\n }\n case 'ssh-dss': {\n const p = readString(data, data._pos);\n if (p === undefined)\n return new Error('Malformed RFC4716 public key');\n const q = readString(data, data._pos);\n if (q === undefined)\n return new Error('Malformed RFC4716 public key');\n const g = readString(data, data._pos);\n if (g === undefined)\n return new Error('Malformed RFC4716 public key');\n const y = readString(data, data._pos);\n if (y === undefined)\n return new Error('Malformed RFC4716 public key');\n pubPEM = genOpenSSLDSAPub(p, q, g, y);\n pubSSH = genOpenSSHDSAPub(p, q, g, y);\n break;\n }\n default:\n return new Error('Malformed RFC4716 public key');\n }\n\n return new RFC4716_Public(type, comment, pubPEM, pubSSH, 'sha1');\n };\n}\n\n\nfunction parseDER(data, baseType, comment, fullType) {\n if (!isSupportedKeyType(baseType))\n return new Error(`Unsupported OpenSSH public key type: ${baseType}`);\n\n let algo;\n let oid;\n let pubPEM = null;\n let pubSSH = null;\n\n switch (baseType) {\n case 'ssh-rsa': {\n const e = readString(data, data._pos || 0);\n if (e === undefined)\n return new Error('Malformed OpenSSH public key');\n const n = readString(data, data._pos);\n if (n === undefined)\n return new Error('Malformed OpenSSH public key');\n pubPEM = genOpenSSLRSAPub(n, e);\n pubSSH = genOpenSSHRSAPub(n, e);\n algo = 'sha1';\n break;\n }\n case 'ssh-dss': {\n const p = readString(data, data._pos || 0);\n if (p === undefined)\n return new Error('Malformed OpenSSH public key');\n const q = readString(data, data._pos);\n if (q === undefined)\n return new Error('Malformed OpenSSH public key');\n const g = readString(data, data._pos);\n if (g === undefined)\n return new Error('Malformed OpenSSH public key');\n const y = readString(data, data._pos);\n if (y === undefined)\n return new Error('Malformed OpenSSH public key');\n pubPEM = genOpenSSLDSAPub(p, q, g, y);\n pubSSH = genOpenSSHDSAPub(p, q, g, y);\n algo = 'sha1';\n break;\n }\n case 'ssh-ed25519': {\n const edpub = readString(data, data._pos || 0);\n if (edpub === undefined || edpub.length !== 32)\n return new Error('Malformed OpenSSH public key');\n pubPEM = genOpenSSLEdPub(edpub);\n pubSSH = genOpenSSHEdPub(edpub);\n algo = null;\n break;\n }\n case 'ecdsa-sha2-nistp256':\n algo = 'sha256';\n oid = '1.2.840.10045.3.1.7';\n // FALLTHROUGH\n case 'ecdsa-sha2-nistp384':\n if (algo === undefined) {\n algo = 'sha384';\n oid = '1.3.132.0.34';\n }\n // FALLTHROUGH\n case 'ecdsa-sha2-nistp521': {\n if (algo === undefined) {\n algo = 'sha512';\n oid = '1.3.132.0.35';\n }\n // TODO: validate curve name against type\n if (!skipFields(data, 1)) // Skip curve name\n return new Error('Malformed OpenSSH public key');\n const ecpub = readString(data, data._pos || 0);\n if (ecpub === undefined)\n return new Error('Malformed OpenSSH public key');\n pubPEM = genOpenSSLECDSAPub(oid, ecpub);\n pubSSH = genOpenSSHECDSAPub(oid, ecpub);\n break;\n }\n default:\n return new Error(`Unsupported OpenSSH public key type: ${baseType}`);\n }\n\n return new OpenSSH_Public(fullType, comment, pubPEM, pubSSH, algo);\n}\n\nfunction isSupportedKeyType(type) {\n switch (type) {\n case 'ssh-rsa':\n case 'ssh-dss':\n case 'ecdsa-sha2-nistp256':\n case 'ecdsa-sha2-nistp384':\n case 'ecdsa-sha2-nistp521':\n return true;\n case 'ssh-ed25519':\n if (eddsaSupported)\n return true;\n // FALLTHROUGH\n default:\n return false;\n }\n}\n\nfunction isParsedKey(val) {\n if (!val)\n return false;\n return (typeof val[SYM_DECRYPTED] === 'boolean');\n}\n\nfunction parseKey(data, passphrase) {\n if (isParsedKey(data))\n return data;\n\n let origBuffer;\n if (Buffer.isBuffer(data)) {\n origBuffer = data;\n data = data.utf8Slice(0, data.length).trim();\n } else if (typeof data === 'string') {\n data = data.trim();\n } else {\n return new Error('Key data must be a Buffer or string');\n }\n\n // eslint-disable-next-line eqeqeq\n if (passphrase != undefined) {\n if (typeof passphrase === 'string')\n passphrase = Buffer.from(passphrase);\n else if (!Buffer.isBuffer(passphrase))\n return new Error('Passphrase must be a string or Buffer when supplied');\n }\n\n let ret;\n\n // First try as printable string format (e.g. PEM)\n\n // Private keys\n if ((ret = OpenSSH_Private.parse(data, passphrase)) !== null)\n return ret;\n if ((ret = OpenSSH_Old_Private.parse(data, passphrase)) !== null)\n return ret;\n if ((ret = PPK_Private.parse(data, passphrase)) !== null)\n return ret;\n\n // Public keys\n if ((ret = OpenSSH_Public.parse(data)) !== null)\n return ret;\n if ((ret = RFC4716_Public.parse(data)) !== null)\n return ret;\n\n // Finally try as a binary format if we were originally passed binary data\n if (origBuffer) {\n binaryKeyParser.init(origBuffer, 0);\n const type = binaryKeyParser.readString(true);\n if (type !== undefined) {\n data = binaryKeyParser.readRaw();\n if (data !== undefined) {\n ret = parseDER(data, type, '', type);\n // Ignore potentially useless errors in case the data was not actually\n // in the binary format\n if (ret instanceof Error)\n ret = null;\n }\n }\n binaryKeyParser.clear();\n }\n\n if (ret)\n return ret;\n\n return new Error('Unsupported key format');\n}\n\nmodule.exports = {\n isParsedKey,\n isSupportedKeyType,\n parseDERKey: (data, type) => parseDER(data, type, '', type),\n parseKey,\n};\n", "'use strict';\n\nconst { Socket } = require('net');\nconst { Duplex } = require('stream');\nconst { resolve } = require('path');\nconst { readFile } = require('fs');\nconst { execFile, spawn } = require('child_process');\n\nconst { isParsedKey, parseKey } = require('./protocol/keyParser.js');\n\nconst {\n makeBufferParser,\n readUInt32BE,\n writeUInt32BE,\n writeUInt32LE,\n} = require('./protocol/utils.js');\n\nfunction once(cb) {\n let called = false;\n return (...args) => {\n if (called)\n return;\n called = true;\n cb(...args);\n };\n}\n\nfunction concat(buf1, buf2) {\n const combined = Buffer.allocUnsafe(buf1.length + buf2.length);\n buf1.copy(combined, 0);\n buf2.copy(combined, buf1.length);\n return combined;\n}\n\nfunction noop() {}\n\nconst EMPTY_BUF = Buffer.alloc(0);\n\nconst binaryParser = makeBufferParser();\n\nclass BaseAgent {\n getIdentities(cb) {\n cb(new Error('Missing getIdentities() implementation'));\n }\n sign(pubKey, data, options, cb) {\n if (typeof options === 'function')\n cb = options;\n cb(new Error('Missing sign() implementation'));\n }\n}\n\nclass OpenSSHAgent extends BaseAgent {\n constructor(socketPath) {\n super();\n this.socketPath = socketPath;\n }\n\n getStream(cb) {\n cb = once(cb);\n const sock = new Socket();\n sock.on('connect', () => {\n cb(null, sock);\n });\n sock.on('close', onFail)\n .on('end', onFail)\n .on('error', onFail);\n sock.connect(this.socketPath);\n\n function onFail() {\n try {\n sock.destroy();\n } catch {}\n\n cb(new Error('Failed to connect to agent'));\n }\n }\n\n getIdentities(cb) {\n cb = once(cb);\n this.getStream((err, stream) => {\n function onFail(err) {\n if (stream) {\n try {\n stream.destroy();\n } catch {}\n }\n if (!err)\n err = new Error('Failed to retrieve identities from agent');\n cb(err);\n }\n\n if (err)\n return onFail(err);\n\n const protocol = new AgentProtocol(true);\n protocol.on('error', onFail);\n protocol.pipe(stream).pipe(protocol);\n\n stream.on('close', onFail)\n .on('end', onFail)\n .on('error', onFail);\n\n protocol.getIdentities((err, keys) => {\n if (err)\n return onFail(err);\n try {\n stream.destroy();\n } catch {}\n cb(null, keys);\n });\n });\n }\n\n sign(pubKey, data, options, cb) {\n if (typeof options === 'function') {\n cb = options;\n options = undefined;\n } else if (typeof options !== 'object' || options === null) {\n options = undefined;\n }\n\n cb = once(cb);\n this.getStream((err, stream) => {\n function onFail(err) {\n if (stream) {\n try {\n stream.destroy();\n } catch {}\n }\n if (!err)\n err = new Error('Failed to sign data with agent');\n cb(err);\n }\n\n if (err)\n return onFail(err);\n\n const protocol = new AgentProtocol(true);\n protocol.on('error', onFail);\n protocol.pipe(stream).pipe(protocol);\n\n stream.on('close', onFail)\n .on('end', onFail)\n .on('error', onFail);\n\n protocol.sign(pubKey, data, options, (err, sig) => {\n if (err)\n return onFail(err);\n\n try {\n stream.destroy();\n } catch {}\n\n cb(null, sig);\n });\n });\n }\n}\n\nconst PageantAgent = (() => {\n const RET_ERR_BADARGS = 10;\n const RET_ERR_UNAVAILABLE = 11;\n const RET_ERR_NOMAP = 12;\n const RET_ERR_BINSTDIN = 13;\n const RET_ERR_BINSTDOUT = 14;\n const RET_ERR_BADLEN = 15;\n\n const EXEPATH = resolve(__dirname, '..', 'util/pagent.exe');\n const ERROR = {\n [RET_ERR_BADARGS]: new Error('Invalid pagent.exe arguments'),\n [RET_ERR_UNAVAILABLE]: new Error('Pageant is not running'),\n [RET_ERR_NOMAP]: new Error('pagent.exe could not create an mmap'),\n [RET_ERR_BINSTDIN]: new Error('pagent.exe could not set mode for stdin'),\n [RET_ERR_BINSTDOUT]: new Error('pagent.exe could not set mode for stdout'),\n [RET_ERR_BADLEN]:\n new Error('pagent.exe did not get expected input payload'),\n };\n\n function destroy(stream) {\n stream.buffer = null;\n if (stream.proc) {\n stream.proc.kill();\n stream.proc = undefined;\n }\n }\n\n class PageantSocket extends Duplex {\n constructor() {\n super();\n this.proc = undefined;\n this.buffer = null;\n }\n _read(n) {}\n _write(data, encoding, cb) {\n if (this.buffer === null) {\n this.buffer = data;\n } else {\n const newBuffer = Buffer.allocUnsafe(this.buffer.length + data.length);\n this.buffer.copy(newBuffer, 0);\n data.copy(newBuffer, this.buffer.length);\n this.buffer = newBuffer;\n }\n // Wait for at least all length bytes\n if (this.buffer.length < 4)\n return cb();\n\n const len = readUInt32BE(this.buffer, 0);\n // Make sure we have a full message before querying pageant\n if ((this.buffer.length - 4) < len)\n return cb();\n\n data = this.buffer.slice(0, 4 + len);\n if (this.buffer.length > (4 + len))\n return cb(new Error('Unexpected multiple agent requests'));\n this.buffer = null;\n\n let error;\n const proc = this.proc = spawn(EXEPATH, [ data.length ]);\n proc.stdout.on('data', (data) => {\n this.push(data);\n });\n proc.on('error', (err) => {\n error = err;\n cb(error);\n });\n proc.on('close', (code) => {\n this.proc = undefined;\n if (!error) {\n if (error = ERROR[code])\n return cb(error);\n cb();\n }\n });\n proc.stdin.end(data);\n }\n _final(cb) {\n destroy(this);\n cb();\n }\n _destroy(err, cb) {\n destroy(this);\n cb();\n }\n }\n\n return class PageantAgent extends OpenSSHAgent {\n getStream(cb) {\n cb(null, new PageantSocket());\n }\n };\n})();\n\nconst CygwinAgent = (() => {\n const RE_CYGWIN_SOCK = /^!<socket >(\\d+) s ([A-Z0-9]{8}-[A-Z0-9]{8}-[A-Z0-9]{8}-[A-Z0-9]{8})/;\n\n return class CygwinAgent extends OpenSSHAgent {\n getStream(cb) {\n cb = once(cb);\n\n // The cygwin ssh-agent connection process looks like this:\n // 1. Read the \"socket\" as a file to get the underlying TCP port and a\n // special \"secret\" that must be sent to the TCP server.\n // 2. Connect to the server listening on localhost at the TCP port.\n // 3. Send the \"secret\" to the server.\n // 4. The server sends back the same \"secret\".\n // 5. Send three 32-bit integer values of zero. This is ordinarily the\n // pid, uid, and gid of this process, but cygwin will actually\n // send us the correct values as a response.\n // 6. The server sends back the pid, uid, gid.\n // 7. Disconnect.\n // 8. Repeat steps 2-6, except send the received pid, uid, and gid in\n // step 5 instead of zeroes.\n // 9. Connection is ready to be used.\n\n let socketPath = this.socketPath;\n let triedCygpath = false;\n readFile(socketPath, function readCygsocket(err, data) {\n if (err) {\n if (triedCygpath)\n return cb(new Error('Invalid cygwin unix socket path'));\n\n // Try using `cygpath` to convert a possible *nix-style path to the\n // real Windows path before giving up ...\n execFile('cygpath', ['-w', socketPath], (err, stdout, stderr) => {\n if (err || stdout.length === 0)\n return cb(new Error('Invalid cygwin unix socket path'));\n\n triedCygpath = true;\n socketPath = stdout.toString().replace(/[\\r\\n]/g, '');\n readFile(socketPath, readCygsocket);\n });\n return;\n }\n\n const m = RE_CYGWIN_SOCK.exec(data.toString('ascii'));\n if (!m)\n return cb(new Error('Malformed cygwin unix socket file'));\n\n let state;\n let bc = 0;\n let isRetrying = false;\n const inBuf = [];\n let sock;\n\n // Use 0 for pid, uid, and gid to ensure we get an error and also\n // a valid uid and gid from cygwin so that we don't have to figure it\n // out ourselves\n let credsBuf = Buffer.alloc(12);\n\n // Parse cygwin unix socket file contents\n const port = parseInt(m[1], 10);\n const secret = m[2].replace(/-/g, '');\n const secretBuf = Buffer.allocUnsafe(16);\n for (let i = 0, j = 0; j < 32; ++i, j += 2)\n secretBuf[i] = parseInt(secret.substring(j, j + 2), 16);\n\n // Convert to host order (always LE for Windows)\n for (let i = 0; i < 16; i += 4)\n writeUInt32LE(secretBuf, readUInt32BE(secretBuf, i), i);\n\n tryConnect();\n\n function _onconnect() {\n bc = 0;\n state = 'secret';\n sock.write(secretBuf);\n }\n\n function _ondata(data) {\n bc += data.length;\n\n if (state === 'secret') {\n // The secret we sent is echoed back to us by cygwin, not sure of\n // the reason for that, but we ignore it nonetheless ...\n if (bc === 16) {\n bc = 0;\n state = 'creds';\n sock.write(credsBuf);\n }\n return;\n }\n\n if (state === 'creds') {\n // If this is the first attempt, make sure to gather the valid\n // uid and gid for our next attempt\n if (!isRetrying)\n inBuf.push(data);\n\n if (bc === 12) {\n sock.removeListener('connect', _onconnect);\n sock.removeListener('data', _ondata);\n sock.removeListener('error', onFail);\n sock.removeListener('end', onFail);\n sock.removeListener('close', onFail);\n\n if (isRetrying)\n return cb(null, sock);\n\n isRetrying = true;\n credsBuf = Buffer.concat(inBuf);\n writeUInt32LE(credsBuf, process.pid, 0);\n sock.on('error', () => {});\n sock.destroy();\n\n tryConnect();\n }\n }\n }\n\n function onFail() {\n cb(new Error('Problem negotiating cygwin unix socket security'));\n }\n\n function tryConnect() {\n sock = new Socket();\n sock.on('connect', _onconnect);\n sock.on('data', _ondata);\n sock.on('error', onFail);\n sock.on('end', onFail);\n sock.on('close', onFail);\n sock.connect(port);\n }\n });\n }\n };\n})();\n\n// Format of `//./pipe/ANYTHING`, with forward slashes and backward slashes\n// being interchangeable\nconst WINDOWS_PIPE_REGEX = /^[/\\\\][/\\\\]\\.[/\\\\]pipe[/\\\\].+/;\nfunction createAgent(path) {\n if (process.platform === 'win32' && !WINDOWS_PIPE_REGEX.test(path)) {\n return (path === 'pageant'\n ? new PageantAgent()\n : new CygwinAgent(path));\n }\n return new OpenSSHAgent(path);\n}\n\nconst AgentProtocol = (() => {\n // Client->Server messages\n const SSH_AGENTC_REQUEST_IDENTITIES = 11;\n const SSH_AGENTC_SIGN_REQUEST = 13;\n // const SSH_AGENTC_ADD_IDENTITY = 17;\n // const SSH_AGENTC_REMOVE_IDENTITY = 18;\n // const SSH_AGENTC_REMOVE_ALL_IDENTITIES = 19;\n // const SSH_AGENTC_ADD_SMARTCARD_KEY = 20;\n // const SSH_AGENTC_REMOVE_SMARTCARD_KEY = 21;\n // const SSH_AGENTC_LOCK = 22;\n // const SSH_AGENTC_UNLOCK = 23;\n // const SSH_AGENTC_ADD_ID_CONSTRAINED = 25;\n // const SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED = 26;\n // const SSH_AGENTC_EXTENSION = 27;\n // Server->Client messages\n const SSH_AGENT_FAILURE = 5;\n // const SSH_AGENT_SUCCESS = 6;\n const SSH_AGENT_IDENTITIES_ANSWER = 12;\n const SSH_AGENT_SIGN_RESPONSE = 14;\n // const SSH_AGENT_EXTENSION_FAILURE = 28;\n\n // const SSH_AGENT_CONSTRAIN_LIFETIME = 1;\n // const SSH_AGENT_CONSTRAIN_CONFIRM = 2;\n // const SSH_AGENT_CONSTRAIN_EXTENSION = 255;\n\n const SSH_AGENT_RSA_SHA2_256 = (1 << 1);\n const SSH_AGENT_RSA_SHA2_512 = (1 << 2);\n\n const ROLE_CLIENT = 0;\n const ROLE_SERVER = 1;\n\n // Ensures that responses get sent back in the same order the requests were\n // received\n function processResponses(protocol) {\n let ret;\n while (protocol[SYM_REQS].length) {\n const nextResponse = protocol[SYM_REQS][0][SYM_RESP];\n if (nextResponse === undefined)\n break;\n\n protocol[SYM_REQS].shift();\n ret = protocol.push(nextResponse);\n }\n return ret;\n }\n\n const SYM_TYPE = Symbol('Inbound Request Type');\n const SYM_RESP = Symbol('Inbound Request Response');\n const SYM_CTX = Symbol('Inbound Request Context');\n class AgentInboundRequest {\n constructor(type, ctx) {\n this[SYM_TYPE] = type;\n this[SYM_RESP] = undefined;\n this[SYM_CTX] = ctx;\n }\n hasResponded() {\n return (this[SYM_RESP] !== undefined);\n }\n getType() {\n return this[SYM_TYPE];\n }\n getContext() {\n return this[SYM_CTX];\n }\n }\n function respond(protocol, req, data) {\n req[SYM_RESP] = data;\n return processResponses(protocol);\n }\n\n function cleanup(protocol) {\n protocol[SYM_BUFFER] = null;\n if (protocol[SYM_MODE] === ROLE_CLIENT) {\n const reqs = protocol[SYM_REQS];\n if (reqs && reqs.length) {\n protocol[SYM_REQS] = [];\n for (const req of reqs)\n req.cb(new Error('No reply from server'));\n }\n }\n\n // Node streams hackery to make streams do the \"right thing\"\n try {\n protocol.end();\n } catch {}\n setImmediate(() => {\n if (!protocol[SYM_ENDED])\n protocol.emit('end');\n if (!protocol[SYM_CLOSED])\n protocol.emit('close');\n });\n }\n\n function onClose() {\n this[SYM_CLOSED] = true;\n }\n\n function onEnd() {\n this[SYM_ENDED] = true;\n }\n\n const SYM_REQS = Symbol('Requests');\n const SYM_MODE = Symbol('Agent Protocol Role');\n const SYM_BUFFER = Symbol('Agent Protocol Buffer');\n const SYM_MSGLEN = Symbol('Agent Protocol Current Message Length');\n const SYM_CLOSED = Symbol('Agent Protocol Closed');\n const SYM_ENDED = Symbol('Agent Protocol Ended');\n // Implementation based on:\n // https://tools.ietf.org/html/draft-miller-ssh-agent-04\n return class AgentProtocol extends Duplex {\n /*\n Notes:\n - `constraint` type consists of:\n byte constraint_type\n byte[] constraint_data\n where `constraint_type` is one of:\n * SSH_AGENT_CONSTRAIN_LIFETIME\n - `constraint_data` consists of:\n uint32 seconds\n * SSH_AGENT_CONSTRAIN_CONFIRM\n - `constraint_data` N/A\n * SSH_AGENT_CONSTRAIN_EXTENSION\n - `constraint_data` consists of:\n string extension name\n byte[] extension-specific details\n */\n\n constructor(isClient) {\n super({ autoDestroy: true, emitClose: false });\n this[SYM_MODE] = (isClient ? ROLE_CLIENT : ROLE_SERVER);\n this[SYM_REQS] = [];\n this[SYM_BUFFER] = null;\n this[SYM_MSGLEN] = -1;\n this.once('end', onEnd);\n this.once('close', onClose);\n }\n\n _read(n) {}\n\n _write(data, encoding, cb) {\n /*\n Messages are of the format:\n uint32 message length\n byte message type\n byte[message length - 1] message contents\n */\n if (this[SYM_BUFFER] === null)\n this[SYM_BUFFER] = data;\n else\n this[SYM_BUFFER] = concat(this[SYM_BUFFER], data);\n\n let buffer = this[SYM_BUFFER];\n let bufferLen = buffer.length;\n\n let p = 0;\n while (p < bufferLen) {\n // Wait for length + type\n if (bufferLen < 5)\n break;\n\n if (this[SYM_MSGLEN] === -1)\n this[SYM_MSGLEN] = readUInt32BE(buffer, p);\n\n // Check if we have the entire message\n if (bufferLen < (4 + this[SYM_MSGLEN]))\n break;\n\n const msgType = buffer[p += 4];\n ++p;\n\n if (this[SYM_MODE] === ROLE_CLIENT) {\n if (this[SYM_REQS].length === 0)\n return cb(new Error('Received unexpected message from server'));\n\n const req = this[SYM_REQS].shift();\n\n switch (msgType) {\n case SSH_AGENT_FAILURE:\n req.cb(new Error('Agent responded with failure'));\n break;\n case SSH_AGENT_IDENTITIES_ANSWER: {\n if (req.type !== SSH_AGENTC_REQUEST_IDENTITIES)\n return cb(new Error('Agent responded with wrong message type'));\n\n /*\n byte SSH_AGENT_IDENTITIES_ANSWER\n uint32 nkeys\n\n where `nkeys` is 0 or more of:\n string key blob\n string comment\n */\n\n binaryParser.init(buffer, p);\n\n const numKeys = binaryParser.readUInt32BE();\n\n if (numKeys === undefined) {\n binaryParser.clear();\n return cb(new Error('Malformed agent response'));\n }\n\n const keys = [];\n for (let i = 0; i < numKeys; ++i) {\n let pubKey = binaryParser.readString();\n if (pubKey === undefined) {\n binaryParser.clear();\n return cb(new Error('Malformed agent response'));\n }\n\n const comment = binaryParser.readString(true);\n if (comment === undefined) {\n binaryParser.clear();\n return cb(new Error('Malformed agent response'));\n }\n\n pubKey = parseKey(pubKey);\n // We continue parsing the packet if we encounter an error\n // in case the error is due to the key being an unsupported\n // type\n if (pubKey instanceof Error)\n continue;\n\n pubKey.comment = pubKey.comment || comment;\n\n keys.push(pubKey);\n }\n p = binaryParser.pos();\n binaryParser.clear();\n\n req.cb(null, keys);\n break;\n }\n case SSH_AGENT_SIGN_RESPONSE: {\n if (req.type !== SSH_AGENTC_SIGN_REQUEST)\n return cb(new Error('Agent responded with wrong message type'));\n\n /*\n byte SSH_AGENT_SIGN_RESPONSE\n string signature\n */\n\n binaryParser.init(buffer, p);\n let signature = binaryParser.readString();\n p = binaryParser.pos();\n binaryParser.clear();\n\n if (signature === undefined)\n return cb(new Error('Malformed agent response'));\n\n // We strip the algorithm from OpenSSH's output and assume it's\n // using the algorithm we specified. This makes it easier on\n // custom Agent implementations so they don't have to construct\n // the correct binary format for a (OpenSSH-style) signature.\n\n // TODO: verify signature type based on key and options used\n // during initial sign request\n binaryParser.init(signature, 0);\n binaryParser.readString(true);\n signature = binaryParser.readString();\n binaryParser.clear();\n\n if (signature === undefined)\n return cb(new Error('Malformed OpenSSH signature format'));\n\n req.cb(null, signature);\n break;\n }\n default:\n return cb(\n new Error('Agent responded with unsupported message type')\n );\n }\n } else {\n switch (msgType) {\n case SSH_AGENTC_REQUEST_IDENTITIES: {\n const req = new AgentInboundRequest(msgType);\n this[SYM_REQS].push(req);\n /*\n byte SSH_AGENTC_REQUEST_IDENTITIES\n */\n this.emit('identities', req);\n break;\n }\n case SSH_AGENTC_SIGN_REQUEST: {\n /*\n byte SSH_AGENTC_SIGN_REQUEST\n string key_blob\n string data\n uint32 flags\n */\n binaryParser.init(buffer, p);\n let pubKey = binaryParser.readString();\n const data = binaryParser.readString();\n const flagsVal = binaryParser.readUInt32BE();\n p = binaryParser.pos();\n binaryParser.clear();\n if (flagsVal === undefined) {\n const req = new AgentInboundRequest(msgType);\n this[SYM_REQS].push(req);\n return this.failureReply(req);\n }\n\n pubKey = parseKey(pubKey);\n if (pubKey instanceof Error) {\n const req = new AgentInboundRequest(msgType);\n this[SYM_REQS].push(req);\n return this.failureReply(req);\n }\n\n const flags = {\n hash: undefined,\n };\n let ctx;\n if (pubKey.type === 'ssh-rsa') {\n if (flagsVal & SSH_AGENT_RSA_SHA2_256) {\n ctx = 'rsa-sha2-256';\n flags.hash = 'sha256';\n } else if (flagsVal & SSH_AGENT_RSA_SHA2_512) {\n ctx = 'rsa-sha2-512';\n flags.hash = 'sha512';\n }\n }\n if (ctx === undefined)\n ctx = pubKey.type;\n\n const req = new AgentInboundRequest(msgType, ctx);\n this[SYM_REQS].push(req);\n\n this.emit('sign', req, pubKey, data, flags);\n break;\n }\n default: {\n const req = new AgentInboundRequest(msgType);\n this[SYM_REQS].push(req);\n this.failureReply(req);\n }\n }\n }\n\n // Get ready for next message\n this[SYM_MSGLEN] = -1;\n if (p === bufferLen) {\n // Nothing left to process for now\n this[SYM_BUFFER] = null;\n break;\n } else {\n this[SYM_BUFFER] = buffer = buffer.slice(p);\n bufferLen = buffer.length;\n p = 0;\n }\n }\n\n cb();\n }\n\n _destroy(err, cb) {\n cleanup(this);\n cb();\n }\n\n _final(cb) {\n cleanup(this);\n cb();\n }\n\n // Client->Server messages =================================================\n sign(pubKey, data, options, cb) {\n if (this[SYM_MODE] !== ROLE_CLIENT)\n throw new Error('Client-only method called with server role');\n\n if (typeof options === 'function') {\n cb = options;\n options = undefined;\n } else if (typeof options !== 'object' || options === null) {\n options = undefined;\n }\n\n let flags = 0;\n\n pubKey = parseKey(pubKey);\n if (pubKey instanceof Error)\n throw new Error('Invalid public key argument');\n\n if (pubKey.type === 'ssh-rsa' && options) {\n switch (options.hash) {\n case 'sha256':\n flags = SSH_AGENT_RSA_SHA2_256;\n break;\n case 'sha512':\n flags = SSH_AGENT_RSA_SHA2_512;\n break;\n }\n }\n pubKey = pubKey.getPublicSSH();\n\n /*\n byte SSH_AGENTC_SIGN_REQUEST\n string key_blob\n string data\n uint32 flags\n */\n const type = SSH_AGENTC_SIGN_REQUEST;\n const keyLen = pubKey.length;\n const dataLen = data.length;\n let p = 0;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + keyLen + 4 + dataLen + 4);\n\n writeUInt32BE(buf, buf.length - 4, p);\n\n buf[p += 4] = type;\n\n writeUInt32BE(buf, keyLen, ++p);\n pubKey.copy(buf, p += 4);\n\n writeUInt32BE(buf, dataLen, p += keyLen);\n data.copy(buf, p += 4);\n\n writeUInt32BE(buf, flags, p += dataLen);\n\n if (typeof cb !== 'function')\n cb = noop;\n\n this[SYM_REQS].push({ type, cb });\n\n return this.push(buf);\n }\n getIdentities(cb) {\n if (this[SYM_MODE] !== ROLE_CLIENT)\n throw new Error('Client-only method called with server role');\n\n /*\n byte SSH_AGENTC_REQUEST_IDENTITIES\n */\n const type = SSH_AGENTC_REQUEST_IDENTITIES;\n\n let p = 0;\n const buf = Buffer.allocUnsafe(4 + 1);\n\n writeUInt32BE(buf, buf.length - 4, p);\n\n buf[p += 4] = type;\n\n if (typeof cb !== 'function')\n cb = noop;\n\n this[SYM_REQS].push({ type, cb });\n\n return this.push(buf);\n }\n\n // Server->Client messages =================================================\n failureReply(req) {\n if (this[SYM_MODE] !== ROLE_SERVER)\n throw new Error('Server-only method called with client role');\n\n if (!(req instanceof AgentInboundRequest))\n throw new Error('Wrong request argument');\n\n if (req.hasResponded())\n return true;\n\n let p = 0;\n const buf = Buffer.allocUnsafe(4 + 1);\n\n writeUInt32BE(buf, buf.length - 4, p);\n\n buf[p += 4] = SSH_AGENT_FAILURE;\n\n return respond(this, req, buf);\n }\n getIdentitiesReply(req, keys) {\n if (this[SYM_MODE] !== ROLE_SERVER)\n throw new Error('Server-only method called with client role');\n\n if (!(req instanceof AgentInboundRequest))\n throw new Error('Wrong request argument');\n\n if (req.hasResponded())\n return true;\n\n /*\n byte SSH_AGENT_IDENTITIES_ANSWER\n uint32 nkeys\n\n where `nkeys` is 0 or more of:\n string key blob\n string comment\n */\n\n if (req.getType() !== SSH_AGENTC_REQUEST_IDENTITIES)\n throw new Error('Invalid response to request');\n\n if (!Array.isArray(keys))\n throw new Error('Keys argument must be an array');\n\n let totalKeysLen = 4; // Include `nkeys` size\n\n const newKeys = [];\n for (let i = 0; i < keys.length; ++i) {\n const entry = keys[i];\n if (typeof entry !== 'object' || entry === null)\n throw new Error(`Invalid key entry: ${entry}`);\n\n let pubKey;\n let comment;\n if (isParsedKey(entry)) {\n pubKey = entry;\n } else if (isParsedKey(entry.pubKey)) {\n pubKey = entry.pubKey;\n } else {\n if (typeof entry.pubKey !== 'object' || entry.pubKey === null)\n continue;\n ({ pubKey, comment } = entry.pubKey);\n pubKey = parseKey(pubKey);\n if (pubKey instanceof Error)\n continue; // TODO: add debug output\n }\n comment = pubKey.comment || comment;\n pubKey = pubKey.getPublicSSH();\n\n totalKeysLen += 4 + pubKey.length;\n\n if (comment && typeof comment === 'string')\n comment = Buffer.from(comment);\n else if (!Buffer.isBuffer(comment))\n comment = EMPTY_BUF;\n\n totalKeysLen += 4 + comment.length;\n\n newKeys.push({ pubKey, comment });\n }\n\n let p = 0;\n const buf = Buffer.allocUnsafe(4 + 1 + totalKeysLen);\n\n writeUInt32BE(buf, buf.length - 4, p);\n\n buf[p += 4] = SSH_AGENT_IDENTITIES_ANSWER;\n\n writeUInt32BE(buf, newKeys.length, ++p);\n p += 4;\n for (let i = 0; i < newKeys.length; ++i) {\n const { pubKey, comment } = newKeys[i];\n\n writeUInt32BE(buf, pubKey.length, p);\n pubKey.copy(buf, p += 4);\n\n writeUInt32BE(buf, comment.length, p += pubKey.length);\n p += 4;\n if (comment.length) {\n comment.copy(buf, p);\n p += comment.length;\n }\n }\n\n return respond(this, req, buf);\n }\n signReply(req, signature) {\n if (this[SYM_MODE] !== ROLE_SERVER)\n throw new Error('Server-only method called with client role');\n\n if (!(req instanceof AgentInboundRequest))\n throw new Error('Wrong request argument');\n\n if (req.hasResponded())\n return true;\n\n /*\n byte SSH_AGENT_SIGN_RESPONSE\n string signature\n */\n\n if (req.getType() !== SSH_AGENTC_SIGN_REQUEST)\n throw new Error('Invalid response to request');\n\n if (!Buffer.isBuffer(signature))\n throw new Error('Signature argument must be a Buffer');\n\n if (signature.length === 0)\n throw new Error('Signature argument must be non-empty');\n\n /*\n OpenSSH agent signatures are encoded as:\n\n string signature format identifier (as specified by the\n public key/certificate format)\n byte[n] signature blob in format specific encoding.\n - This is actually a `string` for: rsa, dss, ecdsa, and ed25519\n types\n */\n\n let p = 0;\n const sigFormat = req.getContext();\n const sigFormatLen = Buffer.byteLength(sigFormat);\n const buf = Buffer.allocUnsafe(\n 4 + 1 + 4 + 4 + sigFormatLen + 4 + signature.length\n );\n\n writeUInt32BE(buf, buf.length - 4, p);\n\n buf[p += 4] = SSH_AGENT_SIGN_RESPONSE;\n\n writeUInt32BE(buf, 4 + sigFormatLen + 4 + signature.length, ++p);\n writeUInt32BE(buf, sigFormatLen, p += 4);\n buf.utf8Write(sigFormat, p += 4, sigFormatLen);\n writeUInt32BE(buf, signature.length, p += sigFormatLen);\n signature.copy(buf, p += 4);\n\n return respond(this, req, buf);\n }\n };\n})();\n\nconst SYM_AGENT = Symbol('Agent');\nconst SYM_AGENT_KEYS = Symbol('Agent Keys');\nconst SYM_AGENT_KEYS_IDX = Symbol('Agent Keys Index');\nconst SYM_AGENT_CBS = Symbol('Agent Init Callbacks');\nclass AgentContext {\n constructor(agent) {\n if (typeof agent === 'string')\n agent = createAgent(agent);\n else if (!isAgent(agent))\n throw new Error('Invalid agent argument');\n this[SYM_AGENT] = agent;\n this[SYM_AGENT_KEYS] = null;\n this[SYM_AGENT_KEYS_IDX] = -1;\n this[SYM_AGENT_CBS] = null;\n }\n init(cb) {\n if (typeof cb !== 'function')\n cb = noop;\n\n if (this[SYM_AGENT_KEYS] === null) {\n if (this[SYM_AGENT_CBS] === null) {\n this[SYM_AGENT_CBS] = [cb];\n\n const doCbs = (...args) => {\n process.nextTick(() => {\n const cbs = this[SYM_AGENT_CBS];\n this[SYM_AGENT_CBS] = null;\n for (const cb of cbs)\n cb(...args);\n });\n };\n\n this[SYM_AGENT].getIdentities(once((err, keys) => {\n if (err)\n return doCbs(err);\n\n if (!Array.isArray(keys)) {\n return doCbs(new Error(\n 'Agent implementation failed to provide keys'\n ));\n }\n\n const newKeys = [];\n for (let key of keys) {\n key = parseKey(key);\n if (key instanceof Error) {\n // TODO: add debug output\n continue;\n }\n newKeys.push(key);\n }\n\n this[SYM_AGENT_KEYS] = newKeys;\n this[SYM_AGENT_KEYS_IDX] = -1;\n doCbs();\n }));\n } else {\n this[SYM_AGENT_CBS].push(cb);\n }\n } else {\n process.nextTick(cb);\n }\n }\n nextKey() {\n if (this[SYM_AGENT_KEYS] === null\n || ++this[SYM_AGENT_KEYS_IDX] >= this[SYM_AGENT_KEYS].length) {\n return false;\n }\n\n return this[SYM_AGENT_KEYS][this[SYM_AGENT_KEYS_IDX]];\n }\n currentKey() {\n if (this[SYM_AGENT_KEYS] === null\n || this[SYM_AGENT_KEYS_IDX] >= this[SYM_AGENT_KEYS].length) {\n return null;\n }\n\n return this[SYM_AGENT_KEYS][this[SYM_AGENT_KEYS_IDX]];\n }\n pos() {\n if (this[SYM_AGENT_KEYS] === null\n || this[SYM_AGENT_KEYS_IDX] >= this[SYM_AGENT_KEYS].length) {\n return -1;\n }\n\n return this[SYM_AGENT_KEYS_IDX];\n }\n reset() {\n this[SYM_AGENT_KEYS_IDX] = -1;\n }\n\n sign(...args) {\n this[SYM_AGENT].sign(...args);\n }\n}\n\nfunction isAgent(val) {\n return (val instanceof BaseAgent);\n}\n\nmodule.exports = {\n AgentContext,\n AgentProtocol,\n BaseAgent,\n createAgent,\n CygwinAgent,\n isAgent,\n OpenSSHAgent,\n PageantAgent,\n};\n", "'use strict';\n\nconst { kMaxLength } = require('buffer');\nconst {\n createInflate,\n constants: {\n DEFLATE,\n INFLATE,\n Z_DEFAULT_CHUNK,\n Z_DEFAULT_COMPRESSION,\n Z_DEFAULT_MEMLEVEL,\n Z_DEFAULT_STRATEGY,\n Z_DEFAULT_WINDOWBITS,\n Z_PARTIAL_FLUSH,\n }\n} = require('zlib');\nconst ZlibHandle = createInflate()._handle.constructor;\n\nfunction processCallback() {\n throw new Error('Should not get here');\n}\n\nfunction zlibOnError(message, errno, code) {\n const self = this._owner;\n // There is no way to cleanly recover.\n // Continuing only obscures problems.\n\n const error = new Error(message);\n error.errno = errno;\n error.code = code;\n self._err = error;\n}\n\nfunction _close(engine) {\n // Caller may invoke .close after a zlib error (which will null _handle).\n if (!engine._handle)\n return;\n\n engine._handle.close();\n engine._handle = null;\n}\n\nclass Zlib {\n constructor(mode) {\n const windowBits = Z_DEFAULT_WINDOWBITS;\n const level = Z_DEFAULT_COMPRESSION;\n const memLevel = Z_DEFAULT_MEMLEVEL;\n const strategy = Z_DEFAULT_STRATEGY;\n const dictionary = undefined;\n\n this._err = undefined;\n this._writeState = new Uint32Array(2);\n this._chunkSize = Z_DEFAULT_CHUNK;\n this._maxOutputLength = kMaxLength;\n this._outBuffer = Buffer.allocUnsafe(this._chunkSize);\n this._outOffset = 0;\n\n this._handle = new ZlibHandle(mode);\n this._handle._owner = this;\n this._handle.onerror = zlibOnError;\n this._handle.init(windowBits,\n level,\n memLevel,\n strategy,\n this._writeState,\n processCallback,\n dictionary);\n }\n\n writeSync(chunk, retChunks) {\n const handle = this._handle;\n if (!handle)\n throw new Error('Invalid Zlib instance');\n\n let availInBefore = chunk.length;\n let availOutBefore = this._chunkSize - this._outOffset;\n let inOff = 0;\n let availOutAfter;\n let availInAfter;\n\n let buffers;\n let nread = 0;\n const state = this._writeState;\n let buffer = this._outBuffer;\n let offset = this._outOffset;\n const chunkSize = this._chunkSize;\n\n while (true) {\n handle.writeSync(Z_PARTIAL_FLUSH,\n chunk, // in\n inOff, // in_off\n availInBefore, // in_len\n buffer, // out\n offset, // out_off\n availOutBefore); // out_len\n if (this._err)\n throw this._err;\n\n availOutAfter = state[0];\n availInAfter = state[1];\n\n const inDelta = availInBefore - availInAfter;\n const have = availOutBefore - availOutAfter;\n\n if (have > 0) {\n const out = (offset === 0 && have === buffer.length\n ? buffer\n : buffer.slice(offset, offset + have));\n offset += have;\n if (!buffers)\n buffers = out;\n else if (buffers.push === undefined)\n buffers = [buffers, out];\n else\n buffers.push(out);\n nread += out.byteLength;\n\n if (nread > this._maxOutputLength) {\n _close(this);\n throw new Error(\n `Output length exceeded maximum of ${this._maxOutputLength}`\n );\n }\n } else if (have !== 0) {\n throw new Error('have should not go down');\n }\n\n // Exhausted the output buffer, or used all the input create a new one.\n if (availOutAfter === 0 || offset >= chunkSize) {\n availOutBefore = chunkSize;\n offset = 0;\n buffer = Buffer.allocUnsafe(chunkSize);\n }\n\n if (availOutAfter === 0) {\n // Not actually done. Need to reprocess.\n // Also, update the availInBefore to the availInAfter value,\n // so that if we have to hit it a third (fourth, etc.) time,\n // it'll have the correct byte counts.\n inOff += inDelta;\n availInBefore = availInAfter;\n } else {\n break;\n }\n }\n\n this._outBuffer = buffer;\n this._outOffset = offset;\n\n if (nread === 0)\n buffers = Buffer.alloc(0);\n\n if (retChunks) {\n buffers.totalLen = nread;\n return buffers;\n }\n\n if (buffers.push === undefined)\n return buffers;\n\n const output = Buffer.allocUnsafe(nread);\n for (let i = 0, p = 0; i < buffers.length; ++i) {\n const buf = buffers[i];\n output.set(buf, p);\n p += buf.length;\n }\n return output;\n }\n}\n\nclass ZlibPacketWriter {\n constructor(protocol) {\n this.allocStart = 0;\n this.allocStartKEX = 0;\n this._protocol = protocol;\n this._zlib = new Zlib(DEFLATE);\n }\n\n cleanup() {\n if (this._zlib)\n _close(this._zlib);\n }\n\n alloc(payloadSize, force) {\n return Buffer.allocUnsafe(payloadSize);\n }\n\n finalize(payload, force) {\n if (this._protocol._kexinit === undefined || force) {\n const output = this._zlib.writeSync(payload, true);\n const packet = this._protocol._cipher.allocPacket(output.totalLen);\n if (output.push === undefined) {\n packet.set(output, 5);\n } else {\n for (let i = 0, p = 5; i < output.length; ++i) {\n const chunk = output[i];\n packet.set(chunk, p);\n p += chunk.length;\n }\n }\n return packet;\n }\n return payload;\n }\n}\n\nclass PacketWriter {\n constructor(protocol) {\n this.allocStart = 5;\n this.allocStartKEX = 5;\n this._protocol = protocol;\n }\n\n cleanup() {}\n\n alloc(payloadSize, force) {\n if (this._protocol._kexinit === undefined || force)\n return this._protocol._cipher.allocPacket(payloadSize);\n return Buffer.allocUnsafe(payloadSize);\n }\n\n finalize(packet, force) {\n return packet;\n }\n}\n\nclass ZlibPacketReader {\n constructor() {\n this._zlib = new Zlib(INFLATE);\n }\n\n cleanup() {\n if (this._zlib)\n _close(this._zlib);\n }\n\n read(data) {\n return this._zlib.writeSync(data, false);\n }\n}\n\nclass PacketReader {\n cleanup() {}\n\n read(data) {\n return data;\n }\n}\n\nmodule.exports = {\n PacketReader,\n PacketWriter,\n ZlibPacketReader,\n ZlibPacketWriter,\n};\n", "'use strict';\n\nconst {\n bufferSlice,\n bufferParser,\n doFatalError,\n sigSSHToASN1,\n writeUInt32BE,\n} = require('./utils.js');\n\nconst {\n CHANNEL_OPEN_FAILURE,\n COMPAT,\n MESSAGE,\n TERMINAL_MODE,\n} = require('./constants.js');\n\nconst {\n parseKey,\n} = require('./keyParser.js');\n\nconst TERMINAL_MODE_BY_VALUE =\n Array.from(Object.entries(TERMINAL_MODE))\n .reduce((obj, [key, value]) => ({ ...obj, [key]: value }), {});\n\nmodule.exports = {\n // Transport layer protocol ==================================================\n [MESSAGE.DISCONNECT]: (self, payload) => {\n /*\n byte SSH_MSG_DISCONNECT\n uint32 reason code\n string description in ISO-10646 UTF-8 encoding\n string language tag\n */\n bufferParser.init(payload, 1);\n const reason = bufferParser.readUInt32BE();\n const desc = bufferParser.readString(true);\n const lang = bufferParser.readString();\n bufferParser.clear();\n\n if (lang === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed DISCONNECT packet'\n );\n }\n\n self._debug && self._debug(\n `Inbound: Received DISCONNECT (${reason}, \"${desc}\")`\n );\n\n const handler = self._handlers.DISCONNECT;\n handler && handler(self, reason, desc);\n },\n [MESSAGE.IGNORE]: (self, payload) => {\n /*\n byte SSH_MSG_IGNORE\n string data\n */\n self._debug && self._debug('Inbound: Received IGNORE');\n },\n [MESSAGE.UNIMPLEMENTED]: (self, payload) => {\n /*\n byte SSH_MSG_UNIMPLEMENTED\n uint32 packet sequence number of rejected message\n */\n bufferParser.init(payload, 1);\n const seqno = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (seqno === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed UNIMPLEMENTED packet'\n );\n }\n\n self._debug\n && self._debug(`Inbound: Received UNIMPLEMENTED (seqno ${seqno})`);\n },\n [MESSAGE.DEBUG]: (self, payload) => {\n /*\n byte SSH_MSG_DEBUG\n boolean always_display\n string message in ISO-10646 UTF-8 encoding [RFC3629]\n string language tag [RFC3066]\n */\n bufferParser.init(payload, 1);\n const display = bufferParser.readBool();\n const msg = bufferParser.readString(true);\n const lang = bufferParser.readString();\n bufferParser.clear();\n\n if (lang === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed DEBUG packet'\n );\n }\n\n self._debug && self._debug('Inbound: Received DEBUG');\n\n const handler = self._handlers.DEBUG;\n handler && handler(self, display, msg);\n },\n [MESSAGE.SERVICE_REQUEST]: (self, payload) => {\n /*\n byte SSH_MSG_SERVICE_REQUEST\n string service name\n */\n bufferParser.init(payload, 1);\n const name = bufferParser.readString(true);\n bufferParser.clear();\n\n if (name === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed SERVICE_REQUEST packet'\n );\n }\n\n self._debug && self._debug(`Inbound: Received SERVICE_REQUEST (${name})`);\n\n const handler = self._handlers.SERVICE_REQUEST;\n handler && handler(self, name);\n },\n [MESSAGE.SERVICE_ACCEPT]: (self, payload) => {\n // S->C\n /*\n byte SSH_MSG_SERVICE_ACCEPT\n string service name\n */\n bufferParser.init(payload, 1);\n const name = bufferParser.readString(true);\n bufferParser.clear();\n\n if (name === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed SERVICE_ACCEPT packet'\n );\n }\n\n self._debug && self._debug(`Inbound: Received SERVICE_ACCEPT (${name})`);\n\n const handler = self._handlers.SERVICE_ACCEPT;\n handler && handler(self, name);\n },\n [MESSAGE.EXT_INFO]: (self, payload) => {\n /*\n byte SSH_MSG_EXT_INFO\n uint32 nr-extensions\n repeat the following 2 fields \"nr-extensions\" times:\n string extension-name\n string extension-value (binary)\n */\n bufferParser.init(payload, 1);\n const numExts = bufferParser.readUInt32BE();\n let exts;\n if (numExts !== undefined) {\n exts = [];\n for (let i = 0; i < numExts; ++i) {\n const name = bufferParser.readString(true);\n const data = bufferParser.readString();\n if (data !== undefined) {\n switch (name) {\n case 'server-sig-algs': {\n const algs = data.latin1Slice(0, data.length).split(',');\n exts.push({ name, algs });\n continue;\n }\n default:\n continue;\n }\n }\n // Malformed\n exts = undefined;\n break;\n }\n }\n bufferParser.clear();\n\n if (exts === undefined)\n return doFatalError(self, 'Inbound: Malformed EXT_INFO packet');\n\n self._debug && self._debug('Inbound: Received EXT_INFO');\n\n const handler = self._handlers.EXT_INFO;\n handler && handler(self, exts);\n },\n\n // User auth protocol -- generic =============================================\n [MESSAGE.USERAUTH_REQUEST]: (self, payload) => {\n /*\n byte SSH_MSG_USERAUTH_REQUEST\n string user name in ISO-10646 UTF-8 encoding [RFC3629]\n string service name in US-ASCII\n string method name in US-ASCII\n .... method specific fields\n */\n bufferParser.init(payload, 1);\n const user = bufferParser.readString(true);\n const service = bufferParser.readString(true);\n const method = bufferParser.readString(true);\n let methodData;\n let methodDesc;\n switch (method) {\n case 'none':\n methodData = null;\n break;\n case 'password': {\n /*\n boolean <new password follows (old) plaintext password?>\n string plaintext password in ISO-10646 UTF-8 encoding [RFC3629]\n [string new password]\n */\n const isChange = bufferParser.readBool();\n if (isChange !== undefined) {\n methodData = bufferParser.readString(true);\n if (methodData !== undefined && isChange) {\n const newPassword = bufferParser.readString(true);\n if (newPassword !== undefined)\n methodData = { oldPassword: methodData, newPassword };\n else\n methodData = undefined;\n }\n }\n break;\n }\n case 'publickey': {\n /*\n boolean <signature follows public key blob?>\n string public key algorithm name\n string public key blob\n [string signature]\n */\n const hasSig = bufferParser.readBool();\n if (hasSig !== undefined) {\n const keyAlgo = bufferParser.readString(true);\n let realKeyAlgo = keyAlgo;\n const key = bufferParser.readString();\n\n let hashAlgo;\n switch (keyAlgo) {\n case 'rsa-sha2-256':\n realKeyAlgo = 'ssh-rsa';\n hashAlgo = 'sha256';\n break;\n case 'rsa-sha2-512':\n realKeyAlgo = 'ssh-rsa';\n hashAlgo = 'sha512';\n break;\n }\n\n if (hasSig) {\n const blobEnd = bufferParser.pos();\n let signature = bufferParser.readString();\n if (signature !== undefined) {\n if (signature.length > (4 + keyAlgo.length + 4)\n && signature.utf8Slice(4, 4 + keyAlgo.length) === keyAlgo) {\n // Skip algoLen + algo + sigLen\n signature = bufferSlice(signature, 4 + keyAlgo.length + 4);\n }\n\n signature = sigSSHToASN1(signature, realKeyAlgo);\n if (signature) {\n const sessionID = self._kex.sessionID;\n const blob = Buffer.allocUnsafe(4 + sessionID.length + blobEnd);\n writeUInt32BE(blob, sessionID.length, 0);\n blob.set(sessionID, 4);\n blob.set(\n new Uint8Array(payload.buffer, payload.byteOffset, blobEnd),\n 4 + sessionID.length\n );\n methodData = {\n keyAlgo: realKeyAlgo,\n key,\n signature,\n blob,\n hashAlgo,\n };\n }\n }\n } else {\n methodData = { keyAlgo: realKeyAlgo, key, hashAlgo };\n methodDesc = 'publickey -- check';\n }\n }\n break;\n }\n case 'hostbased': {\n /*\n string public key algorithm for host key\n string public host key and certificates for client host\n string client host name expressed as the FQDN in US-ASCII\n string user name on the client host in ISO-10646 UTF-8 encoding\n [RFC3629]\n string signature\n */\n const keyAlgo = bufferParser.readString(true);\n let realKeyAlgo = keyAlgo;\n const key = bufferParser.readString();\n const localHostname = bufferParser.readString(true);\n const localUsername = bufferParser.readString(true);\n\n let hashAlgo;\n switch (keyAlgo) {\n case 'rsa-sha2-256':\n realKeyAlgo = 'ssh-rsa';\n hashAlgo = 'sha256';\n break;\n case 'rsa-sha2-512':\n realKeyAlgo = 'ssh-rsa';\n hashAlgo = 'sha512';\n break;\n }\n\n const blobEnd = bufferParser.pos();\n let signature = bufferParser.readString();\n if (signature !== undefined) {\n if (signature.length > (4 + keyAlgo.length + 4)\n && signature.utf8Slice(4, 4 + keyAlgo.length) === keyAlgo) {\n // Skip algoLen + algo + sigLen\n signature = bufferSlice(signature, 4 + keyAlgo.length + 4);\n }\n\n signature = sigSSHToASN1(signature, realKeyAlgo);\n if (signature !== undefined) {\n const sessionID = self._kex.sessionID;\n const blob = Buffer.allocUnsafe(4 + sessionID.length + blobEnd);\n writeUInt32BE(blob, sessionID.length, 0);\n blob.set(sessionID, 4);\n blob.set(\n new Uint8Array(payload.buffer, payload.byteOffset, blobEnd),\n 4 + sessionID.length\n );\n methodData = {\n keyAlgo: realKeyAlgo,\n key,\n signature,\n blob,\n localHostname,\n localUsername,\n hashAlgo\n };\n }\n }\n break;\n }\n case 'keyboard-interactive':\n /*\n string language tag (as defined in [RFC-3066])\n string submethods (ISO-10646 UTF-8)\n */\n // Skip/ignore language field -- it's deprecated in RFC 4256\n bufferParser.skipString();\n\n methodData = bufferParser.readList();\n break;\n default:\n if (method !== undefined)\n methodData = bufferParser.readRaw();\n }\n bufferParser.clear();\n\n if (methodData === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_REQUEST packet'\n );\n }\n\n if (methodDesc === undefined)\n methodDesc = method;\n\n self._authsQueue.push(method);\n\n self._debug\n && self._debug(`Inbound: Received USERAUTH_REQUEST (${methodDesc})`);\n\n const handler = self._handlers.USERAUTH_REQUEST;\n handler && handler(self, user, service, method, methodData);\n },\n [MESSAGE.USERAUTH_FAILURE]: (self, payload) => {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_FAILURE\n name-list authentications that can continue\n boolean partial success\n */\n bufferParser.init(payload, 1);\n const authMethods = bufferParser.readList();\n const partialSuccess = bufferParser.readBool();\n bufferParser.clear();\n\n if (partialSuccess === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_FAILURE packet'\n );\n }\n\n self._debug\n && self._debug(`Inbound: Received USERAUTH_FAILURE (${authMethods})`);\n\n self._authsQueue.shift();\n const handler = self._handlers.USERAUTH_FAILURE;\n handler && handler(self, authMethods, partialSuccess);\n },\n [MESSAGE.USERAUTH_SUCCESS]: (self, payload) => {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_SUCCESS\n */\n self._debug && self._debug('Inbound: Received USERAUTH_SUCCESS');\n\n self._authsQueue.shift();\n const handler = self._handlers.USERAUTH_SUCCESS;\n handler && handler(self);\n },\n [MESSAGE.USERAUTH_BANNER]: (self, payload) => {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_BANNER\n string message in ISO-10646 UTF-8 encoding [RFC3629]\n string language tag [RFC3066]\n */\n bufferParser.init(payload, 1);\n const msg = bufferParser.readString(true);\n const lang = bufferParser.readString();\n bufferParser.clear();\n\n if (lang === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_BANNER packet'\n );\n }\n\n self._debug && self._debug('Inbound: Received USERAUTH_BANNER');\n\n const handler = self._handlers.USERAUTH_BANNER;\n handler && handler(self, msg);\n },\n\n // User auth protocol -- method-specific =====================================\n 60: (self, payload) => {\n if (!self._authsQueue.length) {\n self._debug\n && self._debug('Inbound: Received payload type 60 without auth');\n return;\n }\n\n switch (self._authsQueue[0]) {\n case 'password': {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_PASSWD_CHANGEREQ\n string prompt in ISO-10646 UTF-8 encoding [RFC3629]\n string language tag [RFC3066]\n */\n bufferParser.init(payload, 1);\n const prompt = bufferParser.readString(true);\n const lang = bufferParser.readString();\n bufferParser.clear();\n\n if (lang === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_PASSWD_CHANGEREQ packet'\n );\n }\n\n self._debug\n && self._debug('Inbound: Received USERAUTH_PASSWD_CHANGEREQ');\n\n const handler = self._handlers.USERAUTH_PASSWD_CHANGEREQ;\n handler && handler(self, prompt);\n break;\n }\n case 'publickey': {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_PK_OK\n string public key algorithm name from the request\n string public key blob from the request\n */\n bufferParser.init(payload, 1);\n const keyAlgo = bufferParser.readString(true);\n const key = bufferParser.readString();\n bufferParser.clear();\n\n if (key === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_PK_OK packet'\n );\n }\n\n self._debug && self._debug('Inbound: Received USERAUTH_PK_OK');\n\n self._authsQueue.shift();\n const handler = self._handlers.USERAUTH_PK_OK;\n handler && handler(self, keyAlgo, key);\n break;\n }\n case 'keyboard-interactive': {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_INFO_REQUEST\n string name (ISO-10646 UTF-8)\n string instruction (ISO-10646 UTF-8)\n string language tag (as defined in [RFC-3066])\n int num-prompts\n string prompt[1] (ISO-10646 UTF-8)\n boolean echo[1]\n ...\n string prompt[num-prompts] (ISO-10646 UTF-8)\n boolean echo[num-prompts]\n */\n bufferParser.init(payload, 1);\n const name = bufferParser.readString(true);\n const instructions = bufferParser.readString(true);\n bufferParser.readString(); // skip lang\n const numPrompts = bufferParser.readUInt32BE();\n let prompts;\n if (numPrompts !== undefined) {\n prompts = new Array(numPrompts);\n let i;\n for (i = 0; i < numPrompts; ++i) {\n const prompt = bufferParser.readString(true);\n const echo = bufferParser.readBool();\n if (echo === undefined)\n break;\n prompts[i] = { prompt, echo };\n }\n if (i !== numPrompts)\n prompts = undefined;\n }\n bufferParser.clear();\n\n if (prompts === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_INFO_REQUEST packet'\n );\n }\n\n self._debug && self._debug('Inbound: Received USERAUTH_INFO_REQUEST');\n\n const handler = self._handlers.USERAUTH_INFO_REQUEST;\n handler && handler(self, name, instructions, prompts);\n break;\n }\n default:\n self._debug\n && self._debug('Inbound: Received unexpected payload type 60');\n }\n },\n 61: (self, payload) => {\n if (!self._authsQueue.length) {\n self._debug\n && self._debug('Inbound: Received payload type 61 without auth');\n return;\n }\n /*\n byte SSH_MSG_USERAUTH_INFO_RESPONSE\n int num-responses\n string response[1] (ISO-10646 UTF-8)\n ...\n string response[num-responses] (ISO-10646 UTF-8)\n */\n if (self._authsQueue[0] !== 'keyboard-interactive') {\n return doFatalError(\n self,\n 'Inbound: Received unexpected payload type 61'\n );\n }\n bufferParser.init(payload, 1);\n const numResponses = bufferParser.readUInt32BE();\n let responses;\n if (numResponses !== undefined) {\n responses = new Array(numResponses);\n let i;\n for (i = 0; i < numResponses; ++i) {\n const response = bufferParser.readString(true);\n if (response === undefined)\n break;\n responses[i] = response;\n }\n if (i !== numResponses)\n responses = undefined;\n }\n bufferParser.clear();\n\n if (responses === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_INFO_RESPONSE packet'\n );\n }\n\n self._debug && self._debug('Inbound: Received USERAUTH_INFO_RESPONSE');\n\n const handler = self._handlers.USERAUTH_INFO_RESPONSE;\n handler && handler(self, responses);\n },\n\n // Connection protocol -- generic ============================================\n [MESSAGE.GLOBAL_REQUEST]: (self, payload) => {\n /*\n byte SSH_MSG_GLOBAL_REQUEST\n string request name in US-ASCII only\n boolean want reply\n .... request-specific data follows\n */\n bufferParser.init(payload, 1);\n const name = bufferParser.readString(true);\n const wantReply = bufferParser.readBool();\n let data;\n if (wantReply !== undefined) {\n switch (name) {\n case 'tcpip-forward':\n case 'cancel-tcpip-forward': {\n /*\n string address to bind (e.g., \"0.0.0.0\")\n uint32 port number to bind\n */\n const bindAddr = bufferParser.readString(true);\n const bindPort = bufferParser.readUInt32BE();\n if (bindPort !== undefined)\n data = { bindAddr, bindPort };\n break;\n }\n case 'streamlocal-forward@openssh.com':\n case 'cancel-streamlocal-forward@openssh.com': {\n /*\n string socket path\n */\n const socketPath = bufferParser.readString(true);\n if (socketPath !== undefined)\n data = { socketPath };\n break;\n }\n case 'no-more-sessions@openssh.com':\n data = null;\n break;\n case 'hostkeys-00@openssh.com': {\n data = [];\n while (bufferParser.avail() > 0) {\n const keyRaw = bufferParser.readString();\n if (keyRaw === undefined) {\n data = undefined;\n break;\n }\n const key = parseKey(keyRaw);\n if (!(key instanceof Error))\n data.push(key);\n }\n break;\n }\n default:\n data = bufferParser.readRaw();\n }\n }\n bufferParser.clear();\n\n if (data === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed GLOBAL_REQUEST packet'\n );\n }\n\n self._debug && self._debug(`Inbound: GLOBAL_REQUEST (${name})`);\n\n const handler = self._handlers.GLOBAL_REQUEST;\n if (handler)\n handler(self, name, wantReply, data);\n else\n self.requestFailure(); // Auto reject\n },\n [MESSAGE.REQUEST_SUCCESS]: (self, payload) => {\n /*\n byte SSH_MSG_REQUEST_SUCCESS\n .... response specific data\n */\n const data = (payload.length > 1 ? bufferSlice(payload, 1) : null);\n\n self._debug && self._debug('Inbound: REQUEST_SUCCESS');\n\n const handler = self._handlers.REQUEST_SUCCESS;\n handler && handler(self, data);\n },\n [MESSAGE.REQUEST_FAILURE]: (self, payload) => {\n /*\n byte SSH_MSG_REQUEST_FAILURE\n */\n self._debug && self._debug('Inbound: Received REQUEST_FAILURE');\n\n const handler = self._handlers.REQUEST_FAILURE;\n handler && handler(self);\n },\n\n // Connection protocol -- channel-related ====================================\n [MESSAGE.CHANNEL_OPEN]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_OPEN\n string channel type in US-ASCII only\n uint32 sender channel\n uint32 initial window size\n uint32 maximum packet size\n .... channel type specific data follows\n */\n bufferParser.init(payload, 1);\n const type = bufferParser.readString(true);\n const sender = bufferParser.readUInt32BE();\n const window = bufferParser.readUInt32BE();\n const packetSize = bufferParser.readUInt32BE();\n let channelInfo;\n\n switch (type) {\n case 'forwarded-tcpip': // S->C\n case 'direct-tcpip': { // C->S\n /*\n string address that was connected / host to connect\n uint32 port that was connected / port to connect\n string originator IP address\n uint32 originator port\n */\n const destIP = bufferParser.readString(true);\n const destPort = bufferParser.readUInt32BE();\n const srcIP = bufferParser.readString(true);\n const srcPort = bufferParser.readUInt32BE();\n if (srcPort !== undefined) {\n channelInfo = {\n type,\n sender,\n window,\n packetSize,\n data: { destIP, destPort, srcIP, srcPort }\n };\n }\n break;\n }\n case 'forwarded-streamlocal@openssh.com': // S->C\n case 'direct-streamlocal@openssh.com': { // C->S\n /*\n string socket path\n string reserved for future use\n\n (direct-streamlocal@openssh.com additionally has:)\n uint32 reserved\n */\n const socketPath = bufferParser.readString(true);\n if (socketPath !== undefined) {\n channelInfo = {\n type,\n sender,\n window,\n packetSize,\n data: { socketPath }\n };\n }\n break;\n }\n case 'x11': { // S->C\n /*\n string originator address (e.g., \"192.168.7.38\")\n uint32 originator port\n */\n const srcIP = bufferParser.readString(true);\n const srcPort = bufferParser.readUInt32BE();\n if (srcPort !== undefined) {\n channelInfo = {\n type,\n sender,\n window,\n packetSize,\n data: { srcIP, srcPort }\n };\n }\n break;\n }\n default:\n // Includes:\n // 'session' (C->S)\n // 'auth-agent@openssh.com' (S->C)\n channelInfo = {\n type,\n sender,\n window,\n packetSize,\n data: {}\n };\n }\n bufferParser.clear();\n\n if (channelInfo === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_OPEN packet'\n );\n }\n\n self._debug && self._debug(`Inbound: CHANNEL_OPEN (s:${sender}, ${type})`);\n\n const handler = self._handlers.CHANNEL_OPEN;\n if (handler) {\n handler(self, channelInfo);\n } else {\n self.channelOpenFail(\n channelInfo.sender,\n CHANNEL_OPEN_FAILURE.ADMINISTRATIVELY_PROHIBITED,\n '',\n ''\n );\n }\n },\n [MESSAGE.CHANNEL_OPEN_CONFIRMATION]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_OPEN_CONFIRMATION\n uint32 recipient channel\n uint32 sender channel\n uint32 initial window size\n uint32 maximum packet size\n .... channel type specific data follows\n */\n // \"The 'recipient channel' is the channel number given in the\n // original open request, and 'sender channel' is the channel number\n // allocated by the other side.\"\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const sender = bufferParser.readUInt32BE();\n const window = bufferParser.readUInt32BE();\n const packetSize = bufferParser.readUInt32BE();\n const data = (bufferParser.avail() ? bufferParser.readRaw() : undefined);\n bufferParser.clear();\n\n if (packetSize === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_OPEN_CONFIRMATION packet'\n );\n }\n\n self._debug && self._debug(\n `Inbound: CHANNEL_OPEN_CONFIRMATION (r:${recipient}, s:${sender})`\n );\n\n const handler = self._handlers.CHANNEL_OPEN_CONFIRMATION;\n if (handler)\n handler(self, { recipient, sender, window, packetSize, data });\n },\n [MESSAGE.CHANNEL_OPEN_FAILURE]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_OPEN_FAILURE\n uint32 recipient channel\n uint32 reason code\n string description in ISO-10646 UTF-8 encoding [RFC3629]\n string language tag [RFC3066]\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const reason = bufferParser.readUInt32BE();\n const description = bufferParser.readString(true);\n const lang = bufferParser.readString();\n bufferParser.clear();\n\n if (lang === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_OPEN_FAILURE packet'\n );\n }\n\n self._debug\n && self._debug(`Inbound: CHANNEL_OPEN_FAILURE (r:${recipient})`);\n\n const handler = self._handlers.CHANNEL_OPEN_FAILURE;\n handler && handler(self, recipient, reason, description);\n },\n [MESSAGE.CHANNEL_WINDOW_ADJUST]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_WINDOW_ADJUST\n uint32 recipient channel\n uint32 bytes to add\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const bytesToAdd = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (bytesToAdd === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_WINDOW_ADJUST packet'\n );\n }\n\n self._debug && self._debug(\n `Inbound: CHANNEL_WINDOW_ADJUST (r:${recipient}, ${bytesToAdd})`\n );\n\n const handler = self._handlers.CHANNEL_WINDOW_ADJUST;\n handler && handler(self, recipient, bytesToAdd);\n },\n [MESSAGE.CHANNEL_DATA]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_DATA\n uint32 recipient channel\n string data\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const data = bufferParser.readString();\n bufferParser.clear();\n\n if (data === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_DATA packet'\n );\n }\n\n self._debug\n && self._debug(`Inbound: CHANNEL_DATA (r:${recipient}, ${data.length})`);\n\n const handler = self._handlers.CHANNEL_DATA;\n handler && handler(self, recipient, data);\n },\n [MESSAGE.CHANNEL_EXTENDED_DATA]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_EXTENDED_DATA\n uint32 recipient channel\n uint32 data_type_code\n string data\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const type = bufferParser.readUInt32BE();\n const data = bufferParser.readString();\n bufferParser.clear();\n\n if (data === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_EXTENDED_DATA packet'\n );\n }\n\n self._debug && self._debug(\n `Inbound: CHANNEL_EXTENDED_DATA (r:${recipient}, ${data.length})`\n );\n\n const handler = self._handlers.CHANNEL_EXTENDED_DATA;\n handler && handler(self, recipient, data, type);\n },\n [MESSAGE.CHANNEL_EOF]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_EOF\n uint32 recipient channel\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (recipient === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_EOF packet'\n );\n }\n\n self._debug && self._debug(`Inbound: CHANNEL_EOF (r:${recipient})`);\n\n const handler = self._handlers.CHANNEL_EOF;\n handler && handler(self, recipient);\n },\n [MESSAGE.CHANNEL_CLOSE]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_CLOSE\n uint32 recipient channel\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (recipient === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_CLOSE packet'\n );\n }\n\n self._debug && self._debug(`Inbound: CHANNEL_CLOSE (r:${recipient})`);\n\n const handler = self._handlers.CHANNEL_CLOSE;\n handler && handler(self, recipient);\n },\n [MESSAGE.CHANNEL_REQUEST]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_REQUEST\n uint32 recipient channel\n string request type in US-ASCII characters only\n boolean want reply\n .... type-specific data follows\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const type = bufferParser.readString(true);\n const wantReply = bufferParser.readBool();\n let data;\n if (wantReply !== undefined) {\n switch (type) {\n case 'exit-status': // S->C\n /*\n uint32 exit_status\n */\n data = bufferParser.readUInt32BE();\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${data})`\n );\n break;\n case 'exit-signal': { // S->C\n /*\n string signal name (without the \"SIG\" prefix)\n boolean core dumped\n string error message in ISO-10646 UTF-8 encoding\n string language tag\n */\n let signal;\n let coreDumped;\n if (self._compatFlags & COMPAT.OLD_EXIT) {\n /*\n Instead of `signal name` and `core dumped`, we have just:\n uint32 signal number\n */\n const num = bufferParser.readUInt32BE();\n switch (num) {\n case 1:\n signal = 'HUP';\n break;\n case 2:\n signal = 'INT';\n break;\n case 3:\n signal = 'QUIT';\n break;\n case 6:\n signal = 'ABRT';\n break;\n case 9:\n signal = 'KILL';\n break;\n case 14:\n signal = 'ALRM';\n break;\n case 15:\n signal = 'TERM';\n break;\n default:\n if (num !== undefined) {\n // Unknown or OS-specific\n signal = `UNKNOWN (${num})`;\n }\n }\n coreDumped = false;\n } else {\n signal = bufferParser.readString(true);\n coreDumped = bufferParser.readBool();\n if (coreDumped === undefined)\n signal = undefined;\n }\n const errorMessage = bufferParser.readString(true);\n if (bufferParser.skipString() !== undefined)\n data = { signal, coreDumped, errorMessage };\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${signal})`\n );\n break;\n }\n case 'pty-req': { // C->S\n /*\n string TERM environment variable value (e.g., vt100)\n uint32 terminal width, characters (e.g., 80)\n uint32 terminal height, rows (e.g., 24)\n uint32 terminal width, pixels (e.g., 640)\n uint32 terminal height, pixels (e.g., 480)\n string encoded terminal modes\n */\n const term = bufferParser.readString(true);\n const cols = bufferParser.readUInt32BE();\n const rows = bufferParser.readUInt32BE();\n const width = bufferParser.readUInt32BE();\n const height = bufferParser.readUInt32BE();\n const modesBinary = bufferParser.readString();\n if (modesBinary !== undefined) {\n bufferParser.init(modesBinary, 1);\n let modes = {};\n while (bufferParser.avail()) {\n const opcode = bufferParser.readByte();\n if (opcode === TERMINAL_MODE.TTY_OP_END)\n break;\n const name = TERMINAL_MODE_BY_VALUE[opcode];\n const value = bufferParser.readUInt32BE();\n if (opcode === undefined\n || name === undefined\n || value === undefined) {\n modes = undefined;\n break;\n }\n modes[name] = value;\n }\n if (modes !== undefined)\n data = { term, cols, rows, width, height, modes };\n }\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n break;\n }\n case 'window-change': { // C->S\n /*\n uint32 terminal width, columns\n uint32 terminal height, rows\n uint32 terminal width, pixels\n uint32 terminal height, pixels\n */\n const cols = bufferParser.readUInt32BE();\n const rows = bufferParser.readUInt32BE();\n const width = bufferParser.readUInt32BE();\n const height = bufferParser.readUInt32BE();\n if (height !== undefined)\n data = { cols, rows, width, height };\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n break;\n }\n case 'x11-req': { // C->S\n /*\n boolean single connection\n string x11 authentication protocol\n string x11 authentication cookie\n uint32 x11 screen number\n */\n const single = bufferParser.readBool();\n const protocol = bufferParser.readString(true);\n const cookie = bufferParser.readString();\n const screen = bufferParser.readUInt32BE();\n if (screen !== undefined)\n data = { single, protocol, cookie, screen };\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n break;\n }\n case 'env': { // C->S\n /*\n string variable name\n string variable value\n */\n const name = bufferParser.readString(true);\n const value = bufferParser.readString(true);\n if (value !== undefined)\n data = { name, value };\n if (self._debug) {\n self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: `\n + `${name}=${value})`\n );\n }\n break;\n }\n case 'shell': // C->S\n data = null; // No extra data\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n break;\n case 'exec': // C->S\n /*\n string command\n */\n data = bufferParser.readString(true);\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${data})`\n );\n break;\n case 'subsystem': // C->S\n /*\n string subsystem name\n */\n data = bufferParser.readString(true);\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${data})`\n );\n break;\n case 'signal': // C->S\n /*\n string signal name (without the \"SIG\" prefix)\n */\n data = bufferParser.readString(true);\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${data})`\n );\n break;\n case 'xon-xoff': // C->S\n /*\n boolean client can do\n */\n data = bufferParser.readBool();\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${data})`\n );\n break;\n case 'auth-agent-req@openssh.com': // C-S\n data = null; // No extra data\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n break;\n default:\n data = (bufferParser.avail() ? bufferParser.readRaw() : null);\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n }\n }\n bufferParser.clear();\n\n if (data === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_REQUEST packet'\n );\n }\n\n const handler = self._handlers.CHANNEL_REQUEST;\n handler && handler(self, recipient, type, wantReply, data);\n },\n [MESSAGE.CHANNEL_SUCCESS]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_SUCCESS\n uint32 recipient channel\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (recipient === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_SUCCESS packet'\n );\n }\n\n self._debug && self._debug(`Inbound: CHANNEL_SUCCESS (r:${recipient})`);\n\n const handler = self._handlers.CHANNEL_SUCCESS;\n handler && handler(self, recipient);\n },\n [MESSAGE.CHANNEL_FAILURE]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_FAILURE\n uint32 recipient channel\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (recipient === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_FAILURE packet'\n );\n }\n\n self._debug && self._debug(`Inbound: CHANNEL_FAILURE (r:${recipient})`);\n\n const handler = self._handlers.CHANNEL_FAILURE;\n handler && handler(self, recipient);\n },\n};\n", "'use strict';\n\nconst MESSAGE_HANDLERS = new Array(256);\n[\n require('./kex.js').HANDLERS,\n require('./handlers.misc.js'),\n].forEach((handlers) => {\n // eslint-disable-next-line prefer-const\n for (let [type, handler] of Object.entries(handlers)) {\n type = +type;\n if (isFinite(type) && type >= 0 && type < MESSAGE_HANDLERS.length)\n MESSAGE_HANDLERS[type] = handler;\n }\n});\n\nmodule.exports = MESSAGE_HANDLERS;\n", "'use strict';\n\nconst {\n createDiffieHellman,\n createDiffieHellmanGroup,\n createECDH,\n createHash,\n createPublicKey,\n diffieHellman,\n generateKeyPairSync,\n randomFillSync,\n} = require('crypto');\n\nconst { Ber } = require('asn1');\n\nconst {\n COMPAT,\n curve25519Supported,\n DEFAULT_KEX,\n DEFAULT_SERVER_HOST_KEY,\n DEFAULT_CIPHER,\n DEFAULT_MAC,\n DEFAULT_COMPRESSION,\n DISCONNECT_REASON,\n MESSAGE,\n} = require('./constants.js');\nconst {\n CIPHER_INFO,\n createCipher,\n createDecipher,\n MAC_INFO,\n} = require('./crypto.js');\nconst { parseDERKey } = require('./keyParser.js');\nconst {\n bufferFill,\n bufferParser,\n convertSignature,\n doFatalError,\n FastBuffer,\n sigSSHToASN1,\n writeUInt32BE,\n} = require('./utils.js');\nconst {\n PacketReader,\n PacketWriter,\n ZlibPacketReader,\n ZlibPacketWriter,\n} = require('./zlib.js');\n\nlet MESSAGE_HANDLERS;\n\nconst GEX_MIN_BITS = 2048; // RFC 8270\nconst GEX_MAX_BITS = 8192; // RFC 8270\n\nconst EMPTY_BUFFER = Buffer.alloc(0);\n\n// Client/Server\nfunction kexinit(self) {\n /*\n byte SSH_MSG_KEXINIT\n byte[16] cookie (random bytes)\n name-list kex_algorithms\n name-list server_host_key_algorithms\n name-list encryption_algorithms_client_to_server\n name-list encryption_algorithms_server_to_client\n name-list mac_algorithms_client_to_server\n name-list mac_algorithms_server_to_client\n name-list compression_algorithms_client_to_server\n name-list compression_algorithms_server_to_client\n name-list languages_client_to_server\n name-list languages_server_to_client\n boolean first_kex_packet_follows\n uint32 0 (reserved for future extension)\n */\n\n let payload;\n if (self._compatFlags & COMPAT.BAD_DHGEX) {\n const entry = self._offer.lists.kex;\n let kex = entry.array;\n let found = false;\n for (let i = 0; i < kex.length; ++i) {\n if (kex[i].includes('group-exchange')) {\n if (!found) {\n found = true;\n // Copy array lazily\n kex = kex.slice();\n }\n kex.splice(i--, 1);\n }\n }\n if (found) {\n let len = 1 + 16 + self._offer.totalSize + 1 + 4;\n const newKexBuf = Buffer.from(kex.join(','));\n len -= (entry.buffer.length - newKexBuf.length);\n\n const all = self._offer.lists.all;\n const rest = new Uint8Array(\n all.buffer,\n all.byteOffset + 4 + entry.buffer.length,\n all.length - (4 + entry.buffer.length)\n );\n\n payload = Buffer.allocUnsafe(len);\n writeUInt32BE(payload, newKexBuf.length, 17);\n payload.set(newKexBuf, 17 + 4);\n payload.set(rest, 17 + 4 + newKexBuf.length);\n }\n }\n\n if (payload === undefined) {\n payload = Buffer.allocUnsafe(1 + 16 + self._offer.totalSize + 1 + 4);\n self._offer.copyAllTo(payload, 17);\n }\n\n self._debug && self._debug('Outbound: Sending KEXINIT');\n\n payload[0] = MESSAGE.KEXINIT;\n randomFillSync(payload, 1, 16);\n\n // Zero-fill first_kex_packet_follows and reserved bytes\n bufferFill(payload, 0, payload.length - 5);\n\n self._kexinit = payload;\n\n // Needed to correct the starting position in allocated \"packets\" when packets\n // will be buffered due to active key exchange\n self._packetRW.write.allocStart = 0;\n\n // TODO: only create single buffer and set _kexinit as slice of packet instead\n {\n const p = self._packetRW.write.allocStartKEX;\n const packet = self._packetRW.write.alloc(payload.length, true);\n packet.set(payload, p);\n self._cipher.encrypt(self._packetRW.write.finalize(packet, true));\n }\n}\n\nfunction handleKexInit(self, payload) {\n /*\n byte SSH_MSG_KEXINIT\n byte[16] cookie (random bytes)\n name-list kex_algorithms\n name-list server_host_key_algorithms\n name-list encryption_algorithms_client_to_server\n name-list encryption_algorithms_server_to_client\n name-list mac_algorithms_client_to_server\n name-list mac_algorithms_server_to_client\n name-list compression_algorithms_client_to_server\n name-list compression_algorithms_server_to_client\n name-list languages_client_to_server\n name-list languages_server_to_client\n boolean first_kex_packet_follows\n uint32 0 (reserved for future extension)\n */\n const init = {\n kex: undefined,\n serverHostKey: undefined,\n cs: {\n cipher: undefined,\n mac: undefined,\n compress: undefined,\n lang: undefined,\n },\n sc: {\n cipher: undefined,\n mac: undefined,\n compress: undefined,\n lang: undefined,\n },\n };\n\n bufferParser.init(payload, 17);\n\n if ((init.kex = bufferParser.readList()) === undefined\n || (init.serverHostKey = bufferParser.readList()) === undefined\n || (init.cs.cipher = bufferParser.readList()) === undefined\n || (init.sc.cipher = bufferParser.readList()) === undefined\n || (init.cs.mac = bufferParser.readList()) === undefined\n || (init.sc.mac = bufferParser.readList()) === undefined\n || (init.cs.compress = bufferParser.readList()) === undefined\n || (init.sc.compress = bufferParser.readList()) === undefined\n || (init.cs.lang = bufferParser.readList()) === undefined\n || (init.sc.lang = bufferParser.readList()) === undefined) {\n bufferParser.clear();\n return doFatalError(\n self,\n 'Received malformed KEXINIT',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n const pos = bufferParser.pos();\n const firstFollows = (pos < payload.length && payload[pos] === 1);\n bufferParser.clear();\n\n const local = self._offer;\n const remote = init;\n\n let localKex = local.lists.kex.array;\n if (self._compatFlags & COMPAT.BAD_DHGEX) {\n let found = false;\n for (let i = 0; i < localKex.length; ++i) {\n if (localKex[i].indexOf('group-exchange') !== -1) {\n if (!found) {\n found = true;\n // Copy array lazily\n localKex = localKex.slice();\n }\n localKex.splice(i--, 1);\n }\n }\n }\n\n let clientList;\n let serverList;\n let i;\n const debug = self._debug;\n\n debug && debug('Inbound: Handshake in progress');\n\n // Key exchange method =======================================================\n debug && debug(`Handshake: (local) KEX method: ${localKex}`);\n debug && debug(`Handshake: (remote) KEX method: ${remote.kex}`);\n let remoteExtInfoEnabled;\n if (self._server) {\n serverList = localKex;\n clientList = remote.kex;\n remoteExtInfoEnabled = (clientList.indexOf('ext-info-c') !== -1);\n } else {\n serverList = remote.kex;\n clientList = localKex;\n remoteExtInfoEnabled = (serverList.indexOf('ext-info-s') !== -1);\n }\n if (self._strictMode === undefined) {\n if (self._server) {\n self._strictMode =\n (clientList.indexOf('kex-strict-c-v00@openssh.com') !== -1);\n } else {\n self._strictMode =\n (serverList.indexOf('kex-strict-s-v00@openssh.com') !== -1);\n }\n // Note: We check for seqno of 1 instead of 0 since we increment before\n // calling the packet handler\n if (self._strictMode) {\n debug && debug('Handshake: strict KEX mode enabled');\n if (self._decipher.inSeqno !== 1) {\n if (debug)\n debug('Handshake: KEXINIT not first packet in strict KEX mode');\n return doFatalError(\n self,\n 'Handshake failed: KEXINIT not first packet in strict KEX mode',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n }\n }\n // Check for agreeable key exchange algorithm\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: no matching key exchange algorithm');\n return doFatalError(\n self,\n 'Handshake failed: no matching key exchange algorithm',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.kex = clientList[i];\n debug && debug(`Handshake: KEX algorithm: ${clientList[i]}`);\n if (firstFollows && (!remote.kex.length || clientList[i] !== remote.kex[0])) {\n // Ignore next inbound packet, it was a wrong first guess at KEX algorithm\n self._skipNextInboundPacket = true;\n }\n\n\n // Server host key format ====================================================\n const localSrvHostKey = local.lists.serverHostKey.array;\n debug && debug(`Handshake: (local) Host key format: ${localSrvHostKey}`);\n debug && debug(\n `Handshake: (remote) Host key format: ${remote.serverHostKey}`\n );\n if (self._server) {\n serverList = localSrvHostKey;\n clientList = remote.serverHostKey;\n } else {\n serverList = remote.serverHostKey;\n clientList = localSrvHostKey;\n }\n // Check for agreeable server host key format\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching host key format');\n return doFatalError(\n self,\n 'Handshake failed: no matching host key format',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.serverHostKey = clientList[i];\n debug && debug(`Handshake: Host key format: ${clientList[i]}`);\n\n\n // Client->Server cipher =====================================================\n const localCSCipher = local.lists.cs.cipher.array;\n debug && debug(`Handshake: (local) C->S cipher: ${localCSCipher}`);\n debug && debug(`Handshake: (remote) C->S cipher: ${remote.cs.cipher}`);\n if (self._server) {\n serverList = localCSCipher;\n clientList = remote.cs.cipher;\n } else {\n serverList = remote.cs.cipher;\n clientList = localCSCipher;\n }\n // Check for agreeable client->server cipher\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching C->S cipher');\n return doFatalError(\n self,\n 'Handshake failed: no matching C->S cipher',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.cs.cipher = clientList[i];\n debug && debug(`Handshake: C->S Cipher: ${clientList[i]}`);\n\n\n // Server->Client cipher =====================================================\n const localSCCipher = local.lists.sc.cipher.array;\n debug && debug(`Handshake: (local) S->C cipher: ${localSCCipher}`);\n debug && debug(`Handshake: (remote) S->C cipher: ${remote.sc.cipher}`);\n if (self._server) {\n serverList = localSCCipher;\n clientList = remote.sc.cipher;\n } else {\n serverList = remote.sc.cipher;\n clientList = localSCCipher;\n }\n // Check for agreeable server->client cipher\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching S->C cipher');\n return doFatalError(\n self,\n 'Handshake failed: no matching S->C cipher',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.sc.cipher = clientList[i];\n debug && debug(`Handshake: S->C cipher: ${clientList[i]}`);\n\n\n // Client->Server MAC ========================================================\n const localCSMAC = local.lists.cs.mac.array;\n debug && debug(`Handshake: (local) C->S MAC: ${localCSMAC}`);\n debug && debug(`Handshake: (remote) C->S MAC: ${remote.cs.mac}`);\n if (CIPHER_INFO[init.cs.cipher].authLen > 0) {\n init.cs.mac = '';\n debug && debug('Handshake: C->S MAC: <implicit>');\n } else {\n if (self._server) {\n serverList = localCSMAC;\n clientList = remote.cs.mac;\n } else {\n serverList = remote.cs.mac;\n clientList = localCSMAC;\n }\n // Check for agreeable client->server hmac algorithm\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching C->S MAC');\n return doFatalError(\n self,\n 'Handshake failed: no matching C->S MAC',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.cs.mac = clientList[i];\n debug && debug(`Handshake: C->S MAC: ${clientList[i]}`);\n }\n\n\n // Server->Client MAC ========================================================\n const localSCMAC = local.lists.sc.mac.array;\n debug && debug(`Handshake: (local) S->C MAC: ${localSCMAC}`);\n debug && debug(`Handshake: (remote) S->C MAC: ${remote.sc.mac}`);\n if (CIPHER_INFO[init.sc.cipher].authLen > 0) {\n init.sc.mac = '';\n debug && debug('Handshake: S->C MAC: <implicit>');\n } else {\n if (self._server) {\n serverList = localSCMAC;\n clientList = remote.sc.mac;\n } else {\n serverList = remote.sc.mac;\n clientList = localSCMAC;\n }\n // Check for agreeable server->client hmac algorithm\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching S->C MAC');\n return doFatalError(\n self,\n 'Handshake failed: no matching S->C MAC',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.sc.mac = clientList[i];\n debug && debug(`Handshake: S->C MAC: ${clientList[i]}`);\n }\n\n\n // Client->Server compression ================================================\n const localCSCompress = local.lists.cs.compress.array;\n debug && debug(`Handshake: (local) C->S compression: ${localCSCompress}`);\n debug && debug(`Handshake: (remote) C->S compression: ${remote.cs.compress}`);\n if (self._server) {\n serverList = localCSCompress;\n clientList = remote.cs.compress;\n } else {\n serverList = remote.cs.compress;\n clientList = localCSCompress;\n }\n // Check for agreeable client->server compression algorithm\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching C->S compression');\n return doFatalError(\n self,\n 'Handshake failed: no matching C->S compression',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.cs.compress = clientList[i];\n debug && debug(`Handshake: C->S compression: ${clientList[i]}`);\n\n\n // Server->Client compression ================================================\n const localSCCompress = local.lists.sc.compress.array;\n debug && debug(`Handshake: (local) S->C compression: ${localSCCompress}`);\n debug && debug(`Handshake: (remote) S->C compression: ${remote.sc.compress}`);\n if (self._server) {\n serverList = localSCCompress;\n clientList = remote.sc.compress;\n } else {\n serverList = remote.sc.compress;\n clientList = localSCCompress;\n }\n // Check for agreeable server->client compression algorithm\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching S->C compression');\n return doFatalError(\n self,\n 'Handshake failed: no matching S->C compression',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.sc.compress = clientList[i];\n debug && debug(`Handshake: S->C compression: ${clientList[i]}`);\n\n init.cs.lang = '';\n init.sc.lang = '';\n\n // XXX: hack -- find a better way to do this\n if (self._kex) {\n if (!self._kexinit) {\n // We received a rekey request, but we haven't sent a KEXINIT in response\n // yet\n kexinit(self);\n }\n self._decipher._onPayload = onKEXPayload.bind(self, { firstPacket: false });\n }\n\n self._kex = createKeyExchange(init, self, payload);\n self._kex.remoteExtInfoEnabled = remoteExtInfoEnabled;\n self._kex.start();\n}\n\nconst createKeyExchange = (() => {\n function convertToMpint(buf) {\n let idx = 0;\n let length = buf.length;\n while (buf[idx] === 0x00) {\n ++idx;\n --length;\n }\n let newBuf;\n if (buf[idx] & 0x80) {\n newBuf = Buffer.allocUnsafe(1 + length);\n newBuf[0] = 0;\n buf.copy(newBuf, 1, idx);\n buf = newBuf;\n } else if (length !== buf.length) {\n newBuf = Buffer.allocUnsafe(length);\n buf.copy(newBuf, 0, idx);\n buf = newBuf;\n }\n return buf;\n }\n\n class KeyExchange {\n constructor(negotiated, protocol, remoteKexinit) {\n this._protocol = protocol;\n\n this.sessionID = (protocol._kex ? protocol._kex.sessionID : undefined);\n this.negotiated = negotiated;\n this.remoteExtInfoEnabled = false;\n this._step = 1;\n this._public = null;\n this._dh = null;\n this._sentNEWKEYS = false;\n this._receivedNEWKEYS = false;\n this._finished = false;\n this._hostVerified = false;\n\n // Data needed for initializing cipher/decipher/etc.\n this._kexinit = protocol._kexinit;\n this._remoteKexinit = remoteKexinit;\n this._identRaw = protocol._identRaw;\n this._remoteIdentRaw = protocol._remoteIdentRaw;\n this._hostKey = undefined;\n this._dhData = undefined;\n this._sig = undefined;\n }\n finish(scOnly) {\n if (this._finished)\n return false;\n this._finished = true;\n\n const isServer = this._protocol._server;\n const negotiated = this.negotiated;\n\n const pubKey = this.convertPublicKey(this._dhData);\n let secret = this.computeSecret(this._dhData);\n if (secret instanceof Error) {\n secret.message =\n `Error while computing DH secret (${this.type}): ${secret.message}`;\n secret.level = 'handshake';\n return doFatalError(\n this._protocol,\n secret,\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n const hash = createHash(this.hashName);\n // V_C\n hashString(hash, (isServer ? this._remoteIdentRaw : this._identRaw));\n // \"V_S\"\n hashString(hash, (isServer ? this._identRaw : this._remoteIdentRaw));\n // \"I_C\"\n hashString(hash, (isServer ? this._remoteKexinit : this._kexinit));\n // \"I_S\"\n hashString(hash, (isServer ? this._kexinit : this._remoteKexinit));\n // \"K_S\"\n const serverPublicHostKey = (isServer\n ? this._hostKey.getPublicSSH()\n : this._hostKey);\n hashString(hash, serverPublicHostKey);\n\n if (this.type === 'groupex') {\n // Group exchange-specific\n const params = this.getDHParams();\n const num = Buffer.allocUnsafe(4);\n // min (uint32)\n writeUInt32BE(num, this._minBits, 0);\n hash.update(num);\n // preferred (uint32)\n writeUInt32BE(num, this._prefBits, 0);\n hash.update(num);\n // max (uint32)\n writeUInt32BE(num, this._maxBits, 0);\n hash.update(num);\n // prime\n hashString(hash, params.prime);\n // generator\n hashString(hash, params.generator);\n }\n\n // method-specific data sent by client\n hashString(hash, (isServer ? pubKey : this.getPublicKey()));\n // method-specific data sent by server\n const serverPublicKey = (isServer ? this.getPublicKey() : pubKey);\n hashString(hash, serverPublicKey);\n // shared secret (\"K\")\n hashString(hash, secret);\n\n // \"H\"\n const exchangeHash = hash.digest();\n\n if (!isServer) {\n bufferParser.init(this._sig, 0);\n const sigType = bufferParser.readString(true);\n\n if (!sigType) {\n return doFatalError(\n this._protocol,\n 'Malformed packet while reading signature',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n if (sigType !== negotiated.serverHostKey) {\n return doFatalError(\n this._protocol,\n `Wrong signature type: ${sigType}, `\n + `expected: ${negotiated.serverHostKey}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n // \"s\"\n let sigValue = bufferParser.readString();\n\n bufferParser.clear();\n\n if (sigValue === undefined) {\n return doFatalError(\n this._protocol,\n 'Malformed packet while reading signature',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n if (!(sigValue = sigSSHToASN1(sigValue, sigType))) {\n return doFatalError(\n this._protocol,\n 'Malformed signature',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n let parsedHostKey;\n {\n bufferParser.init(this._hostKey, 0);\n const name = bufferParser.readString(true);\n const hostKey = this._hostKey.slice(bufferParser.pos());\n bufferParser.clear();\n parsedHostKey = parseDERKey(hostKey, name);\n if (parsedHostKey instanceof Error) {\n parsedHostKey.level = 'handshake';\n return doFatalError(\n this._protocol,\n parsedHostKey,\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n }\n\n let hashAlgo;\n // Check if we need to override the default hash algorithm\n switch (this.negotiated.serverHostKey) {\n case 'rsa-sha2-256': hashAlgo = 'sha256'; break;\n case 'rsa-sha2-512': hashAlgo = 'sha512'; break;\n }\n\n this._protocol._debug\n && this._protocol._debug('Verifying signature ...');\n\n const verified = parsedHostKey.verify(exchangeHash, sigValue, hashAlgo);\n if (verified !== true) {\n if (verified instanceof Error) {\n this._protocol._debug && this._protocol._debug(\n `Signature verification failed: ${verified.stack}`\n );\n } else {\n this._protocol._debug && this._protocol._debug(\n 'Signature verification failed'\n );\n }\n return doFatalError(\n this._protocol,\n 'Handshake failed: signature verification failed',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug('Verified signature');\n } else {\n // Server\n\n let hashAlgo;\n // Check if we need to override the default hash algorithm\n switch (this.negotiated.serverHostKey) {\n case 'rsa-sha2-256': hashAlgo = 'sha256'; break;\n case 'rsa-sha2-512': hashAlgo = 'sha512'; break;\n }\n\n this._protocol._debug && this._protocol._debug(\n 'Generating signature ...'\n );\n\n let signature = this._hostKey.sign(exchangeHash, hashAlgo);\n if (signature instanceof Error) {\n return doFatalError(\n this._protocol,\n 'Handshake failed: signature generation failed for '\n + `${this._hostKey.type} host key: ${signature.message}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n signature = convertSignature(signature, this._hostKey.type);\n if (signature === false) {\n return doFatalError(\n this._protocol,\n 'Handshake failed: signature conversion failed for '\n + `${this._hostKey.type} host key`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n // Send KEX reply\n /*\n byte SSH_MSG_KEXDH_REPLY\n / SSH_MSG_KEX_DH_GEX_REPLY\n / SSH_MSG_KEX_ECDH_REPLY\n string server public host key and certificates (K_S)\n string <method-specific data>\n string signature of H\n */\n const sigType = this.negotiated.serverHostKey;\n const sigTypeLen = Buffer.byteLength(sigType);\n const sigLen = 4 + sigTypeLen + 4 + signature.length;\n let p = this._protocol._packetRW.write.allocStartKEX;\n const packet = this._protocol._packetRW.write.alloc(\n 1\n + 4 + serverPublicHostKey.length\n + 4 + serverPublicKey.length\n + 4 + sigLen,\n true\n );\n\n packet[p] = MESSAGE.KEXDH_REPLY;\n\n writeUInt32BE(packet, serverPublicHostKey.length, ++p);\n packet.set(serverPublicHostKey, p += 4);\n\n writeUInt32BE(packet,\n serverPublicKey.length,\n p += serverPublicHostKey.length);\n packet.set(serverPublicKey, p += 4);\n\n writeUInt32BE(packet, sigLen, p += serverPublicKey.length);\n\n writeUInt32BE(packet, sigTypeLen, p += 4);\n packet.utf8Write(sigType, p += 4, sigTypeLen);\n\n writeUInt32BE(packet, signature.length, p += sigTypeLen);\n packet.set(signature, p += 4);\n\n if (this._protocol._debug) {\n let type;\n switch (this.type) {\n case 'group':\n type = 'KEXDH_REPLY';\n break;\n case 'groupex':\n type = 'KEXDH_GEX_REPLY';\n break;\n default:\n type = 'KEXECDH_REPLY';\n }\n this._protocol._debug(`Outbound: Sending ${type}`);\n }\n this._protocol._cipher.encrypt(\n this._protocol._packetRW.write.finalize(packet, true)\n );\n }\n\n if (isServer || !scOnly)\n trySendNEWKEYS(this);\n\n let hsCipherConfig;\n let hsWrite;\n const completeHandshake = (partial) => {\n if (hsCipherConfig) {\n trySendNEWKEYS(this);\n hsCipherConfig.outbound.seqno = this._protocol._cipher.outSeqno;\n this._protocol._cipher.free();\n this._protocol._cipher = createCipher(hsCipherConfig);\n this._protocol._packetRW.write = hsWrite;\n hsCipherConfig = undefined;\n hsWrite = undefined;\n this._protocol._onHandshakeComplete(negotiated);\n\n return false;\n }\n\n if (!this.sessionID)\n this.sessionID = exchangeHash;\n\n {\n const newSecret = Buffer.allocUnsafe(4 + secret.length);\n writeUInt32BE(newSecret, secret.length, 0);\n newSecret.set(secret, 4);\n secret = newSecret;\n }\n\n // Initialize new ciphers, deciphers, etc.\n\n const csCipherInfo = CIPHER_INFO[negotiated.cs.cipher];\n const scCipherInfo = CIPHER_INFO[negotiated.sc.cipher];\n\n const csIV = generateKEXVal(csCipherInfo.ivLen,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'A');\n const scIV = generateKEXVal(scCipherInfo.ivLen,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'B');\n const csKey = generateKEXVal(csCipherInfo.keyLen,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'C');\n const scKey = generateKEXVal(scCipherInfo.keyLen,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'D');\n let csMacInfo;\n let csMacKey;\n if (!csCipherInfo.authLen) {\n csMacInfo = MAC_INFO[negotiated.cs.mac];\n csMacKey = generateKEXVal(csMacInfo.len,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'E');\n }\n let scMacInfo;\n let scMacKey;\n if (!scCipherInfo.authLen) {\n scMacInfo = MAC_INFO[negotiated.sc.mac];\n scMacKey = generateKEXVal(scMacInfo.len,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'F');\n }\n\n const config = {\n inbound: {\n onPayload: this._protocol._onPayload,\n seqno: this._protocol._decipher.inSeqno,\n decipherInfo: (!isServer ? scCipherInfo : csCipherInfo),\n decipherIV: (!isServer ? scIV : csIV),\n decipherKey: (!isServer ? scKey : csKey),\n macInfo: (!isServer ? scMacInfo : csMacInfo),\n macKey: (!isServer ? scMacKey : csMacKey),\n },\n outbound: {\n onWrite: this._protocol._onWrite,\n seqno: this._protocol._cipher.outSeqno,\n cipherInfo: (isServer ? scCipherInfo : csCipherInfo),\n cipherIV: (isServer ? scIV : csIV),\n cipherKey: (isServer ? scKey : csKey),\n macInfo: (isServer ? scMacInfo : csMacInfo),\n macKey: (isServer ? scMacKey : csMacKey),\n },\n };\n this._protocol._decipher.free();\n hsCipherConfig = config;\n this._protocol._decipher = createDecipher(config);\n\n const rw = {\n read: undefined,\n write: undefined,\n };\n switch (negotiated.cs.compress) {\n case 'zlib': // starts immediately\n if (isServer)\n rw.read = new ZlibPacketReader();\n else\n rw.write = new ZlibPacketWriter(this._protocol);\n break;\n case 'zlib@openssh.com':\n // Starts after successful user authentication\n\n if (this._protocol._authenticated) {\n // If a rekey happens and this compression method is selected and\n // we already authenticated successfully, we need to start\n // immediately instead\n if (isServer)\n rw.read = new ZlibPacketReader();\n else\n rw.write = new ZlibPacketWriter(this._protocol);\n break;\n }\n // FALLTHROUGH\n default:\n // none -- never any compression/decompression\n\n if (isServer)\n rw.read = new PacketReader();\n else\n rw.write = new PacketWriter(this._protocol);\n }\n switch (negotiated.sc.compress) {\n case 'zlib': // starts immediately\n if (isServer)\n rw.write = new ZlibPacketWriter(this._protocol);\n else\n rw.read = new ZlibPacketReader();\n break;\n case 'zlib@openssh.com':\n // Starts after successful user authentication\n\n if (this._protocol._authenticated) {\n // If a rekey happens and this compression method is selected and\n // we already authenticated successfully, we need to start\n // immediately instead\n if (isServer)\n rw.write = new ZlibPacketWriter(this._protocol);\n else\n rw.read = new ZlibPacketReader();\n break;\n }\n // FALLTHROUGH\n default:\n // none -- never any compression/decompression\n\n if (isServer)\n rw.write = new PacketWriter(this._protocol);\n else\n rw.read = new PacketReader();\n }\n this._protocol._packetRW.read.cleanup();\n this._protocol._packetRW.write.cleanup();\n this._protocol._packetRW.read = rw.read;\n hsWrite = rw.write;\n\n // Cleanup/reset various state\n this._public = null;\n this._dh = null;\n this._kexinit = this._protocol._kexinit = undefined;\n this._remoteKexinit = undefined;\n this._identRaw = undefined;\n this._remoteIdentRaw = undefined;\n this._hostKey = undefined;\n this._dhData = undefined;\n this._sig = undefined;\n\n if (!partial)\n return completeHandshake();\n return false;\n };\n\n if (isServer || scOnly)\n this.finish = completeHandshake;\n\n if (!isServer)\n return completeHandshake(scOnly);\n }\n\n start() {\n if (!this._protocol._server) {\n if (this._protocol._debug) {\n let type;\n switch (this.type) {\n case 'group':\n type = 'KEXDH_INIT';\n break;\n default:\n type = 'KEXECDH_INIT';\n }\n this._protocol._debug(`Outbound: Sending ${type}`);\n }\n\n const pubKey = this.getPublicKey();\n\n let p = this._protocol._packetRW.write.allocStartKEX;\n const packet = this._protocol._packetRW.write.alloc(\n 1 + 4 + pubKey.length,\n true\n );\n packet[p] = MESSAGE.KEXDH_INIT;\n writeUInt32BE(packet, pubKey.length, ++p);\n packet.set(pubKey, p += 4);\n this._protocol._cipher.encrypt(\n this._protocol._packetRW.write.finalize(packet, true)\n );\n }\n }\n getPublicKey() {\n this.generateKeys();\n\n const key = this._public;\n\n if (key)\n return this.convertPublicKey(key);\n }\n convertPublicKey(key) {\n let newKey;\n let idx = 0;\n let len = key.length;\n while (key[idx] === 0x00) {\n ++idx;\n --len;\n }\n\n if (key[idx] & 0x80) {\n newKey = Buffer.allocUnsafe(1 + len);\n newKey[0] = 0;\n key.copy(newKey, 1, idx);\n return newKey;\n }\n\n if (len !== key.length) {\n newKey = Buffer.allocUnsafe(len);\n key.copy(newKey, 0, idx);\n key = newKey;\n }\n return key;\n }\n computeSecret(otherPublicKey) {\n this.generateKeys();\n\n try {\n return convertToMpint(this._dh.computeSecret(otherPublicKey));\n } catch (ex) {\n return ex;\n }\n }\n parse(payload) {\n const type = payload[0];\n switch (this._step) {\n case 1:\n if (this._protocol._server) {\n // Server\n if (type !== MESSAGE.KEXDH_INIT) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.KEXDH_INIT}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Received DH Init'\n );\n /*\n byte SSH_MSG_KEXDH_INIT\n / SSH_MSG_KEX_ECDH_INIT\n string <method-specific data>\n */\n bufferParser.init(payload, 1);\n const dhData = bufferParser.readString();\n bufferParser.clear();\n if (dhData === undefined) {\n return doFatalError(\n this._protocol,\n 'Received malformed KEX*_INIT',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n // Client public key\n this._dhData = dhData;\n\n let hostKey =\n this._protocol._hostKeys[this.negotiated.serverHostKey];\n if (Array.isArray(hostKey))\n hostKey = hostKey[0];\n this._hostKey = hostKey;\n\n this.finish();\n } else {\n // Client\n if (type !== MESSAGE.KEXDH_REPLY) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.KEXDH_REPLY}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Received DH Reply'\n );\n /*\n byte SSH_MSG_KEXDH_REPLY\n / SSH_MSG_KEX_DH_GEX_REPLY\n / SSH_MSG_KEX_ECDH_REPLY\n string server public host key and certificates (K_S)\n string <method-specific data>\n string signature of H\n */\n bufferParser.init(payload, 1);\n let hostPubKey;\n let dhData;\n let sig;\n if ((hostPubKey = bufferParser.readString()) === undefined\n || (dhData = bufferParser.readString()) === undefined\n || (sig = bufferParser.readString()) === undefined) {\n bufferParser.clear();\n return doFatalError(\n this._protocol,\n 'Received malformed KEX*_REPLY',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n bufferParser.clear();\n\n // Check that the host public key type matches what was negotiated\n // during KEXINIT swap\n bufferParser.init(hostPubKey, 0);\n const hostPubKeyType = bufferParser.readString(true);\n bufferParser.clear();\n if (hostPubKeyType === undefined) {\n return doFatalError(\n this._protocol,\n 'Received malformed host public key',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n if (hostPubKeyType !== this.negotiated.serverHostKey) {\n // Check if we need to make an exception\n switch (this.negotiated.serverHostKey) {\n case 'rsa-sha2-256':\n case 'rsa-sha2-512':\n if (hostPubKeyType === 'ssh-rsa')\n break;\n // FALLTHROUGH\n default:\n return doFatalError(\n this._protocol,\n 'Host key does not match negotiated type',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n }\n\n this._hostKey = hostPubKey;\n this._dhData = dhData;\n this._sig = sig;\n\n let checked = false;\n let ret;\n if (this._protocol._hostVerifier === undefined) {\n ret = true;\n this._protocol._debug && this._protocol._debug(\n 'Host accepted by default (no verification)'\n );\n } else {\n ret = this._protocol._hostVerifier(hostPubKey, (permitted) => {\n if (checked)\n return;\n checked = true;\n if (permitted === false) {\n this._protocol._debug && this._protocol._debug(\n 'Host denied (verification failed)'\n );\n return doFatalError(\n this._protocol,\n 'Host denied (verification failed)',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Host accepted (verified)'\n );\n this._hostVerified = true;\n if (this._receivedNEWKEYS)\n this.finish();\n else\n trySendNEWKEYS(this);\n });\n }\n if (ret === undefined) {\n // Async host verification\n ++this._step;\n return;\n }\n checked = true;\n if (ret === false) {\n this._protocol._debug && this._protocol._debug(\n 'Host denied (verification failed)'\n );\n return doFatalError(\n this._protocol,\n 'Host denied (verification failed)',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Host accepted (verified)'\n );\n this._hostVerified = true;\n trySendNEWKEYS(this);\n }\n ++this._step;\n break;\n case 2:\n if (type !== MESSAGE.NEWKEYS) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.NEWKEYS}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Inbound: NEWKEYS'\n );\n this._receivedNEWKEYS = true;\n if (this._protocol._strictMode)\n this._protocol._decipher.inSeqno = 0;\n ++this._step;\n\n return this.finish(!this._protocol._server && !this._hostVerified);\n default:\n return doFatalError(\n this._protocol,\n `Received unexpected packet ${type} after NEWKEYS`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n }\n }\n\n class Curve25519Exchange extends KeyExchange {\n constructor(hashName, ...args) {\n super(...args);\n\n this.type = '25519';\n this.hashName = hashName;\n this._keys = null;\n }\n generateKeys() {\n if (!this._keys)\n this._keys = generateKeyPairSync('x25519');\n }\n getPublicKey() {\n this.generateKeys();\n\n const key = this._keys.publicKey.export({ type: 'spki', format: 'der' });\n return key.slice(-32); // HACK: avoids parsing DER/BER header\n }\n convertPublicKey(key) {\n let newKey;\n let idx = 0;\n let len = key.length;\n while (key[idx] === 0x00) {\n ++idx;\n --len;\n }\n\n if (key.length === 32)\n return key;\n\n if (len !== key.length) {\n newKey = Buffer.allocUnsafe(len);\n key.copy(newKey, 0, idx);\n key = newKey;\n }\n return key;\n }\n computeSecret(otherPublicKey) {\n this.generateKeys();\n\n try {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.3.101.110'); // id-X25519\n asnWriter.endSequence();\n\n // PublicKey\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n // XXX: hack to write a raw buffer without a tag -- yuck\n asnWriter._ensure(otherPublicKey.length);\n otherPublicKey.copy(asnWriter._buf,\n asnWriter._offset,\n 0,\n otherPublicKey.length);\n asnWriter._offset += otherPublicKey.length;\n asnWriter.endSequence();\n asnWriter.endSequence();\n\n return convertToMpint(diffieHellman({\n privateKey: this._keys.privateKey,\n publicKey: createPublicKey({\n key: asnWriter.buffer,\n type: 'spki',\n format: 'der',\n }),\n }));\n } catch (ex) {\n return ex;\n }\n }\n }\n\n class ECDHExchange extends KeyExchange {\n constructor(curveName, hashName, ...args) {\n super(...args);\n\n this.type = 'ecdh';\n this.curveName = curveName;\n this.hashName = hashName;\n }\n generateKeys() {\n if (!this._dh) {\n this._dh = createECDH(this.curveName);\n this._public = this._dh.generateKeys();\n }\n }\n }\n\n class DHGroupExchange extends KeyExchange {\n constructor(hashName, ...args) {\n super(...args);\n\n this.type = 'groupex';\n this.hashName = hashName;\n this._prime = null;\n this._generator = null;\n this._minBits = GEX_MIN_BITS;\n this._prefBits = dhEstimate(this.negotiated);\n if (this._protocol._compatFlags & COMPAT.BUG_DHGEX_LARGE)\n this._prefBits = Math.min(this._prefBits, 4096);\n this._maxBits = GEX_MAX_BITS;\n }\n start() {\n if (this._protocol._server)\n return;\n this._protocol._debug && this._protocol._debug(\n 'Outbound: Sending KEXDH_GEX_REQUEST'\n );\n let p = this._protocol._packetRW.write.allocStartKEX;\n const packet = this._protocol._packetRW.write.alloc(\n 1 + 4 + 4 + 4,\n true\n );\n packet[p] = MESSAGE.KEXDH_GEX_REQUEST;\n writeUInt32BE(packet, this._minBits, ++p);\n writeUInt32BE(packet, this._prefBits, p += 4);\n writeUInt32BE(packet, this._maxBits, p += 4);\n this._protocol._cipher.encrypt(\n this._protocol._packetRW.write.finalize(packet, true)\n );\n }\n generateKeys() {\n if (!this._dh && this._prime && this._generator) {\n this._dh = createDiffieHellman(this._prime, this._generator);\n this._public = this._dh.generateKeys();\n }\n }\n setDHParams(prime, generator) {\n if (!Buffer.isBuffer(prime))\n throw new Error('Invalid prime value');\n if (!Buffer.isBuffer(generator))\n throw new Error('Invalid generator value');\n this._prime = prime;\n this._generator = generator;\n }\n getDHParams() {\n if (this._dh) {\n return {\n prime: convertToMpint(this._dh.getPrime()),\n generator: convertToMpint(this._dh.getGenerator()),\n };\n }\n }\n parse(payload) {\n const type = payload[0];\n switch (this._step) {\n case 1: {\n if (this._protocol._server) {\n if (type !== MESSAGE.KEXDH_GEX_REQUEST) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of `\n + MESSAGE.KEXDH_GEX_REQUEST,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n // TODO: allow user implementation to provide safe prime and\n // generator on demand to support group exchange on server side\n return doFatalError(\n this._protocol,\n 'Group exchange not implemented for server',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n if (type !== MESSAGE.KEXDH_GEX_GROUP) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.KEXDH_GEX_GROUP}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n this._protocol._debug && this._protocol._debug(\n 'Received DH GEX Group'\n );\n\n /*\n byte SSH_MSG_KEX_DH_GEX_GROUP\n mpint p, safe prime\n mpint g, generator for subgroup in GF(p)\n */\n bufferParser.init(payload, 1);\n let prime;\n let gen;\n if ((prime = bufferParser.readString()) === undefined\n || (gen = bufferParser.readString()) === undefined) {\n bufferParser.clear();\n return doFatalError(\n this._protocol,\n 'Received malformed KEXDH_GEX_GROUP',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n bufferParser.clear();\n\n // TODO: validate prime\n this.setDHParams(prime, gen);\n this.generateKeys();\n const pubkey = this.getPublicKey();\n\n this._protocol._debug && this._protocol._debug(\n 'Outbound: Sending KEXDH_GEX_INIT'\n );\n\n let p = this._protocol._packetRW.write.allocStartKEX;\n const packet =\n this._protocol._packetRW.write.alloc(1 + 4 + pubkey.length, true);\n packet[p] = MESSAGE.KEXDH_GEX_INIT;\n writeUInt32BE(packet, pubkey.length, ++p);\n packet.set(pubkey, p += 4);\n this._protocol._cipher.encrypt(\n this._protocol._packetRW.write.finalize(packet, true)\n );\n\n ++this._step;\n break;\n }\n case 2:\n if (this._protocol._server) {\n if (type !== MESSAGE.KEXDH_GEX_INIT) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.KEXDH_GEX_INIT}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Received DH GEX Init'\n );\n return doFatalError(\n this._protocol,\n 'Group exchange not implemented for server',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n } else if (type !== MESSAGE.KEXDH_GEX_REPLY) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.KEXDH_GEX_REPLY}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Received DH GEX Reply'\n );\n this._step = 1;\n payload[0] = MESSAGE.KEXDH_REPLY;\n this.parse = KeyExchange.prototype.parse;\n this.parse(payload);\n }\n }\n }\n\n class DHExchange extends KeyExchange {\n constructor(groupName, hashName, ...args) {\n super(...args);\n\n this.type = 'group';\n this.groupName = groupName;\n this.hashName = hashName;\n }\n start() {\n if (!this._protocol._server) {\n this._protocol._debug && this._protocol._debug(\n 'Outbound: Sending KEXDH_INIT'\n );\n const pubKey = this.getPublicKey();\n let p = this._protocol._packetRW.write.allocStartKEX;\n const packet =\n this._protocol._packetRW.write.alloc(1 + 4 + pubKey.length, true);\n packet[p] = MESSAGE.KEXDH_INIT;\n writeUInt32BE(packet, pubKey.length, ++p);\n packet.set(pubKey, p += 4);\n this._protocol._cipher.encrypt(\n this._protocol._packetRW.write.finalize(packet, true)\n );\n }\n }\n generateKeys() {\n if (!this._dh) {\n this._dh = createDiffieHellmanGroup(this.groupName);\n this._public = this._dh.generateKeys();\n }\n }\n getDHParams() {\n if (this._dh) {\n return {\n prime: convertToMpint(this._dh.getPrime()),\n generator: convertToMpint(this._dh.getGenerator()),\n };\n }\n }\n }\n\n return (negotiated, ...args) => {\n if (typeof negotiated !== 'object' || negotiated === null)\n throw new Error('Invalid negotiated argument');\n const kexType = negotiated.kex;\n if (typeof kexType === 'string') {\n args = [negotiated, ...args];\n switch (kexType) {\n case 'curve25519-sha256':\n case 'curve25519-sha256@libssh.org':\n if (!curve25519Supported)\n break;\n return new Curve25519Exchange('sha256', ...args);\n\n case 'ecdh-sha2-nistp256':\n return new ECDHExchange('prime256v1', 'sha256', ...args);\n case 'ecdh-sha2-nistp384':\n return new ECDHExchange('secp384r1', 'sha384', ...args);\n case 'ecdh-sha2-nistp521':\n return new ECDHExchange('secp521r1', 'sha512', ...args);\n\n case 'diffie-hellman-group1-sha1':\n return new DHExchange('modp2', 'sha1', ...args);\n case 'diffie-hellman-group14-sha1':\n return new DHExchange('modp14', 'sha1', ...args);\n case 'diffie-hellman-group14-sha256':\n return new DHExchange('modp14', 'sha256', ...args);\n case 'diffie-hellman-group15-sha512':\n return new DHExchange('modp15', 'sha512', ...args);\n case 'diffie-hellman-group16-sha512':\n return new DHExchange('modp16', 'sha512', ...args);\n case 'diffie-hellman-group17-sha512':\n return new DHExchange('modp17', 'sha512', ...args);\n case 'diffie-hellman-group18-sha512':\n return new DHExchange('modp18', 'sha512', ...args);\n\n case 'diffie-hellman-group-exchange-sha1':\n return new DHGroupExchange('sha1', ...args);\n case 'diffie-hellman-group-exchange-sha256':\n return new DHGroupExchange('sha256', ...args);\n }\n throw new Error(`Unsupported key exchange algorithm: ${kexType}`);\n }\n throw new Error(`Invalid key exchange type: ${kexType}`);\n };\n})();\n\nconst KexInit = (() => {\n const KEX_PROPERTY_NAMES = [\n 'kex',\n 'serverHostKey',\n ['cs', 'cipher' ],\n ['sc', 'cipher' ],\n ['cs', 'mac' ],\n ['sc', 'mac' ],\n ['cs', 'compress' ],\n ['sc', 'compress' ],\n ['cs', 'lang' ],\n ['sc', 'lang' ],\n ];\n return class KexInit {\n constructor(obj) {\n if (typeof obj !== 'object' || obj === null)\n throw new TypeError('Argument must be an object');\n\n const lists = {\n kex: undefined,\n serverHostKey: undefined,\n cs: {\n cipher: undefined,\n mac: undefined,\n compress: undefined,\n lang: undefined,\n },\n sc: {\n cipher: undefined,\n mac: undefined,\n compress: undefined,\n lang: undefined,\n },\n\n all: undefined,\n };\n let totalSize = 0;\n for (const prop of KEX_PROPERTY_NAMES) {\n let base;\n let val;\n let desc;\n let key;\n if (typeof prop === 'string') {\n base = lists;\n val = obj[prop];\n desc = key = prop;\n } else {\n const parent = prop[0];\n base = lists[parent];\n key = prop[1];\n val = obj[parent][key];\n desc = `${parent}.${key}`;\n }\n const entry = { array: undefined, buffer: undefined };\n if (Buffer.isBuffer(val)) {\n entry.array = ('' + val).split(',');\n entry.buffer = val;\n totalSize += 4 + val.length;\n } else {\n if (typeof val === 'string')\n val = val.split(',');\n if (Array.isArray(val)) {\n entry.array = val;\n entry.buffer = Buffer.from(val.join(','));\n } else {\n throw new TypeError(`Invalid \\`${desc}\\` type: ${typeof val}`);\n }\n totalSize += 4 + entry.buffer.length;\n }\n base[key] = entry;\n }\n\n const all = Buffer.allocUnsafe(totalSize);\n lists.all = all;\n\n let allPos = 0;\n for (const prop of KEX_PROPERTY_NAMES) {\n let data;\n if (typeof prop === 'string')\n data = lists[prop].buffer;\n else\n data = lists[prop[0]][prop[1]].buffer;\n allPos = writeUInt32BE(all, data.length, allPos);\n all.set(data, allPos);\n allPos += data.length;\n }\n\n this.totalSize = totalSize;\n this.lists = lists;\n }\n copyAllTo(buf, offset) {\n const src = this.lists.all;\n if (typeof offset !== 'number')\n throw new TypeError(`Invalid offset value: ${typeof offset}`);\n if (buf.length - offset < src.length)\n throw new Error('Insufficient space to copy list');\n buf.set(src, offset);\n return src.length;\n }\n };\n})();\n\nconst hashString = (() => {\n const LEN = Buffer.allocUnsafe(4);\n return (hash, buf) => {\n writeUInt32BE(LEN, buf.length, 0);\n hash.update(LEN);\n hash.update(buf);\n };\n})();\n\nfunction generateKEXVal(len, hashName, secret, exchangeHash, sessionID, char) {\n let ret;\n if (len) {\n let digest = createHash(hashName)\n .update(secret)\n .update(exchangeHash)\n .update(char)\n .update(sessionID)\n .digest();\n while (digest.length < len) {\n const chunk = createHash(hashName)\n .update(secret)\n .update(exchangeHash)\n .update(digest)\n .digest();\n const extended = Buffer.allocUnsafe(digest.length + chunk.length);\n extended.set(digest, 0);\n extended.set(chunk, digest.length);\n digest = extended;\n }\n if (digest.length === len)\n ret = digest;\n else\n ret = new FastBuffer(digest.buffer, digest.byteOffset, len);\n } else {\n ret = EMPTY_BUFFER;\n }\n return ret;\n}\n\nfunction onKEXPayload(state, payload) {\n // XXX: move this to the Decipher implementations?\n if (payload.length === 0) {\n this._debug && this._debug('Inbound: Skipping empty packet payload');\n return;\n }\n\n if (this._skipNextInboundPacket) {\n this._skipNextInboundPacket = false;\n return;\n }\n\n payload = this._packetRW.read.read(payload);\n\n const type = payload[0];\n\n if (!this._strictMode) {\n switch (type) {\n case MESSAGE.IGNORE:\n case MESSAGE.UNIMPLEMENTED:\n case MESSAGE.DEBUG:\n if (!MESSAGE_HANDLERS)\n MESSAGE_HANDLERS = require('./handlers.js');\n return MESSAGE_HANDLERS[type](this, payload);\n }\n }\n\n switch (type) {\n case MESSAGE.DISCONNECT:\n if (!MESSAGE_HANDLERS)\n MESSAGE_HANDLERS = require('./handlers.js');\n return MESSAGE_HANDLERS[type](this, payload);\n case MESSAGE.KEXINIT:\n if (!state.firstPacket) {\n return doFatalError(\n this,\n 'Received extra KEXINIT during handshake',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n state.firstPacket = false;\n return handleKexInit(this, payload);\n default:\n // Ensure packet is either an algorithm negotiation or KEX\n // algorithm-specific packet\n if (type < 20 || type > 49) {\n return doFatalError(\n this,\n `Received unexpected packet type ${type}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n }\n\n return this._kex.parse(payload);\n}\n\nfunction dhEstimate(neg) {\n const csCipher = CIPHER_INFO[neg.cs.cipher];\n const scCipher = CIPHER_INFO[neg.sc.cipher];\n // XXX: if OpenSSH's `umac-*` MACs are ever supported, their key lengths will\n // also need to be considered when calculating `bits`\n const bits = Math.max(\n 0,\n (csCipher.sslName === 'des-ede3-cbc' ? 14 : csCipher.keyLen),\n csCipher.blockLen,\n csCipher.ivLen,\n (scCipher.sslName === 'des-ede3-cbc' ? 14 : scCipher.keyLen),\n scCipher.blockLen,\n scCipher.ivLen\n ) * 8;\n if (bits <= 112)\n return 2048;\n if (bits <= 128)\n return 3072;\n if (bits <= 192)\n return 7680;\n return 8192;\n}\n\nfunction trySendNEWKEYS(kex) {\n if (!kex._sentNEWKEYS) {\n kex._protocol._debug && kex._protocol._debug(\n 'Outbound: Sending NEWKEYS'\n );\n const p = kex._protocol._packetRW.write.allocStartKEX;\n const packet = kex._protocol._packetRW.write.alloc(1, true);\n packet[p] = MESSAGE.NEWKEYS;\n kex._protocol._cipher.encrypt(\n kex._protocol._packetRW.write.finalize(packet, true)\n );\n kex._sentNEWKEYS = true;\n if (kex._protocol._strictMode)\n kex._protocol._cipher.outSeqno = 0;\n }\n}\n\nmodule.exports = {\n KexInit,\n kexinit,\n onKEXPayload,\n DEFAULT_KEXINIT_CLIENT: new KexInit({\n kex: DEFAULT_KEX.concat(['ext-info-c', 'kex-strict-c-v00@openssh.com']),\n serverHostKey: DEFAULT_SERVER_HOST_KEY,\n cs: {\n cipher: DEFAULT_CIPHER,\n mac: DEFAULT_MAC,\n compress: DEFAULT_COMPRESSION,\n lang: [],\n },\n sc: {\n cipher: DEFAULT_CIPHER,\n mac: DEFAULT_MAC,\n compress: DEFAULT_COMPRESSION,\n lang: [],\n },\n }),\n DEFAULT_KEXINIT_SERVER: new KexInit({\n kex: DEFAULT_KEX.concat(['kex-strict-s-v00@openssh.com']),\n serverHostKey: DEFAULT_SERVER_HOST_KEY,\n cs: {\n cipher: DEFAULT_CIPHER,\n mac: DEFAULT_MAC,\n compress: DEFAULT_COMPRESSION,\n lang: [],\n },\n sc: {\n cipher: DEFAULT_CIPHER,\n mac: DEFAULT_MAC,\n compress: DEFAULT_COMPRESSION,\n lang: [],\n },\n }),\n HANDLERS: {\n [MESSAGE.KEXINIT]: handleKexInit,\n },\n};\n", "{\n \"name\": \"ssh2\",\n \"version\": \"1.17.0\",\n \"author\": \"Brian White <mscdex@mscdex.net>\",\n \"description\": \"SSH2 client and server modules written in pure JavaScript for node.js\",\n \"main\": \"./lib/index.js\",\n \"engines\": {\n \"node\": \">=10.16.0\"\n },\n \"dependencies\": {\n \"asn1\": \"^0.2.6\",\n \"bcrypt-pbkdf\": \"^1.0.2\"\n },\n \"devDependencies\": {\n \"@mscdex/eslint-config\": \"^1.1.0\",\n \"eslint\": \"^7.32.0\"\n },\n \"optionalDependencies\": {\n \"cpu-features\": \"~0.0.10\",\n \"nan\": \"^2.23.0\"\n },\n \"scripts\": {\n \"install\": \"node install.js\",\n \"rebuild\": \"node install.js\",\n \"test\": \"node test/test.js\",\n \"lint\": \"eslint --cache --report-unused-disable-directives --ext=.js .eslintrc.js examples lib test\",\n \"lint:fix\": \"npm run lint -- --fix\"\n },\n \"keywords\": [\n \"ssh\",\n \"ssh2\",\n \"sftp\",\n \"secure\",\n \"shell\",\n \"exec\",\n \"remote\",\n \"client\"\n ],\n \"licenses\": [\n {\n \"type\": \"MIT\",\n \"url\": \"http://github.com/mscdex/ssh2/raw/master/LICENSE\"\n }\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"http://github.com/mscdex/ssh2.git\"\n }\n}\n", "/*\n TODO:\n * Replace `buffer._pos` usage in keyParser.js and elsewhere\n * Utilize optional \"writev\" support when writing packets from\n cipher.encrypt()\n * Built-in support for automatic re-keying, on by default\n * Revisit receiving unexpected/unknown packets\n * Error (fatal or otherwise) or ignore or pass on to user (in some or all\n cases)?\n * Including server/client check for single directional packet types?\n * Check packets for validity or bail as early as possible?\n * Automatic re-key every 2**31 packets after the last key exchange (sent or\n received), as suggested by RFC4344. OpenSSH currently does this.\n * Automatic re-key every so many blocks depending on cipher. RFC4344:\n Because of a birthday property of block ciphers and some modes of\n operation, implementations must be careful not to encrypt too many\n blocks with the same encryption key.\n\n Let L be the block length (in bits) of an SSH encryption method's\n block cipher (e.g., 128 for AES). If L is at least 128, then, after\n rekeying, an SSH implementation SHOULD NOT encrypt more than 2**(L/4)\n blocks before rekeying again. If L is at least 128, then SSH\n implementations should also attempt to force a rekey before receiving\n more than 2**(L/4) blocks. If L is less than 128 (which is the case\n for older ciphers such as 3DES, Blowfish, CAST-128, and IDEA), then,\n although it may be too expensive to rekey every 2**(L/4) blocks, it\n is still advisable for SSH implementations to follow the original\n recommendation in [RFC4253]: rekey at least once for every gigabyte\n of transmitted data.\n\n Note that if L is less than or equal to 128, then the recommendation\n in this subsection supersedes the recommendation in Section 3.1. If\n an SSH implementation uses a block cipher with a larger block size\n (e.g., Rijndael with 256-bit blocks), then the recommendations in\n Section 3.1 may supersede the recommendations in this subsection\n (depending on the lengths of the packets).\n*/\n\n'use strict';\n\nconst { inspect } = require('util');\n\nconst { bindingAvailable, NullCipher, NullDecipher } = require('./crypto.js');\nconst {\n COMPAT_CHECKS,\n DISCONNECT_REASON,\n eddsaSupported,\n MESSAGE,\n SIGNALS,\n TERMINAL_MODE,\n} = require('./constants.js');\nconst {\n DEFAULT_KEXINIT_CLIENT,\n DEFAULT_KEXINIT_SERVER,\n KexInit,\n kexinit,\n onKEXPayload,\n} = require('./kex.js');\nconst {\n parseKey,\n} = require('./keyParser.js');\nconst MESSAGE_HANDLERS = require('./handlers.js');\nconst {\n bufferCopy,\n bufferFill,\n bufferSlice,\n convertSignature,\n sendPacket,\n writeUInt32BE,\n} = require('./utils.js');\nconst {\n PacketReader,\n PacketWriter,\n ZlibPacketReader,\n ZlibPacketWriter,\n} = require('./zlib.js');\n\nconst MODULE_VER = require('../../package.json').version;\n\nconst VALID_DISCONNECT_REASONS = new Map(\n Object.values(DISCONNECT_REASON).map((n) => [n, 1])\n);\nconst IDENT_RAW = Buffer.from(`SSH-2.0-ssh2js${MODULE_VER}`);\nconst IDENT = Buffer.from(`${IDENT_RAW}\\r\\n`);\nconst MAX_LINE_LEN = 8192;\nconst MAX_LINES = 1024;\nconst PING_PAYLOAD = Buffer.from([\n MESSAGE.GLOBAL_REQUEST,\n // \"keepalive@openssh.com\"\n 0, 0, 0, 21,\n 107, 101, 101, 112, 97, 108, 105, 118, 101, 64, 111, 112, 101, 110, 115,\n 115, 104, 46, 99, 111, 109,\n // Request a reply\n 1,\n]);\nconst NO_TERMINAL_MODES_BUFFER = Buffer.from([ TERMINAL_MODE.TTY_OP_END ]);\n\nfunction noop() {}\n\n/*\n Inbound:\n * kexinit payload (needed only until exchange hash is generated)\n * raw ident\n * rekey packet queue\n * expected packet (implemented as separate _parse() function?)\n Outbound:\n * kexinit payload (needed only until exchange hash is generated)\n * rekey packet queue\n * kex secret (needed only until NEWKEYS)\n * exchange hash (needed only until NEWKEYS)\n * session ID (set to exchange hash from initial handshake)\n*/\nclass Protocol {\n constructor(config) {\n const onWrite = config.onWrite;\n if (typeof onWrite !== 'function')\n throw new Error('Missing onWrite function');\n this._onWrite = (data) => { onWrite(data); };\n\n const onError = config.onError;\n if (typeof onError !== 'function')\n throw new Error('Missing onError function');\n this._onError = (err) => { onError(err); };\n\n const debug = config.debug;\n this._debug = (typeof debug === 'function'\n ? (msg) => { debug(msg); }\n : undefined);\n\n const onHeader = config.onHeader;\n this._onHeader = (typeof onHeader === 'function'\n ? (...args) => { onHeader(...args); }\n : noop);\n\n const onPacket = config.onPacket;\n this._onPacket = (typeof onPacket === 'function'\n ? () => { onPacket(); }\n : noop);\n\n let onHandshakeComplete = config.onHandshakeComplete;\n if (typeof onHandshakeComplete !== 'function')\n onHandshakeComplete = noop;\n let firstHandshake;\n this._onHandshakeComplete = (...args) => {\n this._debug && this._debug('Handshake completed');\n if (firstHandshake === undefined)\n firstHandshake = true;\n else\n firstHandshake = false;\n\n // Process packets queued during a rekey where necessary\n const oldQueue = this._queue;\n if (oldQueue) {\n this._queue = undefined;\n this._debug && this._debug(\n `Draining outbound queue (${oldQueue.length}) ...`\n );\n for (let i = 0; i < oldQueue.length; ++i) {\n const data = oldQueue[i];\n // data === payload only\n\n // XXX: hacky\n let finalized = this._packetRW.write.finalize(data);\n if (finalized === data) {\n const packet = this._cipher.allocPacket(data.length);\n packet.set(data, 5);\n finalized = packet;\n }\n\n sendPacket(this, finalized);\n }\n this._debug && this._debug('... finished draining outbound queue');\n }\n\n if (firstHandshake && this._server && this._kex.remoteExtInfoEnabled)\n sendExtInfo(this);\n\n onHandshakeComplete(...args);\n };\n this._queue = undefined;\n\n const messageHandlers = config.messageHandlers;\n if (typeof messageHandlers === 'object' && messageHandlers !== null)\n this._handlers = messageHandlers;\n else\n this._handlers = {};\n\n this._onPayload = onPayload.bind(this);\n\n this._server = !!config.server;\n this._banner = undefined;\n let greeting;\n if (this._server) {\n if (typeof config.hostKeys !== 'object' || config.hostKeys === null)\n throw new Error('Missing server host key(s)');\n this._hostKeys = config.hostKeys;\n\n // Greeting displayed before the ssh identification string is sent, this\n // is usually ignored by most clients\n if (typeof config.greeting === 'string' && config.greeting.length) {\n greeting = (config.greeting.slice(-2) === '\\r\\n'\n ? config.greeting\n : `${config.greeting}\\r\\n`);\n }\n\n // Banner shown after the handshake completes, but before user\n // authentication begins\n if (typeof config.banner === 'string' && config.banner.length) {\n this._banner = (config.banner.slice(-2) === '\\r\\n'\n ? config.banner\n : `${config.banner}\\r\\n`);\n }\n } else {\n this._hostKeys = undefined;\n }\n\n let offer = config.offer;\n if (typeof offer !== 'object' || offer === null) {\n offer = (this._server ? DEFAULT_KEXINIT_SERVER : DEFAULT_KEXINIT_CLIENT);\n } else if (offer.constructor !== KexInit) {\n if (this._server) {\n offer.kex = offer.kex.concat(['kex-strict-s-v00@openssh.com']);\n } else {\n offer.kex = offer.kex.concat([\n 'ext-info-c',\n 'kex-strict-c-v00@openssh.com',\n ]);\n }\n offer = new KexInit(offer);\n }\n this._kex = undefined;\n this._strictMode = undefined;\n this._kexinit = undefined;\n this._offer = offer;\n this._cipher = new NullCipher(0, this._onWrite);\n this._decipher = undefined;\n this._skipNextInboundPacket = false;\n this._packetRW = {\n read: new PacketReader(),\n write: new PacketWriter(this),\n };\n this._hostVerifier = (!this._server\n && typeof config.hostVerifier === 'function'\n ? config.hostVerifier\n : undefined);\n\n this._parse = parseHeader;\n this._buffer = undefined;\n this._authsQueue = [];\n this._authenticated = false;\n this._remoteIdentRaw = undefined;\n let sentIdent;\n if (typeof config.ident === 'string') {\n this._identRaw = Buffer.from(`SSH-2.0-${config.ident}`);\n\n sentIdent = Buffer.allocUnsafe(this._identRaw.length + 2);\n sentIdent.set(this._identRaw, 0);\n sentIdent[sentIdent.length - 2] = 13; // '\\r'\n sentIdent[sentIdent.length - 1] = 10; // '\\n'\n } else if (Buffer.isBuffer(config.ident)) {\n const fullIdent = Buffer.allocUnsafe(8 + config.ident.length);\n fullIdent.latin1Write('SSH-2.0-', 0, 8);\n fullIdent.set(config.ident, 8);\n this._identRaw = fullIdent;\n\n sentIdent = Buffer.allocUnsafe(fullIdent.length + 2);\n sentIdent.set(fullIdent, 0);\n sentIdent[sentIdent.length - 2] = 13; // '\\r'\n sentIdent[sentIdent.length - 1] = 10; // '\\n'\n } else {\n this._identRaw = IDENT_RAW;\n sentIdent = IDENT;\n }\n this._compatFlags = 0;\n\n if (this._debug) {\n if (bindingAvailable)\n this._debug('Custom crypto binding available');\n else\n this._debug('Custom crypto binding not available');\n }\n\n this._debug && this._debug(\n `Local ident: ${inspect(this._identRaw.toString())}`\n );\n this.start = () => {\n this.start = undefined;\n if (greeting)\n this._onWrite(greeting);\n this._onWrite(sentIdent);\n };\n }\n _destruct(reason) {\n this._packetRW.read.cleanup();\n this._packetRW.write.cleanup();\n this._cipher && this._cipher.free();\n this._decipher && this._decipher.free();\n if (typeof reason !== 'string' || reason.length === 0)\n reason = 'fatal error';\n this.parse = () => {\n throw new Error(`Instance unusable after ${reason}`);\n };\n this._onWrite = () => {\n throw new Error(`Instance unusable after ${reason}`);\n };\n this._destruct = undefined;\n }\n cleanup() {\n this._destruct && this._destruct();\n }\n parse(chunk, i, len) {\n while (i < len)\n i = this._parse(chunk, i, len);\n }\n\n // Protocol message API\n\n // ===========================================================================\n // Common/Shared =============================================================\n // ===========================================================================\n\n // Global\n // ------\n disconnect(reason) {\n const pktLen = 1 + 4 + 4 + 4;\n // We don't use _packetRW.write.* here because we need to make sure that\n // we always get a full packet allocated because this message can be sent\n // at any time -- even during a key exchange\n let p = this._packetRW.write.allocStartKEX;\n const packet = this._packetRW.write.alloc(pktLen, true);\n const end = p + pktLen;\n\n if (!VALID_DISCONNECT_REASONS.has(reason))\n reason = DISCONNECT_REASON.PROTOCOL_ERROR;\n\n packet[p] = MESSAGE.DISCONNECT;\n writeUInt32BE(packet, reason, ++p);\n packet.fill(0, p += 4, end);\n\n this._debug && this._debug(`Outbound: Sending DISCONNECT (${reason})`);\n sendPacket(this, this._packetRW.write.finalize(packet, true), true);\n }\n ping() {\n const p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(PING_PAYLOAD.length);\n\n packet.set(PING_PAYLOAD, p);\n\n this._debug && this._debug(\n 'Outbound: Sending ping (GLOBAL_REQUEST: keepalive@openssh.com)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n rekey() {\n if (this._kexinit === undefined) {\n this._debug && this._debug('Outbound: Initiated explicit rekey');\n this._queue = [];\n kexinit(this);\n } else {\n this._debug && this._debug('Outbound: Ignoring rekey during handshake');\n }\n }\n\n // 'ssh-connection' service-specific\n // ---------------------------------\n requestSuccess(data) {\n let p = this._packetRW.write.allocStart;\n let packet;\n if (Buffer.isBuffer(data)) {\n packet = this._packetRW.write.alloc(1 + data.length);\n\n packet[p] = MESSAGE.REQUEST_SUCCESS;\n\n packet.set(data, ++p);\n } else {\n packet = this._packetRW.write.alloc(1);\n\n packet[p] = MESSAGE.REQUEST_SUCCESS;\n }\n\n this._debug && this._debug('Outbound: Sending REQUEST_SUCCESS');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n requestFailure() {\n const p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1);\n\n packet[p] = MESSAGE.REQUEST_FAILURE;\n\n this._debug && this._debug('Outbound: Sending REQUEST_FAILURE');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelSuccess(chan) {\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4);\n\n packet[p] = MESSAGE.CHANNEL_SUCCESS;\n\n writeUInt32BE(packet, chan, ++p);\n\n this._debug && this._debug(`Outbound: Sending CHANNEL_SUCCESS (r:${chan})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelFailure(chan) {\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4);\n\n packet[p] = MESSAGE.CHANNEL_FAILURE;\n\n writeUInt32BE(packet, chan, ++p);\n\n this._debug && this._debug(`Outbound: Sending CHANNEL_FAILURE (r:${chan})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelEOF(chan) {\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4);\n\n packet[p] = MESSAGE.CHANNEL_EOF;\n\n writeUInt32BE(packet, chan, ++p);\n\n this._debug && this._debug(`Outbound: Sending CHANNEL_EOF (r:${chan})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelClose(chan) {\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4);\n\n packet[p] = MESSAGE.CHANNEL_CLOSE;\n\n writeUInt32BE(packet, chan, ++p);\n\n this._debug && this._debug(`Outbound: Sending CHANNEL_CLOSE (r:${chan})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelWindowAdjust(chan, amount) {\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4);\n\n packet[p] = MESSAGE.CHANNEL_WINDOW_ADJUST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, amount, p += 4);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_WINDOW_ADJUST (r:${chan}, ${amount})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelData(chan, data) {\n const isBuffer = Buffer.isBuffer(data);\n const dataLen = (isBuffer ? data.length : Buffer.byteLength(data));\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + dataLen);\n\n packet[p] = MESSAGE.CHANNEL_DATA;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, dataLen, p += 4);\n\n if (isBuffer)\n packet.set(data, p += 4);\n else\n packet.utf8Write(data, p += 4, dataLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_DATA (r:${chan}, ${dataLen})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelExtData(chan, data, type) {\n const isBuffer = Buffer.isBuffer(data);\n const dataLen = (isBuffer ? data.length : Buffer.byteLength(data));\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 4 + dataLen);\n\n packet[p] = MESSAGE.CHANNEL_EXTENDED_DATA;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, type, p += 4);\n\n writeUInt32BE(packet, dataLen, p += 4);\n\n if (isBuffer)\n packet.set(data, p += 4);\n else\n packet.utf8Write(data, p += 4, dataLen);\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_EXTENDED_DATA (r:${chan})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelOpenConfirm(remote, local, initWindow, maxPacket) {\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 4 + 4);\n\n packet[p] = MESSAGE.CHANNEL_OPEN_CONFIRMATION;\n\n writeUInt32BE(packet, remote, ++p);\n\n writeUInt32BE(packet, local, p += 4);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_OPEN_CONFIRMATION (r:${remote}, l:${local})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelOpenFail(remote, reason, desc) {\n if (typeof desc !== 'string')\n desc = '';\n\n const descLen = Buffer.byteLength(desc);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 4 + descLen + 4);\n\n packet[p] = MESSAGE.CHANNEL_OPEN_FAILURE;\n\n writeUInt32BE(packet, remote, ++p);\n\n writeUInt32BE(packet, reason, p += 4);\n\n writeUInt32BE(packet, descLen, p += 4);\n\n p += 4;\n if (descLen) {\n packet.utf8Write(desc, p, descLen);\n p += descLen;\n }\n\n writeUInt32BE(packet, 0, p); // Empty language tag\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_OPEN_FAILURE (r:${remote})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n\n // ===========================================================================\n // Client-specific ===========================================================\n // ===========================================================================\n\n // Global\n // ------\n service(name) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const nameLen = Buffer.byteLength(name);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + nameLen);\n\n packet[p] = MESSAGE.SERVICE_REQUEST;\n\n writeUInt32BE(packet, nameLen, ++p);\n packet.utf8Write(name, p += 4, nameLen);\n\n this._debug && this._debug(`Outbound: Sending SERVICE_REQUEST (${name})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n\n // 'ssh-userauth' service-specific\n // -------------------------------\n authPassword(username, password, newPassword) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const userLen = Buffer.byteLength(username);\n const passLen = Buffer.byteLength(password);\n const newPassLen = (newPassword ? Buffer.byteLength(newPassword) : 0);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + userLen + 4 + 14 + 4 + 8 + 1 + 4 + passLen\n + (newPassword ? 4 + newPassLen : 0)\n );\n\n packet[p] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(packet, userLen, ++p);\n packet.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(packet, 14, p += userLen);\n packet.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(packet, 8, p += 14);\n packet.utf8Write('password', p += 4, 8);\n\n packet[p += 8] = (newPassword ? 1 : 0);\n\n writeUInt32BE(packet, passLen, ++p);\n if (Buffer.isBuffer(password))\n bufferCopy(password, packet, 0, passLen, p += 4);\n else\n packet.utf8Write(password, p += 4, passLen);\n\n if (newPassword) {\n writeUInt32BE(packet, newPassLen, p += passLen);\n if (Buffer.isBuffer(newPassword))\n bufferCopy(newPassword, packet, 0, newPassLen, p += 4);\n else\n packet.utf8Write(newPassword, p += 4, newPassLen);\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (changed password)'\n );\n } else {\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (password)'\n );\n }\n\n this._authsQueue.push('password');\n\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authPK(username, pubKey, keyAlgo, cbSign) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n pubKey = parseKey(pubKey);\n if (pubKey instanceof Error)\n throw new Error('Invalid key');\n\n const keyType = pubKey.type;\n pubKey = pubKey.getPublicSSH();\n\n if (typeof keyAlgo === 'function') {\n cbSign = keyAlgo;\n keyAlgo = undefined;\n }\n if (!keyAlgo)\n keyAlgo = keyType;\n\n const userLen = Buffer.byteLength(username);\n const algoLen = Buffer.byteLength(keyAlgo);\n const pubKeyLen = pubKey.length;\n const sessionID = this._kex.sessionID;\n const sesLen = sessionID.length;\n const payloadLen =\n (cbSign ? 4 + sesLen : 0)\n + 1 + 4 + userLen + 4 + 14 + 4 + 9 + 1 + 4 + algoLen + 4 + pubKeyLen;\n let packet;\n let p;\n if (cbSign) {\n packet = Buffer.allocUnsafe(payloadLen);\n p = 0;\n writeUInt32BE(packet, sesLen, p);\n packet.set(sessionID, p += 4);\n p += sesLen;\n } else {\n packet = this._packetRW.write.alloc(payloadLen);\n p = this._packetRW.write.allocStart;\n }\n\n packet[p] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(packet, userLen, ++p);\n packet.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(packet, 14, p += userLen);\n packet.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(packet, 9, p += 14);\n packet.utf8Write('publickey', p += 4, 9);\n\n packet[p += 9] = (cbSign ? 1 : 0);\n\n writeUInt32BE(packet, algoLen, ++p);\n packet.utf8Write(keyAlgo, p += 4, algoLen);\n\n writeUInt32BE(packet, pubKeyLen, p += algoLen);\n packet.set(pubKey, p += 4);\n\n if (!cbSign) {\n this._authsQueue.push('publickey');\n\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (publickey -- check)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n return;\n }\n\n cbSign(packet, (signature) => {\n signature = convertSignature(signature, keyType);\n if (signature === false)\n throw new Error('Error while converting handshake signature');\n\n const sigLen = signature.length;\n p = this._packetRW.write.allocStart;\n packet = this._packetRW.write.alloc(\n 1 + 4 + userLen + 4 + 14 + 4 + 9 + 1 + 4 + algoLen + 4 + pubKeyLen + 4\n + 4 + algoLen + 4 + sigLen\n );\n\n // TODO: simply copy from original \"packet\" to new `packet` to avoid\n // having to write each individual field a second time?\n packet[p] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(packet, userLen, ++p);\n packet.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(packet, 14, p += userLen);\n packet.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(packet, 9, p += 14);\n packet.utf8Write('publickey', p += 4, 9);\n\n packet[p += 9] = 1;\n\n writeUInt32BE(packet, algoLen, ++p);\n packet.utf8Write(keyAlgo, p += 4, algoLen);\n\n writeUInt32BE(packet, pubKeyLen, p += algoLen);\n packet.set(pubKey, p += 4);\n\n writeUInt32BE(packet, 4 + algoLen + 4 + sigLen, p += pubKeyLen);\n\n writeUInt32BE(packet, algoLen, p += 4);\n packet.utf8Write(keyAlgo, p += 4, algoLen);\n\n writeUInt32BE(packet, sigLen, p += algoLen);\n packet.set(signature, p += 4);\n\n // Servers shouldn't send packet type 60 in response to signed publickey\n // attempts, but if they do, interpret as type 60.\n this._authsQueue.push('publickey');\n\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (publickey)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n });\n }\n authHostbased(username, pubKey, hostname, userlocal, keyAlgo, cbSign) {\n // TODO: Make DRY by sharing similar code with authPK()\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n pubKey = parseKey(pubKey);\n if (pubKey instanceof Error)\n throw new Error('Invalid key');\n\n const keyType = pubKey.type;\n pubKey = pubKey.getPublicSSH();\n\n if (typeof keyAlgo === 'function') {\n cbSign = keyAlgo;\n keyAlgo = undefined;\n }\n if (!keyAlgo)\n keyAlgo = keyType;\n\n const userLen = Buffer.byteLength(username);\n const algoLen = Buffer.byteLength(keyAlgo);\n const pubKeyLen = pubKey.length;\n const sessionID = this._kex.sessionID;\n const sesLen = sessionID.length;\n const hostnameLen = Buffer.byteLength(hostname);\n const userlocalLen = Buffer.byteLength(userlocal);\n const data = Buffer.allocUnsafe(\n 4 + sesLen + 1 + 4 + userLen + 4 + 14 + 4 + 9 + 4 + algoLen\n + 4 + pubKeyLen + 4 + hostnameLen + 4 + userlocalLen\n );\n let p = 0;\n\n writeUInt32BE(data, sesLen, p);\n data.set(sessionID, p += 4);\n\n data[p += sesLen] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(data, userLen, ++p);\n data.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(data, 14, p += userLen);\n data.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(data, 9, p += 14);\n data.utf8Write('hostbased', p += 4, 9);\n\n writeUInt32BE(data, algoLen, p += 9);\n data.utf8Write(keyAlgo, p += 4, algoLen);\n\n writeUInt32BE(data, pubKeyLen, p += algoLen);\n data.set(pubKey, p += 4);\n\n writeUInt32BE(data, hostnameLen, p += pubKeyLen);\n data.utf8Write(hostname, p += 4, hostnameLen);\n\n writeUInt32BE(data, userlocalLen, p += hostnameLen);\n data.utf8Write(userlocal, p += 4, userlocalLen);\n\n cbSign(data, (signature) => {\n signature = convertSignature(signature, keyType);\n if (!signature)\n throw new Error('Error while converting handshake signature');\n\n const sigLen = signature.length;\n const reqDataLen = (data.length - sesLen - 4);\n p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n reqDataLen + 4 + 4 + algoLen + 4 + sigLen\n );\n\n bufferCopy(data, packet, 4 + sesLen, data.length, p);\n\n writeUInt32BE(packet, 4 + algoLen + 4 + sigLen, p += reqDataLen);\n writeUInt32BE(packet, algoLen, p += 4);\n packet.utf8Write(keyAlgo, p += 4, algoLen);\n writeUInt32BE(packet, sigLen, p += algoLen);\n packet.set(signature, p += 4);\n\n this._authsQueue.push('hostbased');\n\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (hostbased)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n });\n }\n authKeyboard(username) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const userLen = Buffer.byteLength(username);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + userLen + 4 + 14 + 4 + 20 + 4 + 4\n );\n\n packet[p] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(packet, userLen, ++p);\n packet.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(packet, 14, p += userLen);\n packet.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(packet, 20, p += 14);\n packet.utf8Write('keyboard-interactive', p += 4, 20);\n\n writeUInt32BE(packet, 0, p += 20);\n\n writeUInt32BE(packet, 0, p += 4);\n\n this._authsQueue.push('keyboard-interactive');\n\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (keyboard-interactive)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authNone(username) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const userLen = Buffer.byteLength(username);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + userLen + 4 + 14 + 4 + 4);\n\n packet[p] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(packet, userLen, ++p);\n packet.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(packet, 14, p += userLen);\n packet.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(packet, 4, p += 14);\n packet.utf8Write('none', p += 4, 4);\n\n this._authsQueue.push('none');\n\n this._debug && this._debug('Outbound: Sending USERAUTH_REQUEST (none)');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authInfoRes(responses) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n let responsesTotalLen = 0;\n let responseLens;\n\n if (responses) {\n responseLens = new Array(responses.length);\n for (let i = 0; i < responses.length; ++i) {\n const len = Buffer.byteLength(responses[i]);\n responseLens[i] = len;\n responsesTotalLen += 4 + len;\n }\n }\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + responsesTotalLen);\n\n packet[p] = MESSAGE.USERAUTH_INFO_RESPONSE;\n\n if (responses) {\n writeUInt32BE(packet, responses.length, ++p);\n p += 4;\n for (let i = 0; i < responses.length; ++i) {\n const len = responseLens[i];\n writeUInt32BE(packet, len, p);\n p += 4;\n if (len) {\n packet.utf8Write(responses[i], p, len);\n p += len;\n }\n }\n } else {\n writeUInt32BE(packet, 0, ++p);\n }\n\n this._debug && this._debug('Outbound: Sending USERAUTH_INFO_RESPONSE');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n\n // 'ssh-connection' service-specific\n // ---------------------------------\n tcpipForward(bindAddr, bindPort, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const addrLen = Buffer.byteLength(bindAddr);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 13 + 1 + 4 + addrLen + 4);\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 13, ++p);\n packet.utf8Write('tcpip-forward', p += 4, 13);\n\n packet[p += 13] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, addrLen, ++p);\n packet.utf8Write(bindAddr, p += 4, addrLen);\n\n writeUInt32BE(packet, bindPort, p += addrLen);\n\n this._debug\n && this._debug('Outbound: Sending GLOBAL_REQUEST (tcpip-forward)');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n cancelTcpipForward(bindAddr, bindPort, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const addrLen = Buffer.byteLength(bindAddr);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 20 + 1 + 4 + addrLen + 4);\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 20, ++p);\n packet.utf8Write('cancel-tcpip-forward', p += 4, 20);\n\n packet[p += 20] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, addrLen, ++p);\n packet.utf8Write(bindAddr, p += 4, addrLen);\n\n writeUInt32BE(packet, bindPort, p += addrLen);\n\n this._debug\n && this._debug('Outbound: Sending GLOBAL_REQUEST (cancel-tcpip-forward)');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_streamLocalForward(socketPath, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const socketPathLen = Buffer.byteLength(socketPath);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 31 + 1 + 4 + socketPathLen\n );\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 31, ++p);\n packet.utf8Write('streamlocal-forward@openssh.com', p += 4, 31);\n\n packet[p += 31] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, socketPathLen, ++p);\n packet.utf8Write(socketPath, p += 4, socketPathLen);\n\n this._debug && this._debug(\n 'Outbound: Sending GLOBAL_REQUEST (streamlocal-forward@openssh.com)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_cancelStreamLocalForward(socketPath, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const socketPathLen = Buffer.byteLength(socketPath);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 38 + 1 + 4 + socketPathLen\n );\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 38, ++p);\n packet.utf8Write('cancel-streamlocal-forward@openssh.com', p += 4, 38);\n\n packet[p += 38] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, socketPathLen, ++p);\n packet.utf8Write(socketPath, p += 4, socketPathLen);\n\n if (this._debug) {\n this._debug(\n 'Outbound: Sending GLOBAL_REQUEST '\n + '(cancel-streamlocal-forward@openssh.com)'\n );\n }\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n directTcpip(chan, initWindow, maxPacket, cfg) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const srcLen = Buffer.byteLength(cfg.srcIP);\n const dstLen = Buffer.byteLength(cfg.dstIP);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 12 + 4 + 4 + 4 + 4 + srcLen + 4 + 4 + dstLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 12, ++p);\n packet.utf8Write('direct-tcpip', p += 4, 12);\n\n writeUInt32BE(packet, chan, p += 12);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n writeUInt32BE(packet, dstLen, p += 4);\n packet.utf8Write(cfg.dstIP, p += 4, dstLen);\n\n writeUInt32BE(packet, cfg.dstPort, p += dstLen);\n\n writeUInt32BE(packet, srcLen, p += 4);\n packet.utf8Write(cfg.srcIP, p += 4, srcLen);\n\n writeUInt32BE(packet, cfg.srcPort, p += srcLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_OPEN (r:${chan}, direct-tcpip)`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_directStreamLocal(chan, initWindow, maxPacket, cfg) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const pathLen = Buffer.byteLength(cfg.socketPath);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 30 + 4 + 4 + 4 + 4 + pathLen + 4 + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 30, ++p);\n packet.utf8Write('direct-streamlocal@openssh.com', p += 4, 30);\n\n writeUInt32BE(packet, chan, p += 30);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n writeUInt32BE(packet, pathLen, p += 4);\n packet.utf8Write(cfg.socketPath, p += 4, pathLen);\n\n // zero-fill reserved fields (string and uint32)\n bufferFill(packet, 0, p += pathLen, p + 8);\n\n if (this._debug) {\n this._debug(\n 'Outbound: Sending CHANNEL_OPEN '\n + `(r:${chan}, direct-streamlocal@openssh.com)`\n );\n }\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_noMoreSessions(wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 28 + 1);\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 28, ++p);\n packet.utf8Write('no-more-sessions@openssh.com', p += 4, 28);\n\n packet[p += 28] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n this._debug && this._debug(\n 'Outbound: Sending GLOBAL_REQUEST (no-more-sessions@openssh.com)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n session(chan, initWindow, maxPacket) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 7 + 4 + 4 + 4);\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 7, ++p);\n packet.utf8Write('session', p += 4, 7);\n\n writeUInt32BE(packet, chan, p += 7);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_OPEN (r:${chan}, session)`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n windowChange(chan, rows, cols, height, width) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 13 + 1 + 4 + 4 + 4 + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 13, p += 4);\n packet.utf8Write('window-change', p += 4, 13);\n\n packet[p += 13] = 0;\n\n writeUInt32BE(packet, cols, ++p);\n\n writeUInt32BE(packet, rows, p += 4);\n\n writeUInt32BE(packet, width, p += 4);\n\n writeUInt32BE(packet, height, p += 4);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, window-change)`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n pty(chan, rows, cols, height, width, term, modes, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n if (!term || !term.length)\n term = 'vt100';\n if (modes\n && !Buffer.isBuffer(modes)\n && !Array.isArray(modes)\n && typeof modes === 'object'\n && modes !== null) {\n modes = modesToBytes(modes);\n }\n if (!modes || !modes.length)\n modes = NO_TERMINAL_MODES_BUFFER;\n\n const termLen = term.length;\n const modesLen = modes.length;\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 7 + 1 + 4 + termLen + 4 + 4 + 4 + 4 + 4 + modesLen\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 7, p += 4);\n packet.utf8Write('pty-req', p += 4, 7);\n\n packet[p += 7] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, termLen, ++p);\n packet.utf8Write(term, p += 4, termLen);\n\n writeUInt32BE(packet, cols, p += termLen);\n\n writeUInt32BE(packet, rows, p += 4);\n\n writeUInt32BE(packet, width, p += 4);\n\n writeUInt32BE(packet, height, p += 4);\n\n writeUInt32BE(packet, modesLen, p += 4);\n p += 4;\n if (Array.isArray(modes)) {\n for (let i = 0; i < modesLen; ++i)\n packet[p++] = modes[i];\n } else if (Buffer.isBuffer(modes)) {\n packet.set(modes, p);\n }\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_REQUEST (r:${chan}, pty-req)`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n shell(chan, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 5 + 1);\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 5, p += 4);\n packet.utf8Write('shell', p += 4, 5);\n\n packet[p += 5] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_REQUEST (r:${chan}, shell)`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n exec(chan, cmd, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n const isBuf = Buffer.isBuffer(cmd);\n const cmdLen = (isBuf ? cmd.length : Buffer.byteLength(cmd));\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 4 + 1 + 4 + cmdLen);\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 4, p += 4);\n packet.utf8Write('exec', p += 4, 4);\n\n packet[p += 4] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, cmdLen, ++p);\n if (isBuf)\n packet.set(cmd, p += 4);\n else\n packet.utf8Write(cmd, p += 4, cmdLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, exec: ${cmd})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n signal(chan, signal) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n const origSignal = signal;\n\n signal = signal.toUpperCase();\n if (signal.slice(0, 3) === 'SIG')\n signal = signal.slice(3);\n\n if (SIGNALS[signal] !== 1)\n throw new Error(`Invalid signal: ${origSignal}`);\n\n const signalLen = signal.length;\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 6 + 1 + 4 + signalLen\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 6, p += 4);\n packet.utf8Write('signal', p += 4, 6);\n\n packet[p += 6] = 0;\n\n writeUInt32BE(packet, signalLen, ++p);\n packet.utf8Write(signal, p += 4, signalLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, signal: ${signal})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n env(chan, key, val, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n const keyLen = Buffer.byteLength(key);\n const isBuf = Buffer.isBuffer(val);\n const valLen = (isBuf ? val.length : Buffer.byteLength(val));\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 3 + 1 + 4 + keyLen + 4 + valLen\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 3, p += 4);\n packet.utf8Write('env', p += 4, 3);\n\n packet[p += 3] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, keyLen, ++p);\n packet.utf8Write(key, p += 4, keyLen);\n\n writeUInt32BE(packet, valLen, p += keyLen);\n if (isBuf)\n packet.set(val, p += 4);\n else\n packet.utf8Write(val, p += 4, valLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, env: ${key}=${val})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n x11Forward(chan, cfg, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n const protocol = cfg.protocol;\n const cookie = cfg.cookie;\n const isBufProto = Buffer.isBuffer(protocol);\n const protoLen = (isBufProto\n ? protocol.length\n : Buffer.byteLength(protocol));\n const isBufCookie = Buffer.isBuffer(cookie);\n const cookieLen = (isBufCookie\n ? cookie.length\n : Buffer.byteLength(cookie));\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 7 + 1 + 1 + 4 + protoLen + 4 + cookieLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 7, p += 4);\n packet.utf8Write('x11-req', p += 4, 7);\n\n packet[p += 7] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n packet[++p] = (cfg.single ? 1 : 0);\n\n writeUInt32BE(packet, protoLen, ++p);\n if (isBufProto)\n packet.set(protocol, p += 4);\n else\n packet.utf8Write(protocol, p += 4, protoLen);\n\n writeUInt32BE(packet, cookieLen, p += protoLen);\n if (isBufCookie)\n packet.set(cookie, p += 4);\n else\n packet.latin1Write(cookie, p += 4, cookieLen);\n\n writeUInt32BE(packet, (cfg.screen || 0), p += cookieLen);\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_REQUEST (r:${chan}, x11-req)`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n subsystem(chan, name, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n const nameLen = Buffer.byteLength(name);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 9 + 1 + 4 + nameLen);\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 9, p += 4);\n packet.utf8Write('subsystem', p += 4, 9);\n\n packet[p += 9] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, nameLen, ++p);\n packet.utf8Write(name, p += 4, nameLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, subsystem: ${name})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_agentForward(chan, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 26 + 1);\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 26, p += 4);\n packet.utf8Write('auth-agent-req@openssh.com', p += 4, 26);\n\n packet[p += 26] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n if (this._debug) {\n this._debug(\n 'Outbound: Sending CHANNEL_REQUEST '\n + `(r:${chan}, auth-agent-req@openssh.com)`\n );\n }\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_hostKeysProve(keys) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n let keysTotal = 0;\n const publicKeys = [];\n for (const key of keys) {\n const publicKey = key.getPublicSSH();\n keysTotal += 4 + publicKey.length;\n publicKeys.push(publicKey);\n }\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 29 + 1 + keysTotal);\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 29, ++p);\n packet.utf8Write('hostkeys-prove-00@openssh.com', p += 4, 29);\n\n packet[p += 29] = 1; // want reply\n\n ++p;\n for (const buf of publicKeys) {\n writeUInt32BE(packet, buf.length, p);\n bufferCopy(buf, packet, 0, buf.length, p += 4);\n p += buf.length;\n }\n\n if (this._debug) {\n this._debug(\n 'Outbound: Sending GLOBAL_REQUEST (hostkeys-prove-00@openssh.com)'\n );\n }\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n\n // ===========================================================================\n // Server-specific ===========================================================\n // ===========================================================================\n\n // Global\n // ------\n serviceAccept(svcName) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n const svcNameLen = Buffer.byteLength(svcName);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + svcNameLen);\n\n packet[p] = MESSAGE.SERVICE_ACCEPT;\n\n writeUInt32BE(packet, svcNameLen, ++p);\n packet.utf8Write(svcName, p += 4, svcNameLen);\n\n this._debug && this._debug(`Outbound: Sending SERVICE_ACCEPT (${svcName})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n\n if (this._server && this._banner && svcName === 'ssh-userauth') {\n const banner = this._banner;\n this._banner = undefined; // Prevent banner from being displayed again\n const bannerLen = Buffer.byteLength(banner);\n p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + bannerLen + 4);\n\n packet[p] = MESSAGE.USERAUTH_BANNER;\n\n writeUInt32BE(packet, bannerLen, ++p);\n packet.utf8Write(banner, p += 4, bannerLen);\n\n writeUInt32BE(packet, 0, p += bannerLen); // Empty language tag\n\n this._debug && this._debug('Outbound: Sending USERAUTH_BANNER');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n }\n // 'ssh-connection' service-specific\n forwardedTcpip(chan, initWindow, maxPacket, cfg) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n const boundAddrLen = Buffer.byteLength(cfg.boundAddr);\n const remoteAddrLen = Buffer.byteLength(cfg.remoteAddr);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 15 + 4 + 4 + 4 + 4 + boundAddrLen + 4 + 4 + remoteAddrLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 15, ++p);\n packet.utf8Write('forwarded-tcpip', p += 4, 15);\n\n writeUInt32BE(packet, chan, p += 15);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n writeUInt32BE(packet, boundAddrLen, p += 4);\n packet.utf8Write(cfg.boundAddr, p += 4, boundAddrLen);\n\n writeUInt32BE(packet, cfg.boundPort, p += boundAddrLen);\n\n writeUInt32BE(packet, remoteAddrLen, p += 4);\n packet.utf8Write(cfg.remoteAddr, p += 4, remoteAddrLen);\n\n writeUInt32BE(packet, cfg.remotePort, p += remoteAddrLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_OPEN (r:${chan}, forwarded-tcpip)`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n x11(chan, initWindow, maxPacket, cfg) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n const addrLen = Buffer.byteLength(cfg.originAddr);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 3 + 4 + 4 + 4 + 4 + addrLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 3, ++p);\n packet.utf8Write('x11', p += 4, 3);\n\n writeUInt32BE(packet, chan, p += 3);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n writeUInt32BE(packet, addrLen, p += 4);\n packet.utf8Write(cfg.originAddr, p += 4, addrLen);\n\n writeUInt32BE(packet, cfg.originPort, p += addrLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_OPEN (r:${chan}, x11)`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_authAgent(chan, initWindow, maxPacket) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 22 + 4 + 4 + 4);\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 22, ++p);\n packet.utf8Write('auth-agent@openssh.com', p += 4, 22);\n\n writeUInt32BE(packet, chan, p += 22);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_OPEN (r:${chan}, auth-agent@openssh.com)`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_forwardedStreamLocal(chan, initWindow, maxPacket, cfg) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n const pathLen = Buffer.byteLength(cfg.socketPath);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 33 + 4 + 4 + 4 + 4 + pathLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 33, ++p);\n packet.utf8Write('forwarded-streamlocal@openssh.com', p += 4, 33);\n\n writeUInt32BE(packet, chan, p += 33);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n writeUInt32BE(packet, pathLen, p += 4);\n packet.utf8Write(cfg.socketPath, p += 4, pathLen);\n\n writeUInt32BE(packet, 0, p += pathLen);\n\n if (this._debug) {\n this._debug(\n 'Outbound: Sending CHANNEL_OPEN '\n + `(r:${chan}, forwarded-streamlocal@openssh.com)`\n );\n }\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n exitStatus(chan, status) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n // Does not consume window space\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 11 + 1 + 4);\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 11, p += 4);\n packet.utf8Write('exit-status', p += 4, 11);\n\n packet[p += 11] = 0;\n\n writeUInt32BE(packet, status, ++p);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, exit-status: ${status})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n exitSignal(chan, name, coreDumped, msg) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n // Does not consume window space\n\n const origSignal = name;\n\n if (typeof origSignal !== 'string' || !origSignal)\n throw new Error(`Invalid signal: ${origSignal}`);\n\n let signal = name.toUpperCase();\n if (signal.slice(0, 3) === 'SIG')\n signal = signal.slice(3);\n\n if (SIGNALS[signal] !== 1)\n throw new Error(`Invalid signal: ${origSignal}`);\n\n const nameLen = Buffer.byteLength(signal);\n const msgLen = (msg ? Buffer.byteLength(msg) : 0);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 11 + 1 + 4 + nameLen + 1 + 4 + msgLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 11, p += 4);\n packet.utf8Write('exit-signal', p += 4, 11);\n\n packet[p += 11] = 0;\n\n writeUInt32BE(packet, nameLen, ++p);\n packet.utf8Write(signal, p += 4, nameLen);\n\n packet[p += nameLen] = (coreDumped ? 1 : 0);\n\n writeUInt32BE(packet, msgLen, ++p);\n\n p += 4;\n if (msgLen) {\n packet.utf8Write(msg, p, msgLen);\n p += msgLen;\n }\n\n writeUInt32BE(packet, 0, p);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, exit-signal: ${name})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n // 'ssh-userauth' service-specific\n authFailure(authMethods, isPartial) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n if (this._authsQueue.length === 0)\n throw new Error('No auth in progress');\n\n let methods;\n\n if (typeof authMethods === 'boolean') {\n isPartial = authMethods;\n authMethods = undefined;\n }\n\n if (authMethods) {\n methods = [];\n for (let i = 0; i < authMethods.length; ++i) {\n if (authMethods[i].toLowerCase() === 'none')\n continue;\n methods.push(authMethods[i]);\n }\n methods = methods.join(',');\n } else {\n methods = '';\n }\n\n const methodsLen = methods.length;\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + methodsLen + 1);\n\n packet[p] = MESSAGE.USERAUTH_FAILURE;\n\n writeUInt32BE(packet, methodsLen, ++p);\n packet.utf8Write(methods, p += 4, methodsLen);\n\n packet[p += methodsLen] = (isPartial === true ? 1 : 0);\n\n this._authsQueue.shift();\n\n this._debug && this._debug('Outbound: Sending USERAUTH_FAILURE');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authSuccess() {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n if (this._authsQueue.length === 0)\n throw new Error('No auth in progress');\n\n const p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1);\n\n packet[p] = MESSAGE.USERAUTH_SUCCESS;\n\n this._authsQueue.shift();\n this._authenticated = true;\n\n this._debug && this._debug('Outbound: Sending USERAUTH_SUCCESS');\n sendPacket(this, this._packetRW.write.finalize(packet));\n\n if (this._kex.negotiated.cs.compress === 'zlib@openssh.com')\n this._packetRW.read = new ZlibPacketReader();\n if (this._kex.negotiated.sc.compress === 'zlib@openssh.com')\n this._packetRW.write = new ZlibPacketWriter(this);\n }\n authPKOK(keyAlgo, key) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n if (this._authsQueue.length === 0 || this._authsQueue[0] !== 'publickey')\n throw new Error('\"publickey\" auth not in progress');\n\n // TODO: support parsed key for `key`\n\n const keyAlgoLen = Buffer.byteLength(keyAlgo);\n const keyLen = key.length;\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + keyAlgoLen + 4 + keyLen);\n\n packet[p] = MESSAGE.USERAUTH_PK_OK;\n\n writeUInt32BE(packet, keyAlgoLen, ++p);\n packet.utf8Write(keyAlgo, p += 4, keyAlgoLen);\n\n writeUInt32BE(packet, keyLen, p += keyAlgoLen);\n packet.set(key, p += 4);\n\n this._authsQueue.shift();\n\n this._debug && this._debug('Outbound: Sending USERAUTH_PK_OK');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authPasswdChg(prompt) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n const promptLen = Buffer.byteLength(prompt);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + promptLen + 4);\n\n packet[p] = MESSAGE.USERAUTH_PASSWD_CHANGEREQ;\n\n writeUInt32BE(packet, promptLen, ++p);\n packet.utf8Write(prompt, p += 4, promptLen);\n\n writeUInt32BE(packet, 0, p += promptLen); // Empty language tag\n\n this._debug && this._debug('Outbound: Sending USERAUTH_PASSWD_CHANGEREQ');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authInfoReq(name, instructions, prompts) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n let promptsLen = 0;\n const nameLen = name ? Buffer.byteLength(name) : 0;\n const instrLen = instructions ? Buffer.byteLength(instructions) : 0;\n\n for (let i = 0; i < prompts.length; ++i)\n promptsLen += 4 + Buffer.byteLength(prompts[i].prompt) + 1;\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + nameLen + 4 + instrLen + 4 + 4 + promptsLen\n );\n\n packet[p] = MESSAGE.USERAUTH_INFO_REQUEST;\n\n writeUInt32BE(packet, nameLen, ++p);\n p += 4;\n if (name) {\n packet.utf8Write(name, p, nameLen);\n p += nameLen;\n }\n\n writeUInt32BE(packet, instrLen, p);\n p += 4;\n if (instructions) {\n packet.utf8Write(instructions, p, instrLen);\n p += instrLen;\n }\n\n writeUInt32BE(packet, 0, p);\n\n writeUInt32BE(packet, prompts.length, p += 4);\n p += 4;\n for (let i = 0; i < prompts.length; ++i) {\n const prompt = prompts[i];\n const promptLen = Buffer.byteLength(prompt.prompt);\n\n writeUInt32BE(packet, promptLen, p);\n p += 4;\n if (promptLen) {\n packet.utf8Write(prompt.prompt, p, promptLen);\n p += promptLen;\n }\n packet[p++] = (prompt.echo ? 1 : 0);\n }\n\n this._debug && this._debug('Outbound: Sending USERAUTH_INFO_REQUEST');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n}\n\n// SSH-protoversion-softwareversion (SP comments) CR LF\nconst RE_IDENT = /^SSH-(2\\.0|1\\.99)-([^ ]+)(?: (.*))?$/;\n\n// TODO: optimize this by starting n bytes from the end of this._buffer instead\n// of the beginning\nfunction parseHeader(chunk, p, len) {\n let data;\n let chunkOffset;\n if (this._buffer) {\n data = Buffer.allocUnsafe(this._buffer.length + (len - p));\n data.set(this._buffer, 0);\n if (p === 0) {\n data.set(chunk, this._buffer.length);\n } else {\n data.set(new Uint8Array(chunk.buffer,\n chunk.byteOffset + p,\n (len - p)),\n this._buffer.length);\n }\n chunkOffset = this._buffer.length;\n p = 0;\n } else {\n data = chunk;\n chunkOffset = 0;\n }\n const op = p;\n let start = p;\n let end = p;\n let needNL = false;\n let lineLen = 0;\n let lines = 0;\n for (; p < data.length; ++p) {\n const ch = data[p];\n\n if (ch === 13 /* '\\r' */) {\n needNL = true;\n continue;\n }\n\n if (ch === 10 /* '\\n' */) {\n if (end > start\n && end - start > 4\n && data[start] === 83 /* 'S' */\n && data[start + 1] === 83 /* 'S' */\n && data[start + 2] === 72 /* 'H' */\n && data[start + 3] === 45 /* '-' */) {\n\n const full = data.latin1Slice(op, end + 1);\n const identRaw = (start === op ? full : full.slice(start - op));\n const m = RE_IDENT.exec(identRaw);\n if (!m)\n throw new Error('Invalid identification string');\n\n const header = {\n greeting: (start === op ? '' : full.slice(0, start - op)),\n identRaw,\n versions: {\n protocol: m[1],\n software: m[2],\n },\n comments: m[3]\n };\n\n // Needed during handshake\n this._remoteIdentRaw = Buffer.from(identRaw);\n\n this._debug && this._debug(`Remote ident: ${inspect(identRaw)}`);\n this._compatFlags = getCompatFlags(header);\n\n this._buffer = undefined;\n this._decipher =\n new NullDecipher(0, onKEXPayload.bind(this, { firstPacket: true }));\n this._parse = parsePacket;\n\n this._onHeader(header);\n if (!this._destruct) {\n // We disconnected inside _onHeader\n return len;\n }\n\n kexinit(this);\n\n return p + 1 - chunkOffset;\n }\n\n // Only allow pre-ident greetings when we're a client\n if (this._server)\n throw new Error('Greetings from clients not permitted');\n\n if (++lines > MAX_LINES)\n throw new Error('Max greeting lines exceeded');\n\n needNL = false;\n start = p + 1;\n lineLen = 0;\n } else if (needNL) {\n throw new Error('Invalid header: expected newline');\n } else if (++lineLen >= MAX_LINE_LEN) {\n throw new Error('Header line too long');\n }\n\n end = p;\n }\n if (!this._buffer)\n this._buffer = bufferSlice(data, op);\n\n return p - chunkOffset;\n}\n\nfunction parsePacket(chunk, p, len) {\n return this._decipher.decrypt(chunk, p, len);\n}\n\nfunction onPayload(payload) {\n // XXX: move this to the Decipher implementations?\n\n this._onPacket();\n\n if (payload.length === 0) {\n this._debug && this._debug('Inbound: Skipping empty packet payload');\n return;\n }\n\n payload = this._packetRW.read.read(payload);\n\n const type = payload[0];\n if (type === MESSAGE.USERAUTH_SUCCESS\n && !this._server\n && !this._authenticated) {\n this._authenticated = true;\n if (this._kex.negotiated.cs.compress === 'zlib@openssh.com')\n this._packetRW.write = new ZlibPacketWriter(this);\n if (this._kex.negotiated.sc.compress === 'zlib@openssh.com')\n this._packetRW.read = new ZlibPacketReader();\n }\n const handler = MESSAGE_HANDLERS[type];\n if (handler === undefined) {\n this._debug && this._debug(`Inbound: Unsupported message type: ${type}`);\n return;\n }\n\n return handler(this, payload);\n}\n\nfunction getCompatFlags(header) {\n const software = header.versions.software;\n\n let flags = 0;\n\n for (const rule of COMPAT_CHECKS) {\n if (typeof rule[0] === 'string') {\n if (software === rule[0])\n flags |= rule[1];\n } else if (rule[0].test(software)) {\n flags |= rule[1];\n }\n }\n\n return flags;\n}\n\nfunction modesToBytes(modes) {\n const keys = Object.keys(modes);\n const bytes = Buffer.allocUnsafe((5 * keys.length) + 1);\n let b = 0;\n\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n if (key === 'TTY_OP_END')\n continue;\n\n const opcode = TERMINAL_MODE[key];\n if (opcode === undefined)\n continue;\n\n const val = modes[key];\n if (typeof val === 'number' && isFinite(val)) {\n bytes[b++] = opcode;\n bytes[b++] = val >>> 24;\n bytes[b++] = val >>> 16;\n bytes[b++] = val >>> 8;\n bytes[b++] = val;\n }\n }\n\n bytes[b++] = TERMINAL_MODE.TTY_OP_END;\n\n if (b < bytes.length)\n return bufferSlice(bytes, 0, b);\n\n return bytes;\n}\n\nfunction sendExtInfo(proto) {\n let serverSigAlgs =\n 'ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521'\n + 'rsa-sha2-512,rsa-sha2-256,ssh-rsa,ssh-dss';\n if (eddsaSupported)\n serverSigAlgs = `ssh-ed25519,${serverSigAlgs}`;\n const algsLen = Buffer.byteLength(serverSigAlgs);\n\n let p = proto._packetRW.write.allocStart;\n const packet = proto._packetRW.write.alloc(1 + 4 + 4 + 15 + 4 + algsLen);\n\n packet[p] = MESSAGE.EXT_INFO;\n\n writeUInt32BE(packet, 1, ++p);\n\n writeUInt32BE(packet, 15, p += 4);\n packet.utf8Write('server-sig-algs', p += 4, 15);\n\n writeUInt32BE(packet, algsLen, p += 15);\n packet.utf8Write(serverSigAlgs, p += 4, algsLen);\n\n proto._debug && proto._debug('Outbound: Sending EXT_INFO');\n sendPacket(proto, proto._packetRW.write.finalize(packet));\n}\n\nmodule.exports = Protocol;\n", "'use strict';\n\nconst assert = require('assert');\nconst { inspect } = require('util');\n\n// Only use this for integers! Decimal numbers do not work with this function.\nfunction addNumericalSeparator(val) {\n let res = '';\n let i = val.length;\n const start = val[0] === '-' ? 1 : 0;\n for (; i >= start + 4; i -= 3)\n res = `_${val.slice(i - 3, i)}${res}`;\n return `${val.slice(0, i)}${res}`;\n}\n\nfunction oneOf(expected, thing) {\n assert(typeof thing === 'string', '`thing` has to be of type string');\n if (Array.isArray(expected)) {\n const len = expected.length;\n assert(len > 0, 'At least one expected value needs to be specified');\n expected = expected.map((i) => String(i));\n if (len > 2) {\n return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or `\n + expected[len - 1];\n } else if (len === 2) {\n return `one of ${thing} ${expected[0]} or ${expected[1]}`;\n }\n return `of ${thing} ${expected[0]}`;\n }\n return `of ${thing} ${String(expected)}`;\n}\n\n\nexports.ERR_INTERNAL_ASSERTION = class ERR_INTERNAL_ASSERTION extends Error {\n constructor(message) {\n super();\n Error.captureStackTrace(this, ERR_INTERNAL_ASSERTION);\n\n const suffix = 'This is caused by either a bug in ssh2 '\n + 'or incorrect usage of ssh2 internals.\\n'\n + 'Please open an issue with this stack trace at '\n + 'https://github.com/mscdex/ssh2/issues\\n';\n\n this.message = (message === undefined ? suffix : `${message}\\n${suffix}`);\n }\n};\n\nconst MAX_32BIT_INT = 2 ** 32;\nconst MAX_32BIT_BIGINT = (() => {\n try {\n return new Function('return 2n ** 32n')();\n } catch {}\n})();\nexports.ERR_OUT_OF_RANGE = class ERR_OUT_OF_RANGE extends RangeError {\n constructor(str, range, input, replaceDefaultBoolean) {\n super();\n Error.captureStackTrace(this, ERR_OUT_OF_RANGE);\n\n assert(range, 'Missing \"range\" argument');\n let msg = (replaceDefaultBoolean\n ? str\n : `The value of \"${str}\" is out of range.`);\n let received;\n if (Number.isInteger(input) && Math.abs(input) > MAX_32BIT_INT) {\n received = addNumericalSeparator(String(input));\n } else if (typeof input === 'bigint') {\n received = String(input);\n if (input > MAX_32BIT_BIGINT || input < -MAX_32BIT_BIGINT)\n received = addNumericalSeparator(received);\n received += 'n';\n } else {\n received = inspect(input);\n }\n msg += ` It must be ${range}. Received ${received}`;\n\n this.message = msg;\n }\n};\n\nclass ERR_INVALID_ARG_TYPE extends TypeError {\n constructor(name, expected, actual) {\n super();\n Error.captureStackTrace(this, ERR_INVALID_ARG_TYPE);\n\n assert(typeof name === 'string', `'name' must be a string`);\n\n // determiner: 'must be' or 'must not be'\n let determiner;\n if (typeof expected === 'string' && expected.startsWith('not ')) {\n determiner = 'must not be';\n expected = expected.replace(/^not /, '');\n } else {\n determiner = 'must be';\n }\n\n let msg;\n if (name.endsWith(' argument')) {\n // For cases like 'first argument'\n msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`;\n } else {\n const type = (name.includes('.') ? 'property' : 'argument');\n msg = `The \"${name}\" ${type} ${determiner} ${oneOf(expected, 'type')}`;\n }\n\n msg += `. Received type ${typeof actual}`;\n\n this.message = msg;\n }\n}\nexports.ERR_INVALID_ARG_TYPE = ERR_INVALID_ARG_TYPE;\n\nexports.validateNumber = function validateNumber(value, name) {\n if (typeof value !== 'number')\n throw new ERR_INVALID_ARG_TYPE(name, 'number', value);\n};\n", "'use strict';\n\nconst EventEmitter = require('events');\nconst fs = require('fs');\nconst { constants } = fs;\nconst {\n Readable: ReadableStream,\n Writable: WritableStream\n} = require('stream');\nconst { inherits, types: { isDate } } = require('util');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst {\n bufferCopy,\n bufferSlice,\n makeBufferParser,\n writeUInt32BE,\n} = require('./utils.js');\n\nconst ATTR = {\n SIZE: 0x00000001,\n UIDGID: 0x00000002,\n PERMISSIONS: 0x00000004,\n ACMODTIME: 0x00000008,\n EXTENDED: 0x80000000,\n};\n\n// Large enough to store all possible attributes\nconst ATTRS_BUF = Buffer.alloc(28);\n\nconst STATUS_CODE = {\n OK: 0,\n EOF: 1,\n NO_SUCH_FILE: 2,\n PERMISSION_DENIED: 3,\n FAILURE: 4,\n BAD_MESSAGE: 5,\n NO_CONNECTION: 6,\n CONNECTION_LOST: 7,\n OP_UNSUPPORTED: 8\n};\n\nconst VALID_STATUS_CODES = new Map(\n Object.values(STATUS_CODE).map((n) => [n, 1])\n);\n\nconst STATUS_CODE_STR = {\n [STATUS_CODE.OK]: 'No error',\n [STATUS_CODE.EOF]: 'End of file',\n [STATUS_CODE.NO_SUCH_FILE]: 'No such file or directory',\n [STATUS_CODE.PERMISSION_DENIED]: 'Permission denied',\n [STATUS_CODE.FAILURE]: 'Failure',\n [STATUS_CODE.BAD_MESSAGE]: 'Bad message',\n [STATUS_CODE.NO_CONNECTION]: 'No connection',\n [STATUS_CODE.CONNECTION_LOST]: 'Connection lost',\n [STATUS_CODE.OP_UNSUPPORTED]: 'Operation unsupported',\n};\n\nconst REQUEST = {\n INIT: 1,\n OPEN: 3,\n CLOSE: 4,\n READ: 5,\n WRITE: 6,\n LSTAT: 7,\n FSTAT: 8,\n SETSTAT: 9,\n FSETSTAT: 10,\n OPENDIR: 11,\n READDIR: 12,\n REMOVE: 13,\n MKDIR: 14,\n RMDIR: 15,\n REALPATH: 16,\n STAT: 17,\n RENAME: 18,\n READLINK: 19,\n SYMLINK: 20,\n EXTENDED: 200\n};\n\nconst RESPONSE = {\n VERSION: 2,\n STATUS: 101,\n HANDLE: 102,\n DATA: 103,\n NAME: 104,\n ATTRS: 105,\n EXTENDED: 201\n};\n\nconst OPEN_MODE = {\n READ: 0x00000001,\n WRITE: 0x00000002,\n APPEND: 0x00000004,\n CREAT: 0x00000008,\n TRUNC: 0x00000010,\n EXCL: 0x00000020\n};\n\nconst PKT_RW_OVERHEAD = 2 * 1024;\nconst MAX_REQID = 2 ** 32 - 1;\nconst CLIENT_VERSION_BUFFER = Buffer.from([\n 0, 0, 0, 5 /* length */,\n REQUEST.INIT,\n 0, 0, 0, 3 /* version */\n]);\nconst SERVER_VERSION_BUFFER = Buffer.from([\n 0, 0, 0, 5 /* length */,\n RESPONSE.VERSION,\n 0, 0, 0, 3 /* version */\n]);\n\nconst RE_OPENSSH = /^SSH-2.0-(?:OpenSSH|dropbear)/;\nconst OPENSSH_MAX_PKT_LEN = 256 * 1024;\n\nconst bufferParser = makeBufferParser();\n\nconst fakeStderr = {\n readable: false,\n writable: false,\n push: (data) => {},\n once: () => {},\n on: () => {},\n emit: () => {},\n end: () => {},\n};\n\nfunction noop() {}\n\n// Emulates enough of `Channel` to be able to be used as a drop-in replacement\n// in order to process incoming data with as little overhead as possible\nclass SFTP extends EventEmitter {\n constructor(client, chanInfo, cfg) {\n super();\n\n if (typeof cfg !== 'object' || !cfg)\n cfg = {};\n\n const remoteIdentRaw = client._protocol._remoteIdentRaw;\n\n this.server = !!cfg.server;\n this._debug = (typeof cfg.debug === 'function' ? cfg.debug : undefined);\n this._isOpenSSH = (remoteIdentRaw && RE_OPENSSH.test(remoteIdentRaw));\n\n this._version = -1;\n this._extensions = {};\n this._biOpt = cfg.biOpt;\n this._pktLenBytes = 0;\n this._pktLen = 0;\n this._pktPos = 0;\n this._pktType = 0;\n this._pktData = undefined;\n this._writeReqid = -1;\n this._requests = {};\n this._maxInPktLen = OPENSSH_MAX_PKT_LEN;\n this._maxOutPktLen = 34000;\n this._maxReadLen =\n (this._isOpenSSH ? OPENSSH_MAX_PKT_LEN : 34000) - PKT_RW_OVERHEAD;\n this._maxWriteLen =\n (this._isOpenSSH ? OPENSSH_MAX_PKT_LEN : 34000) - PKT_RW_OVERHEAD;\n\n this.maxOpenHandles = undefined;\n\n // Channel compatibility\n this._client = client;\n this._protocol = client._protocol;\n this._callbacks = [];\n this._hasX11 = false;\n this._exit = {\n code: undefined,\n signal: undefined,\n dump: undefined,\n desc: undefined,\n };\n this._waitWindow = false; // SSH-level backpressure\n this._chunkcb = undefined;\n this._buffer = [];\n this.type = chanInfo.type;\n this.subtype = undefined;\n this.incoming = chanInfo.incoming;\n this.outgoing = chanInfo.outgoing;\n this.stderr = fakeStderr;\n this.readable = true;\n }\n\n // This handles incoming data to parse\n push(data) {\n if (data === null) {\n cleanupRequests(this);\n if (!this.readable)\n return;\n // No more incoming data from the remote side\n this.readable = false;\n this.emit('end');\n return;\n }\n /*\n uint32 length\n byte type\n byte[length - 1] data payload\n */\n let p = 0;\n\n while (p < data.length) {\n if (this._pktLenBytes < 4) {\n let nb = Math.min(4 - this._pktLenBytes, data.length - p);\n this._pktLenBytes += nb;\n\n while (nb--)\n this._pktLen = (this._pktLen << 8) + data[p++];\n\n if (this._pktLenBytes < 4)\n return;\n if (this._pktLen === 0)\n return doFatalSFTPError(this, 'Invalid packet length');\n if (this._pktLen > this._maxInPktLen) {\n const max = this._maxInPktLen;\n return doFatalSFTPError(\n this,\n `Packet length ${this._pktLen} exceeds max length of ${max}`\n );\n }\n if (p >= data.length)\n return;\n }\n if (this._pktPos < this._pktLen) {\n const nb = Math.min(this._pktLen - this._pktPos, data.length - p);\n if (p !== 0 || nb !== data.length) {\n if (nb === this._pktLen) {\n this._pkt = new FastBuffer(data.buffer, data.byteOffset + p, nb);\n } else {\n if (!this._pkt)\n this._pkt = Buffer.allocUnsafe(this._pktLen);\n this._pkt.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._pktPos\n );\n }\n } else if (nb === this._pktLen) {\n this._pkt = data;\n } else {\n if (!this._pkt)\n this._pkt = Buffer.allocUnsafe(this._pktLen);\n this._pkt.set(data, this._pktPos);\n }\n p += nb;\n this._pktPos += nb;\n if (this._pktPos < this._pktLen)\n return;\n }\n\n const type = this._pkt[0];\n const payload = this._pkt;\n\n // Prepare for next packet\n this._pktLen = 0;\n this._pktLenBytes = 0;\n this._pkt = undefined;\n this._pktPos = 0;\n\n const handler = (this.server\n ? SERVER_HANDLERS[type]\n : CLIENT_HANDLERS[type]);\n if (!handler)\n return doFatalSFTPError(this, `Unknown packet type ${type}`);\n\n if (this._version === -1) {\n if (this.server) {\n if (type !== REQUEST.INIT)\n return doFatalSFTPError(this, `Expected INIT packet, got ${type}`);\n } else if (type !== RESPONSE.VERSION) {\n return doFatalSFTPError(this, `Expected VERSION packet, got ${type}`);\n }\n }\n\n if (handler(this, payload) === false)\n return;\n }\n }\n\n end() {\n this.destroy();\n }\n destroy() {\n if (this.outgoing.state === 'open' || this.outgoing.state === 'eof') {\n this.outgoing.state = 'closing';\n this._protocol.channelClose(this.outgoing.id);\n }\n }\n _init() {\n this._init = noop;\n if (!this.server)\n sendOrBuffer(this, CLIENT_VERSION_BUFFER);\n }\n\n // ===========================================================================\n // Client-specific ===========================================================\n // ===========================================================================\n createReadStream(path, options) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n return new ReadStream(this, path, options);\n }\n createWriteStream(path, options) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n return new WriteStream(this, path, options);\n }\n open(path, flags_, attrs, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (typeof attrs === 'function') {\n cb = attrs;\n attrs = undefined;\n }\n\n const flags = (typeof flags_ === 'number' ? flags_ : stringToFlags(flags_));\n if (flags === null)\n throw new Error(`Unknown flags string: ${flags_}`);\n\n let attrsFlags = 0;\n let attrsLen = 0;\n if (typeof attrs === 'string' || typeof attrs === 'number')\n attrs = { mode: attrs };\n if (typeof attrs === 'object' && attrs !== null) {\n attrs = attrsToBytes(attrs);\n attrsFlags = attrs.flags;\n attrsLen = attrs.nb;\n }\n\n /*\n uint32 id\n string filename\n uint32 pflags\n ATTRS attrs\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen + 4 + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.OPEN;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n writeUInt32BE(buf, flags, p += pathLen);\n writeUInt32BE(buf, attrsFlags, p += 4);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} OPEN`\n );\n }\n close(handle, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n /*\n uint32 id\n string handle\n */\n const handleLen = handle.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.CLOSE;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, handleLen, p);\n buf.set(handle, p += 4);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} CLOSE`\n );\n }\n read(handle, buf, off, len, position, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n if (!Buffer.isBuffer(buf))\n throw new Error('buffer is not a Buffer');\n if (off >= buf.length)\n throw new Error('offset is out of bounds');\n if (off + len > buf.length)\n throw new Error('length extends beyond buffer');\n if (position === null)\n throw new Error('null position currently unsupported');\n\n read_(this, handle, buf, off, len, position, cb);\n }\n readData(handle, buf, off, len, position, cb) {\n // Backwards compatibility\n this.read(handle, buf, off, len, position, cb);\n }\n write(handle, buf, off, len, position, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n if (!Buffer.isBuffer(buf))\n throw new Error('buffer is not a Buffer');\n if (off > buf.length)\n throw new Error('offset is out of bounds');\n if (off + len > buf.length)\n throw new Error('length extends beyond buffer');\n if (position === null)\n throw new Error('null position currently unsupported');\n\n if (!len) {\n cb && process.nextTick(cb, undefined, 0);\n return;\n }\n\n const maxDataLen = this._maxWriteLen;\n const overflow = Math.max(len - maxDataLen, 0);\n const origPosition = position;\n\n if (overflow)\n len = maxDataLen;\n\n /*\n uint32 id\n string handle\n uint64 offset\n string data\n */\n const handleLen = handle.length;\n let p = 9;\n const out = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen + 8 + 4 + len);\n\n writeUInt32BE(out, out.length - 4, 0);\n out[4] = REQUEST.WRITE;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(out, reqid, 5);\n\n writeUInt32BE(out, handleLen, p);\n out.set(handle, p += 4);\n p += handleLen;\n for (let i = 7; i >= 0; --i) {\n out[p + i] = position & 0xFF;\n position /= 256;\n }\n writeUInt32BE(out, len, p += 8);\n bufferCopy(buf, out, off, off + len, p += 4);\n\n this._requests[reqid] = {\n cb: (err) => {\n if (err) {\n if (typeof cb === 'function')\n cb(err);\n } else if (overflow) {\n this.write(handle,\n buf,\n off + len,\n overflow,\n origPosition + len,\n cb);\n } else if (typeof cb === 'function') {\n cb(undefined, off + len);\n }\n }\n };\n\n const isSent = sendOrBuffer(this, out);\n if (this._debug) {\n const how = (isSent ? 'Sent' : 'Buffered');\n this._debug(`SFTP: Outbound: ${how} WRITE (id:${reqid})`);\n }\n }\n writeData(handle, buf, off, len, position, cb) {\n // Backwards compatibility\n this.write(handle, buf, off, len, position, cb);\n }\n fastGet(remotePath, localPath, opts, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n fastXfer(this, fs, remotePath, localPath, opts, cb);\n }\n fastPut(localPath, remotePath, opts, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n fastXfer(fs, this, localPath, remotePath, opts, cb);\n }\n readFile(path, options, callback_) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n let callback;\n if (typeof callback_ === 'function') {\n callback = callback_;\n } else if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n\n if (typeof options === 'string')\n options = { encoding: options, flag: 'r' };\n else if (!options)\n options = { encoding: null, flag: 'r' };\n else if (typeof options !== 'object')\n throw new TypeError('Bad arguments');\n\n const encoding = options.encoding;\n if (encoding && !Buffer.isEncoding(encoding))\n throw new Error(`Unknown encoding: ${encoding}`);\n\n // First stat the file, so we know the size.\n let size;\n let buffer; // Single buffer with file data\n let buffers; // List for when size is unknown\n let pos = 0;\n let handle;\n\n // SFTPv3 does not support using -1 for read position, so we have to track\n // read position manually\n let bytesRead = 0;\n\n const flag = options.flag || 'r';\n\n const read = () => {\n if (size === 0) {\n buffer = Buffer.allocUnsafe(8192);\n this.read(handle, buffer, 0, 8192, bytesRead, afterRead);\n } else {\n this.read(handle, buffer, pos, size - pos, bytesRead, afterRead);\n }\n };\n\n const afterRead = (er, nbytes) => {\n let eof;\n if (er) {\n eof = (er.code === STATUS_CODE.EOF);\n if (!eof) {\n return this.close(handle, () => {\n return callback && callback(er);\n });\n }\n } else {\n eof = false;\n }\n\n if (eof || (size === 0 && nbytes === 0))\n return close();\n\n bytesRead += nbytes;\n pos += nbytes;\n if (size !== 0) {\n if (pos === size)\n close();\n else\n read();\n } else {\n // Unknown size, just read until we don't get bytes.\n buffers.push(bufferSlice(buffer, 0, nbytes));\n read();\n }\n };\n afterRead._wantEOFError = true;\n\n const close = () => {\n this.close(handle, (er) => {\n if (size === 0) {\n // Collect the data into the buffers list.\n buffer = Buffer.concat(buffers, pos);\n } else if (pos < size) {\n buffer = bufferSlice(buffer, 0, pos);\n }\n\n if (encoding)\n buffer = buffer.toString(encoding);\n return callback && callback(er, buffer);\n });\n };\n\n this.open(path, flag, 0o666, (er, handle_) => {\n if (er)\n return callback && callback(er);\n handle = handle_;\n\n const tryStat = (er, st) => {\n if (er) {\n // Try stat() for sftp servers that may not support fstat() for\n // whatever reason\n this.stat(path, (er_, st_) => {\n if (er_) {\n return this.close(handle, () => {\n callback && callback(er);\n });\n }\n tryStat(null, st_);\n });\n return;\n }\n\n size = st.size || 0;\n if (size === 0) {\n // The kernel lies about many files.\n // Go ahead and try to read some bytes.\n buffers = [];\n return read();\n }\n\n buffer = Buffer.allocUnsafe(size);\n read();\n };\n this.fstat(handle, tryStat);\n });\n }\n writeFile(path, data, options, callback_) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n let callback;\n if (typeof callback_ === 'function') {\n callback = callback_;\n } else if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n\n if (typeof options === 'string')\n options = { encoding: options, mode: 0o666, flag: 'w' };\n else if (!options)\n options = { encoding: 'utf8', mode: 0o666, flag: 'w' };\n else if (typeof options !== 'object')\n throw new TypeError('Bad arguments');\n\n if (options.encoding && !Buffer.isEncoding(options.encoding))\n throw new Error(`Unknown encoding: ${options.encoding}`);\n\n const flag = options.flag || 'w';\n this.open(path, flag, options.mode, (openErr, handle) => {\n if (openErr) {\n callback && callback(openErr);\n } else {\n const buffer = (Buffer.isBuffer(data)\n ? data\n : Buffer.from('' + data, options.encoding || 'utf8'));\n const position = (/a/.test(flag) ? null : 0);\n\n // SFTPv3 does not support the notion of 'current position'\n // (null position), so we just attempt to append to the end of the file\n // instead\n if (position === null) {\n const tryStat = (er, st) => {\n if (er) {\n // Try stat() for sftp servers that may not support fstat() for\n // whatever reason\n this.stat(path, (er_, st_) => {\n if (er_) {\n return this.close(handle, () => {\n callback && callback(er);\n });\n }\n tryStat(null, st_);\n });\n return;\n }\n writeAll(this, handle, buffer, 0, buffer.length, st.size, callback);\n };\n this.fstat(handle, tryStat);\n return;\n }\n writeAll(this, handle, buffer, 0, buffer.length, position, callback);\n }\n });\n }\n appendFile(path, data, options, callback_) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n let callback;\n if (typeof callback_ === 'function') {\n callback = callback_;\n } else if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n\n if (typeof options === 'string')\n options = { encoding: options, mode: 0o666, flag: 'a' };\n else if (!options)\n options = { encoding: 'utf8', mode: 0o666, flag: 'a' };\n else if (typeof options !== 'object')\n throw new TypeError('Bad arguments');\n\n if (!options.flag)\n options = Object.assign({ flag: 'a' }, options);\n this.writeFile(path, data, options, callback);\n }\n exists(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n this.stat(path, (err) => {\n cb && cb(err ? false : true);\n });\n }\n unlink(filename, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string filename\n */\n const fnameLen = Buffer.byteLength(filename);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + fnameLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.REMOVE;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, fnameLen, p);\n buf.utf8Write(filename, p += 4, fnameLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} REMOVE`\n );\n }\n rename(oldPath, newPath, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string oldpath\n string newpath\n */\n const oldLen = Buffer.byteLength(oldPath);\n const newLen = Buffer.byteLength(newPath);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + oldLen + 4 + newLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.RENAME;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, oldLen, p);\n buf.utf8Write(oldPath, p += 4, oldLen);\n writeUInt32BE(buf, newLen, p += oldLen);\n buf.utf8Write(newPath, p += 4, newLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} RENAME`\n );\n }\n mkdir(path, attrs, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n let flags = 0;\n let attrsLen = 0;\n\n if (typeof attrs === 'function') {\n cb = attrs;\n attrs = undefined;\n }\n if (typeof attrs === 'object' && attrs !== null) {\n attrs = attrsToBytes(attrs);\n flags = attrs.flags;\n attrsLen = attrs.nb;\n }\n\n /*\n uint32 id\n string path\n ATTRS attrs\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.MKDIR;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n writeUInt32BE(buf, flags, p += pathLen);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} MKDIR`\n );\n }\n rmdir(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.RMDIR;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} RMDIR`\n );\n }\n readdir(where, opts, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n if (typeof opts !== 'object' || opts === null)\n opts = {};\n\n const doFilter = (opts && opts.full ? false : true);\n\n if (!Buffer.isBuffer(where) && typeof where !== 'string')\n throw new Error('missing directory handle or path');\n\n if (typeof where === 'string') {\n const entries = [];\n let e = 0;\n\n const reread = (err, handle) => {\n if (err)\n return cb(err);\n\n this.readdir(handle, opts, (err, list) => {\n const eof = (err && err.code === STATUS_CODE.EOF);\n\n if (err && !eof)\n return this.close(handle, () => cb(err));\n\n if (eof) {\n return this.close(handle, (err) => {\n if (err)\n return cb(err);\n cb(undefined, entries);\n });\n }\n\n for (let i = 0; i < list.length; ++i, ++e)\n entries[e] = list[i];\n\n reread(undefined, handle);\n });\n };\n return this.opendir(where, reread);\n }\n\n /*\n uint32 id\n string handle\n */\n const handleLen = where.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.READDIR;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, handleLen, p);\n buf.set(where, p += 4);\n\n this._requests[reqid] = {\n cb: (doFilter\n ? (err, list) => {\n if (typeof cb !== 'function')\n return;\n if (err)\n return cb(err);\n\n for (let i = list.length - 1; i >= 0; --i) {\n if (list[i].filename === '.' || list[i].filename === '..')\n list.splice(i, 1);\n }\n\n cb(undefined, list);\n }\n : cb)\n };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} READDIR`\n );\n }\n fstat(handle, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n /*\n uint32 id\n string handle\n */\n const handleLen = handle.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.FSTAT;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, handleLen, p);\n buf.set(handle, p += 4);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} FSTAT`\n );\n }\n stat(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.STAT;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} STAT`\n );\n }\n lstat(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.LSTAT;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} LSTAT`\n );\n }\n opendir(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.OPENDIR;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} OPENDIR`\n );\n }\n setstat(path, attrs, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n let flags = 0;\n let attrsLen = 0;\n\n if (typeof attrs === 'object' && attrs !== null) {\n attrs = attrsToBytes(attrs);\n flags = attrs.flags;\n attrsLen = attrs.nb;\n } else if (typeof attrs === 'function') {\n cb = attrs;\n }\n\n /*\n uint32 id\n string path\n ATTRS attrs\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.SETSTAT;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n writeUInt32BE(buf, flags, p += pathLen);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} SETSTAT`\n );\n }\n fsetstat(handle, attrs, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n let flags = 0;\n let attrsLen = 0;\n\n if (typeof attrs === 'object' && attrs !== null) {\n attrs = attrsToBytes(attrs);\n flags = attrs.flags;\n attrsLen = attrs.nb;\n } else if (typeof attrs === 'function') {\n cb = attrs;\n }\n\n /*\n uint32 id\n string handle\n ATTRS attrs\n */\n const handleLen = handle.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.FSETSTAT;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, handleLen, p);\n buf.set(handle, p += 4);\n writeUInt32BE(buf, flags, p += handleLen);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} FSETSTAT`\n );\n }\n futimes(handle, atime, mtime, cb) {\n return this.fsetstat(handle, {\n atime: toUnixTimestamp(atime),\n mtime: toUnixTimestamp(mtime)\n }, cb);\n }\n utimes(path, atime, mtime, cb) {\n return this.setstat(path, {\n atime: toUnixTimestamp(atime),\n mtime: toUnixTimestamp(mtime)\n }, cb);\n }\n fchown(handle, uid, gid, cb) {\n return this.fsetstat(handle, {\n uid: uid,\n gid: gid\n }, cb);\n }\n chown(path, uid, gid, cb) {\n return this.setstat(path, {\n uid: uid,\n gid: gid\n }, cb);\n }\n fchmod(handle, mode, cb) {\n return this.fsetstat(handle, {\n mode: mode\n }, cb);\n }\n chmod(path, mode, cb) {\n return this.setstat(path, {\n mode: mode\n }, cb);\n }\n readlink(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.READLINK;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = {\n cb: (err, names) => {\n if (typeof cb !== 'function')\n return;\n if (err)\n return cb(err);\n if (!names || !names.length)\n return cb(new Error('Response missing link info'));\n cb(undefined, names[0].filename);\n }\n };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} READLINK`\n );\n }\n symlink(targetPath, linkPath, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string linkpath\n string targetpath\n */\n const linkLen = Buffer.byteLength(linkPath);\n const targetLen = Buffer.byteLength(targetPath);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + linkLen + 4 + targetLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.SYMLINK;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n if (this._isOpenSSH) {\n // OpenSSH has linkpath and targetpath positions switched\n writeUInt32BE(buf, targetLen, p);\n buf.utf8Write(targetPath, p += 4, targetLen);\n writeUInt32BE(buf, linkLen, p += targetLen);\n buf.utf8Write(linkPath, p += 4, linkLen);\n } else {\n writeUInt32BE(buf, linkLen, p);\n buf.utf8Write(linkPath, p += 4, linkLen);\n writeUInt32BE(buf, targetLen, p += linkLen);\n buf.utf8Write(targetPath, p += 4, targetLen);\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} SYMLINK`\n );\n }\n realpath(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.REALPATH;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = {\n cb: (err, names) => {\n if (typeof cb !== 'function')\n return;\n if (err)\n return cb(err);\n if (!names || !names.length)\n return cb(new Error('Response missing path info'));\n cb(undefined, names[0].filename);\n }\n };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} REALPATH`\n );\n }\n // extended requests\n ext_openssh_rename(oldPath, newPath, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['posix-rename@openssh.com'];\n if (!ext || ext !== '1')\n throw new Error('Server does not support this extended request');\n\n /*\n uint32 id\n string \"posix-rename@openssh.com\"\n string oldpath\n string newpath\n */\n const oldLen = Buffer.byteLength(oldPath);\n const newLen = Buffer.byteLength(newPath);\n let p = 9;\n const buf =\n Buffer.allocUnsafe(4 + 1 + 4 + 4 + 24 + 4 + oldLen + 4 + newLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 24, p);\n buf.utf8Write('posix-rename@openssh.com', p += 4, 24);\n writeUInt32BE(buf, oldLen, p += 24);\n buf.utf8Write(oldPath, p += 4, oldLen);\n writeUInt32BE(buf, newLen, p += oldLen);\n buf.utf8Write(newPath, p += 4, newLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const which = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${which} posix-rename@openssh.com`);\n }\n }\n ext_openssh_statvfs(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['statvfs@openssh.com'];\n if (!ext || ext !== '2')\n throw new Error('Server does not support this extended request');\n\n /*\n uint32 id\n string \"statvfs@openssh.com\"\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 19 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 19, p);\n buf.utf8Write('statvfs@openssh.com', p += 4, 19);\n writeUInt32BE(buf, pathLen, p += 19);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = { extended: 'statvfs@openssh.com', cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const which = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${which} statvfs@openssh.com`);\n }\n }\n ext_openssh_fstatvfs(handle, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['fstatvfs@openssh.com'];\n if (!ext || ext !== '2')\n throw new Error('Server does not support this extended request');\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n /*\n uint32 id\n string \"fstatvfs@openssh.com\"\n string handle\n */\n const handleLen = handle.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 20 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 20, p);\n buf.utf8Write('fstatvfs@openssh.com', p += 4, 20);\n writeUInt32BE(buf, handleLen, p += 20);\n buf.set(handle, p += 4);\n\n this._requests[reqid] = { extended: 'fstatvfs@openssh.com', cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const which = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${which} fstatvfs@openssh.com`);\n }\n }\n ext_openssh_hardlink(oldPath, newPath, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['hardlink@openssh.com'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n /*\n uint32 id\n string \"hardlink@openssh.com\"\n string oldpath\n string newpath\n */\n const oldLen = Buffer.byteLength(oldPath);\n const newLen = Buffer.byteLength(newPath);\n let p = 9;\n const buf =\n Buffer.allocUnsafe(4 + 1 + 4 + 4 + 20 + 4 + oldLen + 4 + newLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 20, p);\n buf.utf8Write('hardlink@openssh.com', p += 4, 20);\n writeUInt32BE(buf, oldLen, p += 20);\n buf.utf8Write(oldPath, p += 4, oldLen);\n writeUInt32BE(buf, newLen, p += oldLen);\n buf.utf8Write(newPath, p += 4, newLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const which = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${which} hardlink@openssh.com`);\n }\n }\n ext_openssh_fsync(handle, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['fsync@openssh.com'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n /*\n uint32 id\n string \"fsync@openssh.com\"\n string handle\n */\n const handleLen = handle.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 17 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 17, p);\n buf.utf8Write('fsync@openssh.com', p += 4, 17);\n writeUInt32BE(buf, handleLen, p += 17);\n buf.set(handle, p += 4);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} fsync@openssh.com`\n );\n }\n ext_openssh_lsetstat(path, attrs, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['lsetstat@openssh.com'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n let flags = 0;\n let attrsLen = 0;\n\n if (typeof attrs === 'object' && attrs !== null) {\n attrs = attrsToBytes(attrs);\n flags = attrs.flags;\n attrsLen = attrs.nb;\n } else if (typeof attrs === 'function') {\n cb = attrs;\n }\n\n /*\n uint32 id\n string \"lsetstat@openssh.com\"\n string path\n ATTRS attrs\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf =\n Buffer.allocUnsafe(4 + 1 + 4 + 4 + 20 + 4 + pathLen + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 20, p);\n buf.utf8Write('lsetstat@openssh.com', p += 4, 20);\n\n writeUInt32BE(buf, pathLen, p += 20);\n buf.utf8Write(path, p += 4, pathLen);\n\n writeUInt32BE(buf, flags, p += pathLen);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const status = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${status} lsetstat@openssh.com`);\n }\n }\n ext_openssh_expandPath(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['expand-path@openssh.com'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n /*\n uint32 id\n string \"expand-path@openssh.com\"\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 23 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 23, p);\n buf.utf8Write('expand-path@openssh.com', p += 4, 23);\n\n writeUInt32BE(buf, pathLen, p += 20);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = {\n cb: (err, names) => {\n if (typeof cb !== 'function')\n return;\n if (err)\n return cb(err);\n if (!names || !names.length)\n return cb(new Error('Response missing expanded path'));\n cb(undefined, names[0].filename);\n }\n };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const status = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${status} expand-path@openssh.com`);\n }\n }\n ext_copy_data(srcHandle, srcOffset, len, dstHandle, dstOffset, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['copy-data'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n if (!Buffer.isBuffer(srcHandle))\n throw new Error('Source handle is not a Buffer');\n\n if (!Buffer.isBuffer(dstHandle))\n throw new Error('Destination handle is not a Buffer');\n\n /*\n uint32 id\n string \"copy-data\"\n string read-from-handle\n uint64 read-from-offset\n uint64 read-data-length\n string write-to-handle\n uint64 write-to-offset\n */\n let p = 0;\n const buf = Buffer.allocUnsafe(\n 4 + 1\n + 4\n + 4 + 9\n + 4 + srcHandle.length\n + 8\n + 8\n + 4 + dstHandle.length\n + 8\n );\n\n writeUInt32BE(buf, buf.length - 4, p);\n p += 4;\n\n buf[p] = REQUEST.EXTENDED;\n ++p;\n\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, p);\n p += 4;\n\n writeUInt32BE(buf, 9, p);\n p += 4;\n buf.utf8Write('copy-data', p, 9);\n p += 9;\n\n writeUInt32BE(buf, srcHandle.length, p);\n p += 4;\n buf.set(srcHandle, p);\n p += srcHandle.length;\n\n for (let i = 7; i >= 0; --i) {\n buf[p + i] = srcOffset & 0xFF;\n srcOffset /= 256;\n }\n p += 8;\n\n for (let i = 7; i >= 0; --i) {\n buf[p + i] = len & 0xFF;\n len /= 256;\n }\n p += 8;\n\n writeUInt32BE(buf, dstHandle.length, p);\n p += 4;\n buf.set(dstHandle, p);\n p += dstHandle.length;\n\n for (let i = 7; i >= 0; --i) {\n buf[p + i] = dstOffset & 0xFF;\n dstOffset /= 256;\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const status = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${status} copy-data`);\n }\n }\n ext_home_dir(username, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['home-directory'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n if (typeof username !== 'string')\n throw new TypeError('username is not a string');\n\n /*\n uint32 id\n string \"home-directory\"\n string username\n */\n let p = 0;\n const usernameLen = Buffer.byteLength(username);\n const buf = Buffer.allocUnsafe(\n 4 + 1\n + 4\n + 4 + 14\n + 4 + usernameLen\n );\n\n writeUInt32BE(buf, buf.length - 4, p);\n p += 4;\n\n buf[p] = REQUEST.EXTENDED;\n ++p;\n\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, p);\n p += 4;\n\n writeUInt32BE(buf, 14, p);\n p += 4;\n buf.utf8Write('home-directory', p, 14);\n p += 14;\n\n writeUInt32BE(buf, usernameLen, p);\n p += 4;\n buf.utf8Write(username, p, usernameLen);\n p += usernameLen;\n\n this._requests[reqid] = {\n cb: (err, names) => {\n if (typeof cb !== 'function')\n return;\n if (err)\n return cb(err);\n if (!names || !names.length)\n return cb(new Error('Response missing home directory'));\n cb(undefined, names[0].filename);\n }\n };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const status = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${status} home-directory`);\n }\n }\n ext_users_groups(uids, gids, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['users-groups-by-id@openssh.com'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n if (!Array.isArray(uids))\n throw new TypeError('uids is not an array');\n for (const val of uids) {\n if (!Number.isInteger(val) || val < 0 || val > (2 ** 32 - 1))\n throw new Error('uid values must all be 32-bit unsigned integers');\n }\n if (!Array.isArray(gids))\n throw new TypeError('gids is not an array');\n for (const val of gids) {\n if (!Number.isInteger(val) || val < 0 || val > (2 ** 32 - 1))\n throw new Error('gid values must all be 32-bit unsigned integers');\n }\n\n /*\n uint32 id\n string \"users-groups-by-id@openssh.com\"\n string uids\n uint32 uid1\n ...\n string gids\n uint32 gid1\n ...\n */\n let p = 0;\n const buf = Buffer.allocUnsafe(\n 4 + 1\n + 4\n + 4 + 30\n + 4 + (4 * uids.length)\n + 4 + (4 * gids.length)\n );\n\n writeUInt32BE(buf, buf.length - 4, p);\n p += 4;\n\n buf[p] = REQUEST.EXTENDED;\n ++p;\n\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, p);\n p += 4;\n\n writeUInt32BE(buf, 30, p);\n p += 4;\n buf.utf8Write('users-groups-by-id@openssh.com', p, 30);\n p += 30;\n\n writeUInt32BE(buf, 4 * uids.length, p);\n p += 4;\n for (const val of uids) {\n writeUInt32BE(buf, val, p);\n p += 4;\n }\n\n writeUInt32BE(buf, 4 * gids.length, p);\n p += 4;\n for (const val of gids) {\n writeUInt32BE(buf, val, p);\n p += 4;\n }\n\n this._requests[reqid] = { extended: 'users-groups-by-id@openssh.com', cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const status = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${status} users-groups-by-id@openssh.com`);\n }\n }\n // ===========================================================================\n // Server-specific ===========================================================\n // ===========================================================================\n handle(reqid, handle) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n const handleLen = handle.length;\n\n if (handleLen > 256)\n throw new Error('handle too large (> 256 bytes)');\n\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = RESPONSE.HANDLE;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, handleLen, p);\n if (handleLen)\n buf.set(handle, p += 4);\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} HANDLE`\n );\n }\n status(reqid, code, message) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n if (!VALID_STATUS_CODES.has(code))\n throw new Error(`Bad status code: ${code}`);\n\n message || (message = '');\n\n const msgLen = Buffer.byteLength(message);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 4 + msgLen + 4);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = RESPONSE.STATUS;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, code, p);\n\n writeUInt32BE(buf, msgLen, p += 4);\n p += 4;\n if (msgLen) {\n buf.utf8Write(message, p, msgLen);\n p += msgLen;\n }\n\n writeUInt32BE(buf, 0, p); // Empty language tag\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} STATUS`\n );\n }\n data(reqid, data, encoding) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n const isBuffer = Buffer.isBuffer(data);\n\n if (!isBuffer && typeof data !== 'string')\n throw new Error('data is not a Buffer or string');\n\n let isUTF8;\n if (!isBuffer && !encoding) {\n encoding = undefined;\n isUTF8 = true;\n }\n\n const dataLen = (\n isBuffer\n ? data.length\n : Buffer.byteLength(data, encoding)\n );\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + dataLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = RESPONSE.DATA;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, dataLen, p);\n if (dataLen) {\n if (isBuffer)\n buf.set(data, p += 4);\n else if (isUTF8)\n buf.utf8Write(data, p += 4, dataLen);\n else\n buf.write(data, p += 4, dataLen, encoding);\n }\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} DATA`\n );\n }\n name(reqid, names) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n if (!Array.isArray(names)) {\n if (typeof names !== 'object' || names === null)\n throw new Error('names is not an object or array');\n names = [ names ];\n }\n\n const count = names.length;\n let namesLen = 0;\n let nameAttrs;\n const attrs = [];\n\n for (let i = 0; i < count; ++i) {\n const name = names[i];\n const filename = (\n !name || !name.filename || typeof name.filename !== 'string'\n ? ''\n : name.filename\n );\n namesLen += 4 + Buffer.byteLength(filename);\n const longname = (\n !name || !name.longname || typeof name.longname !== 'string'\n ? ''\n : name.longname\n );\n namesLen += 4 + Buffer.byteLength(longname);\n\n if (typeof name.attrs === 'object' && name.attrs !== null) {\n nameAttrs = attrsToBytes(name.attrs);\n namesLen += 4 + nameAttrs.nb;\n\n if (nameAttrs.nb) {\n let bytes;\n\n if (nameAttrs.nb === ATTRS_BUF.length) {\n bytes = new Uint8Array(ATTRS_BUF);\n } else {\n bytes = new Uint8Array(nameAttrs.nb);\n bufferCopy(ATTRS_BUF, bytes, 0, nameAttrs.nb, 0);\n }\n\n nameAttrs.bytes = bytes;\n }\n\n attrs.push(nameAttrs);\n } else {\n namesLen += 4;\n attrs.push(null);\n }\n }\n\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + namesLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = RESPONSE.NAME;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, count, p);\n\n p += 4;\n\n for (let i = 0; i < count; ++i) {\n const name = names[i];\n\n {\n const filename = (\n !name || !name.filename || typeof name.filename !== 'string'\n ? ''\n : name.filename\n );\n const len = Buffer.byteLength(filename);\n writeUInt32BE(buf, len, p);\n p += 4;\n if (len) {\n buf.utf8Write(filename, p, len);\n p += len;\n }\n }\n\n {\n const longname = (\n !name || !name.longname || typeof name.longname !== 'string'\n ? ''\n : name.longname\n );\n const len = Buffer.byteLength(longname);\n writeUInt32BE(buf, len, p);\n p += 4;\n if (len) {\n buf.utf8Write(longname, p, len);\n p += len;\n }\n }\n\n const attr = attrs[i];\n if (attr) {\n writeUInt32BE(buf, attr.flags, p);\n p += 4;\n if (attr.flags && attr.bytes) {\n buf.set(attr.bytes, p);\n p += attr.nb;\n }\n } else {\n writeUInt32BE(buf, 0, p);\n p += 4;\n }\n }\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} NAME`\n );\n }\n attrs(reqid, attrs) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n if (typeof attrs !== 'object' || attrs === null)\n throw new Error('attrs is not an object');\n\n attrs = attrsToBytes(attrs);\n const flags = attrs.flags;\n const attrsLen = attrs.nb;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = RESPONSE.ATTRS;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, flags, p);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} ATTRS`\n );\n }\n}\n\nfunction tryCreateBuffer(size) {\n try {\n return Buffer.allocUnsafe(size);\n } catch (ex) {\n return ex;\n }\n}\n\nfunction read_(self, handle, buf, off, len, position, cb, req_) {\n const maxDataLen = self._maxReadLen;\n const overflow = Math.max(len - maxDataLen, 0);\n\n if (overflow)\n len = maxDataLen;\n\n /*\n uint32 id\n string handle\n uint64 offset\n uint32 len\n */\n const handleLen = handle.length;\n let p = 9;\n let pos = position;\n const out = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen + 8 + 4);\n\n writeUInt32BE(out, out.length - 4, 0);\n out[4] = REQUEST.READ;\n const reqid = self._writeReqid = (self._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(out, reqid, 5);\n\n writeUInt32BE(out, handleLen, p);\n out.set(handle, p += 4);\n p += handleLen;\n for (let i = 7; i >= 0; --i) {\n out[p + i] = pos & 0xFF;\n pos /= 256;\n }\n writeUInt32BE(out, len, p += 8);\n\n if (typeof cb !== 'function')\n cb = noop;\n\n const req = (req_ || {\n nb: 0,\n position,\n off,\n origOff: off,\n len: undefined,\n overflow: undefined,\n cb: (err, data, nb) => {\n const len = req.len;\n const overflow = req.overflow;\n\n if (err) {\n if (cb._wantEOFError || err.code !== STATUS_CODE.EOF)\n return cb(err);\n } else if (nb > len) {\n return cb(new Error('Received more data than requested'));\n } else if (nb === len && overflow) {\n req.nb += nb;\n req.position += nb;\n req.off += nb;\n read_(self, handle, buf, req.off, overflow, req.position, cb, req);\n return;\n }\n\n nb = (nb || 0);\n if (req.origOff === 0 && buf.length === req.nb)\n data = buf;\n else\n data = bufferSlice(buf, req.origOff, req.origOff + req.nb + nb);\n cb(undefined, req.nb + nb, data, req.position);\n },\n buffer: undefined,\n });\n\n req.len = len;\n req.overflow = overflow;\n\n // TODO: avoid creating multiple buffer slices when we need to re-call read_()\n // because of overflow\n req.buffer = bufferSlice(buf, off, off + len);\n\n self._requests[reqid] = req;\n\n const isBuffered = sendOrBuffer(self, out);\n self._debug && self._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} READ`\n );\n}\n\nfunction fastXfer(src, dst, srcPath, dstPath, opts, cb) {\n let concurrency = 64;\n let chunkSize = 32768;\n let onstep;\n let mode;\n let fileSize;\n\n if (typeof opts === 'function') {\n cb = opts;\n } else if (typeof opts === 'object' && opts !== null) {\n if (typeof opts.concurrency === 'number'\n && opts.concurrency > 0\n && !isNaN(opts.concurrency)) {\n concurrency = opts.concurrency;\n }\n if (typeof opts.chunkSize === 'number'\n && opts.chunkSize > 0\n && !isNaN(opts.chunkSize)) {\n chunkSize = opts.chunkSize;\n }\n if (typeof opts.fileSize === 'number'\n && opts.fileSize > 0\n && !isNaN(opts.fileSize)) {\n fileSize = opts.fileSize;\n }\n if (typeof opts.step === 'function')\n onstep = opts.step;\n\n if (typeof opts.mode === 'string' || typeof opts.mode === 'number')\n mode = modeNum(opts.mode);\n }\n\n // Internal state variables\n let fsize;\n let pdst = 0;\n let total = 0;\n let hadError = false;\n let srcHandle;\n let dstHandle;\n let readbuf;\n let bufsize = chunkSize * concurrency;\n\n function onerror(err) {\n if (hadError)\n return;\n\n hadError = true;\n\n let left = 0;\n let cbfinal;\n\n if (srcHandle || dstHandle) {\n cbfinal = () => {\n if (--left === 0)\n cb(err);\n };\n if (srcHandle && (src === fs || src.outgoing.state === 'open'))\n ++left;\n if (dstHandle && (dst === fs || dst.outgoing.state === 'open'))\n ++left;\n if (srcHandle && (src === fs || src.outgoing.state === 'open'))\n src.close(srcHandle, cbfinal);\n if (dstHandle && (dst === fs || dst.outgoing.state === 'open'))\n dst.close(dstHandle, cbfinal);\n } else {\n cb(err);\n }\n }\n\n src.open(srcPath, 'r', (err, sourceHandle) => {\n if (err)\n return onerror(err);\n\n srcHandle = sourceHandle;\n\n if (fileSize === undefined)\n src.fstat(srcHandle, tryStat);\n else\n tryStat(null, { size: fileSize });\n\n function tryStat(err, attrs) {\n if (err) {\n if (src !== fs) {\n // Try stat() for sftp servers that may not support fstat() for\n // whatever reason\n src.stat(srcPath, (err_, attrs_) => {\n if (err_)\n return onerror(err);\n tryStat(null, attrs_);\n });\n return;\n }\n return onerror(err);\n }\n fsize = attrs.size;\n\n dst.open(dstPath, 'w', (err, destHandle) => {\n if (err)\n return onerror(err);\n\n dstHandle = destHandle;\n\n if (fsize <= 0)\n return onerror();\n\n // Use less memory where possible\n while (bufsize > fsize) {\n if (concurrency === 1) {\n bufsize = fsize;\n break;\n }\n bufsize -= chunkSize;\n --concurrency;\n }\n\n readbuf = tryCreateBuffer(bufsize);\n if (readbuf instanceof Error)\n return onerror(readbuf);\n\n if (mode !== undefined) {\n dst.fchmod(dstHandle, mode, function tryAgain(err) {\n if (err) {\n // Try chmod() for sftp servers that may not support fchmod()\n // for whatever reason\n dst.chmod(dstPath, mode, (err_) => tryAgain());\n return;\n }\n startReads();\n });\n } else {\n startReads();\n }\n\n function onread(err, nb, data, dstpos, datapos, origChunkLen) {\n if (err)\n return onerror(err);\n\n datapos = datapos || 0;\n\n dst.write(dstHandle, readbuf, datapos, nb, dstpos, writeCb);\n\n function writeCb(err) {\n if (err)\n return onerror(err);\n\n total += nb;\n onstep && onstep(total, nb, fsize);\n\n if (nb < origChunkLen)\n return singleRead(datapos, dstpos + nb, origChunkLen - nb);\n\n if (total === fsize) {\n dst.close(dstHandle, (err) => {\n dstHandle = undefined;\n if (err)\n return onerror(err);\n src.close(srcHandle, (err) => {\n srcHandle = undefined;\n if (err)\n return onerror(err);\n cb();\n });\n });\n return;\n }\n\n if (pdst >= fsize)\n return;\n\n const chunk =\n (pdst + chunkSize > fsize ? fsize - pdst : chunkSize);\n singleRead(datapos, pdst, chunk);\n pdst += chunk;\n }\n }\n\n function makeCb(psrc, pdst, chunk) {\n return (err, nb, data) => {\n onread(err, nb, data, pdst, psrc, chunk);\n };\n }\n\n function singleRead(psrc, pdst, chunk) {\n src.read(srcHandle,\n readbuf,\n psrc,\n chunk,\n pdst,\n makeCb(psrc, pdst, chunk));\n }\n\n function startReads() {\n let reads = 0;\n let psrc = 0;\n while (pdst < fsize && reads < concurrency) {\n const chunk =\n (pdst + chunkSize > fsize ? fsize - pdst : chunkSize);\n singleRead(psrc, pdst, chunk);\n psrc += chunk;\n pdst += chunk;\n ++reads;\n }\n }\n });\n }\n });\n}\n\nfunction writeAll(sftp, handle, buffer, offset, length, position, callback_) {\n const callback = (typeof callback_ === 'function' ? callback_ : undefined);\n\n sftp.write(handle,\n buffer,\n offset,\n length,\n position,\n (writeErr, written) => {\n if (writeErr) {\n return sftp.close(handle, () => {\n callback && callback(writeErr);\n });\n }\n if (written === length) {\n sftp.close(handle, callback);\n } else {\n offset += written;\n length -= written;\n position += written;\n writeAll(sftp, handle, buffer, offset, length, position, callback);\n }\n });\n}\n\nclass Stats {\n constructor(initial) {\n this.mode = (initial && initial.mode);\n this.uid = (initial && initial.uid);\n this.gid = (initial && initial.gid);\n this.size = (initial && initial.size);\n this.atime = (initial && initial.atime);\n this.mtime = (initial && initial.mtime);\n this.extended = (initial && initial.extended);\n }\n isDirectory() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFDIR);\n }\n isFile() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFREG);\n }\n isBlockDevice() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFBLK);\n }\n isCharacterDevice() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFCHR);\n }\n isSymbolicLink() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFLNK);\n }\n isFIFO() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFIFO);\n }\n isSocket() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFSOCK);\n }\n}\n\nfunction attrsToBytes(attrs) {\n let flags = 0;\n let nb = 0;\n\n if (typeof attrs === 'object' && attrs !== null) {\n if (typeof attrs.size === 'number') {\n flags |= ATTR.SIZE;\n const val = attrs.size;\n // Big Endian\n ATTRS_BUF[nb++] = val / 72057594037927940; // 2**56\n ATTRS_BUF[nb++] = val / 281474976710656; // 2**48\n ATTRS_BUF[nb++] = val / 1099511627776; // 2**40\n ATTRS_BUF[nb++] = val / 4294967296; // 2**32\n ATTRS_BUF[nb++] = val / 16777216; // 2**24\n ATTRS_BUF[nb++] = val / 65536; // 2**16\n ATTRS_BUF[nb++] = val / 256; // 2**8\n ATTRS_BUF[nb++] = val;\n }\n if (typeof attrs.uid === 'number' && typeof attrs.gid === 'number') {\n flags |= ATTR.UIDGID;\n const uid = attrs.uid;\n const gid = attrs.gid;\n // Big Endian\n ATTRS_BUF[nb++] = uid >>> 24;\n ATTRS_BUF[nb++] = uid >>> 16;\n ATTRS_BUF[nb++] = uid >>> 8;\n ATTRS_BUF[nb++] = uid;\n ATTRS_BUF[nb++] = gid >>> 24;\n ATTRS_BUF[nb++] = gid >>> 16;\n ATTRS_BUF[nb++] = gid >>> 8;\n ATTRS_BUF[nb++] = gid;\n }\n if (typeof attrs.mode === 'number' || typeof attrs.mode === 'string') {\n const mode = modeNum(attrs.mode);\n flags |= ATTR.PERMISSIONS;\n // Big Endian\n ATTRS_BUF[nb++] = mode >>> 24;\n ATTRS_BUF[nb++] = mode >>> 16;\n ATTRS_BUF[nb++] = mode >>> 8;\n ATTRS_BUF[nb++] = mode;\n }\n if ((typeof attrs.atime === 'number' || isDate(attrs.atime))\n && (typeof attrs.mtime === 'number' || isDate(attrs.mtime))) {\n const atime = toUnixTimestamp(attrs.atime);\n const mtime = toUnixTimestamp(attrs.mtime);\n\n flags |= ATTR.ACMODTIME;\n // Big Endian\n ATTRS_BUF[nb++] = atime >>> 24;\n ATTRS_BUF[nb++] = atime >>> 16;\n ATTRS_BUF[nb++] = atime >>> 8;\n ATTRS_BUF[nb++] = atime;\n ATTRS_BUF[nb++] = mtime >>> 24;\n ATTRS_BUF[nb++] = mtime >>> 16;\n ATTRS_BUF[nb++] = mtime >>> 8;\n ATTRS_BUF[nb++] = mtime;\n }\n // TODO: extended attributes\n }\n\n return { flags, nb };\n}\n\nfunction toUnixTimestamp(time) {\n // eslint-disable-next-line no-self-compare\n if (typeof time === 'number' && time === time) // Valid, non-NaN number\n return time;\n if (isDate(time))\n return parseInt(time.getTime() / 1000, 10);\n throw new Error(`Cannot parse time: ${time}`);\n}\n\nfunction modeNum(mode) {\n // eslint-disable-next-line no-self-compare\n if (typeof mode === 'number' && mode === mode) // Valid, non-NaN number\n return mode;\n if (typeof mode === 'string')\n return modeNum(parseInt(mode, 8));\n throw new Error(`Cannot parse mode: ${mode}`);\n}\n\nconst stringFlagMap = {\n 'r': OPEN_MODE.READ,\n 'r+': OPEN_MODE.READ | OPEN_MODE.WRITE,\n 'w': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.WRITE,\n 'wx': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.WRITE | OPEN_MODE.EXCL,\n 'xw': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.WRITE | OPEN_MODE.EXCL,\n 'w+': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE,\n 'wx+': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE\n | OPEN_MODE.EXCL,\n 'xw+': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE\n | OPEN_MODE.EXCL,\n 'a': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.WRITE,\n 'ax': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.WRITE | OPEN_MODE.EXCL,\n 'xa': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.WRITE | OPEN_MODE.EXCL,\n 'a+': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE,\n 'ax+': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE\n | OPEN_MODE.EXCL,\n 'xa+': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE\n | OPEN_MODE.EXCL\n};\n\nfunction stringToFlags(str) {\n const flags = stringFlagMap[str];\n return (flags !== undefined ? flags : null);\n}\n\nconst flagsToString = (() => {\n const stringFlagMapKeys = Object.keys(stringFlagMap);\n return (flags) => {\n for (let i = 0; i < stringFlagMapKeys.length; ++i) {\n const key = stringFlagMapKeys[i];\n if (stringFlagMap[key] === flags)\n return key;\n }\n return null;\n };\n})();\n\nfunction readAttrs(biOpt) {\n /*\n uint32 flags\n uint64 size present only if flag SSH_FILEXFER_ATTR_SIZE\n uint32 uid present only if flag SSH_FILEXFER_ATTR_UIDGID\n uint32 gid present only if flag SSH_FILEXFER_ATTR_UIDGID\n uint32 permissions present only if flag SSH_FILEXFER_ATTR_PERMISSIONS\n uint32 atime present only if flag SSH_FILEXFER_ACMODTIME\n uint32 mtime present only if flag SSH_FILEXFER_ACMODTIME\n uint32 extended_count present only if flag SSH_FILEXFER_ATTR_EXTENDED\n string extended_type\n string extended_data\n ... more extended data (extended_type - extended_data pairs),\n so that number of pairs equals extended_count\n */\n const flags = bufferParser.readUInt32BE();\n if (flags === undefined)\n return;\n\n const attrs = new Stats();\n if (flags & ATTR.SIZE) {\n const size = bufferParser.readUInt64BE(biOpt);\n if (size === undefined)\n return;\n attrs.size = size;\n }\n\n if (flags & ATTR.UIDGID) {\n const uid = bufferParser.readUInt32BE();\n const gid = bufferParser.readUInt32BE();\n if (gid === undefined)\n return;\n attrs.uid = uid;\n attrs.gid = gid;\n }\n\n if (flags & ATTR.PERMISSIONS) {\n const mode = bufferParser.readUInt32BE();\n if (mode === undefined)\n return;\n attrs.mode = mode;\n }\n\n if (flags & ATTR.ACMODTIME) {\n const atime = bufferParser.readUInt32BE();\n const mtime = bufferParser.readUInt32BE();\n if (mtime === undefined)\n return;\n attrs.atime = atime;\n attrs.mtime = mtime;\n }\n\n if (flags & ATTR.EXTENDED) {\n const count = bufferParser.readUInt32BE();\n if (count === undefined)\n return;\n const extended = {};\n for (let i = 0; i < count; ++i) {\n const type = bufferParser.readString(true);\n const data = bufferParser.readString();\n if (data === undefined)\n return;\n extended[type] = data;\n }\n attrs.extended = extended;\n }\n\n return attrs;\n}\n\nfunction sendOrBuffer(sftp, payload) {\n const ret = tryWritePayload(sftp, payload);\n if (ret !== undefined) {\n sftp._buffer.push(ret);\n return false;\n }\n return true;\n}\n\nfunction tryWritePayload(sftp, payload) {\n const outgoing = sftp.outgoing;\n if (outgoing.state !== 'open')\n return;\n\n if (outgoing.window === 0) {\n sftp._waitWindow = true;\n sftp._chunkcb = drainBuffer;\n return payload;\n }\n\n let ret;\n const len = payload.length;\n let p = 0;\n\n while (len - p > 0 && outgoing.window > 0) {\n const actualLen = Math.min(len - p, outgoing.window, outgoing.packetSize);\n outgoing.window -= actualLen;\n if (outgoing.window === 0) {\n sftp._waitWindow = true;\n sftp._chunkcb = drainBuffer;\n }\n\n if (p === 0 && actualLen === len) {\n sftp._protocol.channelData(sftp.outgoing.id, payload);\n } else {\n sftp._protocol.channelData(sftp.outgoing.id,\n bufferSlice(payload, p, p + actualLen));\n }\n\n p += actualLen;\n }\n\n if (len - p > 0) {\n if (p > 0)\n ret = bufferSlice(payload, p, len);\n else\n ret = payload; // XXX: should never get here?\n }\n\n return ret;\n}\n\nfunction drainBuffer() {\n this._chunkcb = undefined;\n const buffer = this._buffer;\n let i = 0;\n while (i < buffer.length) {\n const payload = buffer[i];\n const ret = tryWritePayload(this, payload);\n if (ret !== undefined) {\n if (ret !== payload)\n buffer[i] = ret;\n if (i > 0)\n this._buffer = buffer.slice(i);\n return;\n }\n ++i;\n }\n if (i > 0)\n this._buffer = [];\n}\n\nfunction doFatalSFTPError(sftp, msg, noDebug) {\n const err = new Error(msg);\n err.level = 'sftp-protocol';\n if (!noDebug && sftp._debug)\n sftp._debug(`SFTP: Inbound: ${msg}`);\n sftp.emit('error', err);\n sftp.destroy();\n cleanupRequests(sftp);\n return false;\n}\n\nfunction cleanupRequests(sftp) {\n const keys = Object.keys(sftp._requests);\n if (keys.length === 0)\n return;\n\n const reqs = sftp._requests;\n sftp._requests = {};\n const err = new Error('No response from server');\n for (let i = 0; i < keys.length; ++i) {\n const req = reqs[keys[i]];\n if (typeof req.cb === 'function')\n req.cb(err);\n }\n}\n\nfunction requestLimits(sftp, cb) {\n /*\n uint32 id\n string \"limits@openssh.com\"\n */\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 18);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = sftp._writeReqid = (sftp._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 18, p);\n buf.utf8Write('limits@openssh.com', p += 4, 18);\n\n sftp._requests[reqid] = { extended: 'limits@openssh.com', cb };\n\n const isBuffered = sendOrBuffer(sftp, buf);\n if (sftp._debug) {\n const which = (isBuffered ? 'Buffered' : 'Sending');\n sftp._debug(`SFTP: Outbound: ${which} limits@openssh.com`);\n }\n}\n\nconst CLIENT_HANDLERS = {\n [RESPONSE.VERSION]: (sftp, payload) => {\n if (sftp._version !== -1)\n return doFatalSFTPError(sftp, 'Duplicate VERSION packet');\n\n const extensions = {};\n\n /*\n uint32 version\n <extension data>\n */\n bufferParser.init(payload, 1);\n let version = bufferParser.readUInt32BE();\n while (bufferParser.avail()) {\n const extName = bufferParser.readString(true);\n const extData = bufferParser.readString(true);\n if (extData === undefined) {\n version = undefined;\n break;\n }\n extensions[extName] = extData;\n }\n bufferParser.clear();\n\n if (version === undefined)\n return doFatalSFTPError(sftp, 'Malformed VERSION packet');\n\n if (sftp._debug) {\n const names = Object.keys(extensions);\n if (names.length) {\n sftp._debug(\n `SFTP: Inbound: Received VERSION (v${version}, exts:${names})`\n );\n } else {\n sftp._debug(`SFTP: Inbound: Received VERSION (v${version})`);\n }\n }\n\n sftp._version = version;\n sftp._extensions = extensions;\n\n if (extensions['limits@openssh.com'] === '1') {\n return requestLimits(sftp, (err, limits) => {\n if (!err) {\n if (limits.maxPktLen > 0)\n sftp._maxOutPktLen = limits.maxPktLen;\n if (limits.maxReadLen > 0)\n sftp._maxReadLen = limits.maxReadLen;\n if (limits.maxWriteLen > 0)\n sftp._maxWriteLen = limits.maxWriteLen;\n sftp.maxOpenHandles = (\n limits.maxOpenHandles > 0 ? limits.maxOpenHandles : Infinity\n );\n }\n sftp.emit('ready');\n });\n }\n\n sftp.emit('ready');\n },\n [RESPONSE.STATUS]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n uint32 error/status code\n string error message (ISO-10646 UTF-8)\n string language tag\n */\n const errorCode = bufferParser.readUInt32BE();\n const errorMsg = bufferParser.readString(true);\n bufferParser.clear();\n\n // Note: we avoid checking that the error message and language tag are in\n // the packet because there are some broken implementations that incorrectly\n // omit them. The language tag in general was never really used amongst ssh\n // implementations, so in the case of a missing error message we just\n // default to something sensible.\n\n if (sftp._debug) {\n const jsonMsg = JSON.stringify(errorMsg);\n sftp._debug(\n `SFTP: Inbound: Received STATUS (id:${reqID}, ${errorCode}, ${jsonMsg})`\n );\n }\n const req = sftp._requests[reqID];\n delete sftp._requests[reqID];\n if (req && typeof req.cb === 'function') {\n if (errorCode === STATUS_CODE.OK) {\n req.cb();\n return;\n }\n const err = new Error(errorMsg\n || STATUS_CODE_STR[errorCode]\n || 'Unknown status');\n err.code = errorCode;\n req.cb(err);\n }\n },\n [RESPONSE.HANDLE]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n */\n const handle = bufferParser.readString();\n bufferParser.clear();\n\n if (handle === undefined) {\n if (reqID !== undefined)\n delete sftp._requests[reqID];\n return doFatalSFTPError(sftp, 'Malformed HANDLE packet');\n }\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received HANDLE (id:${reqID})`);\n\n const req = sftp._requests[reqID];\n delete sftp._requests[reqID];\n if (req && typeof req.cb === 'function')\n req.cb(undefined, handle);\n },\n [RESPONSE.DATA]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n let req;\n if (reqID !== undefined) {\n req = sftp._requests[reqID];\n delete sftp._requests[reqID];\n }\n /*\n string data\n */\n if (req && typeof req.cb === 'function') {\n if (req.buffer) {\n // We have already pre-allocated space to store the data\n\n const nb = bufferParser.readString(req.buffer);\n bufferParser.clear();\n\n if (nb !== undefined) {\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received DATA (id:${reqID}, ${nb})`\n );\n req.cb(undefined, req.buffer, nb);\n return;\n }\n } else {\n const data = bufferParser.readString();\n bufferParser.clear();\n\n if (data !== undefined) {\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received DATA (id:${reqID}, ${data.length})`\n );\n req.cb(undefined, data);\n return;\n }\n }\n } else {\n const nb = bufferParser.skipString();\n bufferParser.clear();\n if (nb !== undefined) {\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received DATA (id:${reqID}, ${nb})`\n );\n return;\n }\n }\n\n return doFatalSFTPError(sftp, 'Malformed DATA packet');\n },\n [RESPONSE.NAME]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n let req;\n if (reqID !== undefined) {\n req = sftp._requests[reqID];\n delete sftp._requests[reqID];\n }\n /*\n uint32 count\n repeats count times:\n string filename\n string longname\n ATTRS attrs\n */\n const count = bufferParser.readUInt32BE();\n if (count !== undefined) {\n let names = [];\n for (let i = 0; i < count; ++i) {\n // We are going to assume UTF-8 for filenames despite the SFTPv3\n // spec not specifying an encoding because the specs for newer\n // versions of the protocol all explicitly specify UTF-8 for\n // filenames\n const filename = bufferParser.readString(true);\n\n // `longname` only exists in SFTPv3 and since it typically will\n // contain the filename, we assume it is also UTF-8\n const longname = bufferParser.readString(true);\n\n const attrs = readAttrs(sftp._biOpt);\n if (attrs === undefined) {\n names = undefined;\n break;\n }\n names.push({ filename, longname, attrs });\n }\n if (names !== undefined) {\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received NAME (id:${reqID}, ${names.length})`\n );\n bufferParser.clear();\n if (req && typeof req.cb === 'function')\n req.cb(undefined, names);\n return;\n }\n }\n\n bufferParser.clear();\n return doFatalSFTPError(sftp, 'Malformed NAME packet');\n },\n [RESPONSE.ATTRS]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n let req;\n if (reqID !== undefined) {\n req = sftp._requests[reqID];\n delete sftp._requests[reqID];\n }\n /*\n ATTRS attrs\n */\n const attrs = readAttrs(sftp._biOpt);\n bufferParser.clear();\n if (attrs !== undefined) {\n sftp._debug && sftp._debug(`SFTP: Inbound: Received ATTRS (id:${reqID})`);\n if (req && typeof req.cb === 'function')\n req.cb(undefined, attrs);\n return;\n }\n\n return doFatalSFTPError(sftp, 'Malformed ATTRS packet');\n },\n [RESPONSE.EXTENDED]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n if (reqID !== undefined) {\n const req = sftp._requests[reqID];\n if (req) {\n delete sftp._requests[reqID];\n switch (req.extended) {\n case 'statvfs@openssh.com':\n case 'fstatvfs@openssh.com': {\n /*\n uint64 f_bsize // file system block size\n uint64 f_frsize // fundamental fs block size\n uint64 f_blocks // number of blocks (unit f_frsize)\n uint64 f_bfree // free blocks in file system\n uint64 f_bavail // free blocks for non-root\n uint64 f_files // total file inodes\n uint64 f_ffree // free file inodes\n uint64 f_favail // free file inodes for to non-root\n uint64 f_fsid // file system id\n uint64 f_flag // bit mask of f_flag values\n uint64 f_namemax // maximum filename length\n */\n const biOpt = sftp._biOpt;\n const stats = {\n f_bsize: bufferParser.readUInt64BE(biOpt),\n f_frsize: bufferParser.readUInt64BE(biOpt),\n f_blocks: bufferParser.readUInt64BE(biOpt),\n f_bfree: bufferParser.readUInt64BE(biOpt),\n f_bavail: bufferParser.readUInt64BE(biOpt),\n f_files: bufferParser.readUInt64BE(biOpt),\n f_ffree: bufferParser.readUInt64BE(biOpt),\n f_favail: bufferParser.readUInt64BE(biOpt),\n f_sid: bufferParser.readUInt64BE(biOpt),\n f_flag: bufferParser.readUInt64BE(biOpt),\n f_namemax: bufferParser.readUInt64BE(biOpt),\n };\n if (stats.f_namemax === undefined)\n break;\n if (sftp._debug) {\n sftp._debug(\n 'SFTP: Inbound: Received EXTENDED_REPLY '\n + `(id:${reqID}, ${req.extended})`\n );\n }\n bufferParser.clear();\n if (typeof req.cb === 'function')\n req.cb(undefined, stats);\n return;\n }\n case 'limits@openssh.com': {\n /*\n uint64 max-packet-length\n uint64 max-read-length\n uint64 max-write-length\n uint64 max-open-handles\n */\n const limits = {\n maxPktLen: bufferParser.readUInt64BE(),\n maxReadLen: bufferParser.readUInt64BE(),\n maxWriteLen: bufferParser.readUInt64BE(),\n maxOpenHandles: bufferParser.readUInt64BE(),\n };\n if (limits.maxOpenHandles === undefined)\n break;\n if (sftp._debug) {\n sftp._debug(\n 'SFTP: Inbound: Received EXTENDED_REPLY '\n + `(id:${reqID}, ${req.extended})`\n );\n }\n bufferParser.clear();\n if (typeof req.cb === 'function')\n req.cb(undefined, limits);\n return;\n }\n case 'users-groups-by-id@openssh.com': {\n /*\n string usernames\n string username1\n ...\n string groupnames\n string groupname1\n ...\n */\n const usernameCount = bufferParser.readUInt32BE();\n if (usernameCount === undefined)\n break;\n const usernames = new Array(usernameCount);\n for (let i = 0; i < usernames.length; ++i)\n usernames[i] = bufferParser.readString(true);\n\n const groupnameCount = bufferParser.readUInt32BE();\n if (groupnameCount === undefined)\n break;\n const groupnames = new Array(groupnameCount);\n for (let i = 0; i < groupnames.length; ++i)\n groupnames[i] = bufferParser.readString(true);\n if (groupnames.length > 0\n && groupnames[groupnames.length - 1] === undefined) {\n break;\n }\n\n if (sftp._debug) {\n sftp._debug(\n 'SFTP: Inbound: Received EXTENDED_REPLY '\n + `(id:${reqID}, ${req.extended})`\n );\n }\n bufferParser.clear();\n if (typeof req.cb === 'function')\n req.cb(undefined, usernames, groupnames);\n return;\n }\n default:\n // Unknown extended request\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received EXTENDED_REPLY (id:${reqID}, ???)`\n );\n bufferParser.clear();\n if (typeof req.cb === 'function')\n req.cb();\n return;\n }\n } else {\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received EXTENDED_REPLY (id:${reqID}, ???)`\n );\n bufferParser.clear();\n return;\n }\n }\n\n bufferParser.clear();\n return doFatalSFTPError(sftp, 'Malformed EXTENDED_REPLY packet');\n },\n};\nconst SERVER_HANDLERS = {\n [REQUEST.INIT]: (sftp, payload) => {\n if (sftp._version !== -1)\n return doFatalSFTPError(sftp, 'Duplicate INIT packet');\n\n const extensions = {};\n\n /*\n uint32 version\n <extension data>\n */\n bufferParser.init(payload, 1);\n let version = bufferParser.readUInt32BE();\n while (bufferParser.avail()) {\n const extName = bufferParser.readString(true);\n const extData = bufferParser.readString(true);\n if (extData === undefined) {\n version = undefined;\n break;\n }\n extensions[extName] = extData;\n }\n bufferParser.clear();\n\n if (version === undefined)\n return doFatalSFTPError(sftp, 'Malformed INIT packet');\n\n if (sftp._debug) {\n const names = Object.keys(extensions);\n if (names.length) {\n sftp._debug(\n `SFTP: Inbound: Received INIT (v${version}, exts:${names})`\n );\n } else {\n sftp._debug(`SFTP: Inbound: Received INIT (v${version})`);\n }\n }\n\n sendOrBuffer(sftp, SERVER_VERSION_BUFFER);\n\n sftp._version = version;\n sftp._extensions = extensions;\n sftp.emit('ready');\n },\n [REQUEST.OPEN]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string filename\n uint32 pflags\n ATTRS attrs\n */\n const filename = bufferParser.readString(true);\n const pflags = bufferParser.readUInt32BE();\n const attrs = readAttrs(sftp._biOpt);\n bufferParser.clear();\n\n if (attrs === undefined)\n return doFatalSFTPError(sftp, 'Malformed OPEN packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received OPEN (id:${reqID})`);\n\n if (!sftp.emit('OPEN', reqID, filename, pflags, attrs)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.CLOSE]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n */\n const handle = bufferParser.readString();\n bufferParser.clear();\n\n if (handle === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed CLOSE packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received CLOSE (id:${reqID})`);\n\n if (!sftp.emit('CLOSE', reqID, handle)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.READ]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n uint64 offset\n uint32 len\n */\n const handle = bufferParser.readString();\n const offset = bufferParser.readUInt64BE(sftp._biOpt);\n const len = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (len === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed READ packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received READ (id:${reqID})`);\n\n if (!sftp.emit('READ', reqID, handle, offset, len)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.WRITE]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n uint64 offset\n string data\n */\n const handle = bufferParser.readString();\n const offset = bufferParser.readUInt64BE(sftp._biOpt);\n const data = bufferParser.readString();\n bufferParser.clear();\n\n if (data === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed WRITE packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received WRITE (id:${reqID})`);\n\n if (!sftp.emit('WRITE', reqID, handle, offset, data)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.LSTAT]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed LSTAT packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received LSTAT (id:${reqID})`);\n\n if (!sftp.emit('LSTAT', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.FSTAT]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n */\n const handle = bufferParser.readString();\n bufferParser.clear();\n\n if (handle === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed FSTAT packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received FSTAT (id:${reqID})`);\n\n if (!sftp.emit('FSTAT', reqID, handle)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.SETSTAT]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n ATTRS attrs\n */\n const path = bufferParser.readString(true);\n const attrs = readAttrs(sftp._biOpt);\n bufferParser.clear();\n\n if (attrs === undefined)\n return doFatalSFTPError(sftp, 'Malformed SETSTAT packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received SETSTAT (id:${reqID})`);\n\n if (!sftp.emit('SETSTAT', reqID, path, attrs)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.FSETSTAT]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n ATTRS attrs\n */\n const handle = bufferParser.readString();\n const attrs = readAttrs(sftp._biOpt);\n bufferParser.clear();\n\n if (attrs === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed FSETSTAT packet');\n\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received FSETSTAT (id:${reqID})`\n );\n\n if (!sftp.emit('FSETSTAT', reqID, handle, attrs)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.OPENDIR]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed OPENDIR packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received OPENDIR (id:${reqID})`);\n\n if (!sftp.emit('OPENDIR', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.READDIR]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n */\n const handle = bufferParser.readString();\n bufferParser.clear();\n\n if (handle === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed READDIR packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received READDIR (id:${reqID})`);\n\n if (!sftp.emit('READDIR', reqID, handle)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.REMOVE]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed REMOVE packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received REMOVE (id:${reqID})`);\n\n if (!sftp.emit('REMOVE', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.MKDIR]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n ATTRS attrs\n */\n const path = bufferParser.readString(true);\n const attrs = readAttrs(sftp._biOpt);\n bufferParser.clear();\n\n if (attrs === undefined)\n return doFatalSFTPError(sftp, 'Malformed MKDIR packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received MKDIR (id:${reqID})`);\n\n if (!sftp.emit('MKDIR', reqID, path, attrs)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.RMDIR]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed RMDIR packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received RMDIR (id:${reqID})`);\n\n if (!sftp.emit('RMDIR', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.REALPATH]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed REALPATH packet');\n\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received REALPATH (id:${reqID})`\n );\n\n if (!sftp.emit('REALPATH', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.STAT]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed STAT packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received STAT (id:${reqID})`);\n\n if (!sftp.emit('STAT', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.RENAME]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string oldpath\n string newpath\n */\n const oldPath = bufferParser.readString(true);\n const newPath = bufferParser.readString(true);\n bufferParser.clear();\n\n if (newPath === undefined)\n return doFatalSFTPError(sftp, 'Malformed RENAME packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received RENAME (id:${reqID})`);\n\n if (!sftp.emit('RENAME', reqID, oldPath, newPath)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.READLINK]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed READLINK packet');\n\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received READLINK (id:${reqID})`\n );\n\n if (!sftp.emit('READLINK', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.SYMLINK]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string linkpath\n string targetpath\n */\n const linkPath = bufferParser.readString(true);\n const targetPath = bufferParser.readString(true);\n bufferParser.clear();\n\n if (targetPath === undefined)\n return doFatalSFTPError(sftp, 'Malformed SYMLINK packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received SYMLINK (id:${reqID})`);\n\n let handled;\n if (sftp._isOpenSSH) {\n // OpenSSH has linkpath and targetpath positions switched\n handled = sftp.emit('SYMLINK', reqID, targetPath, linkPath);\n } else {\n handled = sftp.emit('SYMLINK', reqID, linkPath, targetPath);\n }\n if (!handled) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.EXTENDED]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string extended-request\n ... any request-specific data ...\n */\n const extName = bufferParser.readString(true);\n if (extName === undefined) {\n bufferParser.clear();\n return doFatalSFTPError(sftp, 'Malformed EXTENDED packet');\n }\n\n let extData;\n if (bufferParser.avail())\n extData = bufferParser.readRaw();\n bufferParser.clear();\n\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received EXTENDED (id:${reqID})`\n );\n\n if (!sftp.emit('EXTENDED', reqID, extName, extData)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n};\n\n// =============================================================================\n// ReadStream/WriteStream-related ==============================================\n// =============================================================================\nconst {\n ERR_INVALID_ARG_TYPE,\n ERR_OUT_OF_RANGE,\n validateNumber\n} = require('./node-fs-compat');\n\nconst kMinPoolSpace = 128;\n\nlet pool;\n// It can happen that we expect to read a large chunk of data, and reserve\n// a large chunk of the pool accordingly, but the read() call only filled\n// a portion of it. If a concurrently executing read() then uses the same pool,\n// the \"reserved\" portion cannot be used, so we allow it to be re-used as a\n// new pool later.\nconst poolFragments = [];\n\nfunction allocNewPool(poolSize) {\n if (poolFragments.length > 0)\n pool = poolFragments.pop();\n else\n pool = Buffer.allocUnsafe(poolSize);\n pool.used = 0;\n}\n\n// Check the `this.start` and `this.end` of stream.\nfunction checkPosition(pos, name) {\n if (!Number.isSafeInteger(pos)) {\n validateNumber(pos, name);\n if (!Number.isInteger(pos))\n throw new ERR_OUT_OF_RANGE(name, 'an integer', pos);\n throw new ERR_OUT_OF_RANGE(name, '>= 0 and <= 2 ** 53 - 1', pos);\n }\n if (pos < 0)\n throw new ERR_OUT_OF_RANGE(name, '>= 0 and <= 2 ** 53 - 1', pos);\n}\n\nfunction roundUpToMultipleOf8(n) {\n return (n + 7) & ~7; // Align to 8 byte boundary.\n}\n\nfunction ReadStream(sftp, path, options) {\n if (options === undefined)\n options = {};\n else if (typeof options === 'string')\n options = { encoding: options };\n else if (options === null || typeof options !== 'object')\n throw new TypeError('\"options\" argument must be a string or an object');\n else\n options = Object.create(options);\n\n // A little bit bigger buffer and water marks by default\n if (options.highWaterMark === undefined)\n options.highWaterMark = 64 * 1024;\n\n // For backwards compat do not emit close on destroy.\n options.emitClose = false;\n options.autoDestroy = false; // Node 14 major change.\n\n ReadableStream.call(this, options);\n\n this.path = path;\n this.flags = options.flags === undefined ? 'r' : options.flags;\n this.mode = options.mode === undefined ? 0o666 : options.mode;\n\n this.start = options.start;\n this.end = options.end;\n this.autoClose = options.autoClose === undefined ? true : options.autoClose;\n this.pos = 0;\n this.bytesRead = 0;\n this.isClosed = false;\n\n this.handle = options.handle === undefined ? null : options.handle;\n this.sftp = sftp;\n this._opening = false;\n\n if (this.start !== undefined) {\n checkPosition(this.start, 'start');\n\n this.pos = this.start;\n }\n\n if (this.end === undefined) {\n this.end = Infinity;\n } else if (this.end !== Infinity) {\n checkPosition(this.end, 'end');\n\n if (this.start !== undefined && this.start > this.end) {\n throw new ERR_OUT_OF_RANGE(\n 'start',\n `<= \"end\" (here: ${this.end})`,\n this.start\n );\n }\n }\n\n this.on('end', function() {\n if (this.autoClose)\n this.destroy();\n });\n\n if (!Buffer.isBuffer(this.handle))\n this.open();\n}\ninherits(ReadStream, ReadableStream);\n\nReadStream.prototype.open = function() {\n if (this._opening)\n return;\n\n this._opening = true;\n\n this.sftp.open(this.path, this.flags, this.mode, (er, handle) => {\n this._opening = false;\n\n if (er) {\n this.emit('error', er);\n if (this.autoClose)\n this.destroy();\n return;\n }\n\n this.handle = handle;\n this.emit('open', handle);\n this.emit('ready');\n // Start the flow of data.\n this.read();\n });\n};\n\nReadStream.prototype._read = function(n) {\n if (!Buffer.isBuffer(this.handle))\n return this.once('open', () => this._read(n));\n\n // XXX: safe to remove this?\n if (this.destroyed)\n return;\n\n if (!pool || pool.length - pool.used < kMinPoolSpace) {\n // Discard the old pool.\n allocNewPool(this.readableHighWaterMark\n || this._readableState.highWaterMark);\n }\n\n // Grab another reference to the pool in the case that while we're\n // in the thread pool another read() finishes up the pool, and\n // allocates a new one.\n const thisPool = pool;\n let toRead = Math.min(pool.length - pool.used, n);\n const start = pool.used;\n\n if (this.end !== undefined)\n toRead = Math.min(this.end - this.pos + 1, toRead);\n\n // Already read everything we were supposed to read!\n // treat as EOF.\n if (toRead <= 0)\n return this.push(null);\n\n // the actual read.\n this.sftp.read(this.handle,\n pool,\n pool.used,\n toRead,\n this.pos,\n (er, bytesRead) => {\n if (er) {\n this.emit('error', er);\n if (this.autoClose)\n this.destroy();\n return;\n }\n let b = null;\n\n // Now that we know how much data we have actually read, re-wind the\n // 'used' field if we can, and otherwise allow the remainder of our\n // reservation to be used as a new pool later.\n if (start + toRead === thisPool.used && thisPool === pool) {\n thisPool.used = roundUpToMultipleOf8(thisPool.used + bytesRead - toRead);\n } else {\n // Round down to the next lowest multiple of 8 to ensure the new pool\n // fragment start and end positions are aligned to an 8 byte boundary.\n const alignedEnd = (start + toRead) & ~7;\n const alignedStart = roundUpToMultipleOf8(start + bytesRead);\n if (alignedEnd - alignedStart >= kMinPoolSpace)\n poolFragments.push(thisPool.slice(alignedStart, alignedEnd));\n }\n\n if (bytesRead > 0) {\n this.bytesRead += bytesRead;\n b = thisPool.slice(start, start + bytesRead);\n }\n\n // Move the pool positions, and internal position for reading.\n this.pos += bytesRead;\n\n this.push(b);\n });\n\n pool.used = roundUpToMultipleOf8(pool.used + toRead);\n};\n\nReadStream.prototype._destroy = function(err, cb) {\n if (this._opening && !Buffer.isBuffer(this.handle)) {\n this.once('open', closeStream.bind(null, this, cb, err));\n return;\n }\n\n closeStream(this, cb, err);\n this.handle = null;\n this._opening = false;\n};\n\nfunction closeStream(stream, cb, err) {\n if (!stream.handle)\n return onclose();\n\n stream.sftp.close(stream.handle, onclose);\n\n function onclose(er) {\n er = er || err;\n cb(er);\n stream.isClosed = true;\n if (!er)\n stream.emit('close');\n }\n}\n\nReadStream.prototype.close = function(cb) {\n this.destroy(null, cb);\n};\n\nObject.defineProperty(ReadStream.prototype, 'pending', {\n get() {\n return this.handle === null;\n },\n configurable: true\n});\n\n// TODO: add `concurrency` setting to allow more than one in-flight WRITE\n// request to server to improve throughput\nfunction WriteStream(sftp, path, options) {\n if (options === undefined)\n options = {};\n else if (typeof options === 'string')\n options = { encoding: options };\n else if (options === null || typeof options !== 'object')\n throw new TypeError('\"options\" argument must be a string or an object');\n else\n options = Object.create(options);\n\n // For backwards compat do not emit close on destroy.\n options.emitClose = false;\n options.autoDestroy = false; // Node 14 major change.\n\n WritableStream.call(this, options);\n\n this.path = path;\n this.flags = options.flags === undefined ? 'w' : options.flags;\n this.mode = options.mode === undefined ? 0o666 : options.mode;\n\n this.start = options.start;\n this.autoClose = options.autoClose === undefined ? true : options.autoClose;\n this.pos = 0;\n this.bytesWritten = 0;\n this.isClosed = false;\n\n this.handle = options.handle === undefined ? null : options.handle;\n this.sftp = sftp;\n this._opening = false;\n\n if (this.start !== undefined) {\n checkPosition(this.start, 'start');\n\n this.pos = this.start;\n }\n\n if (options.encoding)\n this.setDefaultEncoding(options.encoding);\n\n // Node v6.x only\n this.on('finish', function() {\n if (this._writableState.finalCalled)\n return;\n if (this.autoClose)\n this.destroy();\n });\n\n if (!Buffer.isBuffer(this.handle))\n this.open();\n}\ninherits(WriteStream, WritableStream);\n\nWriteStream.prototype._final = function(cb) {\n if (this.autoClose)\n this.destroy();\n cb();\n};\n\nWriteStream.prototype.open = function() {\n if (this._opening)\n return;\n\n this._opening = true;\n\n this.sftp.open(this.path, this.flags, this.mode, (er, handle) => {\n this._opening = false;\n\n if (er) {\n this.emit('error', er);\n if (this.autoClose)\n this.destroy();\n return;\n }\n\n this.handle = handle;\n\n const tryAgain = (err) => {\n if (err) {\n // Try chmod() for sftp servers that may not support fchmod() for\n // whatever reason\n this.sftp.chmod(this.path, this.mode, (err_) => tryAgain());\n return;\n }\n\n // SFTPv3 requires absolute offsets, no matter the open flag used\n if (this.flags[0] === 'a') {\n const tryStat = (err, st) => {\n if (err) {\n // Try stat() for sftp servers that may not support fstat() for\n // whatever reason\n this.sftp.stat(this.path, (err_, st_) => {\n if (err_) {\n this.destroy();\n this.emit('error', err);\n return;\n }\n tryStat(null, st_);\n });\n return;\n }\n\n this.pos = st.size;\n this.emit('open', handle);\n this.emit('ready');\n };\n\n this.sftp.fstat(handle, tryStat);\n return;\n }\n\n this.emit('open', handle);\n this.emit('ready');\n };\n\n this.sftp.fchmod(handle, this.mode, tryAgain);\n });\n};\n\nWriteStream.prototype._write = function(data, encoding, cb) {\n if (!Buffer.isBuffer(data)) {\n const err = new ERR_INVALID_ARG_TYPE('data', 'Buffer', data);\n return this.emit('error', err);\n }\n\n if (!Buffer.isBuffer(this.handle)) {\n return this.once('open', function() {\n this._write(data, encoding, cb);\n });\n }\n\n this.sftp.write(this.handle,\n data,\n 0,\n data.length,\n this.pos,\n (er, bytes) => {\n if (er) {\n if (this.autoClose)\n this.destroy();\n return cb(er);\n }\n this.bytesWritten += bytes;\n cb();\n });\n\n this.pos += data.length;\n};\n\nWriteStream.prototype._writev = function(data, cb) {\n if (!Buffer.isBuffer(this.handle)) {\n return this.once('open', function() {\n this._writev(data, cb);\n });\n }\n\n const sftp = this.sftp;\n const handle = this.handle;\n let writesLeft = data.length;\n\n const onwrite = (er, bytes) => {\n if (er) {\n this.destroy();\n return cb(er);\n }\n this.bytesWritten += bytes;\n if (--writesLeft === 0)\n cb();\n };\n\n // TODO: try to combine chunks to reduce number of requests to the server?\n for (let i = 0; i < data.length; ++i) {\n const chunk = data[i].chunk;\n\n sftp.write(handle, chunk, 0, chunk.length, this.pos, onwrite);\n this.pos += chunk.length;\n }\n};\n\nif (typeof WritableStream.prototype.destroy !== 'function')\n WriteStream.prototype.destroy = ReadStream.prototype.destroy;\n\nWriteStream.prototype._destroy = ReadStream.prototype._destroy;\nWriteStream.prototype.close = function(cb) {\n if (cb) {\n if (this.isClosed) {\n process.nextTick(cb);\n return;\n }\n this.on('close', cb);\n }\n\n // If we are not autoClosing, we should call\n // destroy on 'finish'.\n if (!this.autoClose)\n this.on('finish', this.destroy.bind(this));\n\n this.end();\n};\n\n// There is no shutdown() for files.\nWriteStream.prototype.destroySoon = WriteStream.prototype.end;\n\nObject.defineProperty(WriteStream.prototype, 'pending', {\n get() {\n return this.handle === null;\n },\n configurable: true\n});\n// =============================================================================\n\nmodule.exports = {\n flagsToString,\n OPEN_MODE,\n SFTP,\n Stats,\n STATUS_CODE,\n stringToFlags,\n};\n", "'use strict';\n\nconst {\n Duplex: DuplexStream,\n Readable: ReadableStream,\n Writable: WritableStream,\n} = require('stream');\n\nconst {\n CHANNEL_EXTENDED_DATATYPE: { STDERR },\n} = require('./protocol/constants.js');\nconst { bufferSlice } = require('./protocol/utils.js');\n\nconst PACKET_SIZE = 32 * 1024;\nconst MAX_WINDOW = 2 * 1024 * 1024;\nconst WINDOW_THRESHOLD = MAX_WINDOW / 2;\n\nclass ClientStderr extends ReadableStream {\n constructor(channel, streamOpts) {\n super(streamOpts);\n\n this._channel = channel;\n }\n _read(n) {\n if (this._channel._waitChanDrain) {\n this._channel._waitChanDrain = false;\n if (this._channel.incoming.window <= WINDOW_THRESHOLD)\n windowAdjust(this._channel);\n }\n }\n}\n\nclass ServerStderr extends WritableStream {\n constructor(channel) {\n super({ highWaterMark: MAX_WINDOW });\n\n this._channel = channel;\n }\n\n _write(data, encoding, cb) {\n const channel = this._channel;\n const protocol = channel._client._protocol;\n const outgoing = channel.outgoing;\n const packetSize = outgoing.packetSize;\n const id = outgoing.id;\n let window = outgoing.window;\n const len = data.length;\n let p = 0;\n\n if (outgoing.state !== 'open')\n return;\n\n while (len - p > 0 && window > 0) {\n let sliceLen = len - p;\n if (sliceLen > window)\n sliceLen = window;\n if (sliceLen > packetSize)\n sliceLen = packetSize;\n\n if (p === 0 && sliceLen === len)\n protocol.channelExtData(id, data, STDERR);\n else\n protocol.channelExtData(id, bufferSlice(data, p, p + sliceLen), STDERR);\n\n p += sliceLen;\n window -= sliceLen;\n }\n\n outgoing.window = window;\n\n if (len - p > 0) {\n if (window === 0)\n channel._waitWindow = true;\n if (p > 0)\n channel._chunkErr = bufferSlice(data, p, len);\n else\n channel._chunkErr = data;\n channel._chunkcbErr = cb;\n return;\n }\n\n cb();\n }\n}\n\nclass Channel extends DuplexStream {\n constructor(client, info, opts) {\n const streamOpts = {\n highWaterMark: MAX_WINDOW,\n allowHalfOpen: (!opts || (opts && opts.allowHalfOpen !== false)),\n emitClose: false,\n };\n super(streamOpts);\n this.allowHalfOpen = streamOpts.allowHalfOpen;\n\n const server = !!(opts && opts.server);\n\n this.server = server;\n this.type = info.type;\n this.subtype = undefined;\n\n /*\n incoming and outgoing contain these properties:\n {\n id: undefined,\n window: undefined,\n packetSize: undefined,\n state: 'closed'\n }\n */\n this.incoming = info.incoming;\n this.outgoing = info.outgoing;\n this._callbacks = [];\n\n this._client = client;\n this._hasX11 = false;\n this._exit = {\n code: undefined,\n signal: undefined,\n dump: undefined,\n desc: undefined,\n };\n\n this.stdin = this.stdout = this;\n\n if (server)\n this.stderr = new ServerStderr(this);\n else\n this.stderr = new ClientStderr(this, streamOpts);\n\n // Outgoing data\n this._waitWindow = false; // SSH-level backpressure\n\n // Incoming data\n this._waitChanDrain = false; // Channel Readable side backpressure\n\n this._chunk = undefined;\n this._chunkcb = undefined;\n this._chunkErr = undefined;\n this._chunkcbErr = undefined;\n\n this.on('finish', onFinish)\n .on('prefinish', onFinish); // For node v0.11+\n\n this.on('end', onEnd).on('close', onEnd);\n }\n\n _read(n) {\n if (this._waitChanDrain) {\n this._waitChanDrain = false;\n if (this.incoming.window <= WINDOW_THRESHOLD)\n windowAdjust(this);\n }\n }\n\n _write(data, encoding, cb) {\n const protocol = this._client._protocol;\n const outgoing = this.outgoing;\n const packetSize = outgoing.packetSize;\n const id = outgoing.id;\n let window = outgoing.window;\n const len = data.length;\n let p = 0;\n\n if (outgoing.state !== 'open')\n return;\n\n while (len - p > 0 && window > 0) {\n let sliceLen = len - p;\n if (sliceLen > window)\n sliceLen = window;\n if (sliceLen > packetSize)\n sliceLen = packetSize;\n\n if (p === 0 && sliceLen === len)\n protocol.channelData(id, data);\n else\n protocol.channelData(id, bufferSlice(data, p, p + sliceLen));\n\n p += sliceLen;\n window -= sliceLen;\n }\n\n outgoing.window = window;\n\n if (len - p > 0) {\n if (window === 0)\n this._waitWindow = true;\n if (p > 0)\n this._chunk = bufferSlice(data, p, len);\n else\n this._chunk = data;\n this._chunkcb = cb;\n return;\n }\n\n cb();\n }\n\n eof() {\n if (this.outgoing.state === 'open') {\n this.outgoing.state = 'eof';\n this._client._protocol.channelEOF(this.outgoing.id);\n }\n }\n\n close() {\n if (this.outgoing.state === 'open' || this.outgoing.state === 'eof') {\n this.outgoing.state = 'closing';\n this._client._protocol.channelClose(this.outgoing.id);\n }\n }\n\n destroy() {\n this.end();\n this.close();\n return this;\n }\n\n // Session type-specific methods =============================================\n setWindow(rows, cols, height, width) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (this.type === 'session'\n && (this.subtype === 'shell' || this.subtype === 'exec')\n && this.writable\n && this.outgoing.state === 'open') {\n this._client._protocol.windowChange(this.outgoing.id,\n rows,\n cols,\n height,\n width);\n }\n }\n\n signal(signalName) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (this.type === 'session'\n && this.writable\n && this.outgoing.state === 'open') {\n this._client._protocol.signal(this.outgoing.id, signalName);\n }\n }\n\n exit(statusOrSignal, coreDumped, msg) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n if (this.type === 'session'\n && this.writable\n && this.outgoing.state === 'open') {\n if (typeof statusOrSignal === 'number') {\n this._client._protocol.exitStatus(this.outgoing.id, statusOrSignal);\n } else {\n this._client._protocol.exitSignal(this.outgoing.id,\n statusOrSignal,\n coreDumped,\n msg);\n }\n }\n }\n\n}\n\nfunction onFinish() {\n this.eof();\n if (this.server || !this.allowHalfOpen)\n this.close();\n this.writable = false;\n}\n\nfunction onEnd() {\n this.readable = false;\n}\n\nfunction windowAdjust(self) {\n if (self.outgoing.state === 'closed')\n return;\n const amt = MAX_WINDOW - self.incoming.window;\n if (amt <= 0)\n return;\n self.incoming.window += amt;\n self._client._protocol.channelWindowAdjust(self.outgoing.id, amt);\n}\n\nmodule.exports = {\n Channel,\n MAX_WINDOW,\n PACKET_SIZE,\n windowAdjust,\n WINDOW_THRESHOLD,\n};\n", "'use strict';\n\nconst { SFTP } = require('./protocol/SFTP.js');\n\nconst MAX_CHANNEL = 2 ** 32 - 1;\n\nfunction onChannelOpenFailure(self, recipient, info, cb) {\n self._chanMgr.remove(recipient);\n if (typeof cb !== 'function')\n return;\n\n let err;\n if (info instanceof Error) {\n err = info;\n } else if (typeof info === 'object' && info !== null) {\n err = new Error(`(SSH) Channel open failure: ${info.description}`);\n err.reason = info.reason;\n } else {\n err = new Error(\n '(SSH) Channel open failure: server closed channel unexpectedly'\n );\n err.reason = '';\n }\n\n cb(err);\n}\n\nfunction onCHANNEL_CLOSE(self, recipient, channel, err, dead) {\n if (typeof channel === 'function') {\n // We got CHANNEL_CLOSE instead of CHANNEL_OPEN_FAILURE when\n // requesting to open a channel\n onChannelOpenFailure(self, recipient, err, channel);\n return;\n }\n\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.incoming && channel.incoming.state === 'closed')\n return;\n\n self._chanMgr.remove(recipient);\n\n if (channel.server && channel.constructor.name === 'Session')\n return;\n\n channel.incoming.state = 'closed';\n\n if (channel.readable)\n channel.push(null);\n if (channel.server) {\n if (channel.stderr.writable)\n channel.stderr.end();\n } else if (channel.stderr.readable) {\n channel.stderr.push(null);\n }\n\n if (channel.constructor !== SFTP\n && (channel.outgoing.state === 'open'\n || channel.outgoing.state === 'eof')\n && !dead) {\n channel.close();\n }\n if (channel.outgoing.state === 'closing')\n channel.outgoing.state = 'closed';\n\n const readState = channel._readableState;\n const writeState = channel._writableState;\n if (writeState && !writeState.ending && !writeState.finished && !dead)\n channel.end();\n\n // Take care of any outstanding channel requests\n const chanCallbacks = channel._callbacks;\n channel._callbacks = [];\n for (let i = 0; i < chanCallbacks.length; ++i)\n chanCallbacks[i](true);\n\n if (channel.server) {\n if (!channel.readable\n || channel.destroyed\n || (readState && readState.endEmitted)) {\n channel.emit('close');\n } else {\n channel.once('end', () => channel.emit('close'));\n }\n } else {\n let doClose;\n switch (channel.type) {\n case 'direct-streamlocal@openssh.com':\n case 'direct-tcpip':\n doClose = () => channel.emit('close');\n break;\n default: {\n // Align more with node child processes, where the close event gets\n // the same arguments as the exit event\n const exit = channel._exit;\n doClose = () => {\n if (exit.code === null)\n channel.emit('close', exit.code, exit.signal, exit.dump, exit.desc);\n else\n channel.emit('close', exit.code);\n };\n }\n }\n if (!channel.readable\n || channel.destroyed\n || (readState && readState.endEmitted)) {\n doClose();\n } else {\n channel.once('end', doClose);\n }\n\n const errReadState = channel.stderr._readableState;\n if (!channel.stderr.readable\n || channel.stderr.destroyed\n || (errReadState && errReadState.endEmitted)) {\n channel.stderr.emit('close');\n } else {\n channel.stderr.once('end', () => channel.stderr.emit('close'));\n }\n }\n}\n\nclass ChannelManager {\n constructor(client) {\n this._client = client;\n this._channels = {};\n this._cur = -1;\n this._count = 0;\n }\n add(val) {\n // Attempt to reserve an id\n\n let id;\n // Optimized paths\n if (this._cur < MAX_CHANNEL) {\n id = ++this._cur;\n } else if (this._count === 0) {\n // Revert and reset back to fast path once we no longer have any channels\n // open\n this._cur = 0;\n id = 0;\n } else {\n // Slower lookup path\n\n // This path is triggered we have opened at least MAX_CHANNEL channels\n // while having at least one channel open at any given time, so we have\n // to search for a free id.\n const channels = this._channels;\n for (let i = 0; i < MAX_CHANNEL; ++i) {\n if (channels[i] === undefined) {\n id = i;\n break;\n }\n }\n }\n\n if (id === undefined)\n return -1;\n\n this._channels[id] = (val || true);\n ++this._count;\n\n return id;\n }\n update(id, val) {\n if (typeof id !== 'number' || id < 0 || id >= MAX_CHANNEL || !isFinite(id))\n throw new Error(`Invalid channel id: ${id}`);\n\n if (val && this._channels[id])\n this._channels[id] = val;\n }\n get(id) {\n if (typeof id !== 'number' || id < 0 || id >= MAX_CHANNEL || !isFinite(id))\n throw new Error(`Invalid channel id: ${id}`);\n\n return this._channels[id];\n }\n remove(id) {\n if (typeof id !== 'number' || id < 0 || id >= MAX_CHANNEL || !isFinite(id))\n throw new Error(`Invalid channel id: ${id}`);\n\n if (this._channels[id]) {\n delete this._channels[id];\n if (this._count)\n --this._count;\n }\n }\n cleanup(err) {\n const channels = this._channels;\n this._channels = {};\n this._cur = -1;\n this._count = 0;\n\n const chanIDs = Object.keys(channels);\n const client = this._client;\n for (let i = 0; i < chanIDs.length; ++i) {\n const id = +chanIDs[i];\n const channel = channels[id];\n onCHANNEL_CLOSE(client, id, channel._channel || channel, err, true);\n }\n }\n}\n\nconst isRegExp = (() => {\n const toString = Object.prototype.toString;\n return (val) => toString.call(val) === '[object RegExp]';\n})();\n\nfunction generateAlgorithmList(algoList, defaultList, supportedList) {\n if (Array.isArray(algoList) && algoList.length > 0) {\n // Exact list\n for (let i = 0; i < algoList.length; ++i) {\n if (supportedList.indexOf(algoList[i]) === -1)\n throw new Error(`Unsupported algorithm: ${algoList[i]}`);\n }\n return algoList;\n }\n\n if (typeof algoList === 'object' && algoList !== null) {\n // Operations based on the default list\n const keys = Object.keys(algoList);\n let list = defaultList;\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let val = algoList[key];\n switch (key) {\n case 'append':\n if (!Array.isArray(val))\n val = [val];\n if (Array.isArray(val)) {\n for (let j = 0; j < val.length; ++j) {\n const append = val[j];\n if (typeof append === 'string') {\n if (!append || list.indexOf(append) !== -1)\n continue;\n if (supportedList.indexOf(append) === -1)\n throw new Error(`Unsupported algorithm: ${append}`);\n if (list === defaultList)\n list = list.slice();\n list.push(append);\n } else if (isRegExp(append)) {\n for (let k = 0; k < supportedList.length; ++k) {\n const algo = supportedList[k];\n if (append.test(algo)) {\n if (list.indexOf(algo) !== -1)\n continue;\n if (list === defaultList)\n list = list.slice();\n list.push(algo);\n }\n }\n }\n }\n }\n break;\n case 'prepend':\n if (!Array.isArray(val))\n val = [val];\n if (Array.isArray(val)) {\n for (let j = val.length; j >= 0; --j) {\n const prepend = val[j];\n if (typeof prepend === 'string') {\n if (!prepend || list.indexOf(prepend) !== -1)\n continue;\n if (supportedList.indexOf(prepend) === -1)\n throw new Error(`Unsupported algorithm: ${prepend}`);\n if (list === defaultList)\n list = list.slice();\n list.unshift(prepend);\n } else if (isRegExp(prepend)) {\n for (let k = supportedList.length; k >= 0; --k) {\n const algo = supportedList[k];\n if (prepend.test(algo)) {\n if (list.indexOf(algo) !== -1)\n continue;\n if (list === defaultList)\n list = list.slice();\n list.unshift(algo);\n }\n }\n }\n }\n }\n break;\n case 'remove':\n if (!Array.isArray(val))\n val = [val];\n if (Array.isArray(val)) {\n for (let j = 0; j < val.length; ++j) {\n const search = val[j];\n if (typeof search === 'string') {\n if (!search)\n continue;\n const idx = list.indexOf(search);\n if (idx === -1)\n continue;\n if (list === defaultList)\n list = list.slice();\n list.splice(idx, 1);\n } else if (isRegExp(search)) {\n for (let k = 0; k < list.length; ++k) {\n if (search.test(list[k])) {\n if (list === defaultList)\n list = list.slice();\n list.splice(k, 1);\n --k;\n }\n }\n }\n }\n }\n break;\n }\n }\n\n return list;\n }\n\n return defaultList;\n}\n\nmodule.exports = {\n ChannelManager,\n generateAlgorithmList,\n onChannelOpenFailure,\n onCHANNEL_CLOSE,\n isWritable: (stream) => {\n // XXX: hack to workaround regression in node\n // See: https://github.com/nodejs/node/issues/36029\n return (stream\n && stream.writable\n && stream._readableState\n && stream._readableState.ended === false);\n },\n};\n", "// TODO:\n// * add `.connected` or similar property to allow immediate connection\n// status checking\n// * add/improve debug output during user authentication phase\n'use strict';\n\nconst {\n createHash,\n getHashes,\n randomFillSync,\n} = require('crypto');\nconst { Socket } = require('net');\nconst { lookup: dnsLookup } = require('dns');\nconst EventEmitter = require('events');\nconst HASHES = getHashes();\n\nconst {\n COMPAT,\n CHANNEL_EXTENDED_DATATYPE: { STDERR },\n CHANNEL_OPEN_FAILURE,\n DEFAULT_CIPHER,\n DEFAULT_COMPRESSION,\n DEFAULT_KEX,\n DEFAULT_MAC,\n DEFAULT_SERVER_HOST_KEY,\n DISCONNECT_REASON,\n DISCONNECT_REASON_BY_VALUE,\n SUPPORTED_CIPHER,\n SUPPORTED_COMPRESSION,\n SUPPORTED_KEX,\n SUPPORTED_MAC,\n SUPPORTED_SERVER_HOST_KEY,\n} = require('./protocol/constants.js');\nconst { init: cryptoInit } = require('./protocol/crypto.js');\nconst Protocol = require('./protocol/Protocol.js');\nconst { parseKey } = require('./protocol/keyParser.js');\nconst { SFTP } = require('./protocol/SFTP.js');\nconst {\n bufferCopy,\n makeBufferParser,\n makeError,\n readUInt32BE,\n sigSSHToASN1,\n writeUInt32BE,\n} = require('./protocol/utils.js');\n\nconst { AgentContext, createAgent, isAgent } = require('./agent.js');\nconst {\n Channel,\n MAX_WINDOW,\n PACKET_SIZE,\n windowAdjust,\n WINDOW_THRESHOLD,\n} = require('./Channel.js');\nconst {\n ChannelManager,\n generateAlgorithmList,\n isWritable,\n onChannelOpenFailure,\n onCHANNEL_CLOSE,\n} = require('./utils.js');\n\nconst bufferParser = makeBufferParser();\nconst sigParser = makeBufferParser();\nconst RE_OPENSSH = /^OpenSSH_(?:(?![0-4])\\d)|(?:\\d{2,})/;\nconst noop = (err) => {};\n\nclass Client extends EventEmitter {\n constructor() {\n super();\n\n this.config = {\n host: undefined,\n port: undefined,\n localAddress: undefined,\n localPort: undefined,\n forceIPv4: undefined,\n forceIPv6: undefined,\n keepaliveCountMax: undefined,\n keepaliveInterval: undefined,\n readyTimeout: undefined,\n ident: undefined,\n\n username: undefined,\n password: undefined,\n privateKey: undefined,\n tryKeyboard: undefined,\n agent: undefined,\n allowAgentFwd: undefined,\n authHandler: undefined,\n\n hostHashAlgo: undefined,\n hostHashCb: undefined,\n strictVendor: undefined,\n debug: undefined\n };\n\n this._agent = undefined;\n this._readyTimeout = undefined;\n this._chanMgr = undefined;\n this._callbacks = undefined;\n this._forwarding = undefined;\n this._forwardingUnix = undefined;\n this._acceptX11 = undefined;\n this._agentFwdEnabled = undefined;\n this._remoteVer = undefined;\n\n this._protocol = undefined;\n this._sock = undefined;\n this._resetKA = undefined;\n }\n\n connect(cfg) {\n if (this._sock && isWritable(this._sock)) {\n this.once('close', () => {\n this.connect(cfg);\n });\n this.end();\n return this;\n }\n\n this.config.host = cfg.hostname || cfg.host || 'localhost';\n this.config.port = cfg.port || 22;\n this.config.localAddress = (typeof cfg.localAddress === 'string'\n ? cfg.localAddress\n : undefined);\n this.config.localPort = (typeof cfg.localPort === 'string'\n || typeof cfg.localPort === 'number'\n ? cfg.localPort\n : undefined);\n this.config.forceIPv4 = cfg.forceIPv4 || false;\n this.config.forceIPv6 = cfg.forceIPv6 || false;\n this.config.keepaliveCountMax = (typeof cfg.keepaliveCountMax === 'number'\n && cfg.keepaliveCountMax >= 0\n ? cfg.keepaliveCountMax\n : 3);\n this.config.keepaliveInterval = (typeof cfg.keepaliveInterval === 'number'\n && cfg.keepaliveInterval > 0\n ? cfg.keepaliveInterval\n : 0);\n this.config.readyTimeout = (typeof cfg.readyTimeout === 'number'\n && cfg.readyTimeout >= 0\n ? cfg.readyTimeout\n : 20000);\n this.config.ident = (typeof cfg.ident === 'string'\n || Buffer.isBuffer(cfg.ident)\n ? cfg.ident\n : undefined);\n\n const algorithms = {\n kex: undefined,\n serverHostKey: undefined,\n cs: {\n cipher: undefined,\n mac: undefined,\n compress: undefined,\n lang: [],\n },\n sc: undefined,\n };\n let allOfferDefaults = true;\n if (typeof cfg.algorithms === 'object' && cfg.algorithms !== null) {\n algorithms.kex = generateAlgorithmList(cfg.algorithms.kex,\n DEFAULT_KEX,\n SUPPORTED_KEX);\n if (algorithms.kex !== DEFAULT_KEX)\n allOfferDefaults = false;\n\n algorithms.serverHostKey =\n generateAlgorithmList(cfg.algorithms.serverHostKey,\n DEFAULT_SERVER_HOST_KEY,\n SUPPORTED_SERVER_HOST_KEY);\n if (algorithms.serverHostKey !== DEFAULT_SERVER_HOST_KEY)\n allOfferDefaults = false;\n\n algorithms.cs.cipher = generateAlgorithmList(cfg.algorithms.cipher,\n DEFAULT_CIPHER,\n SUPPORTED_CIPHER);\n if (algorithms.cs.cipher !== DEFAULT_CIPHER)\n allOfferDefaults = false;\n\n algorithms.cs.mac = generateAlgorithmList(cfg.algorithms.hmac,\n DEFAULT_MAC,\n SUPPORTED_MAC);\n if (algorithms.cs.mac !== DEFAULT_MAC)\n allOfferDefaults = false;\n\n algorithms.cs.compress = generateAlgorithmList(cfg.algorithms.compress,\n DEFAULT_COMPRESSION,\n SUPPORTED_COMPRESSION);\n if (algorithms.cs.compress !== DEFAULT_COMPRESSION)\n allOfferDefaults = false;\n\n if (!allOfferDefaults)\n algorithms.sc = algorithms.cs;\n }\n\n if (typeof cfg.username === 'string')\n this.config.username = cfg.username;\n else if (typeof cfg.user === 'string')\n this.config.username = cfg.user;\n else\n throw new Error('Invalid username');\n\n this.config.password = (typeof cfg.password === 'string'\n ? cfg.password\n : undefined);\n this.config.privateKey = (typeof cfg.privateKey === 'string'\n || Buffer.isBuffer(cfg.privateKey)\n ? cfg.privateKey\n : undefined);\n this.config.localHostname = (typeof cfg.localHostname === 'string'\n ? cfg.localHostname\n : undefined);\n this.config.localUsername = (typeof cfg.localUsername === 'string'\n ? cfg.localUsername\n : undefined);\n this.config.tryKeyboard = (cfg.tryKeyboard === true);\n if (typeof cfg.agent === 'string' && cfg.agent.length)\n this.config.agent = createAgent(cfg.agent);\n else if (isAgent(cfg.agent))\n this.config.agent = cfg.agent;\n else\n this.config.agent = undefined;\n this.config.allowAgentFwd = (cfg.agentForward === true\n && this.config.agent !== undefined);\n let authHandler = this.config.authHandler = (\n typeof cfg.authHandler === 'function'\n || Array.isArray(cfg.authHandler)\n ? cfg.authHandler\n : undefined\n );\n\n this.config.strictVendor = (typeof cfg.strictVendor === 'boolean'\n ? cfg.strictVendor\n : true);\n\n const debug = this.config.debug = (typeof cfg.debug === 'function'\n ? cfg.debug\n : undefined);\n\n if (cfg.agentForward === true && !this.config.allowAgentFwd) {\n throw new Error(\n 'You must set a valid agent path to allow agent forwarding'\n );\n }\n\n let callbacks = this._callbacks = [];\n this._chanMgr = new ChannelManager(this);\n this._forwarding = {};\n this._forwardingUnix = {};\n this._acceptX11 = 0;\n this._agentFwdEnabled = false;\n this._agent = (this.config.agent ? this.config.agent : undefined);\n this._remoteVer = undefined;\n let privateKey;\n\n if (this.config.privateKey) {\n privateKey = parseKey(this.config.privateKey, cfg.passphrase);\n if (privateKey instanceof Error)\n throw new Error(`Cannot parse privateKey: ${privateKey.message}`);\n if (Array.isArray(privateKey)) {\n // OpenSSH's newer format only stores 1 key for now\n privateKey = privateKey[0];\n }\n if (privateKey.getPrivatePEM() === null) {\n throw new Error(\n 'privateKey value does not contain a (valid) private key'\n );\n }\n }\n\n let hostVerifier;\n if (typeof cfg.hostVerifier === 'function') {\n const hashCb = cfg.hostVerifier;\n let hashAlgo;\n if (HASHES.indexOf(cfg.hostHash) !== -1) {\n // Default to old behavior of hashing on user's behalf\n hashAlgo = cfg.hostHash;\n }\n hostVerifier = (key, verify) => {\n if (hashAlgo)\n key = createHash(hashAlgo).update(key).digest('hex');\n const ret = hashCb(key, verify);\n if (ret !== undefined)\n verify(ret);\n };\n }\n\n const sock = this._sock = (cfg.sock || new Socket());\n let ready = false;\n let sawHeader = false;\n if (this._protocol)\n this._protocol.cleanup();\n const DEBUG_HANDLER = (!debug ? undefined : (p, display, msg) => {\n debug(`Debug output from server: ${JSON.stringify(msg)}`);\n });\n let serverSigAlgs;\n const proto = this._protocol = new Protocol({\n ident: this.config.ident,\n offer: (allOfferDefaults ? undefined : algorithms),\n onWrite: (data) => {\n if (isWritable(sock))\n sock.write(data);\n },\n onError: (err) => {\n if (err.level === 'handshake')\n clearTimeout(this._readyTimeout);\n if (!proto._destruct)\n sock.removeAllListeners('data');\n this.emit('error', err);\n try {\n sock.end();\n } catch {}\n },\n onHeader: (header) => {\n sawHeader = true;\n this._remoteVer = header.versions.software;\n if (header.greeting)\n this.emit('greeting', header.greeting);\n },\n onHandshakeComplete: (negotiated) => {\n this.emit('handshake', negotiated);\n if (!ready) {\n ready = true;\n proto.service('ssh-userauth');\n }\n },\n debug,\n hostVerifier,\n messageHandlers: {\n DEBUG: DEBUG_HANDLER,\n DISCONNECT: (p, reason, desc) => {\n if (reason !== DISCONNECT_REASON.BY_APPLICATION) {\n if (!desc) {\n desc = DISCONNECT_REASON_BY_VALUE[reason];\n if (desc === undefined)\n desc = `Unexpected disconnection reason: ${reason}`;\n }\n const err = new Error(desc);\n err.code = reason;\n this.emit('error', err);\n }\n sock.end();\n },\n SERVICE_ACCEPT: (p, name) => {\n if (name === 'ssh-userauth')\n tryNextAuth();\n },\n EXT_INFO: (p, exts) => {\n if (serverSigAlgs === undefined) {\n for (const ext of exts) {\n if (ext.name === 'server-sig-algs') {\n serverSigAlgs = ext.algs;\n return;\n }\n }\n serverSigAlgs = null;\n }\n },\n USERAUTH_BANNER: (p, msg) => {\n this.emit('banner', msg);\n },\n USERAUTH_SUCCESS: (p) => {\n // Start keepalive mechanism\n resetKA();\n\n clearTimeout(this._readyTimeout);\n\n this.emit('ready');\n },\n USERAUTH_FAILURE: (p, authMethods, partialSuccess) => {\n // For key-based authentication, check if we should retry the current\n // key with a different algorithm first\n if (curAuth.keyAlgos) {\n const oldKeyAlgo = curAuth.keyAlgos[0][0];\n if (debug)\n debug(`Client: ${curAuth.type} (${oldKeyAlgo}) auth failed`);\n curAuth.keyAlgos.shift();\n if (curAuth.keyAlgos.length) {\n const [keyAlgo, hashAlgo] = curAuth.keyAlgos[0];\n switch (curAuth.type) {\n case 'agent':\n proto.authPK(\n curAuth.username,\n curAuth.agentCtx.currentKey(),\n keyAlgo\n );\n return;\n case 'publickey':\n proto.authPK(curAuth.username, curAuth.key, keyAlgo);\n return;\n case 'hostbased':\n proto.authHostbased(curAuth.username,\n curAuth.key,\n curAuth.localHostname,\n curAuth.localUsername,\n keyAlgo,\n (buf, cb) => {\n const signature = curAuth.key.sign(buf, hashAlgo);\n if (signature instanceof Error) {\n signature.message =\n `Error while signing with key: ${signature.message}`;\n signature.level = 'client-authentication';\n this.emit('error', signature);\n return tryNextAuth();\n }\n\n cb(signature);\n });\n return;\n }\n } else {\n curAuth.keyAlgos = undefined;\n }\n }\n\n if (curAuth.type === 'agent') {\n const pos = curAuth.agentCtx.pos();\n debug && debug(`Client: Agent key #${pos + 1} failed`);\n return tryNextAgentKey();\n }\n\n debug && debug(`Client: ${curAuth.type} auth failed`);\n\n curPartial = partialSuccess;\n curAuthsLeft = authMethods;\n tryNextAuth();\n },\n USERAUTH_PASSWD_CHANGEREQ: (p, prompt) => {\n if (curAuth.type === 'password') {\n // TODO: support a `changePrompt()` on `curAuth` that defaults to\n // emitting 'change password' as before\n this.emit('change password', prompt, (newPassword) => {\n proto.authPassword(\n this.config.username,\n this.config.password,\n newPassword\n );\n });\n }\n },\n USERAUTH_PK_OK: (p) => {\n let keyAlgo;\n let hashAlgo;\n if (curAuth.keyAlgos)\n [keyAlgo, hashAlgo] = curAuth.keyAlgos[0];\n if (curAuth.type === 'agent') {\n const key = curAuth.agentCtx.currentKey();\n proto.authPK(curAuth.username, key, keyAlgo, (buf, cb) => {\n const opts = { hash: hashAlgo };\n curAuth.agentCtx.sign(key, buf, opts, (err, signed) => {\n if (err) {\n err.level = 'agent';\n this.emit('error', err);\n } else {\n return cb(signed);\n }\n\n tryNextAgentKey();\n });\n });\n } else if (curAuth.type === 'publickey') {\n proto.authPK(curAuth.username, curAuth.key, keyAlgo, (buf, cb) => {\n const signature = curAuth.key.sign(buf, hashAlgo);\n if (signature instanceof Error) {\n signature.message =\n `Error signing data with key: ${signature.message}`;\n signature.level = 'client-authentication';\n this.emit('error', signature);\n return tryNextAuth();\n }\n cb(signature);\n });\n }\n },\n USERAUTH_INFO_REQUEST: (p, name, instructions, prompts) => {\n if (curAuth.type === 'keyboard-interactive') {\n const nprompts = (Array.isArray(prompts) ? prompts.length : 0);\n if (nprompts === 0) {\n debug && debug(\n 'Client: Sending automatic USERAUTH_INFO_RESPONSE'\n );\n proto.authInfoRes();\n return;\n }\n // We sent a keyboard-interactive user authentication request and\n // now the server is sending us the prompts we need to present to\n // the user\n curAuth.prompt(\n name,\n instructions,\n '',\n prompts,\n (answers) => {\n proto.authInfoRes(answers);\n }\n );\n }\n },\n REQUEST_SUCCESS: (p, data) => {\n if (callbacks.length)\n callbacks.shift()(false, data);\n },\n REQUEST_FAILURE: (p) => {\n if (callbacks.length)\n callbacks.shift()(true);\n },\n GLOBAL_REQUEST: (p, name, wantReply, data) => {\n switch (name) {\n case 'hostkeys-00@openssh.com':\n // Automatically verify keys before passing to end user\n hostKeysProve(this, data, (err, keys) => {\n if (err)\n return;\n this.emit('hostkeys', keys);\n });\n if (wantReply)\n proto.requestSuccess();\n break;\n default:\n // Auto-reject all other global requests, this can be especially\n // useful if the server is sending us dummy keepalive global\n // requests\n if (wantReply)\n proto.requestFailure();\n }\n },\n CHANNEL_OPEN: (p, info) => {\n // Handle incoming requests from server, typically a forwarded TCP or\n // X11 connection\n onCHANNEL_OPEN(this, info);\n },\n CHANNEL_OPEN_CONFIRMATION: (p, info) => {\n const channel = this._chanMgr.get(info.recipient);\n if (typeof channel !== 'function')\n return;\n\n const isSFTP = (channel.type === 'sftp');\n const type = (isSFTP ? 'session' : channel.type);\n const chanInfo = {\n type,\n incoming: {\n id: info.recipient,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n const instance = (\n isSFTP\n ? new SFTP(this, chanInfo, { debug })\n : new Channel(this, chanInfo)\n );\n this._chanMgr.update(info.recipient, instance);\n channel(undefined, instance);\n },\n CHANNEL_OPEN_FAILURE: (p, recipient, reason, description) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'function')\n return;\n\n const info = { reason, description };\n onChannelOpenFailure(this, recipient, info, channel);\n },\n CHANNEL_DATA: (p, recipient, data) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n // The remote party should not be sending us data if there is no\n // window space available ...\n // TODO: raise error on data with not enough window?\n if (channel.incoming.window === 0)\n return;\n\n channel.incoming.window -= data.length;\n\n if (channel.push(data) === false) {\n channel._waitChanDrain = true;\n return;\n }\n\n if (channel.incoming.window <= WINDOW_THRESHOLD)\n windowAdjust(channel);\n },\n CHANNEL_EXTENDED_DATA: (p, recipient, data, type) => {\n if (type !== STDERR)\n return;\n\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n // The remote party should not be sending us data if there is no\n // window space available ...\n // TODO: raise error on data with not enough window?\n if (channel.incoming.window === 0)\n return;\n\n channel.incoming.window -= data.length;\n\n if (!channel.stderr.push(data)) {\n channel._waitChanDrain = true;\n return;\n }\n\n if (channel.incoming.window <= WINDOW_THRESHOLD)\n windowAdjust(channel);\n },\n CHANNEL_WINDOW_ADJUST: (p, recipient, amount) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n // The other side is allowing us to send `amount` more bytes of data\n channel.outgoing.window += amount;\n\n if (channel._waitWindow) {\n channel._waitWindow = false;\n\n if (channel._chunk) {\n channel._write(channel._chunk, null, channel._chunkcb);\n } else if (channel._chunkcb) {\n channel._chunkcb();\n } else if (channel._chunkErr) {\n channel.stderr._write(channel._chunkErr,\n null,\n channel._chunkcbErr);\n } else if (channel._chunkcbErr) {\n channel._chunkcbErr();\n }\n }\n },\n CHANNEL_SUCCESS: (p, recipient) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n this._resetKA();\n\n if (channel._callbacks.length)\n channel._callbacks.shift()(false);\n },\n CHANNEL_FAILURE: (p, recipient) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n this._resetKA();\n\n if (channel._callbacks.length)\n channel._callbacks.shift()(true);\n },\n CHANNEL_REQUEST: (p, recipient, type, wantReply, data) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n const exit = channel._exit;\n if (exit.code !== undefined)\n return;\n switch (type) {\n case 'exit-status':\n channel.emit('exit', exit.code = data);\n return;\n case 'exit-signal':\n channel.emit('exit',\n exit.code = null,\n exit.signal = `SIG${data.signal}`,\n exit.dump = data.coreDumped,\n exit.desc = data.errorMessage);\n return;\n }\n\n // Keepalive request? OpenSSH will send one as a channel request if\n // there is a channel open\n\n if (wantReply)\n p.channelFailure(channel.outgoing.id);\n },\n CHANNEL_EOF: (p, recipient) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.incoming.state !== 'open')\n return;\n channel.incoming.state = 'eof';\n\n if (channel.readable)\n channel.push(null);\n if (channel.stderr.readable)\n channel.stderr.push(null);\n },\n CHANNEL_CLOSE: (p, recipient) => {\n onCHANNEL_CLOSE(this, recipient, this._chanMgr.get(recipient));\n },\n },\n });\n\n sock.pause();\n\n // TODO: check keepalive implementation\n // Keepalive-related\n const kainterval = this.config.keepaliveInterval;\n const kacountmax = this.config.keepaliveCountMax;\n let kacount = 0;\n let katimer;\n const sendKA = () => {\n if (++kacount > kacountmax) {\n clearInterval(katimer);\n if (sock.readable) {\n const err = new Error('Keepalive timeout');\n err.level = 'client-timeout';\n this.emit('error', err);\n sock.destroy();\n }\n return;\n }\n if (isWritable(sock)) {\n // Append dummy callback to keep correct callback order\n callbacks.push(resetKA);\n proto.ping();\n } else {\n clearInterval(katimer);\n }\n };\n function resetKA() {\n if (kainterval > 0) {\n kacount = 0;\n clearInterval(katimer);\n if (isWritable(sock))\n katimer = setInterval(sendKA, kainterval);\n }\n }\n this._resetKA = resetKA;\n\n const onDone = (() => {\n let called = false;\n return () => {\n if (called)\n return;\n called = true;\n if (wasConnected && !sawHeader) {\n const err =\n makeError('Connection lost before handshake', 'protocol', true);\n this.emit('error', err);\n }\n };\n })();\n const onConnect = (() => {\n let called = false;\n return () => {\n if (called)\n return;\n called = true;\n\n wasConnected = true;\n debug && debug('Socket connected');\n this.emit('connect');\n\n cryptoInit.then(() => {\n proto.start();\n sock.on('data', (data) => {\n try {\n proto.parse(data, 0, data.length);\n } catch (ex) {\n this.emit('error', ex);\n try {\n if (isWritable(sock))\n sock.end();\n } catch {}\n }\n });\n\n // Drain stderr if we are connection hopping using an exec stream\n if (sock.stderr && typeof sock.stderr.resume === 'function')\n sock.stderr.resume();\n\n sock.resume();\n }).catch((err) => {\n this.emit('error', err);\n try {\n if (isWritable(sock))\n sock.end();\n } catch {}\n });\n };\n })();\n let wasConnected = false;\n sock.on('connect', onConnect)\n .on('timeout', () => {\n this.emit('timeout');\n }).on('error', (err) => {\n debug && debug(`Socket error: ${err.message}`);\n clearTimeout(this._readyTimeout);\n err.level = 'client-socket';\n this.emit('error', err);\n }).on('end', () => {\n debug && debug('Socket ended');\n onDone();\n proto.cleanup();\n clearTimeout(this._readyTimeout);\n clearInterval(katimer);\n this.emit('end');\n }).on('close', () => {\n debug && debug('Socket closed');\n onDone();\n proto.cleanup();\n clearTimeout(this._readyTimeout);\n clearInterval(katimer);\n this.emit('close');\n\n // Notify outstanding channel requests of disconnection ...\n const callbacks_ = callbacks;\n callbacks = this._callbacks = [];\n const err = new Error('No response from server');\n for (let i = 0; i < callbacks_.length; ++i)\n callbacks_[i](err);\n\n // Simulate error for any channels waiting to be opened\n this._chanMgr.cleanup(err);\n });\n\n // Begin authentication handling ===========================================\n let curAuth;\n let curPartial = null;\n let curAuthsLeft = null;\n const authsAllowed = ['none'];\n if (this.config.password !== undefined)\n authsAllowed.push('password');\n if (privateKey !== undefined)\n authsAllowed.push('publickey');\n if (this._agent !== undefined)\n authsAllowed.push('agent');\n if (this.config.tryKeyboard)\n authsAllowed.push('keyboard-interactive');\n if (privateKey !== undefined\n && this.config.localHostname !== undefined\n && this.config.localUsername !== undefined) {\n authsAllowed.push('hostbased');\n }\n\n if (Array.isArray(authHandler))\n authHandler = makeSimpleAuthHandler(authHandler);\n else if (typeof authHandler !== 'function')\n authHandler = makeSimpleAuthHandler(authsAllowed);\n\n let hasSentAuth = false;\n const doNextAuth = (nextAuth) => {\n if (hasSentAuth)\n return;\n hasSentAuth = true;\n\n if (nextAuth === false) {\n const err = new Error('All configured authentication methods failed');\n err.level = 'client-authentication';\n this.emit('error', err);\n this.end();\n return;\n }\n\n if (typeof nextAuth === 'string') {\n // Remain backwards compatible with original `authHandler()` usage,\n // which only supported passing names of next method to try using data\n // from the `connect()` config object\n\n const type = nextAuth;\n if (authsAllowed.indexOf(type) === -1)\n return skipAuth(`Authentication method not allowed: ${type}`);\n\n const username = this.config.username;\n switch (type) {\n case 'password':\n nextAuth = { type, username, password: this.config.password };\n break;\n case 'publickey':\n nextAuth = { type, username, key: privateKey };\n break;\n case 'hostbased':\n nextAuth = {\n type,\n username,\n key: privateKey,\n localHostname: this.config.localHostname,\n localUsername: this.config.localUsername,\n };\n break;\n case 'agent':\n nextAuth = {\n type,\n username,\n agentCtx: new AgentContext(this._agent),\n };\n break;\n case 'keyboard-interactive':\n nextAuth = {\n type,\n username,\n prompt: (...args) => this.emit('keyboard-interactive', ...args),\n };\n break;\n case 'none':\n nextAuth = { type, username };\n break;\n default:\n return skipAuth(\n `Skipping unsupported authentication method: ${nextAuth}`\n );\n }\n } else if (typeof nextAuth !== 'object' || nextAuth === null) {\n return skipAuth(\n `Skipping invalid authentication attempt: ${nextAuth}`\n );\n } else {\n const username = nextAuth.username;\n if (typeof username !== 'string') {\n return skipAuth(\n `Skipping invalid authentication attempt: ${nextAuth}`\n );\n }\n const type = nextAuth.type;\n switch (type) {\n case 'password': {\n const { password } = nextAuth;\n if (typeof password !== 'string' && !Buffer.isBuffer(password))\n return skipAuth('Skipping invalid password auth attempt');\n nextAuth = { type, username, password };\n break;\n }\n case 'publickey': {\n const key = parseKey(nextAuth.key, nextAuth.passphrase);\n if (key instanceof Error)\n return skipAuth('Skipping invalid key auth attempt');\n if (!key.isPrivateKey())\n return skipAuth('Skipping non-private key');\n nextAuth = { type, username, key };\n break;\n }\n case 'hostbased': {\n const { localHostname, localUsername } = nextAuth;\n const key = parseKey(nextAuth.key, nextAuth.passphrase);\n if (key instanceof Error\n || typeof localHostname !== 'string'\n || typeof localUsername !== 'string') {\n return skipAuth('Skipping invalid hostbased auth attempt');\n }\n if (!key.isPrivateKey())\n return skipAuth('Skipping non-private key');\n nextAuth = { type, username, key, localHostname, localUsername };\n break;\n }\n case 'agent': {\n let agent = nextAuth.agent;\n if (typeof agent === 'string' && agent.length) {\n agent = createAgent(agent);\n } else if (!isAgent(agent)) {\n return skipAuth(\n `Skipping invalid agent: ${nextAuth.agent}`\n );\n }\n nextAuth = { type, username, agentCtx: new AgentContext(agent) };\n break;\n }\n case 'keyboard-interactive': {\n const { prompt } = nextAuth;\n if (typeof prompt !== 'function') {\n return skipAuth(\n 'Skipping invalid keyboard-interactive auth attempt'\n );\n }\n nextAuth = { type, username, prompt };\n break;\n }\n case 'none':\n nextAuth = { type, username };\n break;\n default:\n return skipAuth(\n `Skipping unsupported authentication method: ${nextAuth}`\n );\n }\n }\n curAuth = nextAuth;\n\n // Begin authentication method's process\n try {\n const username = curAuth.username;\n switch (curAuth.type) {\n case 'password':\n proto.authPassword(username, curAuth.password);\n break;\n case 'publickey': {\n let keyAlgo;\n curAuth.keyAlgos = getKeyAlgos(this, curAuth.key, serverSigAlgs);\n if (curAuth.keyAlgos) {\n if (curAuth.keyAlgos.length) {\n keyAlgo = curAuth.keyAlgos[0][0];\n } else {\n return skipAuth(\n 'Skipping key authentication (no mutual hash algorithm)'\n );\n }\n }\n proto.authPK(username, curAuth.key, keyAlgo);\n break;\n }\n case 'hostbased': {\n let keyAlgo;\n let hashAlgo;\n curAuth.keyAlgos = getKeyAlgos(this, curAuth.key, serverSigAlgs);\n if (curAuth.keyAlgos) {\n if (curAuth.keyAlgos.length) {\n [keyAlgo, hashAlgo] = curAuth.keyAlgos[0];\n } else {\n return skipAuth(\n 'Skipping hostbased authentication (no mutual hash algorithm)'\n );\n }\n }\n\n proto.authHostbased(username,\n curAuth.key,\n curAuth.localHostname,\n curAuth.localUsername,\n keyAlgo,\n (buf, cb) => {\n const signature = curAuth.key.sign(buf, hashAlgo);\n if (signature instanceof Error) {\n signature.message =\n `Error while signing with key: ${signature.message}`;\n signature.level = 'client-authentication';\n this.emit('error', signature);\n return tryNextAuth();\n }\n\n cb(signature);\n });\n break;\n }\n case 'agent':\n curAuth.agentCtx.init((err) => {\n if (err) {\n err.level = 'agent';\n this.emit('error', err);\n return tryNextAuth();\n }\n tryNextAgentKey();\n });\n break;\n case 'keyboard-interactive':\n proto.authKeyboard(username);\n break;\n case 'none':\n proto.authNone(username);\n break;\n }\n } finally {\n hasSentAuth = false;\n }\n };\n\n function skipAuth(msg) {\n debug && debug(msg);\n process.nextTick(tryNextAuth);\n }\n\n function tryNextAuth() {\n hasSentAuth = false;\n const auth = authHandler(curAuthsLeft, curPartial, doNextAuth);\n if (hasSentAuth || auth === undefined)\n return;\n doNextAuth(auth);\n }\n\n const tryNextAgentKey = () => {\n if (curAuth.type === 'agent') {\n const key = curAuth.agentCtx.nextKey();\n if (key === false) {\n debug && debug('Agent: No more keys left to try');\n debug && debug('Client: agent auth failed');\n tryNextAuth();\n } else {\n const pos = curAuth.agentCtx.pos();\n let keyAlgo;\n curAuth.keyAlgos = getKeyAlgos(this, key, serverSigAlgs);\n if (curAuth.keyAlgos) {\n if (curAuth.keyAlgos.length) {\n keyAlgo = curAuth.keyAlgos[0][0];\n } else {\n debug && debug(\n `Agent: Skipping key #${pos + 1} (no mutual hash algorithm)`\n );\n tryNextAgentKey();\n return;\n }\n }\n debug && debug(`Agent: Trying key #${pos + 1}`);\n proto.authPK(curAuth.username, key, keyAlgo);\n }\n }\n };\n\n const startTimeout = () => {\n if (this.config.readyTimeout > 0) {\n this._readyTimeout = setTimeout(() => {\n const err = new Error('Timed out while waiting for handshake');\n err.level = 'client-timeout';\n this.emit('error', err);\n sock.destroy();\n }, this.config.readyTimeout);\n }\n };\n\n if (!cfg.sock) {\n let host = this.config.host;\n const forceIPv4 = this.config.forceIPv4;\n const forceIPv6 = this.config.forceIPv6;\n\n debug && debug(`Client: Trying ${host} on port ${this.config.port} ...`);\n\n const doConnect = () => {\n startTimeout();\n sock.connect({\n host,\n port: this.config.port,\n localAddress: this.config.localAddress,\n localPort: this.config.localPort\n });\n sock.setMaxListeners(0);\n sock.setTimeout(typeof cfg.timeout === 'number' ? cfg.timeout : 0);\n };\n\n if ((!forceIPv4 && !forceIPv6) || (forceIPv4 && forceIPv6)) {\n doConnect();\n } else {\n dnsLookup(host, (forceIPv4 ? 4 : 6), (err, address, family) => {\n if (err) {\n const type = (forceIPv4 ? 'IPv4' : 'IPv6');\n const error = new Error(\n `Error while looking up ${type} address for '${host}': ${err}`\n );\n clearTimeout(this._readyTimeout);\n error.level = 'client-dns';\n this.emit('error', error);\n this.emit('close');\n return;\n }\n host = address;\n doConnect();\n });\n }\n } else {\n // Custom socket passed in\n startTimeout();\n if (typeof sock.connecting === 'boolean') {\n // net.Socket\n\n if (!sock.connecting) {\n // Already connected\n onConnect();\n }\n } else {\n // Assume socket/stream is already \"connected\"\n onConnect();\n }\n }\n\n return this;\n }\n\n end() {\n if (this._sock && isWritable(this._sock)) {\n this._protocol.disconnect(DISCONNECT_REASON.BY_APPLICATION);\n this._sock.end();\n }\n return this;\n }\n\n destroy() {\n this._sock && isWritable(this._sock) && this._sock.destroy();\n return this;\n }\n\n exec(cmd, opts, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n\n const extraOpts = { allowHalfOpen: (opts.allowHalfOpen !== false) };\n\n openChannel(this, 'session', extraOpts, (err, chan) => {\n if (err) {\n cb(err);\n return;\n }\n\n const todo = [];\n\n function reqCb(err) {\n if (err) {\n chan.close();\n cb(err);\n return;\n }\n if (todo.length)\n todo.shift()();\n }\n\n if (this.config.allowAgentFwd === true\n || (opts\n && opts.agentForward === true\n && this._agent !== undefined)) {\n todo.push(() => reqAgentFwd(chan, reqCb));\n }\n\n if (typeof opts === 'object' && opts !== null) {\n if (typeof opts.env === 'object' && opts.env !== null)\n reqEnv(chan, opts.env);\n if ((typeof opts.pty === 'object' && opts.pty !== null)\n || opts.pty === true) {\n todo.push(() => reqPty(chan, opts.pty, reqCb));\n }\n if ((typeof opts.x11 === 'object' && opts.x11 !== null)\n || opts.x11 === 'number'\n || opts.x11 === true) {\n todo.push(() => reqX11(chan, opts.x11, reqCb));\n }\n }\n\n todo.push(() => reqExec(chan, cmd, opts, cb));\n todo.shift()();\n });\n\n return this;\n }\n\n shell(wndopts, opts, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n if (typeof wndopts === 'function') {\n cb = wndopts;\n wndopts = opts = undefined;\n } else if (typeof opts === 'function') {\n cb = opts;\n opts = undefined;\n }\n if (wndopts && (wndopts.x11 !== undefined || wndopts.env !== undefined)) {\n opts = wndopts;\n wndopts = undefined;\n }\n\n openChannel(this, 'session', (err, chan) => {\n if (err) {\n cb(err);\n return;\n }\n\n const todo = [];\n\n function reqCb(err) {\n if (err) {\n chan.close();\n cb(err);\n return;\n }\n if (todo.length)\n todo.shift()();\n }\n\n if (this.config.allowAgentFwd === true\n || (opts\n && opts.agentForward === true\n && this._agent !== undefined)) {\n todo.push(() => reqAgentFwd(chan, reqCb));\n }\n\n if (wndopts !== false)\n todo.push(() => reqPty(chan, wndopts, reqCb));\n\n if (typeof opts === 'object' && opts !== null) {\n if (typeof opts.env === 'object' && opts.env !== null)\n reqEnv(chan, opts.env);\n if ((typeof opts.x11 === 'object' && opts.x11 !== null)\n || opts.x11 === 'number'\n || opts.x11 === true) {\n todo.push(() => reqX11(chan, opts.x11, reqCb));\n }\n }\n\n todo.push(() => reqShell(chan, cb));\n todo.shift()();\n });\n\n return this;\n }\n\n subsys(name, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n openChannel(this, 'session', (err, chan) => {\n if (err) {\n cb(err);\n return;\n }\n\n reqSubsystem(chan, name, (err, stream) => {\n if (err) {\n cb(err);\n return;\n }\n\n cb(undefined, stream);\n });\n });\n\n return this;\n }\n\n forwardIn(bindAddr, bindPort, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n // Send a request for the server to start forwarding TCP connections to us\n // on a particular address and port\n\n const wantReply = (typeof cb === 'function');\n\n if (wantReply) {\n this._callbacks.push((had_err, data) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error(`Unable to bind to ${bindAddr}:${bindPort}`));\n return;\n }\n\n let realPort = bindPort;\n if (bindPort === 0 && data && data.length >= 4) {\n realPort = readUInt32BE(data, 0);\n if (!(this._protocol._compatFlags & COMPAT.DYN_RPORT_BUG))\n bindPort = realPort;\n }\n\n this._forwarding[`${bindAddr}:${bindPort}`] = realPort;\n\n cb(undefined, realPort);\n });\n }\n\n this._protocol.tcpipForward(bindAddr, bindPort, wantReply);\n\n return this;\n }\n\n unforwardIn(bindAddr, bindPort, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n // Send a request to stop forwarding us new connections for a particular\n // address and port\n\n const wantReply = (typeof cb === 'function');\n\n if (wantReply) {\n this._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error(`Unable to unbind from ${bindAddr}:${bindPort}`));\n return;\n }\n\n delete this._forwarding[`${bindAddr}:${bindPort}`];\n\n cb();\n });\n }\n\n this._protocol.cancelTcpipForward(bindAddr, bindPort, wantReply);\n\n return this;\n }\n\n forwardOut(srcIP, srcPort, dstIP, dstPort, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n // Send a request to forward a TCP connection to the server\n\n const cfg = {\n srcIP: srcIP,\n srcPort: srcPort,\n dstIP: dstIP,\n dstPort: dstPort\n };\n\n if (typeof cb !== 'function')\n cb = noop;\n\n openChannel(this, 'direct-tcpip', cfg, cb);\n\n return this;\n }\n\n openssh_noMoreSessions(cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n const wantReply = (typeof cb === 'function');\n\n if (!this.config.strictVendor\n || (this.config.strictVendor && RE_OPENSSH.test(this._remoteVer))) {\n if (wantReply) {\n this._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error('Unable to disable future sessions'));\n return;\n }\n\n cb();\n });\n }\n\n this._protocol.openssh_noMoreSessions(wantReply);\n return this;\n }\n\n if (!wantReply)\n return this;\n\n process.nextTick(\n cb,\n new Error(\n 'strictVendor enabled and server is not OpenSSH or compatible version'\n )\n );\n\n return this;\n }\n\n openssh_forwardInStreamLocal(socketPath, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n const wantReply = (typeof cb === 'function');\n\n if (!this.config.strictVendor\n || (this.config.strictVendor && RE_OPENSSH.test(this._remoteVer))) {\n if (wantReply) {\n this._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error(`Unable to bind to ${socketPath}`));\n return;\n }\n this._forwardingUnix[socketPath] = true;\n cb();\n });\n }\n\n this._protocol.openssh_streamLocalForward(socketPath, wantReply);\n return this;\n }\n\n if (!wantReply)\n return this;\n\n process.nextTick(\n cb,\n new Error(\n 'strictVendor enabled and server is not OpenSSH or compatible version'\n )\n );\n\n return this;\n }\n\n openssh_unforwardInStreamLocal(socketPath, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n const wantReply = (typeof cb === 'function');\n\n if (!this.config.strictVendor\n || (this.config.strictVendor && RE_OPENSSH.test(this._remoteVer))) {\n if (wantReply) {\n this._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error(`Unable to unbind from ${socketPath}`));\n return;\n }\n delete this._forwardingUnix[socketPath];\n cb();\n });\n }\n\n this._protocol.openssh_cancelStreamLocalForward(socketPath, wantReply);\n return this;\n }\n\n if (!wantReply)\n return this;\n\n process.nextTick(\n cb,\n new Error(\n 'strictVendor enabled and server is not OpenSSH or compatible version'\n )\n );\n\n return this;\n }\n\n openssh_forwardOutStreamLocal(socketPath, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n if (typeof cb !== 'function')\n cb = noop;\n\n if (!this.config.strictVendor\n || (this.config.strictVendor && RE_OPENSSH.test(this._remoteVer))) {\n openChannel(this, 'direct-streamlocal@openssh.com', { socketPath }, cb);\n return this;\n }\n process.nextTick(\n cb,\n new Error(\n 'strictVendor enabled and server is not OpenSSH or compatible version'\n )\n );\n\n return this;\n }\n\n sftp(env, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n if (typeof env === 'function') {\n cb = env;\n env = undefined;\n }\n\n openChannel(this, 'sftp', (err, sftp) => {\n if (err) {\n cb(err);\n return;\n }\n\n const reqSubsystemCb = (err, sftp_) => {\n if (err) {\n cb(err);\n return;\n }\n\n function removeListeners() {\n sftp.removeListener('ready', onReady);\n sftp.removeListener('error', onError);\n sftp.removeListener('exit', onExit);\n sftp.removeListener('close', onExit);\n }\n\n function onReady() {\n // TODO: do not remove exit/close in case remote end closes the\n // channel abruptly and we need to notify outstanding callbacks\n removeListeners();\n cb(undefined, sftp);\n }\n\n function onError(err) {\n removeListeners();\n cb(err);\n }\n\n function onExit(code, signal) {\n removeListeners();\n let msg;\n if (typeof code === 'number')\n msg = `Received exit code ${code} while establishing SFTP session`;\n else if (signal !== undefined)\n msg = `Received signal ${signal} while establishing SFTP session`;\n else\n msg = 'Received unexpected SFTP session termination';\n const err = new Error(msg);\n err.code = code;\n err.signal = signal;\n cb(err);\n }\n\n sftp.on('ready', onReady)\n .on('error', onError)\n .on('exit', onExit)\n .on('close', onExit);\n\n sftp._init();\n };\n\n if (typeof env === 'object' && env !== null) {\n reqEnv(sftp, env, (err) => {\n if (err) {\n cb(err);\n return;\n }\n\n reqSubsystem(sftp, 'sftp', reqSubsystemCb);\n });\n } else {\n reqSubsystem(sftp, 'sftp', reqSubsystemCb);\n }\n });\n\n return this;\n }\n\n setNoDelay(noDelay) {\n if (this._sock && typeof this._sock.setNoDelay === 'function')\n this._sock.setNoDelay(noDelay);\n\n return this;\n }\n}\n\nfunction openChannel(self, type, opts, cb) {\n // Ask the server to open a channel for some purpose\n // (e.g. session (sftp, exec, shell), or forwarding a TCP connection\n const initWindow = MAX_WINDOW;\n const maxPacket = PACKET_SIZE;\n\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n\n const wrapper = (err, stream) => {\n cb(err, stream);\n };\n wrapper.type = type;\n\n const localChan = self._chanMgr.add(wrapper);\n\n if (localChan === -1) {\n cb(new Error('No free channels available'));\n return;\n }\n\n switch (type) {\n case 'session':\n case 'sftp':\n self._protocol.session(localChan, initWindow, maxPacket);\n break;\n case 'direct-tcpip':\n self._protocol.directTcpip(localChan, initWindow, maxPacket, opts);\n break;\n case 'direct-streamlocal@openssh.com':\n self._protocol.openssh_directStreamLocal(\n localChan, initWindow, maxPacket, opts\n );\n break;\n default:\n throw new Error(`Unsupported channel type: ${type}`);\n }\n}\n\nfunction reqX11(chan, screen, cb) {\n // Asks server to start sending us X11 connections\n const cfg = {\n single: false,\n protocol: 'MIT-MAGIC-COOKIE-1',\n cookie: undefined,\n screen: 0\n };\n\n if (typeof screen === 'function') {\n cb = screen;\n } else if (typeof screen === 'object' && screen !== null) {\n if (typeof screen.single === 'boolean')\n cfg.single = screen.single;\n if (typeof screen.screen === 'number')\n cfg.screen = screen.screen;\n if (typeof screen.protocol === 'string')\n cfg.protocol = screen.protocol;\n if (typeof screen.cookie === 'string')\n cfg.cookie = screen.cookie;\n else if (Buffer.isBuffer(screen.cookie))\n cfg.cookie = screen.cookie.hexSlice(0, screen.cookie.length);\n }\n if (cfg.cookie === undefined)\n cfg.cookie = randomCookie();\n\n const wantReply = (typeof cb === 'function');\n\n if (chan.outgoing.state !== 'open') {\n if (wantReply)\n cb(new Error('Channel is not open'));\n return;\n }\n\n if (wantReply) {\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true ? had_err : new Error('Unable to request X11'));\n return;\n }\n\n chan._hasX11 = true;\n ++chan._client._acceptX11;\n chan.once('close', () => {\n if (chan._client._acceptX11)\n --chan._client._acceptX11;\n });\n\n cb();\n });\n }\n\n chan._client._protocol.x11Forward(chan.outgoing.id, cfg, wantReply);\n}\n\nfunction reqPty(chan, opts, cb) {\n let rows = 24;\n let cols = 80;\n let width = 640;\n let height = 480;\n let term = 'vt100';\n let modes = null;\n\n if (typeof opts === 'function') {\n cb = opts;\n } else if (typeof opts === 'object' && opts !== null) {\n if (typeof opts.rows === 'number')\n rows = opts.rows;\n if (typeof opts.cols === 'number')\n cols = opts.cols;\n if (typeof opts.width === 'number')\n width = opts.width;\n if (typeof opts.height === 'number')\n height = opts.height;\n if (typeof opts.term === 'string')\n term = opts.term;\n if (typeof opts.modes === 'object')\n modes = opts.modes;\n }\n\n const wantReply = (typeof cb === 'function');\n\n if (chan.outgoing.state !== 'open') {\n if (wantReply)\n cb(new Error('Channel is not open'));\n return;\n }\n\n if (wantReply) {\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error('Unable to request a pseudo-terminal'));\n return;\n }\n cb();\n });\n }\n\n chan._client._protocol.pty(chan.outgoing.id,\n rows,\n cols,\n height,\n width,\n term,\n modes,\n wantReply);\n}\n\nfunction reqAgentFwd(chan, cb) {\n const wantReply = (typeof cb === 'function');\n\n if (chan.outgoing.state !== 'open') {\n wantReply && cb(new Error('Channel is not open'));\n return;\n }\n if (chan._client._agentFwdEnabled) {\n wantReply && cb(false);\n return;\n }\n\n chan._client._agentFwdEnabled = true;\n\n chan._callbacks.push((had_err) => {\n if (had_err) {\n chan._client._agentFwdEnabled = false;\n if (wantReply) {\n cb(had_err !== true\n ? had_err\n : new Error('Unable to request agent forwarding'));\n }\n return;\n }\n\n if (wantReply)\n cb();\n });\n\n chan._client._protocol.openssh_agentForward(chan.outgoing.id, true);\n}\n\nfunction reqShell(chan, cb) {\n if (chan.outgoing.state !== 'open') {\n cb(new Error('Channel is not open'));\n return;\n }\n\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true ? had_err : new Error('Unable to open shell'));\n return;\n }\n chan.subtype = 'shell';\n cb(undefined, chan);\n });\n\n chan._client._protocol.shell(chan.outgoing.id, true);\n}\n\nfunction reqExec(chan, cmd, opts, cb) {\n if (chan.outgoing.state !== 'open') {\n cb(new Error('Channel is not open'));\n return;\n }\n\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true ? had_err : new Error('Unable to exec'));\n return;\n }\n chan.subtype = 'exec';\n chan.allowHalfOpen = (opts.allowHalfOpen !== false);\n cb(undefined, chan);\n });\n\n chan._client._protocol.exec(chan.outgoing.id, cmd, true);\n}\n\nfunction reqEnv(chan, env, cb) {\n const wantReply = (typeof cb === 'function');\n\n if (chan.outgoing.state !== 'open') {\n if (wantReply)\n cb(new Error('Channel is not open'));\n return;\n }\n\n if (wantReply) {\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error('Unable to set environment'));\n return;\n }\n cb();\n });\n }\n\n const keys = Object.keys(env || {});\n\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n const val = env[key];\n chan._client._protocol.env(chan.outgoing.id, key, val, wantReply);\n }\n}\n\nfunction reqSubsystem(chan, name, cb) {\n if (chan.outgoing.state !== 'open') {\n cb(new Error('Channel is not open'));\n return;\n }\n\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error(`Unable to start subsystem: ${name}`));\n return;\n }\n chan.subtype = 'subsystem';\n cb(undefined, chan);\n });\n\n chan._client._protocol.subsystem(chan.outgoing.id, name, true);\n}\n\n// TODO: inline implementation into single call site\nfunction onCHANNEL_OPEN(self, info) {\n // The server is trying to open a channel with us, this is usually when\n // we asked the server to forward us connections on some port and now they\n // are asking us to accept/deny an incoming connection on their side\n\n let localChan = -1;\n let reason;\n\n const accept = () => {\n const chanInfo = {\n type: info.type,\n incoming: {\n id: localChan,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n const stream = new Channel(self, chanInfo);\n self._chanMgr.update(localChan, stream);\n\n self._protocol.channelOpenConfirm(info.sender,\n localChan,\n MAX_WINDOW,\n PACKET_SIZE);\n return stream;\n };\n const reject = () => {\n if (reason === undefined) {\n if (localChan === -1)\n reason = CHANNEL_OPEN_FAILURE.RESOURCE_SHORTAGE;\n else\n reason = CHANNEL_OPEN_FAILURE.CONNECT_FAILED;\n }\n\n if (localChan !== -1)\n self._chanMgr.remove(localChan);\n\n self._protocol.channelOpenFail(info.sender, reason, '');\n };\n const reserveChannel = () => {\n localChan = self._chanMgr.add();\n\n if (localChan === -1) {\n reason = CHANNEL_OPEN_FAILURE.RESOURCE_SHORTAGE;\n if (self.config.debug) {\n self.config.debug(\n 'Client: Automatic rejection of incoming channel open: '\n + 'no channels available'\n );\n }\n }\n\n return (localChan !== -1);\n };\n\n const data = info.data;\n switch (info.type) {\n case 'forwarded-tcpip': {\n const val = self._forwarding[`${data.destIP}:${data.destPort}`];\n if (val !== undefined && reserveChannel()) {\n if (data.destPort === 0)\n data.destPort = val;\n self.emit('tcp connection', data, accept, reject);\n return;\n }\n break;\n }\n case 'forwarded-streamlocal@openssh.com':\n if (self._forwardingUnix[data.socketPath] !== undefined\n && reserveChannel()) {\n self.emit('unix connection', data, accept, reject);\n return;\n }\n break;\n case 'auth-agent@openssh.com':\n if (self._agentFwdEnabled\n && typeof self._agent.getStream === 'function'\n && reserveChannel()) {\n self._agent.getStream((err, stream) => {\n if (err)\n return reject();\n\n const upstream = accept();\n upstream.pipe(stream).pipe(upstream);\n });\n return;\n }\n break;\n case 'x11':\n if (self._acceptX11 !== 0 && reserveChannel()) {\n self.emit('x11', data, accept, reject);\n return;\n }\n break;\n default:\n // Automatically reject any unsupported channel open requests\n reason = CHANNEL_OPEN_FAILURE.UNKNOWN_CHANNEL_TYPE;\n if (self.config.debug) {\n self.config.debug(\n 'Client: Automatic rejection of unsupported incoming channel open '\n + `type: ${info.type}`\n );\n }\n }\n\n if (reason === undefined) {\n reason = CHANNEL_OPEN_FAILURE.ADMINISTRATIVELY_PROHIBITED;\n if (self.config.debug) {\n self.config.debug(\n 'Client: Automatic rejection of unexpected incoming channel open for: '\n + info.type\n );\n }\n }\n\n reject();\n}\n\nconst randomCookie = (() => {\n const buffer = Buffer.allocUnsafe(16);\n return () => {\n randomFillSync(buffer, 0, 16);\n return buffer.hexSlice(0, 16);\n };\n})();\n\nfunction makeSimpleAuthHandler(authList) {\n if (!Array.isArray(authList))\n throw new Error('authList must be an array');\n\n let a = 0;\n return (authsLeft, partialSuccess, cb) => {\n if (a === authList.length)\n return false;\n return authList[a++];\n };\n}\n\nfunction hostKeysProve(client, keys_, cb) {\n if (!client._sock || !isWritable(client._sock))\n return;\n\n if (typeof cb !== 'function')\n cb = noop;\n\n if (!Array.isArray(keys_))\n throw new TypeError('Invalid keys argument type');\n\n const keys = [];\n for (const key of keys_) {\n const parsed = parseKey(key);\n if (parsed instanceof Error)\n throw parsed;\n keys.push(parsed);\n }\n\n if (!client.config.strictVendor\n || (client.config.strictVendor && RE_OPENSSH.test(client._remoteVer))) {\n client._callbacks.push((had_err, data) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error('Server failed to prove supplied keys'));\n return;\n }\n\n // TODO: move all of this parsing/verifying logic out of the client?\n const ret = [];\n let keyIdx = 0;\n bufferParser.init(data, 0);\n while (bufferParser.avail()) {\n if (keyIdx === keys.length)\n break;\n const key = keys[keyIdx++];\n const keyPublic = key.getPublicSSH();\n\n const sigEntry = bufferParser.readString();\n sigParser.init(sigEntry, 0);\n const type = sigParser.readString(true);\n let value = sigParser.readString();\n\n let algo;\n if (type !== key.type) {\n if (key.type === 'ssh-rsa') {\n switch (type) {\n case 'rsa-sha2-256':\n algo = 'sha256';\n break;\n case 'rsa-sha2-512':\n algo = 'sha512';\n break;\n default:\n continue;\n }\n } else {\n continue;\n }\n }\n\n const sessionID = client._protocol._kex.sessionID;\n const verifyData = Buffer.allocUnsafe(\n 4 + 29 + 4 + sessionID.length + 4 + keyPublic.length\n );\n let p = 0;\n writeUInt32BE(verifyData, 29, p);\n verifyData.utf8Write('hostkeys-prove-00@openssh.com', p += 4, 29);\n writeUInt32BE(verifyData, sessionID.length, p += 29);\n bufferCopy(sessionID, verifyData, 0, sessionID.length, p += 4);\n writeUInt32BE(verifyData, keyPublic.length, p += sessionID.length);\n bufferCopy(keyPublic, verifyData, 0, keyPublic.length, p += 4);\n\n if (!(value = sigSSHToASN1(value, type)))\n continue;\n if (key.verify(verifyData, value, algo) === true)\n ret.push(key);\n }\n sigParser.clear();\n bufferParser.clear();\n\n cb(null, ret);\n });\n\n client._protocol.openssh_hostKeysProve(keys);\n return;\n }\n\n process.nextTick(\n cb,\n new Error(\n 'strictVendor enabled and server is not OpenSSH or compatible version'\n )\n );\n}\n\nfunction getKeyAlgos(client, key, serverSigAlgs) {\n switch (key.type) {\n case 'ssh-rsa':\n if (client._protocol._compatFlags & COMPAT.IMPLY_RSA_SHA2_SIGALGS) {\n if (!Array.isArray(serverSigAlgs))\n serverSigAlgs = ['rsa-sha2-256', 'rsa-sha2-512'];\n else\n serverSigAlgs = ['rsa-sha2-256', 'rsa-sha2-512', ...serverSigAlgs];\n }\n if (Array.isArray(serverSigAlgs)) {\n if (serverSigAlgs.indexOf('rsa-sha2-256') !== -1)\n return [['rsa-sha2-256', 'sha256']];\n if (serverSigAlgs.indexOf('rsa-sha2-512') !== -1)\n return [['rsa-sha2-512', 'sha512']];\n if (serverSigAlgs.indexOf('ssh-rsa') === -1)\n return [];\n }\n return [['ssh-rsa', 'sha1']];\n }\n}\n\nmodule.exports = Client;\n", "'use strict';\n\nconst { Agent: HttpAgent } = require('http');\nconst { Agent: HttpsAgent } = require('https');\nconst { connect: tlsConnect } = require('tls');\n\nlet Client;\n\nfor (const ctor of [HttpAgent, HttpsAgent]) {\n class SSHAgent extends ctor {\n constructor(connectCfg, agentOptions) {\n super(agentOptions);\n\n this._connectCfg = connectCfg;\n this._defaultSrcIP = (agentOptions && agentOptions.srcIP) || 'localhost';\n }\n\n createConnection(options, cb) {\n const srcIP = (options && options.localAddress) || this._defaultSrcIP;\n const srcPort = (options && options.localPort) || 0;\n const dstIP = options.host;\n const dstPort = options.port;\n\n if (Client === undefined)\n Client = require('./client.js');\n\n const client = new Client();\n let triedForward = false;\n client.on('ready', () => {\n client.forwardOut(srcIP, srcPort, dstIP, dstPort, (err, stream) => {\n triedForward = true;\n if (err) {\n client.end();\n return cb(err);\n }\n stream.once('close', () => client.end());\n cb(null, decorateStream(stream, ctor, options));\n });\n }).on('error', cb).on('close', () => {\n if (!triedForward)\n cb(new Error('Unexpected connection close'));\n }).connect(this._connectCfg);\n }\n }\n\n exports[ctor === HttpAgent ? 'SSHTTPAgent' : 'SSHTTPSAgent'] = SSHAgent;\n}\n\nfunction noop() {}\n\nfunction decorateStream(stream, ctor, options) {\n if (ctor === HttpAgent) {\n // HTTP\n stream.setKeepAlive = noop;\n stream.setNoDelay = noop;\n stream.setTimeout = noop;\n stream.ref = noop;\n stream.unref = noop;\n stream.destroySoon = stream.destroy;\n return stream;\n }\n\n // HTTPS\n options.socket = stream;\n const wrapped = tlsConnect(options);\n\n // This is a workaround for a regression in node v12.16.3+\n // https://github.com/nodejs/node/issues/35904\n const onClose = (() => {\n let called = false;\n return () => {\n if (called)\n return;\n called = true;\n if (stream.isPaused())\n stream.resume();\n };\n })();\n // 'end' listener is needed because 'close' is not emitted in some scenarios\n // in node v12.x for some unknown reason\n wrapped.on('end', onClose).on('close', onClose);\n\n return wrapped;\n}\n", "// TODO:\n// * convert listenerCount() usage to emit() return value checking?\n// * emit error when connection severed early (e.g. before handshake)\n// * add '.connected' or similar property to connection objects to allow\n// immediate connection status checking\n'use strict';\n\nconst { Server: netServer } = require('net');\nconst EventEmitter = require('events');\nconst { listenerCount } = EventEmitter;\n\nconst {\n CHANNEL_OPEN_FAILURE,\n DEFAULT_CIPHER,\n DEFAULT_COMPRESSION,\n DEFAULT_KEX,\n DEFAULT_MAC,\n DEFAULT_SERVER_HOST_KEY,\n DISCONNECT_REASON,\n DISCONNECT_REASON_BY_VALUE,\n SUPPORTED_CIPHER,\n SUPPORTED_COMPRESSION,\n SUPPORTED_KEX,\n SUPPORTED_MAC,\n SUPPORTED_SERVER_HOST_KEY,\n} = require('./protocol/constants.js');\nconst { init: cryptoInit } = require('./protocol/crypto.js');\nconst { KexInit } = require('./protocol/kex.js');\nconst { parseKey } = require('./protocol/keyParser.js');\nconst Protocol = require('./protocol/Protocol.js');\nconst { SFTP } = require('./protocol/SFTP.js');\nconst { writeUInt32BE } = require('./protocol/utils.js');\n\nconst {\n Channel,\n MAX_WINDOW,\n PACKET_SIZE,\n windowAdjust,\n WINDOW_THRESHOLD,\n} = require('./Channel.js');\n\nconst {\n ChannelManager,\n generateAlgorithmList,\n isWritable,\n onChannelOpenFailure,\n onCHANNEL_CLOSE,\n} = require('./utils.js');\n\nconst MAX_PENDING_AUTHS = 10;\n\nclass AuthContext extends EventEmitter {\n constructor(protocol, username, service, method, cb) {\n super();\n\n this.username = this.user = username;\n this.service = service;\n this.method = method;\n this._initialResponse = false;\n this._finalResponse = false;\n this._multistep = false;\n this._cbfinal = (allowed, methodsLeft, isPartial) => {\n if (!this._finalResponse) {\n this._finalResponse = true;\n cb(this, allowed, methodsLeft, isPartial);\n }\n };\n this._protocol = protocol;\n }\n\n accept() {\n this._cleanup && this._cleanup();\n this._initialResponse = true;\n this._cbfinal(true);\n }\n reject(methodsLeft, isPartial) {\n this._cleanup && this._cleanup();\n this._initialResponse = true;\n this._cbfinal(false, methodsLeft, isPartial);\n }\n}\n\n\nclass KeyboardAuthContext extends AuthContext {\n constructor(protocol, username, service, method, submethods, cb) {\n super(protocol, username, service, method, cb);\n\n this._multistep = true;\n\n this._cb = undefined;\n this._onInfoResponse = (responses) => {\n const callback = this._cb;\n if (callback) {\n this._cb = undefined;\n callback(responses);\n }\n };\n this.submethods = submethods;\n this.on('abort', () => {\n this._cb && this._cb(new Error('Authentication request aborted'));\n });\n }\n\n prompt(prompts, title, instructions, cb) {\n if (!Array.isArray(prompts))\n prompts = [ prompts ];\n\n if (typeof title === 'function') {\n cb = title;\n title = instructions = undefined;\n } else if (typeof instructions === 'function') {\n cb = instructions;\n instructions = undefined;\n } else if (typeof cb !== 'function') {\n cb = undefined;\n }\n\n for (let i = 0; i < prompts.length; ++i) {\n if (typeof prompts[i] === 'string') {\n prompts[i] = {\n prompt: prompts[i],\n echo: true\n };\n }\n }\n\n this._cb = cb;\n this._initialResponse = true;\n\n this._protocol.authInfoReq(title, instructions, prompts);\n }\n}\n\nclass PKAuthContext extends AuthContext {\n constructor(protocol, username, service, method, pkInfo, cb) {\n super(protocol, username, service, method, cb);\n\n this.key = { algo: pkInfo.keyAlgo, data: pkInfo.key };\n this.hashAlgo = pkInfo.hashAlgo;\n this.signature = pkInfo.signature;\n this.blob = pkInfo.blob;\n }\n\n accept() {\n if (!this.signature) {\n this._initialResponse = true;\n this._protocol.authPKOK(this.key.algo, this.key.data);\n } else {\n AuthContext.prototype.accept.call(this);\n }\n }\n}\n\nclass HostbasedAuthContext extends AuthContext {\n constructor(protocol, username, service, method, pkInfo, cb) {\n super(protocol, username, service, method, cb);\n\n this.key = { algo: pkInfo.keyAlgo, data: pkInfo.key };\n this.hashAlgo = pkInfo.hashAlgo;\n this.signature = pkInfo.signature;\n this.blob = pkInfo.blob;\n this.localHostname = pkInfo.localHostname;\n this.localUsername = pkInfo.localUsername;\n }\n}\n\nclass PwdAuthContext extends AuthContext {\n constructor(protocol, username, service, method, password, cb) {\n super(protocol, username, service, method, cb);\n\n this.password = password;\n this._changeCb = undefined;\n }\n\n requestChange(prompt, cb) {\n if (this._changeCb)\n throw new Error('Change request already in progress');\n if (typeof prompt !== 'string')\n throw new Error('prompt argument must be a string');\n if (typeof cb !== 'function')\n throw new Error('Callback argument must be a function');\n this._changeCb = cb;\n this._protocol.authPasswdChg(prompt);\n }\n}\n\n\nclass Session extends EventEmitter {\n constructor(client, info, localChan) {\n super();\n\n this.type = 'session';\n this.subtype = undefined;\n this.server = true;\n this._ending = false;\n this._channel = undefined;\n this._chanInfo = {\n type: 'session',\n incoming: {\n id: localChan,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n }\n}\n\n\nclass Server extends EventEmitter {\n constructor(cfg, listener) {\n super();\n\n if (typeof cfg !== 'object' || cfg === null)\n throw new Error('Missing configuration object');\n\n const hostKeys = Object.create(null);\n const hostKeyAlgoOrder = [];\n\n const hostKeys_ = cfg.hostKeys;\n if (!Array.isArray(hostKeys_))\n throw new Error('hostKeys must be an array');\n\n const cfgAlgos = (\n typeof cfg.algorithms === 'object' && cfg.algorithms !== null\n ? cfg.algorithms\n : {}\n );\n\n const hostKeyAlgos = generateAlgorithmList(\n cfgAlgos.serverHostKey,\n DEFAULT_SERVER_HOST_KEY,\n SUPPORTED_SERVER_HOST_KEY\n );\n for (let i = 0; i < hostKeys_.length; ++i) {\n let privateKey;\n if (Buffer.isBuffer(hostKeys_[i]) || typeof hostKeys_[i] === 'string')\n privateKey = parseKey(hostKeys_[i]);\n else\n privateKey = parseKey(hostKeys_[i].key, hostKeys_[i].passphrase);\n\n if (privateKey instanceof Error)\n throw new Error(`Cannot parse privateKey: ${privateKey.message}`);\n\n if (Array.isArray(privateKey)) {\n // OpenSSH's newer format only stores 1 key for now\n privateKey = privateKey[0];\n }\n\n if (privateKey.getPrivatePEM() === null)\n throw new Error('privateKey value contains an invalid private key');\n\n // Discard key if we already found a key of the same type\n if (hostKeyAlgoOrder.includes(privateKey.type))\n continue;\n\n if (privateKey.type === 'ssh-rsa') {\n // SSH supports multiple signature hashing algorithms for RSA, so we add\n // the algorithms in the desired order\n let sha1Pos = hostKeyAlgos.indexOf('ssh-rsa');\n const sha256Pos = hostKeyAlgos.indexOf('rsa-sha2-256');\n const sha512Pos = hostKeyAlgos.indexOf('rsa-sha2-512');\n if (sha1Pos === -1) {\n // Fall back to giving SHA1 the lowest priority\n sha1Pos = Infinity;\n }\n [sha1Pos, sha256Pos, sha512Pos].sort(compareNumbers).forEach((pos) => {\n if (pos === -1)\n return;\n\n let type;\n switch (pos) {\n case sha1Pos: type = 'ssh-rsa'; break;\n case sha256Pos: type = 'rsa-sha2-256'; break;\n case sha512Pos: type = 'rsa-sha2-512'; break;\n default: return;\n }\n\n // Store same RSA key under each hash algorithm name for convenience\n hostKeys[type] = privateKey;\n\n hostKeyAlgoOrder.push(type);\n });\n } else {\n hostKeys[privateKey.type] = privateKey;\n hostKeyAlgoOrder.push(privateKey.type);\n }\n }\n\n const algorithms = {\n kex: generateAlgorithmList(\n cfgAlgos.kex,\n DEFAULT_KEX,\n SUPPORTED_KEX\n ).concat(['kex-strict-s-v00@openssh.com']),\n serverHostKey: hostKeyAlgoOrder,\n cs: {\n cipher: generateAlgorithmList(\n cfgAlgos.cipher,\n DEFAULT_CIPHER,\n SUPPORTED_CIPHER\n ),\n mac: generateAlgorithmList(cfgAlgos.hmac, DEFAULT_MAC, SUPPORTED_MAC),\n compress: generateAlgorithmList(\n cfgAlgos.compress,\n DEFAULT_COMPRESSION,\n SUPPORTED_COMPRESSION\n ),\n lang: [],\n },\n sc: undefined,\n };\n algorithms.sc = algorithms.cs;\n\n if (typeof listener === 'function')\n this.on('connection', listener);\n\n const origDebug = (typeof cfg.debug === 'function' ? cfg.debug : undefined);\n const ident = (cfg.ident ? Buffer.from(cfg.ident) : undefined);\n const offer = new KexInit(algorithms);\n\n this._srv = new netServer((socket) => {\n if (this._connections >= this.maxConnections) {\n socket.destroy();\n return;\n }\n ++this._connections;\n socket.once('close', () => {\n --this._connections;\n });\n\n let debug;\n if (origDebug) {\n // Prepend debug output with a unique identifier in case there are\n // multiple clients connected at the same time\n const debugPrefix = `[${process.hrtime().join('.')}] `;\n debug = (msg) => {\n origDebug(`${debugPrefix}${msg}`);\n };\n }\n\n // eslint-disable-next-line no-use-before-define\n new Client(socket, hostKeys, ident, offer, debug, this, cfg);\n }).on('error', (err) => {\n this.emit('error', err);\n }).on('listening', () => {\n this.emit('listening');\n }).on('close', () => {\n this.emit('close');\n });\n this._connections = 0;\n this.maxConnections = Infinity;\n }\n\n injectSocket(socket) {\n this._srv.emit('connection', socket);\n }\n\n listen(...args) {\n this._srv.listen(...args);\n return this;\n }\n\n address() {\n return this._srv.address();\n }\n\n getConnections(cb) {\n this._srv.getConnections(cb);\n return this;\n }\n\n close(cb) {\n this._srv.close(cb);\n return this;\n }\n\n ref() {\n this._srv.ref();\n return this;\n }\n\n unref() {\n this._srv.unref();\n return this;\n }\n}\nServer.KEEPALIVE_CLIENT_INTERVAL = 15000;\nServer.KEEPALIVE_CLIENT_COUNT_MAX = 3;\n\n\nclass Client extends EventEmitter {\n constructor(socket, hostKeys, ident, offer, debug, server, srvCfg) {\n super();\n\n let exchanges = 0;\n let acceptedAuthSvc = false;\n let pendingAuths = [];\n let authCtx;\n let kaTimer;\n let onPacket;\n const unsentGlobalRequestsReplies = [];\n this._sock = socket;\n this._chanMgr = new ChannelManager(this);\n this._debug = debug;\n this.noMoreSessions = false;\n this.authenticated = false;\n\n // Silence pre-header errors\n function onClientPreHeaderError(err) {}\n this.on('error', onClientPreHeaderError);\n\n const DEBUG_HANDLER = (!debug ? undefined : (p, display, msg) => {\n debug(`Debug output from client: ${JSON.stringify(msg)}`);\n });\n\n const kaIntvl = (\n typeof srvCfg.keepaliveInterval === 'number'\n && isFinite(srvCfg.keepaliveInterval)\n && srvCfg.keepaliveInterval > 0\n ? srvCfg.keepaliveInterval\n : (\n typeof Server.KEEPALIVE_CLIENT_INTERVAL === 'number'\n && isFinite(Server.KEEPALIVE_CLIENT_INTERVAL)\n && Server.KEEPALIVE_CLIENT_INTERVAL > 0\n ? Server.KEEPALIVE_CLIENT_INTERVAL\n : -1\n )\n );\n const kaCountMax = (\n typeof srvCfg.keepaliveCountMax === 'number'\n && isFinite(srvCfg.keepaliveCountMax)\n && srvCfg.keepaliveCountMax >= 0\n ? srvCfg.keepaliveCountMax\n : (\n typeof Server.KEEPALIVE_CLIENT_COUNT_MAX === 'number'\n && isFinite(Server.KEEPALIVE_CLIENT_COUNT_MAX)\n && Server.KEEPALIVE_CLIENT_COUNT_MAX >= 0\n ? Server.KEEPALIVE_CLIENT_COUNT_MAX\n : -1\n )\n );\n let kaCurCount = 0;\n if (kaIntvl !== -1 && kaCountMax !== -1) {\n this.once('ready', () => {\n const onClose = () => {\n clearInterval(kaTimer);\n };\n this.on('close', onClose).on('end', onClose);\n kaTimer = setInterval(() => {\n if (++kaCurCount > kaCountMax) {\n clearInterval(kaTimer);\n const err = new Error('Keepalive timeout');\n err.level = 'client-timeout';\n this.emit('error', err);\n this.end();\n } else {\n // XXX: if the server ever starts sending real global requests to\n // the client, we will need to add a dummy callback here to\n // keep the correct reply order\n proto.ping();\n }\n }, kaIntvl);\n });\n // TODO: re-verify keepalive behavior with OpenSSH\n onPacket = () => {\n kaTimer && kaTimer.refresh();\n kaCurCount = 0;\n };\n }\n\n const proto = this._protocol = new Protocol({\n server: true,\n hostKeys,\n ident,\n offer,\n onPacket,\n greeting: srvCfg.greeting,\n banner: srvCfg.banner,\n onWrite: (data) => {\n if (isWritable(socket))\n socket.write(data);\n },\n onError: (err) => {\n if (!proto._destruct)\n socket.removeAllListeners('data');\n this.emit('error', err);\n try {\n socket.end();\n } catch {}\n },\n onHeader: (header) => {\n this.removeListener('error', onClientPreHeaderError);\n\n const info = {\n ip: socket.remoteAddress,\n family: socket.remoteFamily,\n port: socket.remotePort,\n header,\n };\n if (!server.emit('connection', this, info)) {\n // auto reject\n proto.disconnect(DISCONNECT_REASON.BY_APPLICATION);\n socket.end();\n return;\n }\n\n if (header.greeting)\n this.emit('greeting', header.greeting);\n },\n onHandshakeComplete: (negotiated) => {\n if (++exchanges > 1)\n this.emit('rekey');\n this.emit('handshake', negotiated);\n },\n debug,\n messageHandlers: {\n DEBUG: DEBUG_HANDLER,\n DISCONNECT: (p, reason, desc) => {\n if (reason !== DISCONNECT_REASON.BY_APPLICATION) {\n if (!desc) {\n desc = DISCONNECT_REASON_BY_VALUE[reason];\n if (desc === undefined)\n desc = `Unexpected disconnection reason: ${reason}`;\n }\n const err = new Error(desc);\n err.code = reason;\n this.emit('error', err);\n }\n socket.end();\n },\n CHANNEL_OPEN: (p, info) => {\n // Handle incoming requests from client\n\n // Do early reject in some cases to prevent wasteful channel\n // allocation\n if ((info.type === 'session' && this.noMoreSessions)\n || !this.authenticated) {\n const reasonCode = CHANNEL_OPEN_FAILURE.ADMINISTRATIVELY_PROHIBITED;\n return proto.channelOpenFail(info.sender, reasonCode);\n }\n\n let localChan = -1;\n let reason;\n let replied = false;\n\n let accept;\n const reject = () => {\n if (replied)\n return;\n replied = true;\n\n if (reason === undefined) {\n if (localChan === -1)\n reason = CHANNEL_OPEN_FAILURE.RESOURCE_SHORTAGE;\n else\n reason = CHANNEL_OPEN_FAILURE.CONNECT_FAILED;\n }\n\n if (localChan !== -1)\n this._chanMgr.remove(localChan);\n proto.channelOpenFail(info.sender, reason, '');\n };\n const reserveChannel = () => {\n localChan = this._chanMgr.add();\n\n if (localChan === -1) {\n reason = CHANNEL_OPEN_FAILURE.RESOURCE_SHORTAGE;\n if (debug) {\n debug('Automatic rejection of incoming channel open: '\n + 'no channels available');\n }\n }\n\n return (localChan !== -1);\n };\n\n const data = info.data;\n switch (info.type) {\n case 'session':\n if (listenerCount(this, 'session') && reserveChannel()) {\n accept = () => {\n if (replied)\n return;\n replied = true;\n\n const instance = new Session(this, info, localChan);\n this._chanMgr.update(localChan, instance);\n\n proto.channelOpenConfirm(info.sender,\n localChan,\n MAX_WINDOW,\n PACKET_SIZE);\n\n return instance;\n };\n\n this.emit('session', accept, reject);\n return;\n }\n break;\n case 'direct-tcpip':\n if (listenerCount(this, 'tcpip') && reserveChannel()) {\n accept = () => {\n if (replied)\n return;\n replied = true;\n\n const chanInfo = {\n type: undefined,\n incoming: {\n id: localChan,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n\n const stream = new Channel(this, chanInfo, { server: true });\n this._chanMgr.update(localChan, stream);\n\n proto.channelOpenConfirm(info.sender,\n localChan,\n MAX_WINDOW,\n PACKET_SIZE);\n\n return stream;\n };\n\n this.emit('tcpip', accept, reject, data);\n return;\n }\n break;\n case 'direct-streamlocal@openssh.com':\n if (listenerCount(this, 'openssh.streamlocal')\n && reserveChannel()) {\n accept = () => {\n if (replied)\n return;\n replied = true;\n\n const chanInfo = {\n type: undefined,\n incoming: {\n id: localChan,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n\n const stream = new Channel(this, chanInfo, { server: true });\n this._chanMgr.update(localChan, stream);\n\n proto.channelOpenConfirm(info.sender,\n localChan,\n MAX_WINDOW,\n PACKET_SIZE);\n\n return stream;\n };\n\n this.emit('openssh.streamlocal', accept, reject, data);\n return;\n }\n break;\n default:\n // Automatically reject any unsupported channel open requests\n reason = CHANNEL_OPEN_FAILURE.UNKNOWN_CHANNEL_TYPE;\n if (debug) {\n debug('Automatic rejection of unsupported incoming channel open'\n + ` type: ${info.type}`);\n }\n }\n\n if (reason === undefined) {\n reason = CHANNEL_OPEN_FAILURE.ADMINISTRATIVELY_PROHIBITED;\n if (debug) {\n debug('Automatic rejection of unexpected incoming channel open'\n + ` for: ${info.type}`);\n }\n }\n\n reject();\n },\n CHANNEL_OPEN_CONFIRMATION: (p, info) => {\n const channel = this._chanMgr.get(info.recipient);\n if (typeof channel !== 'function')\n return;\n\n const chanInfo = {\n type: channel.type,\n incoming: {\n id: info.recipient,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n\n const instance = new Channel(this, chanInfo, { server: true });\n this._chanMgr.update(info.recipient, instance);\n channel(undefined, instance);\n },\n CHANNEL_OPEN_FAILURE: (p, recipient, reason, description) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'function')\n return;\n\n const info = { reason, description };\n onChannelOpenFailure(this, recipient, info, channel);\n },\n CHANNEL_DATA: (p, recipient, data) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n // The remote party should not be sending us data if there is no\n // window space available ...\n // TODO: raise error on data with not enough window?\n if (channel.incoming.window === 0)\n return;\n\n channel.incoming.window -= data.length;\n\n if (channel.push(data) === false) {\n channel._waitChanDrain = true;\n return;\n }\n\n if (channel.incoming.window <= WINDOW_THRESHOLD)\n windowAdjust(channel);\n },\n CHANNEL_EXTENDED_DATA: (p, recipient, data, type) => {\n // NOOP -- should not be sent by client\n },\n CHANNEL_WINDOW_ADJUST: (p, recipient, amount) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n // The other side is allowing us to send `amount` more bytes of data\n channel.outgoing.window += amount;\n\n if (channel._waitWindow) {\n channel._waitWindow = false;\n\n if (channel._chunk) {\n channel._write(channel._chunk, null, channel._chunkcb);\n } else if (channel._chunkcb) {\n channel._chunkcb();\n } else if (channel._chunkErr) {\n channel.stderr._write(channel._chunkErr,\n null,\n channel._chunkcbErr);\n } else if (channel._chunkcbErr) {\n channel._chunkcbErr();\n }\n }\n },\n CHANNEL_SUCCESS: (p, recipient) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n if (channel._callbacks.length)\n channel._callbacks.shift()(false);\n },\n CHANNEL_FAILURE: (p, recipient) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n if (channel._callbacks.length)\n channel._callbacks.shift()(true);\n },\n CHANNEL_REQUEST: (p, recipient, type, wantReply, data) => {\n const session = this._chanMgr.get(recipient);\n if (typeof session !== 'object' || session === null)\n return;\n\n let replied = false;\n let accept;\n let reject;\n\n if (session.constructor !== Session) {\n // normal Channel instance\n if (wantReply)\n proto.channelFailure(session.outgoing.id);\n return;\n }\n\n if (wantReply) {\n // \"real session\" requests will have custom accept behaviors\n if (type !== 'shell'\n && type !== 'exec'\n && type !== 'subsystem') {\n accept = () => {\n if (replied || session._ending || session._channel)\n return;\n replied = true;\n\n proto.channelSuccess(session._chanInfo.outgoing.id);\n };\n }\n\n reject = () => {\n if (replied || session._ending || session._channel)\n return;\n replied = true;\n\n proto.channelFailure(session._chanInfo.outgoing.id);\n };\n }\n\n if (session._ending) {\n reject && reject();\n return;\n }\n\n switch (type) {\n // \"pre-real session start\" requests\n case 'env':\n if (listenerCount(session, 'env')) {\n session.emit('env', accept, reject, {\n key: data.name,\n val: data.value\n });\n return;\n }\n break;\n case 'pty-req':\n if (listenerCount(session, 'pty')) {\n session.emit('pty', accept, reject, data);\n return;\n }\n break;\n case 'window-change':\n if (listenerCount(session, 'window-change'))\n session.emit('window-change', accept, reject, data);\n else\n reject && reject();\n break;\n case 'x11-req':\n if (listenerCount(session, 'x11')) {\n session.emit('x11', accept, reject, data);\n return;\n }\n break;\n // \"post-real session start\" requests\n case 'signal':\n if (listenerCount(session, 'signal')) {\n session.emit('signal', accept, reject, {\n name: data\n });\n return;\n }\n break;\n // XXX: is `auth-agent-req@openssh.com` really \"post-real session\n // start\"?\n case 'auth-agent-req@openssh.com':\n if (listenerCount(session, 'auth-agent')) {\n session.emit('auth-agent', accept, reject);\n return;\n }\n break;\n // \"real session start\" requests\n case 'shell':\n if (listenerCount(session, 'shell')) {\n accept = () => {\n if (replied || session._ending || session._channel)\n return;\n replied = true;\n\n if (wantReply)\n proto.channelSuccess(session._chanInfo.outgoing.id);\n\n const channel = new Channel(\n this, session._chanInfo, { server: true }\n );\n\n channel.subtype = session.subtype = type;\n session._channel = channel;\n\n return channel;\n };\n\n session.emit('shell', accept, reject);\n return;\n }\n break;\n case 'exec':\n if (listenerCount(session, 'exec')) {\n accept = () => {\n if (replied || session._ending || session._channel)\n return;\n replied = true;\n\n if (wantReply)\n proto.channelSuccess(session._chanInfo.outgoing.id);\n\n const channel = new Channel(\n this, session._chanInfo, { server: true }\n );\n\n channel.subtype = session.subtype = type;\n session._channel = channel;\n\n return channel;\n };\n\n session.emit('exec', accept, reject, {\n command: data\n });\n return;\n }\n break;\n case 'subsystem': {\n let useSFTP = (data === 'sftp');\n accept = () => {\n if (replied || session._ending || session._channel)\n return;\n replied = true;\n\n if (wantReply)\n proto.channelSuccess(session._chanInfo.outgoing.id);\n\n let instance;\n if (useSFTP) {\n instance = new SFTP(this, session._chanInfo, {\n server: true,\n debug,\n });\n } else {\n instance = new Channel(\n this, session._chanInfo, { server: true }\n );\n instance.subtype =\n session.subtype = `${type}:${data}`;\n }\n session._channel = instance;\n\n return instance;\n };\n\n if (data === 'sftp') {\n if (listenerCount(session, 'sftp')) {\n session.emit('sftp', accept, reject);\n return;\n }\n useSFTP = false;\n }\n if (listenerCount(session, 'subsystem')) {\n session.emit('subsystem', accept, reject, {\n name: data\n });\n return;\n }\n break;\n }\n }\n debug && debug(\n `Automatic rejection of incoming channel request: ${type}`\n );\n reject && reject();\n },\n CHANNEL_EOF: (p, recipient) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n if (!channel._ending) {\n channel._ending = true;\n channel.emit('eof');\n channel.emit('end');\n }\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n if (channel.incoming.state !== 'open')\n return;\n channel.incoming.state = 'eof';\n\n if (channel.readable)\n channel.push(null);\n },\n CHANNEL_CLOSE: (p, recipient) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n channel._ending = true;\n channel.emit('close');\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n onCHANNEL_CLOSE(this, recipient, channel);\n },\n // Begin service/auth-related ==========================================\n SERVICE_REQUEST: (p, service) => {\n if (exchanges === 0\n || acceptedAuthSvc\n || this.authenticated\n || service !== 'ssh-userauth') {\n proto.disconnect(DISCONNECT_REASON.SERVICE_NOT_AVAILABLE);\n socket.end();\n return;\n }\n\n acceptedAuthSvc = true;\n proto.serviceAccept(service);\n },\n USERAUTH_REQUEST: (p, username, service, method, methodData) => {\n if (exchanges === 0\n || this.authenticated\n || (authCtx\n && (authCtx.username !== username\n || authCtx.service !== service))\n // TODO: support hostbased auth\n || (method !== 'password'\n && method !== 'publickey'\n && method !== 'hostbased'\n && method !== 'keyboard-interactive'\n && method !== 'none')\n || pendingAuths.length === MAX_PENDING_AUTHS) {\n proto.disconnect(DISCONNECT_REASON.PROTOCOL_ERROR);\n socket.end();\n return;\n } else if (service !== 'ssh-connection') {\n proto.disconnect(DISCONNECT_REASON.SERVICE_NOT_AVAILABLE);\n socket.end();\n return;\n }\n\n let ctx;\n switch (method) {\n case 'keyboard-interactive':\n ctx = new KeyboardAuthContext(proto, username, service, method,\n methodData, onAuthDecide);\n break;\n case 'publickey':\n ctx = new PKAuthContext(proto, username, service, method,\n methodData, onAuthDecide);\n break;\n case 'hostbased':\n ctx = new HostbasedAuthContext(proto, username, service, method,\n methodData, onAuthDecide);\n break;\n case 'password':\n if (authCtx\n && authCtx instanceof PwdAuthContext\n && authCtx._changeCb) {\n const cb = authCtx._changeCb;\n authCtx._changeCb = undefined;\n cb(methodData.newPassword);\n return;\n }\n ctx = new PwdAuthContext(proto, username, service, method,\n methodData, onAuthDecide);\n break;\n case 'none':\n ctx = new AuthContext(proto, username, service, method,\n onAuthDecide);\n break;\n }\n\n if (authCtx) {\n if (!authCtx._initialResponse) {\n return pendingAuths.push(ctx);\n } else if (authCtx._multistep && !authCtx._finalResponse) {\n // RFC 4252 says to silently abort the current auth request if a\n // new auth request comes in before the final response from an\n // auth method that requires additional request/response exchanges\n // -- this means keyboard-interactive for now ...\n authCtx._cleanup && authCtx._cleanup();\n authCtx.emit('abort');\n }\n }\n\n authCtx = ctx;\n\n if (listenerCount(this, 'authentication'))\n this.emit('authentication', authCtx);\n else\n authCtx.reject();\n },\n USERAUTH_INFO_RESPONSE: (p, responses) => {\n if (authCtx && authCtx instanceof KeyboardAuthContext)\n authCtx._onInfoResponse(responses);\n },\n // End service/auth-related ============================================\n GLOBAL_REQUEST: (p, name, wantReply, data) => {\n const reply = {\n type: null,\n buf: null\n };\n\n function setReply(type, buf) {\n reply.type = type;\n reply.buf = buf;\n sendReplies();\n }\n\n if (wantReply)\n unsentGlobalRequestsReplies.push(reply);\n\n if ((name === 'tcpip-forward'\n || name === 'cancel-tcpip-forward'\n || name === 'no-more-sessions@openssh.com'\n || name === 'streamlocal-forward@openssh.com'\n || name === 'cancel-streamlocal-forward@openssh.com')\n && listenerCount(this, 'request')\n && this.authenticated) {\n let accept;\n let reject;\n\n if (wantReply) {\n let replied = false;\n accept = (chosenPort) => {\n if (replied)\n return;\n replied = true;\n let bufPort;\n if (name === 'tcpip-forward'\n && data.bindPort === 0\n && typeof chosenPort === 'number') {\n bufPort = Buffer.allocUnsafe(4);\n writeUInt32BE(bufPort, chosenPort, 0);\n }\n setReply('SUCCESS', bufPort);\n };\n reject = () => {\n if (replied)\n return;\n replied = true;\n setReply('FAILURE');\n };\n }\n\n if (name === 'no-more-sessions@openssh.com') {\n this.noMoreSessions = true;\n accept && accept();\n return;\n }\n\n this.emit('request', accept, reject, name, data);\n } else if (wantReply) {\n setReply('FAILURE');\n }\n },\n },\n });\n\n socket.pause();\n cryptoInit.then(() => {\n proto.start();\n socket.on('data', (data) => {\n try {\n proto.parse(data, 0, data.length);\n } catch (ex) {\n this.emit('error', ex);\n try {\n if (isWritable(socket))\n socket.end();\n } catch {}\n }\n });\n socket.resume();\n }).catch((err) => {\n this.emit('error', err);\n try {\n if (isWritable(socket))\n socket.end();\n } catch {}\n });\n socket.on('error', (err) => {\n err.level = 'socket';\n this.emit('error', err);\n }).once('end', () => {\n debug && debug('Socket ended');\n proto.cleanup();\n this.emit('end');\n }).once('close', () => {\n debug && debug('Socket closed');\n proto.cleanup();\n this.emit('close');\n\n const err = new Error('No response from server');\n\n // Simulate error for pending channels and close any open channels\n this._chanMgr.cleanup(err);\n });\n\n const onAuthDecide = (ctx, allowed, methodsLeft, isPartial) => {\n if (authCtx === ctx && !this.authenticated) {\n if (allowed) {\n authCtx = undefined;\n this.authenticated = true;\n proto.authSuccess();\n pendingAuths = [];\n this.emit('ready');\n } else {\n proto.authFailure(methodsLeft, isPartial);\n if (pendingAuths.length) {\n authCtx = pendingAuths.pop();\n if (listenerCount(this, 'authentication'))\n this.emit('authentication', authCtx);\n else\n authCtx.reject();\n }\n }\n }\n };\n\n function sendReplies() {\n while (unsentGlobalRequestsReplies.length > 0\n && unsentGlobalRequestsReplies[0].type) {\n const reply = unsentGlobalRequestsReplies.shift();\n if (reply.type === 'SUCCESS')\n proto.requestSuccess(reply.buf);\n if (reply.type === 'FAILURE')\n proto.requestFailure();\n }\n }\n }\n\n end() {\n if (this._sock && isWritable(this._sock)) {\n this._protocol.disconnect(DISCONNECT_REASON.BY_APPLICATION);\n this._sock.end();\n }\n return this;\n }\n\n x11(originAddr, originPort, cb) {\n const opts = { originAddr, originPort };\n openChannel(this, 'x11', opts, cb);\n return this;\n }\n\n forwardOut(boundAddr, boundPort, remoteAddr, remotePort, cb) {\n const opts = { boundAddr, boundPort, remoteAddr, remotePort };\n openChannel(this, 'forwarded-tcpip', opts, cb);\n return this;\n }\n\n openssh_forwardOutStreamLocal(socketPath, cb) {\n const opts = { socketPath };\n openChannel(this, 'forwarded-streamlocal@openssh.com', opts, cb);\n return this;\n }\n\n rekey(cb) {\n let error;\n\n try {\n this._protocol.rekey();\n } catch (ex) {\n error = ex;\n }\n\n // TODO: re-throw error if no callback?\n\n if (typeof cb === 'function') {\n if (error)\n process.nextTick(cb, error);\n else\n this.once('rekey', cb);\n }\n }\n\n setNoDelay(noDelay) {\n if (this._sock && typeof this._sock.setNoDelay === 'function')\n this._sock.setNoDelay(noDelay);\n\n return this;\n }\n}\n\n\nfunction openChannel(self, type, opts, cb) {\n // Ask the client to open a channel for some purpose (e.g. a forwarded TCP\n // connection)\n const initWindow = MAX_WINDOW;\n const maxPacket = PACKET_SIZE;\n\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n\n const wrapper = (err, stream) => {\n cb(err, stream);\n };\n wrapper.type = type;\n\n const localChan = self._chanMgr.add(wrapper);\n\n if (localChan === -1) {\n cb(new Error('No free channels available'));\n return;\n }\n\n switch (type) {\n case 'forwarded-tcpip':\n self._protocol.forwardedTcpip(localChan, initWindow, maxPacket, opts);\n break;\n case 'x11':\n self._protocol.x11(localChan, initWindow, maxPacket, opts);\n break;\n case 'forwarded-streamlocal@openssh.com':\n self._protocol.openssh_forwardedStreamLocal(\n localChan, initWindow, maxPacket, opts\n );\n break;\n default:\n throw new Error(`Unsupported channel type: ${type}`);\n }\n}\n\nfunction compareNumbers(a, b) {\n return a - b;\n}\n\nmodule.exports = Server;\nmodule.exports.IncomingClient = Client;\n", "'use strict';\n\nconst {\n createCipheriv,\n generateKeyPair: generateKeyPair_,\n generateKeyPairSync: generateKeyPairSync_,\n getCurves,\n randomBytes,\n} = require('crypto');\n\nconst { Ber } = require('asn1');\nconst bcrypt_pbkdf = require('bcrypt-pbkdf').pbkdf;\n\nconst { CIPHER_INFO } = require('./protocol/crypto.js');\n\nconst SALT_LEN = 16;\nconst DEFAULT_ROUNDS = 16;\n\nconst curves = getCurves();\nconst ciphers = new Map(Object.entries(CIPHER_INFO));\n\nfunction makeArgs(type, opts) {\n if (typeof type !== 'string')\n throw new TypeError('Key type must be a string');\n\n const publicKeyEncoding = { type: 'spki', format: 'der' };\n const privateKeyEncoding = { type: 'pkcs8', format: 'der' };\n\n switch (type.toLowerCase()) {\n case 'rsa': {\n if (typeof opts !== 'object' || opts === null)\n throw new TypeError('Missing options object for RSA key');\n const modulusLength = opts.bits;\n if (!Number.isInteger(modulusLength))\n throw new TypeError('RSA bits must be an integer');\n if (modulusLength <= 0 || modulusLength > 16384)\n throw new RangeError('RSA bits must be non-zero and <= 16384');\n return ['rsa', { modulusLength, publicKeyEncoding, privateKeyEncoding }];\n }\n case 'ecdsa': {\n if (typeof opts !== 'object' || opts === null)\n throw new TypeError('Missing options object for ECDSA key');\n if (!Number.isInteger(opts.bits))\n throw new TypeError('ECDSA bits must be an integer');\n let namedCurve;\n switch (opts.bits) {\n case 256:\n namedCurve = 'prime256v1';\n break;\n case 384:\n namedCurve = 'secp384r1';\n break;\n case 521:\n namedCurve = 'secp521r1';\n break;\n default:\n throw new Error('ECDSA bits must be 256, 384, or 521');\n }\n if (!curves.includes(namedCurve))\n throw new Error('Unsupported ECDSA bits value');\n return ['ec', { namedCurve, publicKeyEncoding, privateKeyEncoding }];\n }\n case 'ed25519':\n return ['ed25519', { publicKeyEncoding, privateKeyEncoding }];\n default:\n throw new Error(`Unsupported key type: ${type}`);\n }\n}\n\nfunction parseDERs(keyType, pub, priv) {\n switch (keyType) {\n case 'rsa': {\n // Note: we don't need to parse the public key since the PKCS8 private key\n // already includes the public key parameters\n\n // Parse private key\n let reader = new Ber.Reader(priv);\n reader.readSequence();\n\n // - Version\n if (reader.readInt() !== 0)\n throw new Error('Unsupported version in RSA private key');\n\n // - Algorithm\n reader.readSequence();\n if (reader.readOID() !== '1.2.840.113549.1.1.1')\n throw new Error('Bad RSA private OID');\n // - Algorithm parameters (RSA has none)\n if (reader.readByte() !== Ber.Null)\n throw new Error('Malformed RSA private key (expected null)');\n if (reader.readByte() !== 0x00) {\n throw new Error(\n 'Malformed RSA private key (expected zero-length null)'\n );\n }\n\n reader = new Ber.Reader(reader.readString(Ber.OctetString, true));\n reader.readSequence();\n if (reader.readInt() !== 0)\n throw new Error('Unsupported version in RSA private key');\n const n = reader.readString(Ber.Integer, true);\n const e = reader.readString(Ber.Integer, true);\n const d = reader.readString(Ber.Integer, true);\n const p = reader.readString(Ber.Integer, true);\n const q = reader.readString(Ber.Integer, true);\n reader.readString(Ber.Integer, true); // dmp1\n reader.readString(Ber.Integer, true); // dmq1\n const iqmp = reader.readString(Ber.Integer, true);\n\n /*\n OpenSSH RSA private key:\n string \"ssh-rsa\"\n string n -- public\n string e -- public\n string d -- private\n string iqmp -- private\n string p -- private\n string q -- private\n */\n const keyName = Buffer.from('ssh-rsa');\n const privBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + n.length\n + 4 + e.length\n + 4 + d.length\n + 4 + iqmp.length\n + 4 + p.length\n + 4 + q.length\n );\n let pos = 0;\n\n privBuf.writeUInt32BE(keyName.length, pos += 0);\n privBuf.set(keyName, pos += 4);\n privBuf.writeUInt32BE(n.length, pos += keyName.length);\n privBuf.set(n, pos += 4);\n privBuf.writeUInt32BE(e.length, pos += n.length);\n privBuf.set(e, pos += 4);\n privBuf.writeUInt32BE(d.length, pos += e.length);\n privBuf.set(d, pos += 4);\n privBuf.writeUInt32BE(iqmp.length, pos += d.length);\n privBuf.set(iqmp, pos += 4);\n privBuf.writeUInt32BE(p.length, pos += iqmp.length);\n privBuf.set(p, pos += 4);\n privBuf.writeUInt32BE(q.length, pos += p.length);\n privBuf.set(q, pos += 4);\n\n /*\n OpenSSH RSA public key:\n string \"ssh-rsa\"\n string e -- public\n string n -- public\n */\n const pubBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + e.length\n + 4 + n.length\n );\n pos = 0;\n\n pubBuf.writeUInt32BE(keyName.length, pos += 0);\n pubBuf.set(keyName, pos += 4);\n pubBuf.writeUInt32BE(e.length, pos += keyName.length);\n pubBuf.set(e, pos += 4);\n pubBuf.writeUInt32BE(n.length, pos += e.length);\n pubBuf.set(n, pos += 4);\n\n return { sshName: keyName.toString(), priv: privBuf, pub: pubBuf };\n }\n case 'ec': {\n // Parse public key\n let reader = new Ber.Reader(pub);\n reader.readSequence();\n\n reader.readSequence();\n if (reader.readOID() !== '1.2.840.10045.2.1')\n throw new Error('Bad ECDSA public OID');\n // Skip curve OID, we'll get it from the private key\n reader.readOID();\n let pubBin = reader.readString(Ber.BitString, true);\n {\n // Remove leading zero bytes\n let i = 0;\n for (; i < pubBin.length && pubBin[i] === 0x00; ++i);\n if (i > 0)\n pubBin = pubBin.slice(i);\n }\n\n // Parse private key\n reader = new Ber.Reader(priv);\n reader.readSequence();\n\n // - Version\n if (reader.readInt() !== 0)\n throw new Error('Unsupported version in ECDSA private key');\n\n reader.readSequence();\n if (reader.readOID() !== '1.2.840.10045.2.1')\n throw new Error('Bad ECDSA private OID');\n const curveOID = reader.readOID();\n let sshCurveName;\n switch (curveOID) {\n case '1.2.840.10045.3.1.7':\n // prime256v1/secp256r1\n sshCurveName = 'nistp256';\n break;\n case '1.3.132.0.34':\n // secp384r1\n sshCurveName = 'nistp384';\n break;\n case '1.3.132.0.35':\n // secp521r1\n sshCurveName = 'nistp521';\n break;\n default:\n throw new Error('Unsupported curve in ECDSA private key');\n }\n\n reader = new Ber.Reader(reader.readString(Ber.OctetString, true));\n reader.readSequence();\n\n // - Version\n if (reader.readInt() !== 1)\n throw new Error('Unsupported version in ECDSA private key');\n\n // Add leading zero byte to prevent negative bignum in private key\n const privBin = Buffer.concat([\n Buffer.from([0x00]),\n reader.readString(Ber.OctetString, true)\n ]);\n\n /*\n OpenSSH ECDSA private key:\n string \"ecdsa-sha2-<sshCurveName>\"\n string curve name\n string Q -- public\n string d -- private\n */\n const keyName = Buffer.from(`ecdsa-sha2-${sshCurveName}`);\n sshCurveName = Buffer.from(sshCurveName);\n const privBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + sshCurveName.length\n + 4 + pubBin.length\n + 4 + privBin.length\n );\n let pos = 0;\n\n privBuf.writeUInt32BE(keyName.length, pos += 0);\n privBuf.set(keyName, pos += 4);\n privBuf.writeUInt32BE(sshCurveName.length, pos += keyName.length);\n privBuf.set(sshCurveName, pos += 4);\n privBuf.writeUInt32BE(pubBin.length, pos += sshCurveName.length);\n privBuf.set(pubBin, pos += 4);\n privBuf.writeUInt32BE(privBin.length, pos += pubBin.length);\n privBuf.set(privBin, pos += 4);\n\n /*\n OpenSSH ECDSA public key:\n string \"ecdsa-sha2-<sshCurveName>\"\n string curve name\n string Q -- public\n */\n const pubBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + sshCurveName.length\n + 4 + pubBin.length\n );\n pos = 0;\n\n pubBuf.writeUInt32BE(keyName.length, pos += 0);\n pubBuf.set(keyName, pos += 4);\n pubBuf.writeUInt32BE(sshCurveName.length, pos += keyName.length);\n pubBuf.set(sshCurveName, pos += 4);\n pubBuf.writeUInt32BE(pubBin.length, pos += sshCurveName.length);\n pubBuf.set(pubBin, pos += 4);\n\n return { sshName: keyName.toString(), priv: privBuf, pub: pubBuf };\n }\n case 'ed25519': {\n // Parse public key\n let reader = new Ber.Reader(pub);\n reader.readSequence();\n\n // - Algorithm\n reader.readSequence();\n if (reader.readOID() !== '1.3.101.112')\n throw new Error('Bad ED25519 public OID');\n // - Attributes (absent for ED25519)\n\n let pubBin = reader.readString(Ber.BitString, true);\n {\n // Remove leading zero bytes\n let i = 0;\n for (; i < pubBin.length && pubBin[i] === 0x00; ++i);\n if (i > 0)\n pubBin = pubBin.slice(i);\n }\n\n // Parse private key\n reader = new Ber.Reader(priv);\n reader.readSequence();\n\n // - Version\n if (reader.readInt() !== 0)\n throw new Error('Unsupported version in ED25519 private key');\n\n // - Algorithm\n reader.readSequence();\n if (reader.readOID() !== '1.3.101.112')\n throw new Error('Bad ED25519 private OID');\n // - Attributes (absent)\n\n reader = new Ber.Reader(reader.readString(Ber.OctetString, true));\n const privBin = reader.readString(Ber.OctetString, true);\n\n /*\n OpenSSH ed25519 private key:\n string \"ssh-ed25519\"\n string public key\n string private key + public key\n */\n const keyName = Buffer.from('ssh-ed25519');\n const privBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + pubBin.length\n + 4 + (privBin.length + pubBin.length)\n );\n let pos = 0;\n\n privBuf.writeUInt32BE(keyName.length, pos += 0);\n privBuf.set(keyName, pos += 4);\n privBuf.writeUInt32BE(pubBin.length, pos += keyName.length);\n privBuf.set(pubBin, pos += 4);\n privBuf.writeUInt32BE(\n privBin.length + pubBin.length,\n pos += pubBin.length\n );\n privBuf.set(privBin, pos += 4);\n privBuf.set(pubBin, pos += privBin.length);\n\n /*\n OpenSSH ed25519 public key:\n string \"ssh-ed25519\"\n string public key\n */\n const pubBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + pubBin.length\n );\n pos = 0;\n\n pubBuf.writeUInt32BE(keyName.length, pos += 0);\n pubBuf.set(keyName, pos += 4);\n pubBuf.writeUInt32BE(pubBin.length, pos += keyName.length);\n pubBuf.set(pubBin, pos += 4);\n\n return { sshName: keyName.toString(), priv: privBuf, pub: pubBuf };\n }\n }\n}\n\nfunction convertKeys(keyType, pub, priv, opts) {\n let format = 'new';\n let encrypted;\n let comment = '';\n if (typeof opts === 'object' && opts !== null) {\n if (typeof opts.comment === 'string' && opts.comment)\n comment = opts.comment;\n if (typeof opts.format === 'string' && opts.format)\n format = opts.format;\n if (opts.passphrase) {\n let passphrase;\n if (typeof opts.passphrase === 'string')\n passphrase = Buffer.from(opts.passphrase);\n else if (Buffer.isBuffer(opts.passphrase))\n passphrase = opts.passphrase;\n else\n throw new Error('Invalid passphrase');\n\n if (opts.cipher === undefined)\n throw new Error('Missing cipher name');\n const cipher = ciphers.get(opts.cipher);\n if (cipher === undefined)\n throw new Error('Invalid cipher name');\n\n if (format === 'new') {\n let rounds = DEFAULT_ROUNDS;\n if (opts.rounds !== undefined) {\n if (!Number.isInteger(opts.rounds))\n throw new TypeError('rounds must be an integer');\n if (opts.rounds > 0)\n rounds = opts.rounds;\n }\n\n const gen = Buffer.allocUnsafe(cipher.keyLen + cipher.ivLen);\n const salt = randomBytes(SALT_LEN);\n const r = bcrypt_pbkdf(\n passphrase,\n passphrase.length,\n salt,\n salt.length,\n gen,\n gen.length,\n rounds\n );\n if (r !== 0)\n return new Error('Failed to generate information to encrypt key');\n\n /*\n string salt\n uint32 rounds\n */\n const kdfOptions = Buffer.allocUnsafe(4 + salt.length + 4);\n {\n let pos = 0;\n kdfOptions.writeUInt32BE(salt.length, pos += 0);\n kdfOptions.set(salt, pos += 4);\n kdfOptions.writeUInt32BE(rounds, pos += salt.length);\n }\n\n encrypted = {\n cipher,\n cipherName: opts.cipher,\n kdfName: 'bcrypt',\n kdfOptions,\n key: gen.slice(0, cipher.keyLen),\n iv: gen.slice(cipher.keyLen),\n };\n }\n }\n }\n\n switch (format) {\n case 'new': {\n let privateB64 = '-----BEGIN OPENSSH PRIVATE KEY-----\\n';\n let publicB64;\n /*\n byte[] \"openssh-key-v1\\0\"\n string ciphername\n string kdfname\n string kdfoptions\n uint32 number of keys N\n string publickey1\n string encrypted, padded list of private keys\n uint32 checkint\n uint32 checkint\n byte[] privatekey1\n string comment1\n byte 1\n byte 2\n byte 3\n ...\n byte padlen % 255\n */\n const cipherName = Buffer.from(encrypted ? encrypted.cipherName : 'none');\n const kdfName = Buffer.from(encrypted ? encrypted.kdfName : 'none');\n const kdfOptions = (encrypted ? encrypted.kdfOptions : Buffer.alloc(0));\n const blockLen = (encrypted ? encrypted.cipher.blockLen : 8);\n\n const parsed = parseDERs(keyType, pub, priv);\n\n const checkInt = randomBytes(4);\n const commentBin = Buffer.from(comment);\n const privBlobLen = (4 + 4 + parsed.priv.length + 4 + commentBin.length);\n let padding = [];\n for (let i = 1; ((privBlobLen + padding.length) % blockLen); ++i)\n padding.push(i & 0xFF);\n padding = Buffer.from(padding);\n\n let privBlob = Buffer.allocUnsafe(privBlobLen + padding.length);\n let extra;\n {\n let pos = 0;\n privBlob.set(checkInt, pos += 0);\n privBlob.set(checkInt, pos += 4);\n privBlob.set(parsed.priv, pos += 4);\n privBlob.writeUInt32BE(commentBin.length, pos += parsed.priv.length);\n privBlob.set(commentBin, pos += 4);\n privBlob.set(padding, pos += commentBin.length);\n }\n\n if (encrypted) {\n const options = { authTagLength: encrypted.cipher.authLen };\n const cipher = createCipheriv(\n encrypted.cipher.sslName,\n encrypted.key,\n encrypted.iv,\n options\n );\n cipher.setAutoPadding(false);\n privBlob = Buffer.concat([ cipher.update(privBlob), cipher.final() ]);\n if (encrypted.cipher.authLen > 0)\n extra = cipher.getAuthTag();\n else\n extra = Buffer.alloc(0);\n encrypted.key.fill(0);\n encrypted.iv.fill(0);\n } else {\n extra = Buffer.alloc(0);\n }\n\n const magicBytes = Buffer.from('openssh-key-v1\\0');\n const privBin = Buffer.allocUnsafe(\n magicBytes.length\n + 4 + cipherName.length\n + 4 + kdfName.length\n + 4 + kdfOptions.length\n + 4\n + 4 + parsed.pub.length\n + 4 + privBlob.length\n + extra.length\n );\n {\n let pos = 0;\n privBin.set(magicBytes, pos += 0);\n privBin.writeUInt32BE(cipherName.length, pos += magicBytes.length);\n privBin.set(cipherName, pos += 4);\n privBin.writeUInt32BE(kdfName.length, pos += cipherName.length);\n privBin.set(kdfName, pos += 4);\n privBin.writeUInt32BE(kdfOptions.length, pos += kdfName.length);\n privBin.set(kdfOptions, pos += 4);\n privBin.writeUInt32BE(1, pos += kdfOptions.length);\n privBin.writeUInt32BE(parsed.pub.length, pos += 4);\n privBin.set(parsed.pub, pos += 4);\n privBin.writeUInt32BE(privBlob.length, pos += parsed.pub.length);\n privBin.set(privBlob, pos += 4);\n privBin.set(extra, pos += privBlob.length);\n }\n\n {\n const b64 = privBin.base64Slice(0, privBin.length);\n let formatted = b64.replace(/.{64}/g, '$&\\n');\n if (b64.length & 63)\n formatted += '\\n';\n privateB64 += formatted;\n }\n\n {\n const b64 = parsed.pub.base64Slice(0, parsed.pub.length);\n publicB64 = `${parsed.sshName} ${b64}${comment ? ` ${comment}` : ''}`;\n }\n\n privateB64 += '-----END OPENSSH PRIVATE KEY-----\\n';\n return {\n private: privateB64,\n public: publicB64,\n };\n }\n default:\n throw new Error('Invalid output key format');\n }\n}\n\nfunction noop() {}\n\nmodule.exports = {\n generateKeyPair: (keyType, opts, cb) => {\n if (typeof opts === 'function') {\n cb = opts;\n opts = undefined;\n }\n if (typeof cb !== 'function')\n cb = noop;\n const args = makeArgs(keyType, opts);\n generateKeyPair_(...args, (err, pub, priv) => {\n if (err)\n return cb(err);\n let ret;\n try {\n ret = convertKeys(args[0], pub, priv, opts);\n } catch (ex) {\n return cb(ex);\n }\n cb(null, ret);\n });\n },\n generateKeyPairSync: (keyType, opts) => {\n const args = makeArgs(keyType, opts);\n const { publicKey: pub, privateKey: priv } = generateKeyPairSync_(...args);\n return convertKeys(args[0], pub, priv, opts);\n }\n};\n", "'use strict';\n\nconst {\n AgentProtocol,\n BaseAgent,\n createAgent,\n CygwinAgent,\n OpenSSHAgent,\n PageantAgent,\n} = require('./agent.js');\nconst {\n SSHTTPAgent: HTTPAgent,\n SSHTTPSAgent: HTTPSAgent,\n} = require('./http-agents.js');\nconst { parseKey } = require('./protocol/keyParser.js');\nconst {\n flagsToString,\n OPEN_MODE,\n STATUS_CODE,\n stringToFlags,\n} = require('./protocol/SFTP.js');\n\nmodule.exports = {\n AgentProtocol,\n BaseAgent,\n createAgent,\n Client: require('./client.js'),\n CygwinAgent,\n HTTPAgent,\n HTTPSAgent,\n OpenSSHAgent,\n PageantAgent,\n Server: require('./server.js'),\n utils: {\n parseKey,\n ...require('./keygen.js'),\n sftp: {\n flagsToString,\n OPEN_MODE,\n STATUS_CODE,\n stringToFlags,\n },\n },\n};\n", "import { EventEmitter } from \"node:events\";\nimport { createCustomCommand, registerCommand } from \"../commands/registry\";\nimport { runCommand } from \"../commands/runtime\";\nimport {\n\tbootstrapLinuxRootfs,\n\trefreshProc,\n\tsyncEtcPasswd,\n} from \"../modules/linuxRootfs\";\nimport type { CommandContext, CommandResult } from \"../types/commands\";\nimport type { ShellStream } from \"../types/streams\";\nimport type { PerfLogger } from \"../utils/perfLogger\";\nimport { createPerfLogger } from \"../utils/perfLogger\";\nimport VirtualFileSystem, { type VfsOptions } from \"../VirtualFileSystem\";\nimport { VirtualPackageManager } from \"../VirtualPackageManager\";\nimport { VirtualUserManager } from \"../VirtualUserManager\";\nimport { startShell } from \"./shell\";\n\n/**\n * Virtual machine identity strings surfaced by system-info commands\n * (`uname`, `neofetch`, `lsb_release`, `/proc/version`, `/etc/os-release`).\n *\n * Pass this as the second argument to `new VirtualShell()` to customise the\n * distro name, kernel version, and CPU architecture reported inside the shell.\n *\n * @example\n * ```ts\n * const shell = new VirtualShell(\"my-vm\", {\n * kernel: \"6.1.0+custom-amd64\",\n * os: \"Acme GNU/Linux x64\",\n * arch: \"x86_64\",\n * });\n * ```\n */\nexport interface ShellProperties {\n\t/** Kernel version string (e.g. `\"1.0.0+itsrealfortune+1-amd64\"`). */\n\tkernel: string;\n\t/** Full OS description (e.g. `\"Fortune GNU/Linux x64\"`). */\n\tos: string;\n\t/** CPU architecture label (e.g. `\"x86_64\"`, `\"aarch64\"`). */\n\tarch: string;\n}\n\nconst defaultShellProperties: ShellProperties = {\n\tkernel: \"1.0.0+itsrealfortune+1-amd64\",\n\tos: \"Fortune GNU/Linux x64\",\n\tarch: \"x86_64\",\n};\n\nconst perf: PerfLogger = createPerfLogger(\"VirtualShell\");\n\nfunction resolveAutoSudoForNewUsers(): boolean {\n\tconst configured = process.env.SSH_MIMIC_AUTO_SUDO_NEW_USERS;\n\tif (!configured) {\n\t\treturn true;\n\t}\n\n\treturn ![\"0\", \"false\", \"no\", \"off\"].includes(configured.toLowerCase());\n}\n\n/**\n * Coordinates the virtual filesystem, user manager, package manager, and\n * command runtime for a single isolated shell environment.\n *\n * Each instance owns its own VFS tree, user database, package registry, and\n * session state \u2014 multiple instances are fully independent.\n *\n * Instances are consumed both by the SSH/SFTP server facades and directly via\n * the programmatic `SshClient` API.\n *\n * @example\n * ```ts\n * const shell = new VirtualShell(\"my-vm\");\n * await shell.ensureInitialized();\n * const client = new SshClient(shell, \"root\");\n * const result = await client.exec(\"uname -a\");\n * ```\n *\n * @fires VirtualShell#initialized Emitted once the VFS and users are ready.\n * @fires VirtualShell#command Emitted after every command execution.\n * @fires VirtualShell#session:start Emitted when an interactive session opens.\n */\nclass VirtualShell extends EventEmitter {\n\t/** Backing virtual filesystem \u2014 use for direct path operations. */\n\tvfs: VirtualFileSystem;\n\t/** Virtual user database \u2014 use for auth, quotas, and session tracking. */\n\tusers: VirtualUserManager;\n\t/** APT/dpkg package manager backed by the built-in package registry. */\n\tpackageManager: VirtualPackageManager;\n\t/** Hostname shown in the shell prompt and SSH ident string. */\n\thostname: string;\n\t/** Distro identity strings surfaced by `uname`, `neofetch`, etc. */\n\tproperties: ShellProperties;\n\t/** Unix ms timestamp of shell creation \u2014 used by `uptime` and `/proc/uptime`. */\n\tstartTime: number;\n\tprivate initialized: Promise<void>;\n\n\t/**\n\t * Creates a new virtual shell instance.\n\t *\n\t * @param hostname Virtual hostname used for prompts and idents.\n\t * @param properties Customizable properties shown in `uname -a` and similar commands.\n\t * @param vfsOptions Optional VFS persistence options (mode, snapshotPath).\n\t */\n\tconstructor(\n\t\thostname: string,\n\t\tproperties?: ShellProperties,\n\t\tvfsOptions?: VfsOptions,\n\t) {\n\t\tsuper();\n\t\tperf.mark(\"constructor\");\n\t\tthis.hostname = hostname;\n\t\tthis.properties = properties || defaultShellProperties;\n\t\tthis.startTime = Date.now();\n\t\tthis.vfs = new VirtualFileSystem(vfsOptions ?? {});\n\t\tthis.users = new VirtualUserManager(this.vfs, resolveAutoSudoForNewUsers());\n\t\tthis.packageManager = new VirtualPackageManager(this.vfs, this.users);\n\n\t\t// Store references to avoid TypeScript \"used before assigned\" errors\n\t\tconst vfs = this.vfs;\n\t\tconst users = this.users;\n\t\tconst pm = this.packageManager;\n\t\tconst shellProps = this.properties;\n\t\tconst shellHostname = this.hostname;\n\t\tconst startTime = this.startTime;\n\n\t\t// Initialize both VFS mirror and users, ensuring all is ready before auth\n\t\tthis.initialized = (async () => {\n\t\t\tawait vfs.restoreMirror();\n\t\t\tawait users.initialize();\n\t\t\t// Bootstrap Linux rootfs (idempotent)\n\t\t\tbootstrapLinuxRootfs(vfs, users, shellHostname, shellProps, startTime);\n\t\t\t// Load installed packages from dpkg status\n\t\t\tpm.load();\n\t\t\tthis.emit(\"initialized\");\n\t\t})();\n\t}\n\n\t/**\n\t * Ensures initialization is complete before allowing operations.\n\t * Call this before any authentication or command execution.\n\t */\n\tpublic async ensureInitialized(): Promise<void> {\n\t\tperf.mark(\"ensureInitialized\");\n\t\tawait this.initialized;\n\t}\n\n\t/**\n\t * Registers a new command in the shell runtime.\n\t *\n\t * @param name Case-insensitive command name (no spaces).\n\t * @param params List of parameter names for help text (no validation).\n\t * @param callback Function invoked with command context on execution.\n\t */\n\taddCommand(\n\t\tname: string,\n\t\tparams: string[],\n\t\tcallback: (ctx: CommandContext) => CommandResult | Promise<CommandResult>,\n\t): void {\n\t\tconst normalized = name.trim().toLowerCase();\n\t\tif (normalized.length === 0 || /\\s/.test(normalized)) {\n\t\t\tthrow new Error(\"Command name must be non-empty and contain no spaces\");\n\t\t}\n\n\t\tregisterCommand(createCustomCommand(normalized, params, callback));\n\t}\n\n\t/**\n\t * Executes a raw command line string programmatically.\n\t *\n\t * Supports the full shell operator set (`&&`, `||`, `;`, `|`, `>`, `<`,\n\t * `$(cmd)`) and alias expansion. The result is emitted via the\n\t * `\"command\"` event but not returned \u2014 use `SshClient.exec()` for a\n\t * result-returning wrapper.\n\t *\n\t * @param rawInput Unparsed command line (e.g. `\"ls -la /tmp\"`).\n\t * @param authUser Username to run the command as.\n\t * @param cwd Current working directory for path resolution.\n\t */\n\texecuteCommand(rawInput: string, authUser: string, cwd: string): void {\n\t\tperf.mark(\"executeCommand\");\n\t\trunCommand(rawInput, authUser, this.hostname, \"shell\", cwd, this);\n\t\tthis.emit(\"command\", { command: rawInput, user: authUser, cwd });\n\t}\n\n\t/**\n\t * Attaches an interactive PTY session to this shell instance.\n\t *\n\t * Called internally by `SshMimic` when a client opens a shell channel.\n\t * The session reads from `stream` (user keystrokes) and writes back ANSI\n\t * output. History, `.bashrc` sourcing, and Ctrl+W/Ctrl+U line editing are\n\t * handled automatically.\n\t *\n\t * @param stream Bidirectional SSH channel stream.\n\t * @param authUser Authenticated username bound to this session.\n\t * @param sessionId Stable session UUID (used for `who` output), or `null`.\n\t * @param remoteAddress IP or hostname of the connecting client.\n\t * @param terminalSize Initial terminal dimensions in columns and rows.\n\t */\n\tstartInteractiveSession(\n\t\tstream: ShellStream,\n\t\tauthUser: string,\n\t\tsessionId: string | null,\n\t\tremoteAddress: string,\n\t\tterminalSize: { cols: number; rows: number },\n\t): void {\n\t\tperf.mark(\"startInteractiveSession\");\n\t\t// Interactive shell logic\n\t\tthis.emit(\"session:start\", { user: authUser, sessionId, remoteAddress });\n\t\tstartShell(\n\t\t\tthis.properties,\n\t\t\tstream,\n\t\t\tauthUser,\n\t\t\tthis.hostname,\n\t\t\tsessionId,\n\t\t\tremoteAddress,\n\t\t\tterminalSize,\n\t\t\tthis,\n\t\t);\n\t\t// Refresh /proc/<pid> and /proc/self after session is registered\n\t\tthis.refreshProcSessions();\n\t}\n\n\t/**\n\t * Refreshes the `/proc` virtual filesystem with current system state.\n\t *\n\t * Updates `/proc/uptime`, `/proc/meminfo`, `/proc/cpuinfo`,\n\t * `/proc/version`, `/proc/loadavg`, `/proc/self`, and per-session\n\t * `/proc/<pid>` entries from live session and host data.\n\t *\n\t * Called automatically during `bootstrapLinuxRootfs`. Call again before\n\t * reading `/proc` files for up-to-date values.\n\t */\n\tpublic refreshProcFs(): void {\n\t\trefreshProc(\n\t\t\tthis.vfs,\n\t\t\tthis.properties,\n\t\t\tthis.hostname,\n\t\t\tthis.startTime,\n\t\t\tthis.users.listActiveSessions(),\n\t\t);\n\t}\n\n\t/**\n\t * Updates only the session-dependent `/proc` entries (`/proc/<pid>`,\n\t * `/proc/self`). Cheaper than a full `refreshProcFs()` \u2014 call this\n\t * whenever a session is registered or unregistered.\n\t */\n\tpublic refreshProcSessions(): void {\n\t\trefreshProc(\n\t\t\tthis.vfs,\n\t\t\tthis.properties,\n\t\t\tthis.hostname,\n\t\t\tthis.startTime,\n\t\t\tthis.users.listActiveSessions(),\n\t\t);\n\t}\n\n\t/**\n\t * Syncs `/etc/passwd`, `/etc/group`, and `/etc/shadow` from the current\n\t * `VirtualUserManager` state.\n\t *\n\t * Called automatically during `bootstrapLinuxRootfs`. Call again after\n\t * `users.addUser()`, `users.deleteUser()`, or `users.addSudoer()` to keep\n\t * the classic Unix credential files in sync with the user manager.\n\t */\n\tpublic syncPasswd(): void {\n\t\tsyncEtcPasswd(this.vfs, this.users);\n\t}\n\n\t/**\n\t * Returns virtual filesystem instance after server started.\n\t *\n\t * @returns VirtualFileSystem or null when not started.\n\t */\n\tpublic getVfs(): VirtualFileSystem | null {\n\t\treturn this?.vfs ?? null;\n\t}\n\n\t/**\n\t * Returns user manager instance after server started.\n\t *\n\t * @returns VirtualUserManager or null when not started.\n\t */\n\tpublic getUsers(): VirtualUserManager | null {\n\t\treturn this?.users ?? null;\n\t}\n\n\t/**\n\t * Returns hostname shown in prompts and idents.\n\t *\n\t * @returns Configured hostname label.\n\t */\n\tpublic getHostname(): string {\n\t\treturn this?.hostname;\n\t}\n\n\t/**\n\t * Writes a file on behalf of a user with quota enforcement.\n\t *\n\t * @param authUser User performing the write.\n\t * @param targetPath Destination path.\n\t * @param content File content.\n\t */\n\tpublic writeFileAsUser(\n\t\tauthUser: string,\n\t\ttargetPath: string,\n\t\tcontent: string | Buffer,\n\t): void {\n\t\tperf.mark(\"writeFileAsUser\");\n\t\tthis.users.assertWriteWithinQuota(authUser, targetPath, content);\n\t\tthis.vfs.writeFile(targetPath, content);\n\t}\n}\n\nexport { VirtualShell };\n", "import type { ShellModule } from \"../types/commands\";\n\n/**\n * Add a new user to the virtual user database.\n * @category users\n * @params [\"<username> <password>\"]\n * @returns ShellModule\n */\nexport const adduserCommand: ShellModule = {\n\tname: \"adduser\",\n\tdescription: \"Add a new user\",\n\tcategory: \"users\",\n\tparams: [\"<username> <password>\"],\n\trun: async ({ authUser, shell, args }) => {\n\t\tif (authUser !== \"root\") {\n\t\t\treturn { stderr: \"adduser: permission denied\", exitCode: 1 };\n\t\t}\n\n\t\tconst [username, password] = args;\n\t\tif (!username || !password) {\n\t\t\treturn {\n\t\t\t\tstderr: \"adduser: usage: adduser <username> <password>\",\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\n\t\tawait shell.users.addUser(username, password);\n\t\treturn { stdout: `adduser: user '${username}' created`, exitCode: 0 };\n\t},\n};\n", "type ArgParseOptions = {\n\tflags?: string[];\n\tflagsWithValue?: string[];\n};\n\nfunction toFlagList(flags: string | string[]): string[] {\n\treturn Array.isArray(flags) ? flags : [flags];\n}\n\nfunction matchFlagToken(\n\ttoken: string,\n\tflag: string,\n): { matched: boolean; inlineValue: string | null } {\n\tif (token === flag) {\n\t\treturn { matched: true, inlineValue: null };\n\t}\n\n\tconst prefix = `${flag}=`;\n\tif (token.startsWith(prefix)) {\n\t\treturn { matched: true, inlineValue: token.slice(prefix.length) };\n\t}\n\n\treturn { matched: false, inlineValue: null };\n}\n\nfunction collectPositionals(\n\targs: string[],\n\toptions: ArgParseOptions = {},\n): string[] {\n\tconst boolFlags = new Set(options.flags ?? []);\n\tconst valueFlags = new Set(options.flagsWithValue ?? []);\n\tconst positionals: string[] = [];\n\tlet passthrough = false;\n\n\tfor (let index = 0; index < args.length; index += 1) {\n\t\tconst arg = args[index]!;\n\n\t\tif (passthrough) {\n\t\t\tpositionals.push(arg);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === \"--\") {\n\t\t\tpassthrough = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet consumed = false;\n\n\t\tfor (const flag of boolFlags) {\n\t\t\tconst { matched } = matchFlagToken(arg, flag);\n\t\t\tif (matched) {\n\t\t\t\tconsumed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (consumed) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const flag of valueFlags) {\n\t\t\tconst match = matchFlagToken(arg, flag);\n\t\t\tif (!match.matched) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconsumed = true;\n\t\t\tif (match.inlineValue === null && index + 1 < args.length) {\n\t\t\t\tindex += 1;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tif (!consumed) {\n\t\t\tpositionals.push(arg);\n\t\t}\n\t}\n\n\treturn positionals;\n}\n\n/**\n * Returns `true` when any of the given flags appear in `args`.\n *\n * Matches both standalone tokens (`-s`, `--silent`) and inline forms\n * (`--output=file`). Useful for simple boolean flag checks inside command\n * `run` handlers.\n *\n * @param args Tokenized argument array from `CommandContext.args`.\n * @param flags Single flag string or array of equivalent flag strings.\n * @returns `true` if at least one flag is present, otherwise `false`.\n *\n * @example\n * ```ts\n * ifFlag(args, \"-r\") // single flag\n * ifFlag(args, [\"-r\", \"--recursive\"]) // aliases\n * ```\n */\nexport function ifFlag(args: string[], flags: string | string[]): boolean {\n\tconst allFlags = toFlagList(flags);\n\n\tfor (const arg of args) {\n\t\tfor (const flag of allFlags) {\n\t\t\tif (matchFlagToken(arg, flag).matched) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Returns the value associated with a flag, or `true` if the flag is present\n * but has no associated value, or `undefined` if the flag is absent.\n *\n * Handles three forms:\n * - `--output file` \u2192 returns `\"file\"` (next token)\n * - `--output=file` \u2192 returns `\"file\"` (inline `=` form)\n * - `--verbose` \u2192 returns `true` (flag with no value)\n *\n * @param args Tokenized argument array from `CommandContext.args`.\n * @param flags Single flag string or array of equivalent flag strings.\n * @returns The flag value string, `true` when valueless, or `undefined`.\n *\n * @example\n * ```ts\n * const output = getFlag(args, [\"-o\", \"--output\"]);\n * if (typeof output === \"string\") { /* use path *\\/ }\n * ```\n */\nexport function getFlag(\n\targs: string[],\n\tflags: string | string[],\n): string | true | undefined {\n\tconst allFlags = toFlagList(flags);\n\n\tfor (let index = 0; index < args.length; index += 1) {\n\t\tconst arg = args[index]!;\n\n\t\tfor (const flag of allFlags) {\n\t\t\tconst match = matchFlagToken(arg, flag);\n\t\t\tif (!match.matched) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (match.inlineValue !== null) {\n\t\t\t\treturn match.inlineValue;\n\t\t\t}\n\n\t\t\tconst next = args[index + 1];\n\t\t\tif (next !== undefined && next !== \"--\") {\n\t\t\t\treturn next;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Returns the positional argument at the given zero-based index, skipping\n * known flags and their values.\n *\n * Flags declared in `options.flags` are treated as boolean and skipped.\n * Flags declared in `options.flagsWithValue` consume the next token too.\n * Tokens after `--` are always treated as positionals.\n *\n * @param args Tokenized argument array from `CommandContext.args`.\n * @param index Zero-based positional index to retrieve.\n * @param options Optional flag declarations to skip during positional collection.\n * @returns The positional value, or `undefined` if the index is out of range.\n *\n * @example\n * ```ts\n * // args = [\"-r\", \"src\", \"dest\"]\n * getArg(args, 0, { flags: [\"-r\"] }) // \"src\"\n * getArg(args, 1, { flags: [\"-r\"] }) // \"dest\"\n * ```\n */\nexport function getArg(\n\targs: string[],\n\tindex: number,\n\toptions: ArgParseOptions = {},\n): string | undefined {\n\tconst positionals = collectPositionals(args, options);\n\treturn positionals[index];\n}\n\n/**\n * Parses an argument array into structured flags, flag values, and positionals.\n *\n * - `options.flags` \u2014 boolean flags (e.g. `[\"-r\", \"--recursive\"]`); collected\n * into a `Set<string>` and not treated as positionals.\n * - `options.flagsWithValue` \u2014 flags that consume the next token or an inline\n * `=value`; collected into a `Map<string, string>`.\n * - All remaining tokens are positionals.\n * - Tokens after `--` are always positionals, regardless of `-` prefix.\n *\n * @param args Tokenized argument array from `CommandContext.args`.\n * @param options Flag declaration lists.\n * @returns `{ flags, flagsWithValues, positionals }`.\n *\n * @example\n * ```ts\n * const { flags, flagsWithValues, positionals } = parseArgs(args, {\n * flags: [\"-r\", \"--recursive\"],\n * flagsWithValue: [\"-o\", \"--output\"],\n * });\n * const recursive = flags.has(\"-r\");\n * const output = flagsWithValues.get(\"-o\");\n * ```\n */\nexport function parseArgs(\n\targs: string[],\n\toptions: { flags?: string[]; flagsWithValue?: string[] } = {},\n): {\n\tflags: Set<string>;\n\tflagsWithValues: Map<string, string>;\n\tpositionals: string[];\n} {\n\tconst flags = new Set<string>();\n\tconst flagsWithValues = new Map<string, string>();\n\tconst positionals: string[] = [];\n\tconst boolFlags = new Set(options.flags ?? []);\n\tconst valueFlags = new Set(options.flagsWithValue ?? []);\n\tlet passthrough = false;\n\n\tfor (let index = 0; index < args.length; index += 1) {\n\t\tconst arg = args[index]!;\n\n\t\tif (passthrough) {\n\t\t\tpositionals.push(arg);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === \"--\") {\n\t\t\tpassthrough = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (boolFlags.has(arg)) {\n\t\t\tflags.add(arg);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (valueFlags.has(arg)) {\n\t\t\tconst next = args[index + 1];\n\t\t\tif (next && !next.startsWith(\"-\")) {\n\t\t\t\tflagsWithValues.set(arg, next);\n\t\t\t\tindex += 1;\n\t\t\t} else {\n\t\t\t\tflagsWithValues.set(arg, \"\");\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst inlineFlag = Array.from(valueFlags).find((flag) =>\n\t\t\targ.startsWith(`${flag}=`),\n\t\t);\n\t\tif (inlineFlag) {\n\t\t\tflagsWithValues.set(inlineFlag, arg.slice(inlineFlag.length + 1));\n\t\t\tcontinue;\n\t\t}\n\n\t\tpositionals.push(arg);\n\t}\n\n\treturn { flags, flagsWithValues, positionals };\n}\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n/**\n * Manage shell aliases (list / set / remove).\n * @category shell\n * @params [\"[name[=value] ...]\"]\n */\nexport const aliasCommand: ShellModule = {\n\tname: \"alias\",\n\tdescription: \"Define or display aliases\",\n\tcategory: \"shell\",\n\tparams: [\"[name[=value] ...]\"],\n\trun: ({ args, env }) => {\n\t\tif (!env) return { exitCode: 0 };\n\n\t\t// Aliases stored in env.vars under prefix __alias_\n\t\tif (args.length === 0) {\n\t\t\tconst aliases = Object.entries(env.vars)\n\t\t\t\t.filter(([k]) => k.startsWith(\"__alias_\"))\n\t\t\t\t.map(([k, v]) => `alias ${k.slice(\"__alias_\".length)}='${v}'`);\n\t\t\treturn { stdout: aliases.join(\"\\n\") || \"\", exitCode: 0 };\n\t\t}\n\n\t\tconst lines: string[] = [];\n\t\tfor (const arg of args) {\n\t\t\tconst eq = arg.indexOf(\"=\");\n\t\t\tif (eq === -1) {\n\t\t\t\t// Display single alias\n\t\t\t\tconst val = env.vars[`__alias_${arg}`];\n\t\t\t\tif (val) lines.push(`alias ${arg}='${val}'`);\n\t\t\t\telse return { stderr: `alias: ${arg}: not found`, exitCode: 1 };\n\t\t\t} else {\n\t\t\t\t// Set alias\n\t\t\t\tconst name = arg.slice(0, eq);\n\t\t\t\tconst val = arg.slice(eq + 1).replace(/^['\"]|['\"]$/g, \"\");\n\t\t\t\tenv.vars[`__alias_${name}`] = val;\n\t\t\t}\n\t\t}\n\n\t\treturn { stdout: lines.join(\"\\n\") || undefined, exitCode: 0 };\n\t},\n};\n\nexport const unaliasCommand: ShellModule = {\n\tname: \"unalias\",\n\tdescription: \"Remove alias definitions\",\n\tcategory: \"shell\",\n\tparams: [\"<name...> | -a\"],\n\trun: ({ args, env }) => {\n\t\tif (!env) return { exitCode: 0 };\n\n\t\tif (ifFlag(args, [\"-a\"])) {\n\t\t\tfor (const k of Object.keys(env.vars)) {\n\t\t\t\tif (k.startsWith(\"__alias_\")) delete env.vars[k];\n\t\t\t}\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\tfor (const name of args) {\n\t\t\tdelete env.vars[`__alias_${name}`];\n\t\t}\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import { spawn } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport type VirtualFileSystem from \"../VirtualFileSystem\";\nimport type { VirtualPackageManager } from \"../VirtualPackageManager\";\nimport type { VirtualShell } from \"../VirtualShell\";\n\nconst PROTECTED_PREFIXES = [\"/virtual-env-js/.auth\"] as const;\n\nfunction normalizeFetchUrl(input: string): string {\n\tif (/^[a-zA-Z][a-zA-Z\\d+\\-.]*:/.test(input)) {\n\t\treturn input;\n\t}\n\n\treturn `http://${input}`;\n}\n\nexport function normalizeTerminalOutput(text: string): string {\n\treturn text\n\t\t.replace(/\\r\\n/g, \"\\n\")\n\t\t.replace(/\\r/g, \"\\n\")\n\t\t.replace(/\\t/g, \" \")\n\t\t.split(\"\\n\")\n\t\t.map((line) =>\n\t\t\tline.replace(/^[ \\u00A0]{8,}/, \" \").replace(/[ \\u00A0]{3,}/g, \" \"),\n\t\t)\n\t\t.join(\"\\n\")\n\t\t.replace(/\\n{3,}/g, \"\\n\\n\")\n\t\t.trimEnd();\n}\n\nexport function resolvePath(cwd: string, inputPath: string): string {\n\tif (!inputPath || inputPath.trim() === \"\") {\n\t\treturn cwd;\n\t}\n\treturn inputPath.startsWith(\"/\")\n\t\t? path.posix.normalize(inputPath)\n\t\t: path.posix.normalize(path.posix.join(cwd, inputPath));\n}\n\nfunction isProtectedPath(targetPath: string): boolean {\n\tconst normalized = targetPath.startsWith(\"/\")\n\t\t? path.posix.normalize(targetPath)\n\t\t: path.posix.normalize(`/${targetPath}`);\n\n\treturn PROTECTED_PREFIXES.some(\n\t\t(prefix) => normalized === prefix || normalized.startsWith(`${prefix}/`),\n\t);\n}\n\nexport function assertPathAccess(\n\tauthUser: string,\n\ttargetPath: string,\n\toperation: string,\n): void {\n\tif (authUser === \"root\") {\n\t\treturn;\n\t}\n\n\tif (isProtectedPath(targetPath)) {\n\t\tthrow new Error(`${operation}: permission denied: ${targetPath}`);\n\t}\n}\n\nexport function stripUrlFilename(url: string): string {\n\tconst cleaned = url.split(\"?\")[0]?.split(\"#\")[0] ?? url;\n\tconst lastPart = cleaned.split(\"/\").filter(Boolean).pop();\n\treturn lastPart && lastPart.length > 0 ? lastPart : \"index.html\";\n}\n\nexport async function fetchResource(\n\turl: string,\n): Promise<{ text: string; status: number; contentType: string | null }> {\n\tconst response = await fetch(normalizeFetchUrl(url));\n\tconst contentType = response.headers.get(\"content-type\");\n\treturn {\n\t\ttext: await response.text(),\n\t\tstatus: response.status,\n\t\tcontentType,\n\t};\n}\n\n/**\n * Run a host command like curl or wget and capture its output.\n * @param binary - The binary to execute (e.g., \"curl\", \"wget\").\n * @param args - Arguments to pass to the binary.\n * @returns Promise resolving with stdout, stderr, and exit code.\n */\nexport function runHostCommand(\n\tbinary: string,\n\targs: string[],\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n\treturn new Promise((resolve) => {\n\t\tlet childProcess: ReturnType<typeof spawn>;\n\n\t\ttry {\n\t\t\tchildProcess = spawn(binary, args, {\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tresolve({\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: `${binary}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\texitCode: 1,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tconst stdoutStream = childProcess.stdout;\n\t\tconst stderrStream = childProcess.stderr;\n\n\t\tif (!stdoutStream || !stderrStream) {\n\t\t\tresolve({\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: `${binary}: failed to capture process output`,\n\t\t\t\texitCode: 1,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tstdoutStream.setEncoding(\"utf8\");\n\t\tstderrStream.setEncoding(\"utf8\");\n\n\t\tstdoutStream.on(\"data\", (chunk: string) => {\n\t\t\tstdout += chunk;\n\t\t});\n\n\t\tstderrStream.on(\"data\", (chunk: string) => {\n\t\t\tstderr += chunk;\n\t\t});\n\n\t\tchildProcess.on(\"error\", (error) => {\n\t\t\tconst errorCode =\n\t\t\t\terror instanceof Error && \"code\" in error\n\t\t\t\t\t? String((error as NodeJS.ErrnoException).code ?? \"\")\n\t\t\t\t\t: \"\";\n\t\t\tresolve({\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: `${binary}: ${error.message}`,\n\t\t\t\texitCode: errorCode === \"ENOENT\" ? 127 : 1,\n\t\t\t});\n\t\t});\n\n\t\tchildProcess.on(\"close\", (code) => {\n\t\t\tresolve({\n\t\t\t\tstdout,\n\t\t\t\tstderr,\n\t\t\t\texitCode: code ?? 1,\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction levenshtein(a: string, b: string): number {\n\tconst dp: number[][] = Array.from({ length: a.length + 1 }, () =>\n\t\tArray<number>(b.length + 1).fill(0),\n\t);\n\n\tfor (let i = 0; i <= a.length; i += 1) {\n\t\tdp[i]![0] = i;\n\t}\n\tfor (let j = 0; j <= b.length; j += 1) {\n\t\tdp[0]![j] = j;\n\t}\n\n\tfor (let i = 1; i <= a.length; i += 1) {\n\t\tfor (let j = 1; j <= b.length; j += 1) {\n\t\t\tconst cost = a[i - 1] === b[j - 1] ? 0 : 1;\n\t\t\tdp[i]![j] = Math.min(\n\t\t\t\tdp[i - 1]![j]! + 1,\n\t\t\t\tdp[i]![j - 1]! + 1,\n\t\t\t\tdp[i - 1]![j - 1]! + cost,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn dp[a.length]![b.length]!;\n}\n\nexport function resolveReadablePath(\n\tvfs: VirtualFileSystem,\n\tcwd: string,\n\tinputPath: string,\n): string {\n\tconst exactPath = resolvePath(cwd, inputPath);\n\tif (vfs.exists(exactPath)) {\n\t\treturn exactPath;\n\t}\n\n\tconst parent = path.posix.dirname(exactPath);\n\tconst fileName = path.posix.basename(exactPath);\n\tconst siblings = vfs.list(parent);\n\n\tconst caseInsensitive = siblings.filter(\n\t\t(name) => name.toLowerCase() === fileName.toLowerCase(),\n\t);\n\tif (caseInsensitive.length === 1) {\n\t\treturn path.posix.join(parent, caseInsensitive[0]!);\n\t}\n\n\tconst near = siblings.filter(\n\t\t(name) => levenshtein(name.toLowerCase(), fileName.toLowerCase()) <= 1,\n\t);\n\tif (near.length === 1) {\n\t\treturn path.posix.join(parent, near[0]!);\n\t}\n\n\treturn exactPath;\n}\n\nexport function joinListWithType(\n\tcwd: string,\n\titems: string[],\n\tstatAt: (p: string) => { type: \"file\" | \"directory\" },\n): string {\n\treturn items\n\t\t.map((name) => {\n\t\t\tconst childPath = resolvePath(cwd, name);\n\t\t\tconst stats = statAt(childPath);\n\t\t\treturn stats.type === \"directory\" ? `${name}/` : name;\n\t\t})\n\t\t.join(\" \");\n}\n\nexport function getPackageManager(\n\tshell: VirtualShell,\n): VirtualPackageManager | undefined {\n\treturn shell.packageManager;\n}\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { getPackageManager } from \"./helpers\";\n\n/**\n * APT package manager front-end (simulated).\n * @category package\n * @params [\"<install|remove|update|upgrade|search|show|list> [pkg...]\"]\n */\nexport const aptCommand: ShellModule = {\n\tname: \"apt\",\n\taliases: [\"apt-get\"],\n\tdescription: \"Package manager\",\n\tcategory: \"package\",\n\tparams: [\"<install|remove|update|upgrade|search|show|list> [pkg...]\"],\n\trun: ({ args, shell, authUser }) => {\n\t\tconst pm = getPackageManager(shell);\n\t\tif (!pm)\n\t\t\treturn { stderr: \"apt: package manager not initialised\", exitCode: 1 };\n\n\t\tconst sub = args[0]?.toLowerCase();\n\t\tconst rest = args.slice(1);\n\n\t\tconst quiet = ifFlag(rest, [\"-q\", \"--quiet\", \"-qq\"]);\n\t\tconst purge = ifFlag(rest, [\"--purge\"]);\n\t\tconst pkgs = rest.filter((a) => !a.startsWith(\"-\"));\n\n\t\t// Non-root check\n\t\tconst restricted = [\"install\", \"remove\", \"purge\", \"upgrade\", \"update\"];\n\t\tif (restricted.includes(sub ?? \"\") && authUser !== \"root\") {\n\t\t\treturn {\n\t\t\t\tstderr:\n\t\t\t\t\t\"E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)\\nE: Unable to acquire the dpkg frontend lock, are you root?\",\n\t\t\t\texitCode: 100,\n\t\t\t};\n\t\t}\n\n\t\tswitch (sub) {\n\t\t\tcase \"install\": {\n\t\t\t\tif (pkgs.length === 0)\n\t\t\t\t\treturn { stderr: \"apt: no packages specified\", exitCode: 1 };\n\t\t\t\tconst { output, exitCode } = pm.install(pkgs, { quiet });\n\t\t\t\treturn { stdout: output || undefined, exitCode };\n\t\t\t}\n\n\t\t\tcase \"remove\":\n\t\t\tcase \"purge\": {\n\t\t\t\tif (pkgs.length === 0)\n\t\t\t\t\treturn { stderr: \"apt: no packages specified\", exitCode: 1 };\n\t\t\t\tconst { output, exitCode } = pm.remove(pkgs, {\n\t\t\t\t\tpurge: sub === \"purge\" || purge,\n\t\t\t\t\tquiet,\n\t\t\t\t});\n\t\t\t\treturn { stdout: output || undefined, exitCode };\n\t\t\t}\n\n\t\t\tcase \"update\": {\n\t\t\t\treturn {\n\t\t\t\t\tstdout: [\n\t\t\t\t\t\t\"Hit:1 fortune://packages.fortune.local aurora InRelease\",\n\t\t\t\t\t\t\"Hit:2 fortune://security.fortune.local aurora-security InRelease\",\n\t\t\t\t\t\t\"Reading package lists... Done\",\n\t\t\t\t\t\t\"Building dependency tree... Done\",\n\t\t\t\t\t\t\"Reading state information... Done\",\n\t\t\t\t\t\t`All packages are up to date.`,\n\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"upgrade\": {\n\t\t\t\treturn {\n\t\t\t\t\tstdout: [\n\t\t\t\t\t\t\"Reading package lists... Done\",\n\t\t\t\t\t\t\"Building dependency tree... Done\",\n\t\t\t\t\t\t\"Reading state information... Done\",\n\t\t\t\t\t\t\"Calculating upgrade... Done\",\n\t\t\t\t\t\t\"0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\",\n\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"search\": {\n\t\t\t\tconst term = pkgs[0];\n\t\t\t\tif (!term)\n\t\t\t\t\treturn { stderr: \"apt: search requires a term\", exitCode: 1 };\n\t\t\t\tconst results = pm.search(term);\n\t\t\t\tif (results.length === 0)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstdout: `Sorting... Done\\nFull Text Search... Done\\n(no results)`,\n\t\t\t\t\t\texitCode: 0,\n\t\t\t\t\t};\n\t\t\t\tconst lines = results.map(\n\t\t\t\t\t(p) =>\n\t\t\t\t\t\t`${p.name}/${p.section ?? \"misc\"} ${p.version} amd64\\n ${p.shortDesc ?? p.description}`,\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tstdout: `Sorting... Done\\nFull Text Search... Done\\n${lines.join(\"\\n\")}`,\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"show\": {\n\t\t\t\tconst name = pkgs[0];\n\t\t\t\tif (!name)\n\t\t\t\t\treturn { stderr: \"apt: show requires a package name\", exitCode: 1 };\n\t\t\t\tconst info = pm.show(name);\n\t\t\t\tif (!info)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstderr: `N: Unable to locate package ${name}`,\n\t\t\t\t\t\texitCode: 100,\n\t\t\t\t\t};\n\t\t\t\treturn { stdout: info, exitCode: 0 };\n\t\t\t}\n\n\t\t\tcase \"list\": {\n\t\t\t\tconst installedFlag = ifFlag(rest, [\"--installed\"]);\n\t\t\t\tif (installedFlag) {\n\t\t\t\t\tconst pkgList = pm.listInstalled();\n\t\t\t\t\tif (pkgList.length === 0)\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstdout: \"Listing... Done\\n(no packages installed)\",\n\t\t\t\t\t\t\texitCode: 0,\n\t\t\t\t\t\t};\n\t\t\t\t\tconst lines = pkgList.map(\n\t\t\t\t\t\t(p) =>\n\t\t\t\t\t\t\t`${p.name}/${p.section} ${p.version} ${p.architecture} [installed]`,\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstdout: `Listing... Done\\n${lines.join(\"\\n\")}`,\n\t\t\t\t\t\texitCode: 0,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// all available\n\t\t\t\tconst all = pm.listAvailable();\n\t\t\t\tconst lines = all.map(\n\t\t\t\t\t(p) => `${p.name}/${p.section ?? \"misc\"} ${p.version} amd64`,\n\t\t\t\t);\n\t\t\t\treturn { stdout: `Listing... Done\\n${lines.join(\"\\n\")}`, exitCode: 0 };\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\treturn {\n\t\t\t\t\tstdout: [\n\t\t\t\t\t\t\"Usage: apt [options] command\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"Commands:\",\n\t\t\t\t\t\t\" install <pkg...> Install packages\",\n\t\t\t\t\t\t\" remove <pkg...> Remove packages\",\n\t\t\t\t\t\t\" purge <pkg...> Remove packages and config files\",\n\t\t\t\t\t\t\" update Refresh package index\",\n\t\t\t\t\t\t\" upgrade Upgrade all packages\",\n\t\t\t\t\t\t\" search <term> Search in package descriptions\",\n\t\t\t\t\t\t\" show <pkg> Show package details\",\n\t\t\t\t\t\t\" list [--installed] List packages\",\n\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport const aptCacheCommand: ShellModule = {\n\tname: \"apt-cache\",\n\tdescription: \"Query the package cache\",\n\tcategory: \"package\",\n\tparams: [\"<search|show|policy> [pkg]\"],\n\trun: ({ args, shell }) => {\n\t\tconst pm = getPackageManager(shell);\n\t\tif (!pm)\n\t\t\treturn {\n\t\t\t\tstderr: \"apt-cache: package manager not initialised\",\n\t\t\t\texitCode: 1,\n\t\t\t};\n\n\t\tconst sub = args[0]?.toLowerCase();\n\t\tconst pkgName = args[1];\n\n\t\tswitch (sub) {\n\t\t\tcase \"search\": {\n\t\t\t\tif (!pkgName) return { stderr: \"Need a search term\", exitCode: 1 };\n\t\t\t\tconst results = pm.search(pkgName);\n\t\t\t\treturn {\n\t\t\t\t\tstdout:\n\t\t\t\t\t\tresults\n\t\t\t\t\t\t\t.map((p) => `${p.name} - ${p.shortDesc ?? p.description}`)\n\t\t\t\t\t\t\t.join(\"\\n\") || \"(no results)\",\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase \"show\": {\n\t\t\t\tif (!pkgName) return { stderr: \"Need a package name\", exitCode: 1 };\n\t\t\t\tconst info = pm.show(pkgName);\n\t\t\t\treturn info\n\t\t\t\t\t? { stdout: info, exitCode: 0 }\n\t\t\t\t\t: { stderr: `N: Unable to locate package ${pkgName}`, exitCode: 100 };\n\t\t\t}\n\t\t\tcase \"policy\": {\n\t\t\t\tif (!pkgName) return { stderr: \"Need a package name\", exitCode: 1 };\n\t\t\t\tconst def = pm.findInRegistry(pkgName);\n\t\t\t\tif (!def)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstderr: `N: Unable to locate package ${pkgName}`,\n\t\t\t\t\t\texitCode: 100,\n\t\t\t\t\t};\n\t\t\t\tconst inst = pm.isInstalled(pkgName);\n\t\t\t\treturn {\n\t\t\t\t\tstdout: [\n\t\t\t\t\t\t`${pkgName}:`,\n\t\t\t\t\t\t` Installed: ${inst ? def.version : \"(none)\"}`,\n\t\t\t\t\t\t` Candidate: ${def.version}`,\n\t\t\t\t\t\t` Version table:`,\n\t\t\t\t\t\t` ${def.version} 500`,\n\t\t\t\t\t\t` 500 fortune://packages.fortune.local aurora/main amd64 Packages`,\n\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `apt-cache: unknown command '${sub ?? \"\"}'`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t}\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getFlag } from \"./command-helpers\";\n\n/**\n * Minimal `awk`-like pattern scanner (supports simple print patterns).\n * @category text\n * @params [\"[-F <sep>] '<program>' [file]\"]\n *\n * Supported program patterns:\n * - `print $N` (e.g. `print $1`, `print $2, $3`, `print $0`)\n * - `{print $N}` (e.g. `{print $1}`, `{print $2, $3}`, `{print $0}`)\n *\n * The field separator can be set with `-F` (default is space, which splits on any whitespace).\n */\nexport const awkCommand: ShellModule = {\n\tname: \"awk\",\n\tdescription: \"Pattern scanning and processing language (minimal)\",\n\tcategory: \"text\",\n\tparams: [\"[-F <sep>] '<program>' [file]\"],\n\trun: ({ args, stdin }) => {\n\t\tconst sep = (getFlag(args, [\"-F\"]) as string | undefined) ?? \" \";\n\t\tconst prog = args.find((a) => !a.startsWith(\"-\") && a !== sep);\n\t\tif (!prog) return { stderr: \"awk: no program\", exitCode: 1 };\n\n\t\t// Only support print $N and {print $N} patterns\n\t\tconst printMatch = prog.match(/^\\{?\\s*print\\s+([^}]+)\\s*\\}?$/);\n\t\tif (!printMatch)\n\t\t\treturn { stderr: `awk: unsupported program: ${prog}`, exitCode: 1 };\n\n\t\tconst fields = printMatch[1]!.split(/\\s*,\\s*/).map((f) => f.trim());\n\t\tconst lines = (stdin ?? \"\").split(\"\\n\").filter(Boolean);\n\t\tconst out = lines.map((line) => {\n\t\t\tconst parts = line.split(sep === \" \" ? /\\s+/ : sep);\n\t\t\treturn fields\n\t\t\t\t.map((f) => {\n\t\t\t\t\tif (f === \"$0\") return line;\n\t\t\t\t\tconst n = parseInt(f.replace(\"$\", \"\"), 10);\n\t\t\t\t\treturn Number.isNaN(n) ? f.replace(/\"/g, \"\") : (parts[n - 1] ?? \"\");\n\t\t\t\t})\n\t\t\t\t.join(sep === \" \" ? \"\\t\" : sep);\n\t\t});\n\t\treturn { stdout: out.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n\n/**\n * Encode or decode base64 data.\n * @category text\n * @params [\"[-d] [file]\"]\n */\nexport const base64Command: ShellModule = {\n\tname: \"base64\",\n\tdescription: \"Encode/decode base64\",\n\tcategory: \"text\",\n\tparams: [\"[-d] [file]\"],\n\trun: ({ args, stdin }) => {\n\t\tconst decode = ifFlag(args, [\"-d\", \"--decode\"]);\n\t\tconst input = stdin ?? \"\";\n\t\tif (decode) {\n\t\t\ttry {\n\t\t\t\treturn {\n\t\t\t\t\tstdout: Buffer.from(input.trim(), \"base64\").toString(\"utf8\"),\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn { stderr: \"base64: invalid input\", exitCode: 1 };\n\t\t\t}\n\t\t}\n\t\treturn { stdout: Buffer.from(input).toString(\"base64\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { assertPathAccess, resolveReadablePath } from \"./helpers\";\n\n/**\n * Concatenate and print files to stdout.\n * @category files\n * @params [\"[-n] [-b] <file...>\"]\n */\nexport const catCommand: ShellModule = {\n\tname: \"cat\",\n\tdescription: \"Concatenate and print files\",\n\tcategory: \"files\",\n\tparams: [\"[-n] [-b] <file...>\"],\n\trun: ({ authUser, shell, cwd, args, stdin }) => {\n\t\tconst numberAll = ifFlag(args, [\"-n\", \"--number\"]);\n\t\tconst numberNonBlank = ifFlag(args, [\"-b\", \"--number-nonblank\"]);\n\t\tconst fileArgs = args.filter((a) => !a.startsWith(\"-\"));\n\n\t\tif (fileArgs.length === 0 && stdin !== undefined) {\n\t\t\treturn { stdout: stdin, exitCode: 0 };\n\t\t}\n\n\t\tif (fileArgs.length === 0) {\n\t\t\treturn { stderr: \"cat: missing file operand\", exitCode: 1 };\n\t\t}\n\n\t\tconst parts: string[] = [];\n\t\tfor (const fileArg of fileArgs) {\n\t\t\tconst target = resolveReadablePath(shell.vfs, cwd, fileArg);\n\t\t\tassertPathAccess(authUser, target, \"cat\");\n\t\t\tparts.push(shell.vfs.readFile(target));\n\t\t}\n\n\t\tconst combined = parts.join(\"\");\n\n\t\tif (!numberAll && !numberNonBlank) {\n\t\t\treturn { stdout: combined, exitCode: 0 };\n\t\t}\n\n\t\tlet lineNum = 1;\n\t\tconst numbered = combined\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => {\n\t\t\t\tif (numberNonBlank && line.trim() === \"\") return line;\n\t\t\t\treturn `${String(lineNum++).padStart(6)}\\t${line}`;\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\n\t\treturn { stdout: numbered, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\n/**\n * Change current working directory.\n * @category navigation\n * @params [\"[path]\"]\n */\nexport const cdCommand: ShellModule = {\n\tname: \"cd\",\n\tdescription: \"Change directory\",\n\tcategory: \"navigation\",\n\tparams: [\"[path]\"],\n\trun: ({ authUser, shell, cwd, args, mode }) => {\n\t\tconst target = resolvePath(cwd, args[0] ?? \"/virtual-env-js\");\n\t\tassertPathAccess(authUser, target, \"cd\");\n\t\tconst stats = shell.vfs.stat(target);\n\t\tif (stats.type !== \"directory\") {\n\t\t\treturn { stderr: `cd: not a directory: ${target}`, exitCode: 1 };\n\t\t}\n\n\t\tif (mode === \"exec\") {\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\treturn { nextCwd: target, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\n/**\n * Parse a symbolic chmod mode string (e.g. \"+x\", \"u+x\", \"go-w\", \"a+rx\")\n * and apply it to the existing mode bits.\n * Returns null if the string is not a valid symbolic mode.\n */\nfunction applySymbolicMode(existing: number, modeStr: string): number | null {\n\tconst pattern = /^([ugoa]*)([+\\-=])([rwx]*)$/;\n\tconst parts = modeStr.split(\",\");\n\tlet mode = existing;\n\tfor (const part of parts) {\n\t\tconst m = part.trim().match(pattern);\n\t\tif (!m) return null;\n\t\tconst [, who = \"a\", op, perms = \"\"] = m;\n\t\tconst targets = who === \"\" || who === \"a\" ? [\"u\", \"g\", \"o\"] : who.split(\"\");\n\t\tconst bits: Record<string, Record<string, number>> = {\n\t\t\tu: { r: 0o400, w: 0o200, x: 0o100 },\n\t\t\tg: { r: 0o040, w: 0o020, x: 0o010 },\n\t\t\to: { r: 0o004, w: 0o002, x: 0o001 },\n\t\t};\n\t\tfor (const t of targets) {\n\t\t\tfor (const p of perms.split(\"\")) {\n\t\t\t\tconst bit = bits[t]?.[p];\n\t\t\t\tif (bit === undefined) continue;\n\t\t\t\tif (op === \"+\") mode |= bit;\n\t\t\t\telse if (op === \"-\") mode &= ~bit;\n\t\t\t\telse if (op === \"=\") {\n\t\t\t\t\t// clear all bits for this target, then set requested\n\t\t\t\t\tconst mask = Object.values(bits[t] ?? {}).reduce((a, b) => a | b, 0);\n\t\t\t\t\tmode = (mode & ~mask) | bit;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn mode;\n}\n\n/**\n * Change file permissions (octal or symbolic).\n * @category files\n * @params [\"<mode> <file>\"]\n */\nexport const chmodCommand: ShellModule = {\n\tname: \"chmod\",\n\tdescription: \"Change file permissions\",\n\tcategory: \"files\",\n\tparams: [\"<mode> <file>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst [modeArg, fileArg] = args;\n\t\tif (!modeArg || !fileArg) {\n\t\t\treturn { stderr: \"chmod: missing operand\", exitCode: 1 };\n\t\t}\n\n\t\tconst filePath = resolvePath(cwd, fileArg);\n\t\ttry {\n\t\t\tassertPathAccess(authUser, filePath, \"chmod\");\n\t\t\tif (!shell.vfs.exists(filePath)) {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `chmod: ${fileArg}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t\tlet mode: number;\n\t\t\tconst octal = parseInt(modeArg, 8);\n\t\t\tif (!Number.isNaN(octal) && /^[0-7]+$/.test(modeArg)) {\n\t\t\t\tmode = octal;\n\t\t\t} else {\n\t\t\t\t// symbolic mode\n\t\t\t\tconst existing = shell.vfs.stat(filePath).mode;\n\t\t\t\tconst result = applySymbolicMode(existing, modeArg);\n\t\t\t\tif (result === null) {\n\t\t\t\t\treturn { stderr: `chmod: invalid mode: ${modeArg}`, exitCode: 1 };\n\t\t\t\t}\n\t\t\t\tmode = result;\n\t\t\t}\n\t\t\tshell.vfs.chmod(filePath, mode);\n\t\t\treturn { exitCode: 0 };\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\treturn { stderr: `chmod: ${msg}`, exitCode: 1 };\n\t\t}\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const clearCommand: ShellModule = {\n\tname: \"clear\",\n\tdescription: \"Clear the terminal screen\",\n\tcategory: \"shell\",\n\tparams: [],\n\t// clearScreen flag triggers \\x1b[2J\\x1b[H in the shell layer\n\trun: () => ({ clearScreen: true, stdout: \"\", exitCode: 0 }),\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\n/**\n * Copy files or directories inside the virtual filesystem.\n * @category files\n * @params [\"[-r] <source> <dest>\"]\n */\nexport const cpCommand: ShellModule = {\n\tname: \"cp\",\n\tdescription: \"Copy files or directories\",\n\tcategory: \"files\",\n\tparams: [\"[-r] <source> <dest>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst recursive = ifFlag(args, [\"-r\", \"-R\", \"--recursive\"]);\n\t\tconst positionals = args.filter((a) => !a.startsWith(\"-\"));\n\t\tconst [srcArg, destArg] = positionals;\n\n\t\tif (!srcArg || !destArg) {\n\t\t\treturn { stderr: \"cp: missing operand\", exitCode: 1 };\n\t\t}\n\n\t\tconst srcPath = resolvePath(cwd, srcArg);\n\t\tconst destPath = resolvePath(cwd, destArg);\n\n\t\ttry {\n\t\t\tassertPathAccess(authUser, srcPath, \"cp\");\n\t\t\tassertPathAccess(authUser, destPath, \"cp\");\n\n\t\t\tif (!shell.vfs.exists(srcPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `cp: ${srcArg}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst srcStat = shell.vfs.stat(srcPath);\n\n\t\t\tif (srcStat.type === \"directory\") {\n\t\t\t\tif (!recursive) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstderr: `cp: ${srcArg}: is a directory (use -r)`,\n\t\t\t\t\t\texitCode: 1,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst copyDir = (from: string, to: string) => {\n\t\t\t\t\tshell.vfs.mkdir(to, 0o755);\n\t\t\t\t\tfor (const entry of shell.vfs.list(from)) {\n\t\t\t\t\t\tconst fromEntry = `${from}/${entry}`;\n\t\t\t\t\t\tconst toEntry = `${to}/${entry}`;\n\t\t\t\t\t\tconst stat = shell.vfs.stat(fromEntry);\n\t\t\t\t\t\tif (stat.type === \"directory\") {\n\t\t\t\t\t\t\tcopyDir(fromEntry, toEntry);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst content = shell.vfs.readFileRaw(fromEntry);\n\t\t\t\t\t\t\tshell.writeFileAsUser(authUser, toEntry, content);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst finalDest =\n\t\t\t\t\tshell.vfs.exists(destPath) &&\n\t\t\t\t\tshell.vfs.stat(destPath).type === \"directory\"\n\t\t\t\t\t\t? `${destPath}/${srcArg.split(\"/\").pop()}`\n\t\t\t\t\t\t: destPath;\n\t\t\t\tcopyDir(srcPath, finalDest);\n\t\t\t} else {\n\t\t\t\tconst finalDest =\n\t\t\t\t\tshell.vfs.exists(destPath) &&\n\t\t\t\t\tshell.vfs.stat(destPath).type === \"directory\"\n\t\t\t\t\t\t? `${destPath}/${srcArg.split(\"/\").pop()}`\n\t\t\t\t\t\t: destPath;\n\t\t\t\tconst content = shell.vfs.readFileRaw(srcPath);\n\t\t\t\tshell.writeFileAsUser(authUser, finalDest, content);\n\t\t\t}\n\n\t\t\treturn { exitCode: 0 };\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\treturn { stderr: `cp: ${msg}`, exitCode: 1 };\n\t\t}\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag, parseArgs } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\n/**\n * HTTP client wrapper using `fetch()` semantics (virtual curl).\n * @category network\n * @params [\"[options] <url>\"]\n */\nexport const curlCommand: ShellModule = {\n\tname: \"curl\",\n\tdescription: \"Transfer data from or to a server (pure fetch)\",\n\tcategory: \"network\",\n\tparams: [\"[options] <url>\"],\n\trun: async ({ authUser, cwd, args, shell }) => {\n\t\tconst { flagsWithValues, positionals } = parseArgs(args, {\n\t\t\tflagsWithValue: [\n\t\t\t\t\"-o\",\n\t\t\t\t\"--output\",\n\t\t\t\t\"-X\",\n\t\t\t\t\"--request\",\n\t\t\t\t\"-d\",\n\t\t\t\t\"--data\",\n\t\t\t\t\"-H\",\n\t\t\t\t\"--header\",\n\t\t\t\t\"-u\",\n\t\t\t\t\"--user\",\n\t\t\t],\n\t\t});\n\n\t\tif (ifFlag(args, [\"--help\", \"-h\"])) {\n\t\t\treturn {\n\t\t\t\tstdout: [\n\t\t\t\t\t\"Usage: curl [options] <url>\",\n\t\t\t\t\t\" -o, --output <file> Write to file\",\n\t\t\t\t\t\" -X, --request <method> HTTP method\",\n\t\t\t\t\t\" -d, --data <data> POST data\",\n\t\t\t\t\t\" -H, --header <hdr> Extra header\",\n\t\t\t\t\t\" -s, --silent Silent mode\",\n\t\t\t\t\t\" -I, --head Fetch headers only\",\n\t\t\t\t\t\" -L, --location Follow redirects\",\n\t\t\t\t\t\" -v, --verbose Verbose\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst url = positionals[0];\n\t\tif (!url) return { stderr: \"curl: no URL specified\", exitCode: 1 };\n\n\t\tconst outputPath =\n\t\t\tflagsWithValues.get(\"-o\") ?? flagsWithValues.get(\"--output\") ?? null;\n\t\tconst method = (\n\t\t\tflagsWithValues.get(\"-X\") ??\n\t\t\tflagsWithValues.get(\"--request\") ??\n\t\t\t\"GET\"\n\t\t).toUpperCase();\n\t\tconst postData =\n\t\t\tflagsWithValues.get(\"-d\") ?? flagsWithValues.get(\"--data\") ?? null;\n\t\tconst headerRaw =\n\t\t\tflagsWithValues.get(\"-H\") ?? flagsWithValues.get(\"--header\") ?? null;\n\t\tconst silent = ifFlag(args, [\"-s\", \"--silent\"]);\n\t\tconst headOnly = ifFlag(args, [\"-I\", \"--head\"]);\n\t\tconst followRedirects = ifFlag(args, [\"-L\", \"--location\"]);\n\t\tconst verbose = ifFlag(args, [\"-v\", \"--verbose\"]);\n\n\t\tconst extraHeaders: Record<string, string> = {\n\t\t\t\"User-Agent\": \"curl/7.88.1\",\n\t\t};\n\t\tif (headerRaw) {\n\t\t\tconst idx = headerRaw.indexOf(\":\");\n\t\t\tif (idx !== -1)\n\t\t\t\textraHeaders[headerRaw.slice(0, idx).trim()] = headerRaw\n\t\t\t\t\t.slice(idx + 1)\n\t\t\t\t\t.trim();\n\t\t}\n\n\t\tconst finalMethod = postData && method === \"GET\" ? \"POST\" : method;\n\t\tconst fetchOpts: RequestInit = {\n\t\t\tmethod: finalMethod,\n\t\t\theaders: extraHeaders,\n\t\t\tredirect: followRedirects ? \"follow\" : \"manual\",\n\t\t};\n\t\tif (postData) {\n\t\t\textraHeaders[\"Content-Type\"] ??= \"application/x-www-form-urlencoded\";\n\t\t\tfetchOpts.body = postData;\n\t\t}\n\n\t\tconst stderrLines: string[] = [];\n\t\tif (verbose) {\n\t\t\tstderrLines.push(`* Trying ${url}...`, `* Connected`);\n\t\t\tstderrLines.push(\n\t\t\t\t`> ${finalMethod} / HTTP/1.1`,\n\t\t\t\t`> Host: ${new URL(url).host}`,\n\t\t\t);\n\t\t}\n\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await fetch(url, fetchOpts);\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\treturn {\n\t\t\t\tstderr: `curl: (6) Could not resolve host: ${msg}`,\n\t\t\t\texitCode: 6,\n\t\t\t};\n\t\t}\n\n\t\tif (verbose) {\n\t\t\tstderrLines.push(`< HTTP/1.1 ${response.status} ${response.statusText}`);\n\t\t}\n\n\t\tif (headOnly) {\n\t\t\tconst lines = [`HTTP/1.1 ${response.status} ${response.statusText}`];\n\t\t\tfor (const [k, v] of response.headers.entries()) lines.push(`${k}: ${v}`);\n\t\t\treturn { stdout: `${lines.join(\"\\r\\n\")}\\r\\n`, exitCode: 0 };\n\t\t}\n\n\t\tlet body: string;\n\t\ttry {\n\t\t\tbody = await response.text();\n\t\t} catch {\n\t\t\treturn { stderr: \"curl: failed to read response body\", exitCode: 1 };\n\t\t}\n\n\t\tif (outputPath) {\n\t\t\tconst target = resolvePath(cwd, outputPath);\n\t\t\tassertPathAccess(authUser, target, \"curl\");\n\t\t\tshell.writeFileAsUser(authUser, target, body);\n\t\t\tif (!silent)\n\t\t\t\tstderrLines.push(\n\t\t\t\t\t` % Total % Received\\n100 ${body.length} 100 ${body.length}`,\n\t\t\t\t);\n\t\t\treturn {\n\t\t\t\tstderr: stderrLines.join(\"\\n\") || undefined,\n\t\t\t\texitCode: response.ok ? 0 : 22,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstdout: body,\n\t\t\tstderr: stderrLines.length > 0 ? stderrLines.join(\"\\n\") : undefined,\n\t\t\texitCode: response.ok ? 0 : 22,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getFlag } from \"./command-helpers\";\n\n/**\n * Extract selected fields from each line of input.\n * @category text\n * @params [\"-d <delim> -f <fields> [file]\"]\n */\nexport const cutCommand: ShellModule = {\n\tname: \"cut\",\n\tdescription: \"Remove sections from lines\",\n\tcategory: \"text\",\n\tparams: [\"-d <delim> -f <fields> [file]\"],\n\trun: ({ args, stdin }) => {\n\t\tconst delim = (getFlag(args, [\"-d\"]) as string | undefined) ?? \"\\t\";\n\t\tconst fields = (getFlag(args, [\"-f\"]) as string | undefined) ?? \"1\";\n\t\tconst cols = fields.split(\",\").map((f) => {\n\t\t\tconst [a, b] = f.split(\"-\").map(Number);\n\t\t\treturn b !== undefined\n\t\t\t\t? { from: (a ?? 1) - 1, to: b - 1 }\n\t\t\t\t: { from: (a ?? 1) - 1, to: (a ?? 1) - 1 };\n\t\t});\n\t\tconst lines = (stdin ?? \"\").split(\"\\n\");\n\t\tconst out = lines.map((line) => {\n\t\t\tconst parts = line.split(delim);\n\t\t\tconst selected: string[] = [];\n\t\t\tfor (const col of cols) {\n\t\t\t\tfor (let i = col.from; i <= Math.min(col.to, parts.length - 1); i++) {\n\t\t\t\t\tselected.push(parts[i] ?? \"\");\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn selected.join(delim);\n\t\t});\n\t\treturn { stdout: out.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\n/**\n * Print the current date/time or a formatted representation.\n * @category system\n * @params [\"[+format]\"]\n */\nexport const dateCommand: ShellModule = {\n\tname: \"date\",\n\tdescription: \"Print current date and time\",\n\tcategory: \"system\",\n\tparams: [\"[+format]\"],\n\trun: ({ args }) => {\n\t\tconst now = new Date();\n\t\tconst fmt = args[0];\n\t\tif (fmt?.startsWith(\"+\")) {\n\t\t\tconst f = fmt\n\t\t\t\t.slice(1)\n\t\t\t\t.replace(\"%Y\", String(now.getFullYear()))\n\t\t\t\t.replace(\"%m\", String(now.getMonth() + 1).padStart(2, \"0\"))\n\t\t\t\t.replace(\"%d\", String(now.getDate()).padStart(2, \"0\"))\n\t\t\t\t.replace(\"%H\", String(now.getHours()).padStart(2, \"0\"))\n\t\t\t\t.replace(\"%M\", String(now.getMinutes()).padStart(2, \"0\"))\n\t\t\t\t.replace(\"%S\", String(now.getSeconds()).padStart(2, \"0\"))\n\t\t\t\t.replace(\"%s\", String(Math.floor(now.getTime() / 1000)));\n\t\t\treturn { stdout: f, exitCode: 0 };\n\t\t}\n\t\treturn { stdout: now.toString(), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n\nexport const declareCommand: ShellModule = {\n\tname: \"declare\",\n\taliases: [\"local\", \"typeset\"],\n\tdescription: \"Declare variables and give them attributes\",\n\tcategory: \"shell\",\n\tparams: [\"[-i] [-r] [-x] [-a] [name[=value]...]\"],\n\trun: ({ args, env }) => {\n\t\tif (!env) return { exitCode: 0 };\n\n\t\tconst integer = ifFlag(args, [\"-i\"]);\n\t\tconst _readonly = ifFlag(args, [\"-r\"]);\n\t\tconst _export_ = ifFlag(args, [\"-x\"]);\n\t\tconst printAll = args.filter((a) => !a.startsWith(\"-\")).length === 0;\n\n\t\tif (printAll) {\n\t\t\tconst lines = Object.entries(env.vars).map(\n\t\t\t\t([k, v]) => `declare -- ${k}=\"${v}\"`,\n\t\t\t);\n\t\t\treturn { stdout: lines.join(\"\\n\"), exitCode: 0 };\n\t\t}\n\n\t\tconst assignments = args.filter((a) => !a.startsWith(\"-\"));\n\t\tfor (const token of assignments) {\n\t\t\tconst eq = token.indexOf(\"=\");\n\t\t\tif (eq === -1) {\n\t\t\t\t// Just declare (no value)\n\t\t\t\tif (!(token in env.vars)) env.vars[token] = \"\";\n\t\t\t} else {\n\t\t\t\tconst name = token.slice(0, eq);\n\t\t\t\tlet val = token.slice(eq + 1);\n\t\t\t\tif (integer) {\n\t\t\t\t\tconst n = parseInt(val, 10);\n\t\t\t\t\tval = Number.isNaN(n) ? \"0\" : String(n);\n\t\t\t\t}\n\t\t\t\tenv.vars[name] = val;\n\t\t\t}\n\t\t}\n\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const deluserCommand: ShellModule = {\n\tname: \"deluser\",\n\tdescription: \"Delete a user\",\n\tcategory: \"users\",\n\tparams: [\"<username>\"],\n\trun: async ({ authUser, args, shell }) => {\n\t\tif (authUser !== \"root\") {\n\t\t\treturn { stderr: \"deluser: permission denied\", exitCode: 1 };\n\t\t}\n\n\t\tconst [username] = args;\n\t\tif (!username) {\n\t\t\treturn { stderr: \"deluser: usage: deluser <username>\", exitCode: 1 };\n\t\t}\n\n\t\tawait shell.users.deleteUser(username);\n\t\treturn { stdout: `deluser: user '${username}' deleted`, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const dfCommand: ShellModule = {\n\tname: \"df\",\n\tdescription: \"Report filesystem disk space usage\",\n\tcategory: \"system\",\n\tparams: [\"[-h]\"],\n\trun: ({ shell }) => {\n\t\tconst bytes = shell.vfs.getUsageBytes();\n\t\tconst used = (bytes / 1024).toFixed(0);\n\t\tconst total = \"1048576\"; // 1GB virtual\n\t\tconst avail = String(Number(total) - Number(used));\n\t\tconst pct = Math.round((Number(used) / Number(total)) * 100);\n\t\tconst hdr = \"Filesystem 1K-blocks Used Available Use% Mounted on\";\n\t\tconst row = `virtual-fs ${total.padStart(9)} ${used.padStart(7)} ${avail.padStart(9)} ${pct}% /`;\n\t\treturn { stdout: `${hdr}\\n${row}`, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { resolvePath } from \"./helpers\";\n\n/**\n * Compare files line-by-line and print differing lines.\n * @category text\n * @params [\"<file1> <file2>\"]\n */\nexport const diffCommand: ShellModule = {\n\tname: \"diff\",\n\tdescription: \"Compare files line by line\",\n\tcategory: \"text\",\n\tparams: [\"<file1> <file2>\"],\n\trun: ({ shell, cwd, args }) => {\n\t\tconst [f1, f2] = args;\n\t\tif (!f1 || !f2) return { stderr: \"diff: missing operand\", exitCode: 1 };\n\t\tconst p1 = resolvePath(cwd, f1);\n\t\tconst p2 = resolvePath(cwd, f2);\n\t\tlet a: string[], b: string[];\n\t\ttry {\n\t\t\ta = shell.vfs.readFile(p1).split(\"\\n\");\n\t\t} catch {\n\t\t\treturn { stderr: `diff: ${f1}: No such file or directory`, exitCode: 2 };\n\t\t}\n\t\ttry {\n\t\t\tb = shell.vfs.readFile(p2).split(\"\\n\");\n\t\t} catch {\n\t\t\treturn { stderr: `diff: ${f2}: No such file or directory`, exitCode: 2 };\n\t\t}\n\n\t\tconst out: string[] = [];\n\t\tconst max = Math.max(a.length, b.length);\n\t\tfor (let i = 0; i < max; i++) {\n\t\t\tconst la = a[i];\n\t\t\tconst lb = b[i];\n\t\t\tif (la !== lb) {\n\t\t\t\tif (la !== undefined) out.push(`< ${la}`);\n\t\t\t\tif (lb !== undefined) out.push(`> ${lb}`);\n\t\t\t}\n\t\t}\n\t\treturn { stdout: out.join(\"\\n\"), exitCode: out.length > 0 ? 1 : 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag, parseArgs } from \"./command-helpers\";\nimport { getPackageManager } from \"./helpers\";\n\n/**\n * dpkg compatibility command (query/remove/list) backed by the virtual package manager.\n * @category package\n * @params [\"[-l] [-s pkg] [-L pkg] [-i pkg] [--remove pkg]\"]\n */\nexport const dpkgCommand: ShellModule = {\n\tname: \"dpkg\",\n\tdescription: \"Debian package manager low-level tool\",\n\tcategory: \"package\",\n\tparams: [\"[-l] [-s pkg] [-L pkg] [-i pkg] [--remove pkg]\"],\n\trun: ({ args, authUser, shell }) => {\n\t\tconst pm = getPackageManager(shell);\n\t\tif (!pm)\n\t\t\treturn { stderr: \"dpkg: package manager not initialised\", exitCode: 1 };\n\n\t\tconst listFlag = ifFlag(args, [\"-l\", \"--list\"]);\n\t\tconst statusFlag = ifFlag(args, [\"-s\", \"--status\"]);\n\t\tconst listFilesFlag = ifFlag(args, [\"-L\", \"--listfiles\"]);\n\t\tconst removeFlag = ifFlag(args, [\"-r\", \"--remove\"]);\n\t\tconst purgeFlag = ifFlag(args, [\"-P\", \"--purge\"]);\n\n\t\tconst { positionals } = parseArgs(args, {\n\t\t\tflags: [\n\t\t\t\t\"-l\",\n\t\t\t\t\"--list\",\n\t\t\t\t\"-s\",\n\t\t\t\t\"--status\",\n\t\t\t\t\"-L\",\n\t\t\t\t\"--listfiles\",\n\t\t\t\t\"-r\",\n\t\t\t\t\"--remove\",\n\t\t\t\t\"-P\",\n\t\t\t\t\"--purge\",\n\t\t\t],\n\t\t});\n\n\t\tif (listFlag) {\n\t\t\tconst pkgList = pm.listInstalled();\n\t\t\tif (pkgList.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tstdout: [\n\t\t\t\t\t\t\"Desired=Unknown/Install/Remove/Purge/Hold\",\n\t\t\t\t\t\t\"|Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend\",\n\t\t\t\t\t\t\"|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)\",\n\t\t\t\t\t\t\"||/ Name Version Architecture Description\",\n\t\t\t\t\t\t\"+++-==============-===============-============-========================================\",\n\t\t\t\t\t\t\"(no packages installed)\",\n\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst header = [\n\t\t\t\t\"Desired=Unknown/Install/Remove/Purge/Hold\",\n\t\t\t\t\"|Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend\",\n\t\t\t\t\"|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)\",\n\t\t\t\t\"||/ Name Version Architecture Description\",\n\t\t\t\t\"+++-==============-===============-============-========================================\",\n\t\t\t];\n\n\t\t\tconst rows = pkgList.map((p) => {\n\t\t\t\tconst name = p.name.padEnd(14).slice(0, 14);\n\t\t\t\tconst ver = p.version.padEnd(15).slice(0, 15);\n\t\t\t\tconst arch = p.architecture.padEnd(12).slice(0, 12);\n\t\t\t\tconst desc = (p.description || \"\").slice(0, 40);\n\t\t\t\treturn `ii ${name} ${ver} ${arch} ${desc}`;\n\t\t\t});\n\n\t\t\treturn { stdout: [...header, ...rows].join(\"\\n\"), exitCode: 0 };\n\t\t}\n\n\t\tif (statusFlag) {\n\t\t\tconst pkgName = positionals[0];\n\t\t\tif (!pkgName)\n\t\t\t\treturn { stderr: \"dpkg: -s needs a package name\", exitCode: 1 };\n\t\t\tconst info = pm.show(pkgName);\n\t\t\tif (!info)\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `dpkg-query: package '${pkgName}' is not installed and no information is available`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\treturn { stdout: info, exitCode: 0 };\n\t\t}\n\n\t\tif (listFilesFlag) {\n\t\t\tconst pkgName = positionals[0];\n\t\t\tif (!pkgName)\n\t\t\t\treturn { stderr: \"dpkg: -L needs a package name\", exitCode: 1 };\n\t\t\tconst installed = pm.listInstalled().find((p) => p.name === pkgName);\n\t\t\tif (!installed)\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `dpkg-query: package '${pkgName}' is not installed`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\tif (installed.files.length === 0)\n\t\t\t\treturn { stdout: \"/.keep\", exitCode: 0 };\n\t\t\treturn { stdout: installed.files.join(\"\\n\"), exitCode: 0 };\n\t\t}\n\n\t\tif (removeFlag || purgeFlag) {\n\t\t\tif (authUser !== \"root\")\n\t\t\t\treturn {\n\t\t\t\t\tstderr:\n\t\t\t\t\t\t\"dpkg: error: requested operation requires superuser privilege\",\n\t\t\t\t\texitCode: 2,\n\t\t\t\t};\n\t\t\tif (positionals.length === 0)\n\t\t\t\treturn { stderr: \"dpkg: error: need an action option\", exitCode: 2 };\n\t\t\tconst { output, exitCode } = pm.remove(positionals, { purge: purgeFlag });\n\t\t\treturn { stdout: output || undefined, exitCode };\n\t\t}\n\n\t\t// Default: show help\n\t\treturn {\n\t\t\tstdout: [\n\t\t\t\t\"Usage: dpkg [<option>...] <command>\",\n\t\t\t\t\"\",\n\t\t\t\t\"Commands:\",\n\t\t\t\t\" -l, --list List packages matching given pattern\",\n\t\t\t\t\" -s, --status <pkg>... Report status of specified package\",\n\t\t\t\t\" -L, --listfiles <pkg>... List files owned by package\",\n\t\t\t\t\" -r, --remove <pkg>... Remove <pkg> but leave its configuration\",\n\t\t\t\t\" -P, --purge <pkg>... Remove <pkg> and its configuration\",\n\t\t\t].join(\"\\n\"),\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n\nexport const dpkgQueryCommand: ShellModule = {\n\tname: \"dpkg-query\",\n\tdescription: \"Show information about installed packages\",\n\tcategory: \"package\",\n\tparams: [\"-W [pkg] | -l [pattern]\"],\n\trun: ({ args, shell }) => {\n\t\tconst pm = getPackageManager(shell);\n\t\tif (!pm)\n\t\t\treturn {\n\t\t\t\tstderr: \"dpkg-query: package manager not initialised\",\n\t\t\t\texitCode: 1,\n\t\t\t};\n\n\t\tconst listFlag = ifFlag(args, [\"-l\"]);\n\t\tconst showFlag = ifFlag(args, [\"-W\", \"--show\"]);\n\t\tconst { positionals } = parseArgs(args, {\n\t\t\tflags: [\"-l\", \"-W\", \"--show\"],\n\t\t});\n\n\t\tif (listFlag || showFlag) {\n\t\t\tconst pkgList = pm.listInstalled();\n\t\t\tconst pattern = positionals[0];\n\t\t\tconst filtered = pattern\n\t\t\t\t? pkgList.filter((p) => p.name.includes(pattern))\n\t\t\t\t: pkgList;\n\n\t\t\tif (showFlag) {\n\t\t\t\treturn {\n\t\t\t\t\tstdout: filtered.map((p) => `${p.name}\\t${p.version}`).join(\"\\n\"),\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst rows = filtered.map((p) => {\n\t\t\t\tconst name = p.name.padEnd(14).slice(0, 14);\n\t\t\t\tconst ver = p.version.padEnd(15).slice(0, 15);\n\t\t\t\treturn `ii ${name} ${ver} amd64 ${(p.description || \"\").slice(0, 40)}`;\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tstdout: rows.join(\"\\n\") || \"(no packages match)\",\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\treturn { stderr: \"dpkg-query: need a flag (-l, -W)\", exitCode: 1 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { resolvePath } from \"./helpers\";\n\nexport const duCommand: ShellModule = {\n\tname: \"du\",\n\tdescription: \"Estimate file space usage\",\n\tcategory: \"system\",\n\tparams: [\"[-h] [-s] [path]\"],\n\trun: ({ shell, cwd, args }) => {\n\t\tconst human = ifFlag(args, [\"-h\"]);\n\t\tconst summary = ifFlag(args, [\"-s\"]);\n\t\tconst target = args.find((a) => !a.startsWith(\"-\")) ?? \".\";\n\t\tconst p = resolvePath(cwd, target);\n\n\t\tconst fmt = (b: number) =>\n\t\t\thuman ? `${(b / 1024).toFixed(1)}K` : String(Math.ceil(b / 1024));\n\n\t\tif (!shell.vfs.exists(p))\n\t\t\treturn {\n\t\t\t\tstderr: `du: ${target}: No such file or directory`,\n\t\t\t\texitCode: 1,\n\t\t\t};\n\n\t\tif (summary || shell.vfs.stat(p).type === \"file\") {\n\t\t\treturn {\n\t\t\t\tstdout: `${fmt(shell.vfs.getUsageBytes(p))}\\t${target}`,\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst lines: string[] = [];\n\t\tconst walk = (dir: string, rel: string) => {\n\t\t\tlet total = 0;\n\t\t\tfor (const e of shell.vfs.list(dir)) {\n\t\t\t\tconst full = `${dir}/${e}`,\n\t\t\t\t\tr = `${rel}/${e}`;\n\t\t\t\tconst st = shell.vfs.stat(full);\n\t\t\t\tif (st.type === \"directory\") total += walk(full, r);\n\t\t\t\telse {\n\t\t\t\t\ttotal += st.size;\n\t\t\t\t\tif (!summary) lines.push(`${fmt(st.size)}\\t${r}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlines.push(`${fmt(total)}\\t${rel}`);\n\t\t\treturn total;\n\t\t};\n\t\twalk(p, target);\n\t\treturn { stdout: lines.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "/**\n * expand.ts\n *\n * Centralised shell variable and expression expansion.\n * Used by `runCommand` (index.ts), `echo`, and `sh.ts`.\n *\n * Handles (in order):\n * ~ tilde to $HOME\n * $? last exit code\n * $$ mock PID\n * $# argument count (0 outside scripts)\n * ${#VAR} string length\n * ${VAR:-def} default if unset/empty\n * ${VAR:=def} assign default if unset/empty\n * ${VAR:+val} alternate value if set\n * ${VAR} simple braced reference\n * $VAR simple reference\n * $((expr)) arithmetic (integer)\n */\n\n// \u2500\u2500\u2500 arithmetic evaluator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Evaluate a simple integer arithmetic expression.\n * Supports: + - * / % ** unary- ( )\n * Variables are resolved from `env` before evaluation.\n * Returns NaN on syntax error.\n */\nexport function evalArith(expr: string, env: Record<string, string>): number {\n\t// Substitute variable names before evaluating\n\tconst substituted = expr.replace(\n\t\t/\\b([A-Za-z_][A-Za-z0-9_]*)\\b/g,\n\t\t(_, name) => {\n\t\t\tconst val = env[name];\n\t\t\treturn val !== undefined && val !== \"\" ? val : \"0\";\n\t\t},\n\t);\n\n\t// Whitelist: only digits, operators, spaces, parens\n\tif (!/^[\\d\\s+\\-*/%()^!&|<>=,. ]+$/.test(substituted)) return NaN;\n\n\ttry {\n\t\t// Use Function constructor for safe subset (no identifiers remain)\n\t\t// eslint-disable-next-line no-new-func\n\t\tconst result = Function(\n\t\t\t`\"use strict\"; return (${substituted.replace(/\\*\\*/g, \"**\")});`,\n\t\t)();\n\t\treturn typeof result === \"number\" ? Math.trunc(result) : NaN;\n\t} catch {\n\t\treturn NaN;\n\t}\n}\n\n// \u2500\u2500\u2500 synchronous expansion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Apply a replacer only to portions of `input` that are NOT inside single quotes.\n * Single-quoted content is passed through verbatim (POSIX sh behaviour).\n */\nfunction outsideSingleQuotes(\n\tinput: string,\n\treplacer: (chunk: string) => string,\n): string {\n\tconst parts: string[] = [];\n\tlet i = 0;\n\twhile (i < input.length) {\n\t\tconst sqIdx = input.indexOf(\"'\", i);\n\t\tif (sqIdx === -1) {\n\t\t\t// No more single quotes \u2014 expand the rest\n\t\t\tparts.push(replacer(input.slice(i)));\n\t\t\tbreak;\n\t\t}\n\t\t// Expand the part before the single quote\n\t\tparts.push(replacer(input.slice(i, sqIdx)));\n\t\t// Find closing single quote \u2014 everything inside is literal\n\t\tconst closeIdx = input.indexOf(\"'\", sqIdx + 1);\n\t\tif (closeIdx === -1) {\n\t\t\t// Unclosed quote \u2014 treat rest as literal\n\t\t\tparts.push(input.slice(sqIdx));\n\t\t\tbreak;\n\t\t}\n\t\tparts.push(input.slice(sqIdx, closeIdx + 1)); // include quotes\n\t\ti = closeIdx + 1;\n\t}\n\treturn parts.join(\"\");\n}\n\n/**\n * Expand all shell variable and expression forms synchronously.\n * Does NOT handle `$(cmd)` \u2014 that requires async; see `expandAsync`.\n * Content inside single quotes is left verbatim per POSIX sh rules.\n *\n * @param input Raw string possibly containing `$VAR`, `${...}`, `$((...))`.\n * @param env Current session env vars.\n * @param lastExit Last command exit code (for `$?`).\n * @param home Home directory path (for `~`).\n */\nexport function expandSync(\n\tinput: string,\n\tenv: Record<string, string>,\n\tlastExit = 0,\n\thome?: string,\n): string {\n\tconst homePath = home ?? env.HOME ?? \"/home/user\";\n\n\treturn outsideSingleQuotes(input, (chunk) => {\n\t\tlet s = chunk;\n\n\t\t// Tilde expansion \u2014 only at start of token or after `:` or whitespace\n\t\ts = s.replace(\n\t\t\t/(^|[\\s:])~(\\/|$)/g,\n\t\t\t(_, pre, post) => `${pre}${homePath}${post}`,\n\t\t);\n\n\t\t// $? $$ $#\n\t\ts = s.replace(/\\$\\?/g, String(lastExit));\n\t\ts = s.replace(/\\$\\$/g, \"1\");\n\t\ts = s.replace(/\\$#/g, \"0\");\n\n\t\t// $(( arithmetic )) \u2014 must come before ${ and $VAR to avoid conflicts\n\t\ts = s.replace(/\\$\\(\\(([^)]+(?:\\([^)]*\\)[^)]*)*)\\)\\)/g, (_, expr) => {\n\t\t\tconst result = evalArith(expr, env);\n\t\t\treturn Number.isNaN(result) ? \"0\" : String(result);\n\t\t});\n\n\t\t// ${#VAR} \u2014 string length\n\t\ts = s.replace(/\\$\\{#([A-Za-z_][A-Za-z0-9_]*)\\}/g, (_, name) =>\n\t\t\tString((env[name] ?? \"\").length),\n\t\t);\n\n\t\t// ${VAR:-default}\n\t\ts = s.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*):-([^}]*)\\}/g, (_, name, def) =>\n\t\t\tenv[name] !== undefined && env[name] !== \"\" ? (env[name] as string) : def,\n\t\t);\n\n\t\t// ${VAR:=default} \u2014 also assigns to env\n\t\ts = s.replace(\n\t\t\t/\\$\\{([A-Za-z_][A-Za-z0-9_]*):=([^}]*)\\}/g,\n\t\t\t(_, name, def) => {\n\t\t\t\tif (env[name] === undefined || env[name] === \"\") env[name] = def;\n\t\t\t\treturn env[name] as string;\n\t\t\t},\n\t\t);\n\n\t\t// ${VAR:+alternate}\n\t\ts = s.replace(\n\t\t\t/\\$\\{([A-Za-z_][A-Za-z0-9_]*):\\+([^}]*)\\}/g,\n\t\t\t(_, name, alt) =>\n\t\t\t\tenv[name] !== undefined && env[name] !== \"\" ? alt : \"\",\n\t\t);\n\n\t\t// ${VAR}\n\t\ts = s.replace(\n\t\t\t/\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g,\n\t\t\t(_, name) => env[name] ?? \"\",\n\t\t);\n\n\t\t// $VAR\n\t\ts = s.replace(/\\$([A-Za-z_][A-Za-z0-9_]*)/g, (_, name) => env[name] ?? \"\");\n\n\t\treturn s;\n\t});\n}\n\n// \u2500\u2500\u2500 async expansion (includes $(cmd)) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Expand all shell forms including `$(cmd)` command substitution.\n *\n * Processes `$(...)` blocks depth-first, respecting single-quote boundaries.\n * Then delegates to `expandSync` for the remaining forms.\n *\n * @param input Raw string.\n * @param env Current session env vars.\n * @param lastExit Last exit code.\n * @param runCmd Async callback to execute a command and return its stdout.\n */\nexport async function expandAsync(\n\tinput: string,\n\tenv: Record<string, string>,\n\tlastExit: number,\n\trunCmd: (cmd: string) => Promise<string>,\n): Promise<string> {\n\t// $(cmd) substitution \u2014 skip content inside single quotes\n\tif (input.includes(\"$(\")) {\n\t\tlet result = \"\";\n\t\tlet inSingle = false;\n\t\tlet i = 0;\n\n\t\twhile (i < input.length) {\n\t\t\tconst ch = input[i]!;\n\n\t\t\tif (ch === \"'\" && !inSingle) {\n\t\t\t\tinSingle = true;\n\t\t\t\tresult += ch;\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (ch === \"'\" && inSingle) {\n\t\t\t\tinSingle = false;\n\t\t\t\tresult += ch;\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!inSingle && ch === \"$\" && input[i + 1] === \"(\") {\n\t\t\t\t// $((expr)) arithmetic \u2014 NOT a $(cmd) substitution, skip it\n\t\t\t\tif (input[i + 2] === \"(\") {\n\t\t\t\t\tresult += ch;\n\t\t\t\t\ti++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Find matching ) with depth tracking\n\t\t\t\tlet depth = 0;\n\t\t\t\tlet j = i + 1;\n\t\t\t\twhile (j < input.length) {\n\t\t\t\t\tif (input[j] === \"(\") depth++;\n\t\t\t\t\telse if (input[j] === \")\") {\n\t\t\t\t\t\tdepth--;\n\t\t\t\t\t\tif (depth === 0) break;\n\t\t\t\t\t}\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\tconst sub = input.slice(i + 2, j).trim();\n\t\t\t\tconst out = (await runCmd(sub)).replace(/\\n$/, \"\");\n\t\t\t\tresult += out;\n\t\t\t\ti = j + 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tresult += ch;\n\t\t\ti++;\n\t\t}\n\t\tinput = result;\n\t}\n\n\treturn expandSync(input, env, lastExit);\n}\n", "import type { ShellModule } from \"../types/commands\";\nimport { parseArgs } from \"./command-helpers\";\nimport { expandSync } from \"../utils/expand\";\n\n/**\n * Expand escape sequences for `echo -e`.\n * Handles \\n \\t \\r \\\\ \\a \\b \\f \\v and \\0NNN (octal).\n */\nfunction expandEscapes(text: string): string {\n\treturn text\n\t\t.replace(/\\\\n/g, \"\\n\")\n\t\t.replace(/\\\\t/g, \"\\t\")\n\t\t.replace(/\\\\r/g, \"\\r\")\n\t\t.replace(/\\\\\\\\/g, \"\\\\\")\n\t\t.replace(/\\\\a/g, \"\\x07\")\n\t\t.replace(/\\\\b/g, \"\\x08\")\n\t\t.replace(/\\\\f/g, \"\\x0C\")\n\t\t.replace(/\\\\v/g, \"\\x0B\")\n\t\t.replace(/\\\\0(\\d{1,3})/g, (_, oct) =>\n\t\t\tString.fromCharCode(parseInt(oct, 8)),\n\t\t);\n}\n\n/**\n * Echo text to stdout with shell-style expansion and escape support.\n * @category shell\n * @params [\"[-n] [-e] [text...]\"]\n */\nexport const echoCommand: ShellModule = {\n\tname: \"echo\",\n\tdescription: \"Display text\",\n\tcategory: \"shell\",\n\tparams: [\"[-n] [-e] [text...]\"],\n\trun: ({ args, stdin, env }) => {\n\t\tconst { flags, positionals } = parseArgs(args, {\n\t\t\tflags: [\"-n\", \"-e\", \"-E\"],\n\t\t});\n\t\tconst noNewline = flags.has(\"-n\");\n\t\tconst escapes = flags.has(\"-e\");\n\n\t\tconst rawText =\n\t\t\tpositionals.length > 0 ? positionals.join(\" \") : (stdin ?? \"\");\n\n\t\t// Full expansion: $? ${#VAR} $((expr)) ~ ${VAR:-def} $VAR etc.\n\t\t// $(cmd) is already resolved upstream by runCommand before echo.run is called.\n\t\tconst expanded = expandSync(\n\t\t\trawText,\n\t\t\tenv?.vars ?? {},\n\t\t\tenv?.lastExitCode ?? 0,\n\t\t);\n\t\tconst text = escapes ? expandEscapes(expanded) : expanded;\n\n\t\treturn {\n\t\t\tstdout: noNewline ? text : `${text}\\n`,\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "/** biome-ignore-all lint/style/useNamingConvention: ENV VARS */\nimport type { ShellModule } from \"../types/commands\";\n\n/**\n * Print environment variables for the current session.\n * @category shell\n * @params []\n */\nexport const envCommand: ShellModule = {\n\tname: \"env\",\n\tdescription: \"Print environment variables\",\n\tcategory: \"shell\",\n\tparams: [],\n\trun: ({ env, authUser }) => {\n\t\tconst vars = { ...env.vars, USER: authUser, HOME: `/home/${authUser}` };\n\t\treturn {\n\t\t\tstdout: Object.entries(vars)\n\t\t\t\t.map(([k, v]) => `${k}=${v}`)\n\t\t\t\t.join(\"\\n\"),\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\n/**\n * Exit the current shell session (closeSession flag).\n * @category shell\n * @params [\"[code]\"]\n */\nexport const exitCommand: ShellModule = {\n\tname: \"exit\",\n\taliases: [\"bye\"],\n\tdescription: \"Exit the shell session\",\n\tcategory: \"shell\",\n\tparams: [\"[code]\"],\n\trun: ({ args }) => ({\n\t\tcloseSession: true,\n\t\texitCode: parseInt(args[0] ?? \"0\", 10) || 0,\n\t}),\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const exportCommand: ShellModule = {\n\tname: \"export\",\n\tdescription: \"Set shell environment variable\",\n\tcategory: \"shell\",\n\tparams: [\"[VAR=value]\"],\n\trun: ({ args, env }) => {\n\t\tif (args.length === 0) {\n\t\t\tconst out = Object.entries(env.vars)\n\t\t\t\t.map(([k, v]) => `declare -x ${k}=\"${v}\"`)\n\t\t\t\t.join(\"\\n\");\n\t\t\treturn { stdout: out, exitCode: 0 };\n\t\t}\n\t\tfor (const arg of args) {\n\t\t\tif (arg.includes(\"=\")) {\n\t\t\t\tconst eq = arg.indexOf(\"=\");\n\t\t\t\tconst name = arg.slice(0, eq);\n\t\t\t\tconst value = arg.slice(eq + 1);\n\t\t\t\tenv.vars[name] = value;\n\t\t\t} else {\n\t\t\t\t// mark existing as exported (already is)\n\t\t\t}\n\t\t}\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getFlag } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\n/**\n * Find files and directories by name and type with minimal pattern support.\n * @category files\n * @params [\"[path] [-name <pattern>] [-type f|d]\"]\n */\nexport const findCommand: ShellModule = {\n\tname: \"find\",\n\tdescription: \"Search for files\",\n\tcategory: \"files\",\n\tparams: [\"[path] [-name <pattern>] [-type f|d]\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst namePattern = getFlag(args, [\"-name\"]);\n\t\tconst typeFilter = getFlag(args, [\"-type\"]);\n\t\tconst positionals = args.filter(\n\t\t\t(a) => !a.startsWith(\"-\") && a !== namePattern && a !== typeFilter,\n\t\t);\n\t\tconst rootArg = positionals[0] ?? \".\";\n\t\tconst rootPath = resolvePath(cwd, rootArg);\n\n\t\ttry {\n\t\t\tassertPathAccess(authUser, rootPath, \"find\");\n\t\t\tif (!shell.vfs.exists(rootPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `find: ${rootArg}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\treturn { stderr: `find: ${msg}`, exitCode: 1 };\n\t\t}\n\n\t\tconst nameRegex = namePattern\n\t\t\t? new RegExp(\n\t\t\t\t\t`^${(namePattern as string).replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\").replace(/\\?/g, \".\")}$`,\n\t\t\t\t)\n\t\t\t: null;\n\n\t\tconst results: string[] = [];\n\t\tconst walk = (currentPath: string, display: string) => {\n\t\t\tconst stat = shell.vfs.stat(currentPath);\n\n\t\t\tconst matchesType =\n\t\t\t\t!typeFilter ||\n\t\t\t\t(typeFilter === \"f\" && stat.type === \"file\") ||\n\t\t\t\t(typeFilter === \"d\" && stat.type === \"directory\");\n\t\t\tconst matchesName =\n\t\t\t\t!nameRegex || nameRegex.test(currentPath.split(\"/\").pop() ?? \"\");\n\n\t\t\tif (matchesType && matchesName) results.push(display);\n\n\t\t\tif (stat.type === \"directory\") {\n\t\t\t\tfor (const entry of shell.vfs.list(currentPath)) {\n\t\t\t\t\tconst full = `${currentPath}/${entry}`;\n\t\t\t\t\tconst disp = `${display}/${entry}`;\n\t\t\t\t\twalk(full, disp);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\twalk(rootPath, rootArg);\n\t\treturn { stdout: results.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import * as os from \"node:os\";\nimport type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n\n/**\n * Display memory usage information (human / MB / GB options).\n * @category system\n * @params [\"[-h] [-m] [-g]\"]\n */\nexport const freeCommand: ShellModule = {\n\tname: \"free\",\n\tdescription: \"Display amount of free and used memory\",\n\tcategory: \"system\",\n\tparams: [\"[-h] [-m] [-g]\"],\n\trun: ({ args }) => {\n\t\tconst human = ifFlag(args, [\"-h\", \"--human\"]);\n\t\tconst mb = ifFlag(args, [\"-m\"]);\n\t\tconst gb = ifFlag(args, [\"-g\"]);\n\n\t\tconst osTotalB = os.totalmem();\n\t\tconst osFreeB = os.freemem();\n\t\tconst usedB = osTotalB - osFreeB;\n\t\tconst sharedB = Math.floor(osTotalB * 0.02);\n\t\tconst buffersB = Math.floor(osTotalB * 0.05);\n\t\tconst availableB = Math.floor(osFreeB * 0.95);\n\t\tconst swapB = Math.floor(osTotalB * 0.5);\n\n\t\tconst fmt = (bytes: number): string => {\n\t\t\tif (human) {\n\t\t\t\tif (bytes >= 1024 * 1024 * 1024)\n\t\t\t\t\treturn `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}G`;\n\t\t\t\tif (bytes >= 1024 * 1024)\n\t\t\t\t\treturn `${(bytes / (1024 * 1024)).toFixed(1)}M`;\n\t\t\t\treturn `${(bytes / 1024).toFixed(1)}K`;\n\t\t\t}\n\t\t\tif (gb) return String(Math.floor(bytes / (1024 * 1024 * 1024)));\n\t\t\tif (mb) return String(Math.floor(bytes / (1024 * 1024)));\n\t\t\treturn String(Math.floor(bytes / 1024));\n\t\t};\n\n\t\tconst header = ` total used free shared buff/cache available`;\n\t\tconst memRow = `Mem: ${fmt(osTotalB).padStart(12)} ${fmt(usedB).padStart(11)} ${fmt(osFreeB).padStart(11)} ${fmt(sharedB).padStart(11)} ${fmt(buffersB).padStart(11)} ${fmt(availableB).padStart(11)}`;\n\t\tconst swapRow = `Swap: ${fmt(swapB).padStart(12)} ${fmt(0).padStart(11)} ${fmt(swapB).padStart(11)}`;\n\n\t\treturn { stdout: [header, memRow, swapRow].join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { parseArgs } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\n/**\n * Search for a regex pattern in files or stdin with common flags.\n * @category text\n * @params [\"[-i] [-v] [-n] [-r] <pattern> [file...]\"]\n */\nexport const grepCommand: ShellModule = {\n\tname: \"grep\",\n\tdescription: \"Search text patterns\",\n\tcategory: \"text\",\n\tparams: [\"[-i] [-v] [-n] [-r] <pattern> [file...]\"],\n\trun: ({ authUser, shell, cwd, args, stdin }) => {\n\t\tconst { flags, positionals } = parseArgs(args, {\n\t\t\tflags: [\"-i\", \"-v\", \"-n\", \"-r\"],\n\t\t});\n\t\tconst caseInsensitive = flags.has(\"-i\");\n\t\tconst invertMatch = flags.has(\"-v\");\n\t\tconst showLineNumbers = flags.has(\"-n\");\n\t\tconst recursive = flags.has(\"-r\");\n\t\tconst pattern = positionals[0];\n\t\tconst files = positionals.slice(1);\n\n\t\tif (!pattern) {\n\t\t\treturn { stderr: \"grep: no pattern specified\", exitCode: 1 };\n\t\t}\n\n\t\tlet regex: RegExp;\n\t\ttry {\n\t\t\t// No \"g\" flag \u2014 avoids the stateful lastIndex problem with regex.test()\n\t\t\tconst regexFlags = caseInsensitive ? \"mi\" : \"m\";\n\t\t\tregex = new RegExp(pattern, regexFlags);\n\t\t} catch {\n\t\t\treturn { stderr: `grep: invalid regex: ${pattern}`, exitCode: 1 };\n\t\t}\n\n\t\tconst matchLines = (content: string, prefix = \"\"): string[] => {\n\t\t\tconst lines = content.split(\"\\n\");\n\t\t\tconst out: string[] = [];\n\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\tconst line = lines[i] ?? \"\";\n\t\t\t\tconst matches = regex.test(line);\n\t\t\t\tconst shouldInclude = invertMatch ? !matches : matches;\n\t\t\t\tif (shouldInclude) {\n\t\t\t\t\tconst lineLabel = showLineNumbers ? `${i + 1}:` : \"\";\n\t\t\t\t\tout.push(`${prefix}${lineLabel}${line}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out;\n\t\t};\n\n\t\tconst readPaths = (base: string): string[] => {\n\t\t\tif (!shell.vfs.exists(base)) return [];\n\t\t\tconst stat = shell.vfs.stat(base);\n\t\t\tif (stat.type === \"file\") return [base];\n\t\t\tif (!recursive) return [];\n\t\t\tconst paths: string[] = [];\n\t\t\tconst walk = (dir: string) => {\n\t\t\t\tfor (const entry of shell.vfs.list(dir)) {\n\t\t\t\t\tconst full = `${dir}/${entry}`;\n\t\t\t\t\tconst s = shell.vfs.stat(full);\n\t\t\t\t\tif (s.type === \"file\") paths.push(full);\n\t\t\t\t\telse walk(full);\n\t\t\t\t}\n\t\t\t};\n\t\t\twalk(base);\n\t\t\treturn paths;\n\t\t};\n\n\t\tconst results: string[] = [];\n\n\t\tif (files.length === 0) {\n\t\t\tif (!stdin) return { stdout: \"\", exitCode: 1 };\n\t\t\tresults.push(...matchLines(stdin));\n\t\t} else {\n\t\t\tconst resolvedPaths = files.flatMap((f) => {\n\t\t\t\tconst target = resolvePath(cwd, f);\n\t\t\t\treturn readPaths(target).map((p) => ({ file: f, path: p }));\n\t\t\t});\n\n\t\t\tfor (const { file, path: filePath } of resolvedPaths) {\n\t\t\t\ttry {\n\t\t\t\t\tassertPathAccess(authUser, filePath, \"grep\");\n\t\t\t\t\tconst content = shell.vfs.readFile(filePath);\n\t\t\t\t\tconst prefix = resolvedPaths.length > 1 ? `${file}:` : \"\";\n\t\t\t\t\tresults.push(...matchLines(content, prefix));\n\t\t\t\t} catch {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstderr: `grep: ${file}: No such file or directory`,\n\t\t\t\t\t\texitCode: 1,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tstdout: results.length > 0 ? results.join(\"\\n\") : \"\",\n\t\t\texitCode: results.length > 0 ? 0 : 1,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const groupsCommand: ShellModule = {\n\tname: \"groups\",\n\tdescription: \"Print group memberships\",\n\tcategory: \"system\",\n\tparams: [\"[user]\"],\n\trun: ({ authUser, shell, args }) => {\n\t\tconst target = args[0] ?? authUser;\n\t\tconst isSudo = shell.users.isSudoer(target);\n\t\tconst grps = isSudo ? `${target} sudo root` : target;\n\t\treturn { stdout: grps, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { resolvePath } from \"./helpers\";\n\n/**\n * Compress files using gzip (stores in VFS as compressed content).\n * @category archive\n * @params [\"<file>\"]\n */\nexport const gzipCommand: ShellModule = {\n\tname: \"gzip\",\n\tdescription: \"Compress files\",\n\tcategory: \"archive\",\n\tparams: [\"<file>\"],\n\trun: ({ shell, cwd, args }) => {\n\t\tconst file = args[0];\n\t\tif (!file) return { stderr: \"gzip: no file specified\", exitCode: 1 };\n\t\tconst p = resolvePath(cwd, file);\n\t\ttry {\n\t\t\tshell.vfs.compressFile(p);\n\t\t\treturn { exitCode: 0 };\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tstderr: `gzip: ${file}: No such file or directory`,\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\t},\n};\n\nexport const gunzipCommand: ShellModule = {\n\t/**\n\t * Decompress gzip files (or zcat alias).\n\t * @category archive\n\t * @params [\"<file>\"]\n\t */\n\tname: \"gunzip\",\n\tdescription: \"Decompress files\",\n\tcategory: \"archive\",\n\tparams: [\"<file>\"],\n\taliases: [\"zcat\"],\n\trun: ({ shell, cwd, args }) => {\n\t\tconst file = args[0];\n\t\tif (!file) return { stderr: \"gunzip: no file specified\", exitCode: 1 };\n\t\tconst p = resolvePath(cwd, file);\n\t\ttry {\n\t\t\tshell.vfs.decompressFile(p);\n\t\t\treturn { exitCode: 0 };\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tstderr: `gunzip: ${file}: No such file or directory`,\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getFlag } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\n/**\n * Output the first part of files or stdin (head).\n * @category text\n * @params [\"[-n <lines>] [file...]\"]\n */\nexport const headCommand: ShellModule = {\n\tname: \"head\",\n\tdescription: \"Output first lines\",\n\tcategory: \"text\",\n\tparams: [\"[-n <lines>] [file...]\"],\n\trun: ({ authUser, shell, cwd, args, stdin }) => {\n\t\tconst nArg = getFlag(args, [\"-n\"]);\n\t\tconst n = typeof nArg === \"string\" ? parseInt(nArg, 10) : 10;\n\t\tconst positionals = args.filter((a) => !a.startsWith(\"-\") && a !== nArg);\n\n\t\tconst take = (content: string) =>\n\t\t\tcontent.split(\"\\n\").slice(0, n).join(\"\\n\");\n\n\t\tif (positionals.length === 0) {\n\t\t\treturn { stdout: take(stdin ?? \"\"), exitCode: 0 };\n\t\t}\n\n\t\tconst results: string[] = [];\n\t\tfor (const file of positionals) {\n\t\t\tconst filePath = resolvePath(cwd, file);\n\t\t\ttry {\n\t\t\t\tassertPathAccess(authUser, filePath, \"head\");\n\t\t\t\tresults.push(take(shell.vfs.readFile(filePath)));\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `head: ${file}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn { stdout: results.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getCommandModulesPublic } from \"./registry\";\n\n// \u2500\u2500\u2500 category config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst CATEGORY_ORDER = [\n\t\"navigation\",\n\t\"files\",\n\t\"text\",\n\t\"archive\",\n\t\"system\",\n\t\"package\",\n\t\"network\",\n\t\"shell\",\n\t\"users\",\n\t\"misc\",\n];\n\nconst CATEGORY_LABELS: Record<string, string> = {\n\tnavigation: \"Navigation\",\n\tfiles: \"Files & Filesystem\",\n\ttext: \"Text Processing\",\n\tarchive: \"Archive & Compression\",\n\tsystem: \"System\",\n\tpackage: \"Package Management\",\n\tnetwork: \"Network\",\n\tshell: \"Shell & Scripting\",\n\tusers: \"Users & Permissions\",\n\tmisc: \"Miscellaneous\",\n};\n\n// \u2500\u2500\u2500 formatting helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst BOLD = \"\\x1b[1m\";\nconst RESET = \"\\x1b[0m\";\nconst CYAN = \"\\x1b[36m\";\nconst YLW = \"\\x1b[33m\";\nconst DIM = \"\\x1b[2m\";\nconst GREEN = \"\\x1b[32m\";\n\nfunction pad(s: string, n: number): string {\n\treturn s.length >= n ? s : s + \" \".repeat(n - s.length);\n}\n\nfunction formatCmdLine(mod: ShellModule): string {\n\tconst aliases = mod.aliases?.length\n\t\t? ` ${DIM}(${mod.aliases.join(\", \")})${RESET}`\n\t\t: \"\";\n\treturn ` ${CYAN}${pad(mod.name, 16)}${RESET}${aliases}${pad(\"\", mod.aliases?.length ? 0 : 0)} ${mod.description ?? \"\"}`;\n}\n\n// \u2500\u2500\u2500 full grouped listing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction renderFull(modules: ShellModule[]): string {\n\tconst grouped: Record<string, ShellModule[]> = {};\n\tfor (const mod of modules) {\n\t\tconst cat = mod.category ?? \"misc\";\n\t\tif (!grouped[cat]) grouped[cat] = [];\n\t\tgrouped[cat]!.push(mod);\n\t}\n\n\tconst lines: string[] = [\n\t\t`${BOLD}Available commands${RESET}`,\n\t\t`${DIM}Type 'help <command>' for detailed usage.${RESET}`,\n\t\t\"\",\n\t];\n\n\tconst cats = [\n\t\t...CATEGORY_ORDER.filter((c) => grouped[c]),\n\t\t...Object.keys(grouped)\n\t\t\t.filter((c) => !CATEGORY_ORDER.includes(c))\n\t\t\t.sort(),\n\t];\n\n\tfor (const cat of cats) {\n\t\tconst mods = grouped[cat];\n\t\tif (!mods?.length) continue;\n\n\t\tlines.push(`${YLW}${CATEGORY_LABELS[cat] ?? cat}${RESET}`);\n\t\tconst sorted = [...mods].sort((a, b) => a.name.localeCompare(b.name));\n\t\tfor (const mod of sorted) {\n\t\t\tlines.push(formatCmdLine(mod));\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\n\tconst total = modules.length;\n\tlines.push(`${DIM}${total} commands available.${RESET}`);\n\n\treturn lines.join(\"\\n\");\n}\n\n// \u2500\u2500\u2500 single-command detail \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction renderDetail(mod: ShellModule): string {\n\tconst lines: string[] = [];\n\n\tlines.push(\n\t\t`${BOLD}${mod.name}${RESET} \u2014 ${mod.description ?? \"no description\"}`,\n\t);\n\n\tif (mod.aliases?.length) {\n\t\tlines.push(`${DIM}Aliases: ${mod.aliases.join(\", \")}${RESET}`);\n\t}\n\n\tlines.push(\"\");\n\tlines.push(`${GREEN}Usage:${RESET}`);\n\tif (mod.params.length) {\n\t\tfor (const p of mod.params) {\n\t\t\tlines.push(` ${mod.name} ${p}`);\n\t\t}\n\t} else {\n\t\tlines.push(` ${mod.name}`);\n\t}\n\n\tconst catLabel =\n\t\tCATEGORY_LABELS[mod.category ?? \"misc\"] ?? mod.category ?? \"misc\";\n\tlines.push(\"\");\n\tlines.push(`${DIM}Category: ${catLabel}${RESET}`);\n\n\treturn lines.join(\"\\n\");\n}\n\n// \u2500\u2500\u2500 export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function createHelpCommand(_getNames: () => string[]): ShellModule {\n\treturn {\n\t\tname: \"help\",\n\t\tdescription: \"List all commands, or show usage for a specific command\",\n\t\tcategory: \"shell\",\n\t\tparams: [\"[command]\"],\n\t\trun: ({ args }) => {\n\t\t\tconst modules = getCommandModulesPublic();\n\n\t\t\tif (args[0]) {\n\t\t\t\tconst target = args[0].toLowerCase();\n\t\t\t\tconst mod = modules.find(\n\t\t\t\t\t(m) => m.name === target || m.aliases?.includes(target),\n\t\t\t\t);\n\t\t\t\tif (!mod) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstderr: `help: no help entry for '${args[0]}'`,\n\t\t\t\t\t\texitCode: 1,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn { stdout: renderDetail(mod), exitCode: 0 };\n\t\t\t}\n\n\t\t\treturn { stdout: renderFull(modules), exitCode: 0 };\n\t\t},\n\t};\n}\n", "import type { ShellModule } from \"../types/commands\";\n\n/**\n * Display persisted command history for the session (from VFS).\n * @category shell\n * @params [\"[n]\"]\n */\nexport const historyCommand: ShellModule = {\n\tname: \"history\",\n\tdescription: \"Display command history\",\n\tcategory: \"shell\",\n\tparams: [\"[n]\"],\n\trun: ({ args, shell }) => {\n\t\t// History is persisted in the VFS by the interactive shell\n\t\tconst histPath = \"/virtual-env-js/.bash_history\";\n\t\tif (!shell.vfs.exists(histPath)) {\n\t\t\treturn { stdout: \"\", exitCode: 0 };\n\t\t}\n\n\t\tconst raw = shell.vfs.readFile(histPath);\n\t\tconst lines = raw.split(\"\\n\").filter(Boolean);\n\n\t\tconst nArg = args[0];\n\t\tconst n = nArg ? parseInt(nArg, 10) : null;\n\t\tconst slice = n && !Number.isNaN(n) ? lines.slice(-n) : lines;\n\n\t\tconst offset = lines.length - slice.length + 1;\n\t\tconst numbered = slice.map(\n\t\t\t(line, i) => `${String(offset + i).padStart(5)} ${line}`,\n\t\t);\n\n\t\treturn { stdout: numbered.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\n/**\n * Print the configured hostname for the virtual shell.\n * @category system\n * @params []\n */\nexport const hostnameCommand: ShellModule = {\n\tname: \"hostname\",\n\tdescription: \"Print hostname\",\n\tcategory: \"system\",\n\tparams: [],\n\trun: ({ hostname }) => ({ stdout: hostname, exitCode: 0 }),\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const htopCommand: ShellModule = {\n\tname: \"htop\",\n\tdescription: \"System monitor\",\n\tcategory: \"system\",\n\tparams: [],\n\trun: ({ mode }) => {\n\t\tif (mode === \"exec\") {\n\t\t\treturn { stderr: \"htop: interactive terminal required\", exitCode: 1 };\n\t\t}\n\n\t\treturn { openHtop: true, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const idCommand: ShellModule = {\n\tname: \"id\",\n\tdescription: \"Print user identity\",\n\tcategory: \"system\",\n\tparams: [\"[user]\"],\n\trun: ({ authUser, shell, args }) => {\n\t\tconst target = args[0] ?? authUser;\n\t\tconst uid = target === \"root\" ? 0 : 1000;\n\t\tconst gid = uid;\n\t\tconst isSudo = shell.users.isSudoer(target);\n\t\tconst groups = isSudo ? `${gid}(${target}),0(root)` : `${gid}(${target})`;\n\t\treturn {\n\t\t\tstdout: `uid=${uid}(${target}) gid=${gid}(${target}) groups=${groups}`,\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const killCommand: ShellModule = {\n\tname: \"kill\",\n\tdescription: \"Send signal to process\",\n\tcategory: \"system\",\n\tparams: [\"[-9] <pid>\"],\n\trun: ({ args }) => {\n\t\tconst pid = args.find((a) => !a.startsWith(\"-\"));\n\t\tif (!pid) return { stderr: \"kill: no pid specified\", exitCode: 1 };\n\t\t// In virtual env, we just acknowledge the kill\n\t\treturn { stdout: ``, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const lnCommand: ShellModule = {\n\tname: \"ln\",\n\tdescription: \"Create links\",\n\tcategory: \"files\",\n\tparams: [\"[-s] <target> <link_name>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst symbolic = ifFlag(args, [\"-s\", \"--symbolic\"]);\n\t\tconst positionals = args.filter((a) => !a.startsWith(\"-\"));\n\t\tconst [targetArg, linkArg] = positionals;\n\n\t\tif (!targetArg || !linkArg) {\n\t\t\treturn { stderr: \"ln: missing operand\", exitCode: 1 };\n\t\t}\n\n\t\tconst linkPath = resolvePath(cwd, linkArg);\n\t\tconst targetPath = symbolic\n\t\t\t? targetArg // keep relative for symlinks\n\t\t\t: resolvePath(cwd, targetArg);\n\n\t\ttry {\n\t\t\tassertPathAccess(authUser, linkPath, \"ln\");\n\n\t\t\tif (!symbolic) {\n\t\t\t\t// Hard link \u2014 copy file contents\n\t\t\t\tconst srcPath = resolvePath(cwd, targetArg);\n\t\t\t\tassertPathAccess(authUser, srcPath, \"ln\");\n\t\t\t\tif (!shell.vfs.exists(srcPath)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstderr: `ln: ${targetArg}: No such file or directory`,\n\t\t\t\t\t\texitCode: 1,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst content = shell.vfs.readFile(srcPath);\n\t\t\t\tshell.writeFileAsUser(authUser, linkPath, content);\n\t\t\t} else {\n\t\t\t\tshell.vfs.symlink(targetPath, linkPath);\n\t\t\t}\n\n\t\t\treturn { exitCode: 0 };\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\treturn { stderr: `ln: ${msg}`, exitCode: 1 };\n\t\t}\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg, ifFlag } from \"./command-helpers\";\nimport { assertPathAccess, joinListWithType, resolvePath } from \"./helpers\";\n\nfunction formatPermissions(mode: number, isDirectory: boolean): string {\n\tconst fileType = isDirectory ? \"d\" : \"-\";\n\tconst permissionBits = [\n\t\t[0o400, \"r\"],\n\t\t[0o200, \"w\"],\n\t\t[0o100, \"x\"],\n\t\t[0o040, \"r\"],\n\t\t[0o020, \"w\"],\n\t\t[0o010, \"x\"],\n\t\t[0o004, \"r\"],\n\t\t[0o002, \"w\"],\n\t\t[0o001, \"x\"],\n\t] as const;\n\tconst permissions = permissionBits\n\t\t.map(([bit, symbol]) => (mode & bit ? symbol : \"-\"))\n\t\t.join(\"\");\n\n\treturn `${fileType}${permissions}`;\n}\n\nfunction formatDate(date: Date): string {\n\treturn date.toISOString().replace(\"T\", \" \").slice(0, 16);\n}\n\nexport const lsCommand: ShellModule = {\n\tname: \"ls\",\n\tdescription: \"List directory contents\",\n\tcategory: \"navigation\",\n\tparams: [\"[-la] [path]\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst longFormat = ifFlag(args, [\"-l\", \"--long\"]);\n\t\tconst showHidden = ifFlag(args, [\"-a\", \"--all\"]);\n\t\tconst targetArg = getArg(args, 0, {\n\t\t\tflags: [\"-l\", \"--long\", \"-a\", \"--all\", \"-la\", \"-al\"],\n\t\t});\n\t\tconst target = resolvePath(cwd, targetArg ?? cwd);\n\t\tassertPathAccess(authUser, target, \"ls\");\n\t\tconst items = shell.vfs\n\t\t\t.list(target)\n\t\t\t.filter((name) => showHidden || !name.startsWith(\".\"));\n\t\tconst rendered = longFormat\n\t\t\t? items\n\t\t\t\t\t.map((name) => {\n\t\t\t\t\t\tconst childPath = resolvePath(target, name);\n\t\t\t\t\t\tconst stat = shell.vfs.stat(childPath);\n\t\t\t\t\t\tconst size = stat.type === \"file\" ? stat.size : stat.childrenCount;\n\t\t\t\t\t\treturn `${formatPermissions(stat.mode, stat.type === \"directory\")} 1 ${size} ${formatDate(stat.updatedAt)} ${name}${stat.type === \"directory\" ? \"/\" : \"\"}`;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\"\\n\")\n\t\t\t: joinListWithType(target, items, (p) => shell.vfs.stat(p));\n\t\treturn { stdout: rendered, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n\nexport const lsbReleaseCommand: ShellModule = {\n\tname: \"lsb_release\",\n\tdescription: \"Print distribution-specific information\",\n\tcategory: \"system\",\n\tparams: [\"[-a] [-i] [-d] [-r] [-c]\"],\n\trun: ({ args, shell }) => {\n\t\tlet osName = shell.properties?.os ?? \"Fortune GNU/Linux x64\";\n\t\tlet codename = \"aurora\";\n\t\tlet version = \"1.0\";\n\n\t\ttry {\n\t\t\tconst content = shell.vfs.readFile(\"/etc/os-release\");\n\t\t\tfor (const line of content.split(\"\\n\")) {\n\t\t\t\tif (line.startsWith(\"PRETTY_NAME=\"))\n\t\t\t\t\tosName = line\n\t\t\t\t\t\t.slice(\"PRETTY_NAME=\".length)\n\t\t\t\t\t\t.replace(/^\"|\"$/g, \"\")\n\t\t\t\t\t\t.trim();\n\t\t\t\tif (line.startsWith(\"VERSION_CODENAME=\"))\n\t\t\t\t\tcodename = line.slice(\"VERSION_CODENAME=\".length).trim();\n\t\t\t\tif (line.startsWith(\"VERSION_ID=\"))\n\t\t\t\t\tversion = line\n\t\t\t\t\t\t.slice(\"VERSION_ID=\".length)\n\t\t\t\t\t\t.replace(/^\"|\"$/g, \"\")\n\t\t\t\t\t\t.trim();\n\t\t\t}\n\t\t} catch {}\n\n\t\tconst all = ifFlag(args, [\"-a\", \"--all\"]);\n\t\tconst showId = ifFlag(args, [\"-i\", \"--id\"]);\n\t\tconst showDesc = ifFlag(args, [\"-d\", \"--description\"]);\n\t\tconst showRelease = ifFlag(args, [\"-r\", \"--release\"]);\n\t\tconst showCodename = ifFlag(args, [\"-c\", \"--codename\"]);\n\n\t\tif (all || args.length === 0) {\n\t\t\treturn {\n\t\t\t\tstdout: [\n\t\t\t\t\t`Distributor ID:\\tFortune`,\n\t\t\t\t\t`Description:\\t${osName}`,\n\t\t\t\t\t`Release:\\t${version}`,\n\t\t\t\t\t`Codename:\\t${codename}`,\n\t\t\t\t].join(\"\\n\"),\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst lines: string[] = [];\n\t\tif (showId) lines.push(`Distributor ID:\\tFortune`);\n\t\tif (showDesc) lines.push(`Description:\\t${osName}`);\n\t\tif (showRelease) lines.push(`Release:\\t${version}`);\n\t\tif (showCodename) lines.push(`Codename:\\t${codename}`);\n\n\t\treturn { stdout: lines.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nconst MAN_PAGES: Record<string, string> = {\n\tls: `LS(1) User Commands LS(1)\n\nNAME\n ls - list directory contents\n\nSYNOPSIS\n ls [OPTION]... [FILE]...\n\nDESCRIPTION\n List information about the FILEs (the current directory by default).\n\nOPTIONS\n -l use a long listing format\n -a do not ignore entries starting with .\n -h with -l, print human readable sizes\n -r reverse order while sorting\n -t sort by modification time\n\nAUTHOR\n Written by Richard M. Stallman and David MacKenzie.`,\n\n\tcat: `CAT(1) User Commands CAT(1)\n\nNAME\n cat - concatenate files and print on the standard output\n\nSYNOPSIS\n cat [OPTION]... [FILE]...\n\nDESCRIPTION\n Concatenate FILE(s) to standard output.\n\nOPTIONS\n -n, --number number all output lines\n -b, --number-nonblank number nonempty output lines`,\n\n\tgrep: `GREP(1) User Commands GREP(1)\n\nNAME\n grep, egrep, fgrep - print lines that match patterns\n\nSYNOPSIS\n grep [OPTION]... PATTERNS [FILE]...\n\nOPTIONS\n -i, --ignore-case ignore case distinctions in patterns and data\n -v, --invert-match select non-matching lines\n -n, --line-number print line number with output lines\n -r, --recursive read all files under each directory, recursively`,\n\n\tapt: `APT(8) APT APT(8)\n\nNAME\n apt - command-line interface\n\nSYNOPSIS\n apt [options] command\n\nDESCRIPTION\n apt provides a high-level commandline interface for the package\n management system.\n\nCOMMANDS\n install pkg... Install packages\n remove pkg... Remove packages\n update Download package information\n upgrade Upgrade installed packages\n search term Search in package descriptions\n show pkg Show package information\n list List packages`,\n\n\tssh: `SSH(1) OpenSSH SSH(1)\n\nNAME\n ssh - OpenSSH remote login client\n\nSYNOPSIS\n ssh [-p port] [user@]hostname [command]\n\nDESCRIPTION\n ssh (SSH client) is a program for logging into a remote machine and\n for executing commands on a remote machine.`,\n\n\tcurl: `CURL(1) User Commands CURL(1)\n\nNAME\n curl - transfer a URL\n\nSYNOPSIS\n curl [options / URLs]\n\nDESCRIPTION\n curl is a tool for transferring data with URL syntax.\n\nOPTIONS\n -o, --output <file> Write output to <file>\n -X, --request <method> Specify request method\n -d, --data <data> HTTP POST data\n -H, --header <header> Pass custom header\n -s, --silent Silent mode\n -I, --head Show document info only\n -L, --location Follow redirects\n -v, --verbose Make the operation more talkative`,\n\n\tchmod: `CHMOD(1) User Commands CHMOD(1)\n\nNAME\n chmod - change file mode bits\n\nSYNOPSIS\n chmod [OPTION]... MODE[,MODE]... FILE...\n chmod [OPTION]... OCTAL-MODE FILE...\n\nDESCRIPTION\n Change the file mode bits of each given file according to MODE.\n\nEXAMPLES\n chmod 755 script.sh rwxr-xr-x\n chmod 644 file.txt rw-r--r--\n chmod +x script.sh add execute permission`,\n\n\ttar: `TAR(1) GNU tar Manual TAR(1)\n\nNAME\n tar - an archiving utility\n\nSYNOPSIS\n tar [OPTION...] [FILE]...\n\nDESCRIPTION\n tar saves many files together into a single tape or disk archive,\n and can restore individual files from the archive.\n\nOPTIONS\n -c, --create create a new archive\n -x, --extract extract files from an archive\n -z, --gzip filter the archive through gzip\n -f, --file=ARCHIVE use archive file or device ARCHIVE\n -v, --verbose verbosely list files processed\n -t, --list list the contents of an archive`,\n};\n\nexport const manCommand: ShellModule = {\n\tname: \"man\",\n\tdescription: \"Interface to the system reference manuals\",\n\tcategory: \"shell\",\n\tparams: [\"<command>\"],\n\trun: ({ args, shell }) => {\n\t\tconst name = args[0];\n\t\tif (!name) return { stderr: \"What manual page do you want?\", exitCode: 1 };\n\n\t\t// VFS-installed man pages take priority\n\t\tconst manPath = `/usr/share/man/man1/${name}.1`;\n\t\tif (shell.vfs.exists(manPath)) {\n\t\t\treturn { stdout: shell.vfs.readFile(manPath), exitCode: 0 };\n\t\t}\n\n\t\tconst page = MAN_PAGES[name.toLowerCase()];\n\t\tif (page) return { stdout: page, exitCode: 0 };\n\n\t\treturn { stderr: `No manual entry for ${name}`, exitCode: 16 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const mkdirCommand: ShellModule = {\n\tname: \"mkdir\",\n\tdescription: \"Make directories\",\n\tcategory: \"files\",\n\tparams: [\"<dir>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tif (args.length === 0) {\n\t\t\treturn { stderr: \"mkdir: missing operand\", exitCode: 1 };\n\t\t}\n\n\t\tfor (let index = 0; index < args.length; index++) {\n\t\t\tconst dir = getArg(args, index);\n\t\t\tif (!dir) {\n\t\t\t\treturn { stderr: \"mkdir: missing operand\", exitCode: 1 };\n\t\t\t}\n\t\t\tconst target = resolvePath(cwd, dir);\n\t\t\tassertPathAccess(authUser, target, \"mkdir\");\n\t\t\tshell.vfs.mkdir(target);\n\t\t}\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const mvCommand: ShellModule = {\n\tname: \"mv\",\n\tdescription: \"Move or rename files\",\n\tcategory: \"files\",\n\tparams: [\"<source> <dest>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst positionals = args.filter((a) => !a.startsWith(\"-\"));\n\t\tconst [srcArg, destArg] = positionals;\n\n\t\tif (!srcArg || !destArg) {\n\t\t\treturn { stderr: \"mv: missing operand\", exitCode: 1 };\n\t\t}\n\n\t\tconst srcPath = resolvePath(cwd, srcArg);\n\t\tconst destPath = resolvePath(cwd, destArg);\n\n\t\ttry {\n\t\t\tassertPathAccess(authUser, srcPath, \"mv\");\n\t\t\tassertPathAccess(authUser, destPath, \"mv\");\n\n\t\t\tif (!shell.vfs.exists(srcPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `mv: ${srcArg}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If dest is a directory, move into it\n\t\t\tconst finalDest =\n\t\t\t\tshell.vfs.exists(destPath) &&\n\t\t\t\tshell.vfs.stat(destPath).type === \"directory\"\n\t\t\t\t\t? `${destPath}/${srcArg.split(\"/\").pop()}`\n\t\t\t\t\t: destPath;\n\n\t\t\tshell.vfs.move(srcPath, finalDest);\n\t\t\treturn { exitCode: 0 };\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\treturn { stderr: `mv: ${msg}`, exitCode: 1 };\n\t\t}\n\t},\n};\n", "import * as path from \"node:path\";\nimport type { ShellModule } from \"../types/commands\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const nanoCommand: ShellModule = {\n\tname: \"nano\",\n\tdescription: \"Text editor\",\n\tcategory: \"files\",\n\tparams: [\"<file>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst fileArg = args[0];\n\t\tif (!fileArg) {\n\t\t\treturn { stderr: \"nano: missing file operand\", exitCode: 1 };\n\t\t}\n\n\t\tconst targetPath = resolvePath(cwd, fileArg);\n\t\tassertPathAccess(authUser, targetPath, \"nano\");\n\t\tconst initialContent = shell.vfs.exists(targetPath)\n\t\t\t? shell.vfs.readFile(targetPath)\n\t\t\t: \"\";\n\t\tconst safeName = path.posix.basename(targetPath) || \"buffer\";\n\t\tconst tempPath = `/tmp/sshmimic-nano-${Date.now()}-${safeName}.tmp`;\n\n\t\treturn {\n\t\t\topenEditor: {\n\t\t\t\ttargetPath,\n\t\t\t\ttempPath,\n\t\t\t\tinitialContent,\n\t\t\t},\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ShellProperties } from \"../VirtualShell\";\n\nfunction formatUptime(seconds: number): string {\n\tconst totalMinutes = Math.max(1, Math.floor(seconds / 60));\n\tconst days = Math.floor(totalMinutes / (24 * 60));\n\tconst hours = Math.floor((totalMinutes % (24 * 60)) / 60);\n\tconst minutes = totalMinutes % 60;\n\n\tconst parts: string[] = [];\n\tif (days > 0) {\n\t\tparts.push(`${days} day${days > 1 ? \"s\" : \"\"}`);\n\t}\n\tif (hours > 0) {\n\t\tparts.push(`${hours} hour${hours > 1 ? \"s\" : \"\"}`);\n\t}\n\tif (minutes > 0 || parts.length === 0) {\n\t\tparts.push(`${minutes} min${minutes > 1 ? \"s\" : \"\"}`);\n\t}\n\n\treturn parts.join(\", \");\n}\n\nfunction colorBlock(code: number): string {\n\treturn `\\u001b[${code}m \\u001b[0m`;\n}\n\nfunction buildColorBars(): string[] {\n\tconst normal = [40, 41, 42, 43, 44, 45, 46, 47].map(colorBlock).join(\"\");\n\tconst bright = [100, 101, 102, 103, 104, 105, 106, 107]\n\t\t.map(colorBlock)\n\t\t.join(\"\");\n\treturn [normal, bright];\n}\n\nfunction colorizeLogoLine(line: string, index: number, total: number): string {\n\tif (line.trim().length === 0) {\n\t\treturn line;\n\t}\n\n\tconst start = { r: 255, g: 255, b: 255 };\n\tconst end = { r: 168, g: 85, b: 247 };\n\tconst ratio = total <= 1 ? 0 : index / (total - 1);\n\n\tconst r = Math.round(start.r + (end.r - start.r) * ratio);\n\tconst g = Math.round(start.g + (end.g - start.g) * ratio);\n\tconst b = Math.round(start.b + (end.b - start.b) * ratio);\n\n\treturn `\\u001b[38;2;${r};${g};${b}m${line}\\u001b[0m`;\n}\n\nfunction colorizeDetailLine(line: string): string {\n\tif (line.trim().length === 0) {\n\t\treturn line;\n\t}\n\n\tconst colonIndex = line.indexOf(\":\");\n\n\tif (colonIndex === -1) {\n\t\t// Pas de ':', chercher '@' pour identifier user@host\n\t\tif (line.includes(\"@\")) {\n\t\t\t// C'est user@host, appliquer d\u00E9grad\u00E9 horizontal\n\t\t\treturn applyHorizontalGradient(line);\n\t\t}\n\t\t// Sinon c'est un separator ou autre, laisser tel quel\n\t\treturn line;\n\t}\n\n\t// Il y a un ':', c'est titre: valeur\n\tconst title = line.substring(0, colonIndex + 1);\n\tconst value = line.substring(colonIndex + 1);\n\n\t// Appliquer le d\u00E9grad\u00E9 seulement au titre\n\tconst colorized = applyHorizontalGradient(title);\n\treturn colorized + value;\n}\n\nfunction applyHorizontalGradient(text: string): string {\n\t// Nettoyer les codes ANSI existants\n\tconst ansiRegex = new RegExp(`${String.fromCharCode(27)}\\\\[[\\\\d;]*m`, \"g\");\n\tconst cleaned = text.replace(ansiRegex, \"\");\n\n\tif (cleaned.trim().length === 0) {\n\t\treturn text;\n\t}\n\n\tconst start = { r: 255, g: 255, b: 255 };\n\tconst end = { r: 168, g: 85, b: 247 };\n\tlet result = \"\";\n\n\tfor (let i = 0; i < cleaned.length; i += 1) {\n\t\tconst ratio = cleaned.length <= 1 ? 0 : i / (cleaned.length - 1);\n\n\t\tconst r = Math.round(start.r + (end.r - start.r) * ratio);\n\t\tconst g = Math.round(start.g + (end.g - start.g) * ratio);\n\t\tconst b = Math.round(start.b + (end.b - start.b) * ratio);\n\n\t\tresult += `\\u001b[38;2;${r};${g};${b}m${cleaned[i]}\\u001b[0m`;\n\t}\n\n\treturn result;\n}\n\nexport interface NeofetchInfo {\n\tuser: string;\n\thost: string;\n\tosName?: string;\n\tkernel?: string;\n\tuptimeSeconds?: number;\n\tpackages?: string;\n\tshell?: string;\n\tshellProps?: ShellProperties;\n\tresolution?: string;\n\tterminal?: string;\n\tcpu?: string;\n\tgpu?: string;\n\tmemoryUsedMiB?: number;\n\tmemoryTotalMiB?: number;\n}\n\nfunction toMiB(bytes: number): number {\n\treturn Math.max(0, Math.round(bytes / (1024 * 1024)));\n}\n\nfunction readOsPrettyName(): string | undefined {\n\ttry {\n\t\tconst data = readFileSync(\"/etc/os-release\", \"utf8\");\n\t\tfor (const line of data.split(\"\\n\")) {\n\t\t\tif (!line.startsWith(\"PRETTY_NAME=\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst value = line.slice(\"PRETTY_NAME=\".length).trim();\n\t\t\treturn value.replace(/^\"|\"$/g, \"\");\n\t\t}\n\t} catch {\n\t\treturn undefined;\n\t}\n\n\treturn undefined;\n}\n\nfunction readFirstLine(filePath: string): string | undefined {\n\ttry {\n\t\tconst data = readFileSync(filePath, \"utf8\").split(\"\\n\")[0]?.trim();\n\t\tif (!data || data.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn data;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction resolveHostLabel(fallback: string): string {\n\tconst vendor = readFirstLine(\"/sys/devices/virtual/dmi/id/sys_vendor\");\n\tconst product = readFirstLine(\"/sys/devices/virtual/dmi/id/product_name\");\n\n\tif (vendor && product) {\n\t\treturn `${vendor} ${product}`;\n\t}\n\tif (product) {\n\t\treturn product;\n\t}\n\n\treturn fallback;\n}\n\nfunction countDpkgPackages(): number | undefined {\n\tconst candidates = [\"/var/lib/dpkg/status\", \"/usr/local/var/lib/dpkg/status\"];\n\n\tfor (const filePath of candidates) {\n\t\tif (!existsSync(filePath)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst data = readFileSync(filePath, \"utf8\");\n\t\t\tconst matches = data.match(/^Package:\\s+/gm);\n\t\t\treturn matches?.length ?? 0;\n\t\t} catch {}\n\t}\n\n\treturn undefined;\n}\n\nfunction countSnapPackages(): number | undefined {\n\tconst candidates = [\"/snap\", \"/var/lib/snapd/snaps\"];\n\n\tfor (const dirPath of candidates) {\n\t\tif (!existsSync(dirPath)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst entries = readdirSync(dirPath, { withFileTypes: true });\n\t\t\tconst count = entries.filter((entry) => entry.isDirectory()).length;\n\t\t\treturn count;\n\t\t} catch {}\n\t}\n\n\treturn undefined;\n}\n\nfunction resolvePackagesLabel(): string {\n\tconst dpkgCount = countDpkgPackages();\n\tconst snapCount = countSnapPackages();\n\n\tif (dpkgCount !== undefined && snapCount !== undefined) {\n\t\treturn `${dpkgCount} (dpkg), ${snapCount} (snap)`;\n\t}\n\tif (dpkgCount !== undefined) {\n\t\treturn `${dpkgCount} (dpkg)`;\n\t}\n\tif (snapCount !== undefined) {\n\t\treturn `${snapCount} (snap)`;\n\t}\n\n\treturn \"n/a\";\n}\n\nfunction resolveCpuLabel(): string {\n\tconst cpus = os.cpus();\n\tif (cpus.length === 0) {\n\t\treturn \"unknown\";\n\t}\n\n\tconst first = cpus[0];\n\tif (!first) {\n\t\treturn \"unknown\";\n\t}\n\n\tconst ghz = (first.speed / 1000).toFixed(2);\n\treturn `${first.model} (${cpus.length}) @ ${ghz}GHz`;\n}\n\nfunction resolveShellLabel(shell?: string): string {\n\tif (!shell || shell.trim().length === 0) {\n\t\treturn \"unknown\";\n\t}\n\n\treturn path.posix.basename(shell.trim());\n}\n\nfunction resolveDefaults(info: NeofetchInfo): Required<NeofetchInfo> {\n\tconst totalMem = os.totalmem();\n\tconst freeMem = os.freemem();\n\tconst usedMem = Math.max(0, totalMem - freeMem);\n\tconst shellProps = info.shellProps;\n\n\tconst processUptime = process.uptime();\n\tif (info.uptimeSeconds === undefined) {\n\t\tinfo.uptimeSeconds = Math.round(processUptime);\n\t}\n\n\treturn {\n\t\tuser: info.user,\n\t\thost: info.host,\n\t\tosName:\n\t\t\tshellProps?.os ??\n\t\t\tinfo.osName ??\n\t\t\t`${readOsPrettyName() ?? os.type()} ${os.arch()}`,\n\t\tkernel: shellProps?.kernel ?? info.kernel ?? os.release(),\n\t\tuptimeSeconds: info.uptimeSeconds ?? os.uptime(),\n\t\tpackages: info.packages ?? resolvePackagesLabel(),\n\t\tshell: resolveShellLabel(info.shell),\n\t\tshellProps: (info.shellProps as ShellProperties) ?? {\n\t\t\tkernel: info.kernel ?? os.release(),\n\t\t\tos: info.osName ?? `${readOsPrettyName() ?? os.type()} ${os.arch()}`,\n\t\t\tarch: os.arch(),\n\t\t},\n\t\tresolution: info.resolution ?? \"n/a (ssh)\",\n\t\tterminal: info.terminal ?? \"unknown\",\n\t\tcpu: info.cpu ?? resolveCpuLabel(),\n\t\tgpu: info.gpu ?? \"n/a\",\n\t\tmemoryUsedMiB: info.memoryUsedMiB ?? toMiB(usedMem),\n\t\tmemoryTotalMiB: info.memoryTotalMiB ?? toMiB(totalMem),\n\t};\n}\n\nexport function buildNeofetchOutput(info: NeofetchInfo): string {\n\tconst fields = resolveDefaults(info);\n\tconst uptime = formatUptime(fields.uptimeSeconds);\n\tconst colorBars = buildColorBars();\n\n\tconst distroLogo = [\n\t\t\" .. .:. \",\n\t\t\" .::.. .. .. \",\n\t\t\". .... ... .. \",\n\t\t\": .... .:. .. \",\n\t\t\": .:.:........:. .. \",\n\t\t\": .. \",\n\t\t\". : \",\n\t\t\". : \",\n\t\t\".. : \",\n\t\t\" :. .. \",\n\t\t\" .. .. \",\n\t\t\" :-. :: \",\n\t\t\" .:. :. \",\n\t\t\" ..: ... \",\n\t\t\" ..: :.. \",\n\t\t\" :... :....\",\n\t\t\" .. ....\",\n\t\t\" . .. \",\n\t\t\" .:. .: \",\n\t\t\" :. .. \",\n\t\t\" ::. .. \",\n\t\t\"..... ..:... \",\n\t\t\"...:. .. \",\n\t\t\".:...:. ::. .. \",\n\t\t\" ... ..:::::.. ..:::::::.. \",\n\t];\n\n\tconst details = [\n\t\t`${fields.user}@${fields.host}`,\n\t\t\"-------------------------\",\n\t\t`OS: ${fields.osName}`,\n\t\t`Host: ${resolveHostLabel(fields.host)}`,\n\t\t`Kernel: ${fields.kernel}`,\n\t\t`Uptime: ${uptime}`,\n\t\t// `Packages: ${fields.packages}`,\n\t\t`Packages: ${fields.packages}`,\n\t\t`Shell: ${fields.shell}`,\n\t\t// `Shell Props: ${fields.shellProps}`,\n\t\t`Resolution: ${fields.resolution}`,\n\t\t`Terminal: ${fields.terminal}`,\n\t\t`CPU: ${fields.cpu}`,\n\t\t`GPU: ${fields.gpu}`,\n\t\t`Memory: ${fields.memoryUsedMiB}MiB / ${fields.memoryTotalMiB}MiB`,\n\t\t\"\",\n\t\tcolorBars[0],\n\t\tcolorBars[1],\n\t];\n\n\tconst width = Math.max(distroLogo.length, details.length);\n\tconst lines: string[] = [];\n\n\tfor (let i = 0; i < width; i += 1) {\n\t\tconst rawLeft = distroLogo[i] ?? \"\";\n\t\tconst right = details[i] ?? \"\";\n\t\tif (right.length > 0) {\n\t\t\tconst left = colorizeLogoLine(\n\t\t\t\trawLeft.padEnd(31, \" \"),\n\t\t\t\ti,\n\t\t\t\tdistroLogo.length,\n\t\t\t);\n\t\t\tconst coloredRight = colorizeDetailLine(right);\n\t\t\tlines.push(`${left} ${coloredRight}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tlines.push(colorizeLogoLine(rawLeft, i, distroLogo.length));\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n", "/** biome-ignore-all lint/style/useNamingConvention: env variables */\nimport type { ShellModule } from \"../types/commands\";\n\n// Legacy global store kept for compatibility with older callers\nconst _globalEnv: Record<string, string> = {\n\tPATH: \"/usr/local/bin:/usr/bin:/bin\",\n\tHOME: \"/home/user\",\n\tSHELL: \"/bin/sh\",\n\tTERM: \"xterm-256color\",\n\tUSER: \"user\",\n};\n\n/** @deprecated use env.vars from CommandContext */\nexport function getEnvVar(name: string): string | undefined {\n\treturn _globalEnv[name];\n}\n/** @deprecated use env.vars from CommandContext */\nexport function setEnvVar(name: string, value: string): void {\n\t_globalEnv[name] = value;\n}\n/** @deprecated use env.vars from CommandContext */\nexport function getAllEnvVars(authUser: string): Record<string, string> {\n\t_globalEnv.USER = authUser;\n\t_globalEnv.HOME = `/home/${authUser}`;\n\treturn { ..._globalEnv };\n}\n\nexport const setCommand: ShellModule = {\n\tname: \"set\",\n\tdescription: \"Display or set shell variables\",\n\tcategory: \"shell\",\n\tparams: [\"[VAR=value]\"],\n\trun: ({ args, env }) => {\n\t\tif (args.length === 0) {\n\t\t\tconst out = Object.entries(env.vars)\n\t\t\t\t.map(([k, v]) => `${k}=${v}`)\n\t\t\t\t.join(\"\\n\");\n\t\t\treturn { stdout: out, exitCode: 0 };\n\t\t}\n\t\tfor (const arg of args) {\n\t\t\tif (arg.includes(\"=\")) {\n\t\t\t\tconst eq = arg.indexOf(\"=\");\n\t\t\t\tenv.vars[arg.slice(0, eq)] = arg.slice(eq + 1);\n\t\t\t}\n\t\t}\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import { buildNeofetchOutput } from \"../modules/neofetch\";\nimport type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { getAllEnvVars } from \"./set\";\n\nexport const neofetchCommand: ShellModule = {\n\tname: \"neofetch\",\n\tdescription: \"System info display\",\n\tcategory: \"system\",\n\tparams: [\"[--off]\"],\n\trun: ({ args, authUser, hostname, shell }) => {\n\t\tconst env = getAllEnvVars(authUser);\n\n\t\tif (ifFlag(args, \"--help\")) {\n\t\t\treturn {\n\t\t\t\tstdout: \"Usage: neofetch [--off]\",\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\tif (ifFlag(args, \"--off\")) {\n\t\t\treturn {\n\t\t\t\tstdout: `${authUser}@${hostname}`,\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstdout: buildNeofetchOutput({\n\t\t\t\tuser: authUser,\n\t\t\t\thost: hostname,\n\t\t\t\tshell: env.SHELL,\n\t\t\t\tshellProps: shell.properties,\n\t\t\t\tterminal: env.TERM,\n\t\t\t\tuptimeSeconds: Math.floor((Date.now() - shell.startTime) / 1000),\n\t\t\t\tpackages: (() => {\n\t\t\t\t\tconst count = shell.packageManager?.installedCount() ?? 0;\n\t\t\t\t\treturn `${count} (dpkg)`;\n\t\t\t\t})(),\n\t\t\t}),\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "/** biome-ignore-all lint/style/useNamingConvention: node globals and ENV VAR KEYS */\n/**\n * node.ts \u2014 Virtual Node.js runtime.\n *\n * Uses `node:vm` for sandboxed evaluation with a controlled context that\n * intercepts `process`, `require`, `console`, and all standard globals.\n * No host filesystem access, no network, no child processes.\n */\nimport vm from \"node:vm\";\nimport type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { resolvePath } from \"./helpers\";\n\nconst VIRTUAL_VERSION = \"v18.19.0\";\nconst VIRTUAL_VERSIONS = {\n\tnode: VIRTUAL_VERSION,\n\tnpm: \"9.2.0\",\n\tv8: \"10.2.154.26-node.22\",\n};\n\n// \u2500\u2500\u2500 sandbox context \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction makeContext(outputLines: string[], stderrLines: string[]) {\n\tconst fakeProcess = {\n\t\tversion: VIRTUAL_VERSION,\n\t\tversions: VIRTUAL_VERSIONS,\n\t\tplatform: \"linux\",\n\t\tarch: \"x64\",\n\t\tenv: {\n\t\t\tNODE_ENV: \"production\",\n\t\t\tHOME: \"/root\",\n\t\t\tPATH: \"/usr/local/bin:/usr/bin:/bin\",\n\t\t},\n\t\targv: [\"node\"],\n\t\tstdout: {\n\t\t\twrite: (s: string) => {\n\t\t\t\toutputLines.push(s);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t\tstderr: {\n\t\t\twrite: (s: string) => {\n\t\t\t\tstderrLines.push(s);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t},\n\t\texit: (code = 0) => {\n\t\t\tthrow new ExitSignal(code);\n\t\t},\n\t\tcwd: () => \"/root\",\n\t\thrtime: () => [0, 0],\n\t};\n\n\tconst fakeConsole = {\n\t\tlog: (...a: unknown[]) => outputLines.push(a.map(formatValue).join(\" \")),\n\t\terror: (...a: unknown[]) => stderrLines.push(a.map(formatValue).join(\" \")),\n\t\twarn: (...a: unknown[]) => stderrLines.push(a.map(formatValue).join(\" \")),\n\t\tinfo: (...a: unknown[]) => outputLines.push(a.map(formatValue).join(\" \")),\n\t\tdir: (v: unknown) => outputLines.push(formatValue(v)),\n\t};\n\n\tconst fakeRequire = (mod: string): unknown => {\n\t\t// Provide stubs for common modules\n\t\tswitch (mod) {\n\t\t\tcase \"path\":\n\t\t\t\treturn {\n\t\t\t\t\tjoin: (...parts: string[]) => parts.join(\"/\").replace(/\\/+/g, \"/\"),\n\t\t\t\t\tresolve: (...parts: string[]) =>\n\t\t\t\t\t\t`/${parts.join(\"/\").replace(/^\\/+/, \"\")}`,\n\t\t\t\t\tdirname: (p: string) => p.split(\"/\").slice(0, -1).join(\"/\") || \"/\",\n\t\t\t\t\tbasename: (p: string) => p.split(\"/\").pop() ?? \"\",\n\t\t\t\t\textname: (p: string) => {\n\t\t\t\t\t\tconst b = p.split(\"/\").pop() ?? \"\";\n\t\t\t\t\t\tconst d = b.lastIndexOf(\".\");\n\t\t\t\t\t\treturn d > 0 ? b.slice(d) : \"\";\n\t\t\t\t\t},\n\t\t\t\t\tsep: \"/\",\n\t\t\t\t\tdelimiter: \":\",\n\t\t\t\t};\n\t\t\tcase \"os\":\n\t\t\t\treturn {\n\t\t\t\t\tplatform: () => \"linux\",\n\t\t\t\t\tarch: () => \"x64\",\n\t\t\t\t\ttype: () => \"Linux\",\n\t\t\t\t\thostname: () => \"fortune-vm\",\n\t\t\t\t\thomedir: () => \"/root\",\n\t\t\t\t\ttmpdir: () => \"/tmp\",\n\t\t\t\t\tEOL: \"\\n\",\n\t\t\t\t};\n\t\t\tcase \"util\":\n\t\t\t\treturn {\n\t\t\t\t\tformat: (...a: unknown[]) => a.map(formatValue).join(\" \"),\n\t\t\t\t\tinspect: (v: unknown) => formatValue(v),\n\t\t\t\t};\n\t\t\tcase \"fs\":\n\t\t\tcase \"fs/promises\":\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot require '${mod}': filesystem access not available in virtual runtime`,\n\t\t\t\t);\n\t\t\tcase \"child_process\":\n\t\t\tcase \"net\":\n\t\t\tcase \"http\":\n\t\t\tcase \"https\":\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot require '${mod}': not available in virtual runtime`,\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Cannot find module '${mod}'`);\n\t\t}\n\t};\n\tfakeRequire.resolve = (id: string) => {\n\t\tthrow new Error(`Cannot resolve '${id}'`);\n\t};\n\tfakeRequire.cache = {};\n\tfakeRequire.extensions = {};\n\n\treturn vm.createContext({\n\t\t// Core globals\n\t\tconsole: fakeConsole,\n\t\tprocess: fakeProcess,\n\t\trequire: fakeRequire,\n\n\t\t// JS built-ins\n\t\tMath,\n\t\tJSON,\n\t\tObject,\n\t\tArray,\n\t\tString,\n\t\tNumber,\n\t\tBoolean,\n\t\tSymbol,\n\t\tDate,\n\t\tRegExp,\n\t\tError,\n\t\tTypeError,\n\t\tRangeError,\n\t\tSyntaxError,\n\t\tPromise,\n\t\tMap,\n\t\tSet,\n\t\tWeakMap,\n\t\tWeakSet,\n\t\tparseInt,\n\t\tparseFloat,\n\t\tisNaN,\n\t\tisFinite,\n\t\tencodeURIComponent,\n\t\tdecodeURIComponent,\n\t\tencodeURI,\n\t\tdecodeURI,\n\t\tsetTimeout: () => {},\n\t\tclearTimeout: () => {},\n\t\tsetInterval: () => {},\n\t\tclearInterval: () => {},\n\t\tqueueMicrotask: () => {},\n\t\tglobalThis: undefined as unknown, // set below\n\t\tundefined,\n\t\tInfinity,\n\t\tNaN,\n\t});\n}\n\nclass ExitSignal {\n\tconstructor(public readonly code: number) {}\n}\n\nfunction formatValue(v: unknown): string {\n\tif (v === null) return \"null\";\n\tif (v === undefined) return \"undefined\";\n\tif (typeof v === \"string\") return v;\n\tif (typeof v === \"function\") return `[Function: ${v.name || \"(anonymous)\"}]`;\n\tif (Array.isArray(v)) return `[ ${v.map(formatValue).join(\", \")} ]`;\n\tif (v instanceof Error) return `${v.name}: ${v.message}`;\n\tif (typeof v === \"object\") {\n\t\ttry {\n\t\t\tconst entries = Object.entries(v as Record<string, unknown>)\n\t\t\t\t.map(([k, val]) => `${k}: ${formatValue(val)}`)\n\t\t\t\t.join(\", \");\n\t\t\treturn `{ ${entries} }`;\n\t\t} catch {\n\t\t\treturn \"[Object]\";\n\t\t}\n\t}\n\treturn String(v);\n}\n\n// \u2500\u2500\u2500 execution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction runJs(code: string): {\n\tstdout: string;\n\tstderr: string;\n\texitCode: number;\n} {\n\tconst outputLines: string[] = [];\n\tconst stderrLines: string[] = [];\n\tconst ctx = makeContext(outputLines, stderrLines);\n\n\tlet exitCode = 0;\n\n\ttry {\n\t\tconst result = vm.runInContext(code, ctx, { timeout: 5000 });\n\t\t// If the expression returned a value and nothing was console.log'd, print it\n\t\tif (result !== undefined && outputLines.length === 0) {\n\t\t\toutputLines.push(formatValue(result));\n\t\t}\n\t} catch (err) {\n\t\tif (err instanceof ExitSignal) {\n\t\t\texitCode = err.code;\n\t\t} else if (err instanceof Error) {\n\t\t\tstderrLines.push(`${err.name}: ${err.message}`);\n\t\t\texitCode = 1;\n\t\t} else {\n\t\t\tstderrLines.push(String(err));\n\t\t\texitCode = 1;\n\t\t}\n\t}\n\n\treturn {\n\t\tstdout: outputLines.length ? `${outputLines.join(\"\\n\")}\\n` : \"\",\n\t\tstderr: stderrLines.length ? `${stderrLines.join(\"\\n\")}\\n` : \"\",\n\t\texitCode,\n\t};\n}\n\nfunction runJsFile(code: string): {\n\tstdout: string;\n\tstderr: string;\n\texitCode: number;\n} {\n\t// If the code is a single expression (no semicolons, no newlines, no statements),\n\t// wrap it to capture the return value like a REPL would\n\tconst trimmed = code.trim();\n\tconst isExpression =\n\t\t!trimmed.includes(\"\\n\") &&\n\t\t!trimmed.startsWith(\"const \") &&\n\t\t!trimmed.startsWith(\"let \") &&\n\t\t!trimmed.startsWith(\"var \") &&\n\t\t!trimmed.startsWith(\"function \") &&\n\t\t!trimmed.startsWith(\"class \") &&\n\t\t!trimmed.startsWith(\"if \") &&\n\t\t!trimmed.startsWith(\"for \") &&\n\t\t!trimmed.startsWith(\"while \") &&\n\t\t!trimmed.startsWith(\"import \") &&\n\t\t!trimmed.startsWith(\"//\");\n\n\tif (isExpression) return runJs(trimmed);\n\n\t// Multi-line: wrap in IIFE\n\treturn runJs(`(async () => { ${code} })()`);\n}\n\n// \u2500\u2500\u2500 command \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/**\n * `node` virtual runtime command. Executes JS in a safe sandbox with\n * limited globals and no host FS/child process access.\n * @category system\n * @params []\n */\nexport const nodeCommand: ShellModule = {\n\tname: \"node\",\n\tdescription: \"JavaScript runtime (virtual)\",\n\tcategory: \"system\",\n\tparams: [\"[--version] [-e <expr>] [-p <expr>] [file]\"],\n\trun: ({ args, shell, cwd }) => {\n\t\t// Require explicit installation via `apt install nodejs`\n\t\tif (!shell.packageManager.isInstalled(\"nodejs\")) {\n\t\t\treturn {\n\t\t\t\tstderr:\n\t\t\t\t\t\"bash: node: command not found\\nHint: install it with: apt install nodejs\\n\",\n\t\t\t\texitCode: 127,\n\t\t\t};\n\t\t}\n\t\tif (ifFlag(args, [\"--version\", \"-v\"])) {\n\t\t\treturn { stdout: `${VIRTUAL_VERSION}\\n`, exitCode: 0 };\n\t\t}\n\n\t\tif (ifFlag(args, [\"--versions\"])) {\n\t\t\treturn {\n\t\t\t\tstdout: `${JSON.stringify(VIRTUAL_VERSIONS, null, 2)}\\n`,\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\t// -e 'expr'\n\t\tconst eIdx = args.findIndex((a) => a === \"-e\" || a === \"--eval\");\n\t\tif (eIdx !== -1) {\n\t\t\tconst expr = args[eIdx + 1];\n\t\t\tif (!expr)\n\t\t\t\treturn { stderr: \"node: -e requires an argument\\n\", exitCode: 1 };\n\t\t\tconst { stdout, stderr, exitCode } = runJs(expr);\n\t\t\treturn {\n\t\t\t\tstdout: stdout || undefined,\n\t\t\t\tstderr: stderr || undefined,\n\t\t\t\texitCode,\n\t\t\t};\n\t\t}\n\n\t\t// -p 'expr' \u2014 print mode\n\t\tconst pIdx = args.findIndex((a) => a === \"-p\" || a === \"--print\");\n\t\tif (pIdx !== -1) {\n\t\t\tconst expr = args[pIdx + 1];\n\t\t\tif (!expr)\n\t\t\t\treturn { stderr: \"node: -p requires an argument\\n\", exitCode: 1 };\n\t\t\tconst { stdout, stderr, exitCode } = runJs(expr);\n\t\t\treturn {\n\t\t\t\tstdout: stdout || (exitCode === 0 ? \"\\n\" : undefined),\n\t\t\t\tstderr: stderr || undefined,\n\t\t\t\texitCode,\n\t\t\t};\n\t\t}\n\n\t\t// node <file>\n\t\tconst file = args.find((a) => !a.startsWith(\"-\"));\n\t\tif (file) {\n\t\t\tconst filePath = resolvePath(cwd, file);\n\t\t\tif (!shell.vfs.exists(filePath)) {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `node: cannot open file '${file}': No such file or directory\\n`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst code = shell.vfs.readFile(filePath);\n\t\t\tconst { stdout, stderr, exitCode } = runJsFile(code);\n\t\t\treturn {\n\t\t\t\tstdout: stdout || undefined,\n\t\t\t\tstderr: stderr || undefined,\n\t\t\t\texitCode,\n\t\t\t};\n\t\t}\n\n\t\t// No args \u2014 REPL hint\n\t\treturn {\n\t\t\tstdout: [\n\t\t\t\t`Welcome to Node.js ${VIRTUAL_VERSION}.`,\n\t\t\t\t`Type \".exit\" to exit the REPL.`,\n\t\t\t\t`> `,\n\t\t\t].join(\"\\n\"),\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "/**\n * npm.ts \u2014 Virtual npm command.\n * Gated behind `apt install npm`. Provides version info and informative\n * stubs for common subcommands.\n */\nimport type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n\nconst NPM_VERSION = \"9.2.0\";\nconst NODE_VERSION = \"18.19.0\";\n\n/**\n * `npm` virtual CLI. Requires `apt install npm` in the virtual package manager.\n * @category system\n * @params [\"<command> [args]\"]\n */\nexport const npmCommand: ShellModule = {\n\tname: \"npm\",\n\tdescription: \"Node.js package manager (virtual)\",\n\tcategory: \"system\",\n\tparams: [\"<command> [args]\"],\n\trun: ({ args, shell }) => {\n\t\t// Require explicit installation\n\t\tif (!shell.packageManager.isInstalled(\"npm\")) {\n\t\t\treturn {\n\t\t\t\tstderr:\n\t\t\t\t\t\"bash: npm: command not found\\nHint: install it with: apt install npm\\n\",\n\t\t\t\texitCode: 127,\n\t\t\t};\n\t\t}\n\n\t\tif (ifFlag(args, [\"--version\", \"-v\"])) {\n\t\t\treturn { stdout: `${NPM_VERSION}\\n`, exitCode: 0 };\n\t\t}\n\n\t\tconst sub = args[0]?.toLowerCase();\n\n\t\tswitch (sub) {\n\t\t\tcase \"version\":\n\t\t\tcase \"-version\":\n\t\t\t\treturn {\n\t\t\t\t\tstdout: `{ npm: '${NPM_VERSION}', node: '${NODE_VERSION}', v8: '10.2.154.26' }\\n`,\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\n\t\t\tcase \"install\":\n\t\t\tcase \"i\":\n\t\t\tcase \"add\":\n\t\t\t\treturn {\n\t\t\t\t\tstderr:\n\t\t\t\t\t\t\"npm warn: package installation is not available in the virtual runtime.\\nnpm warn: This environment simulates npm CLI behaviour only.\\n\",\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\n\t\t\tcase \"run\":\n\t\t\tcase \"exec\":\n\t\t\tcase \"x\":\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `npm error: script execution is not available in the virtual runtime.\\n`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\n\t\t\tcase \"init\":\n\t\t\t\treturn {\n\t\t\t\t\tstdout: \"Wrote to /home/user/package.json\\n\",\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\n\t\t\tcase \"list\":\n\t\t\tcase \"ls\":\n\t\t\t\treturn {\n\t\t\t\t\tstdout: `${sub === \"ls\" || sub === \"list\" ? \"virtual-env@1.0.0\" : \"\"}\\n\u2514\u2500\u2500 (empty)\\n`,\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\n\t\t\tcase \"help\":\n\t\t\tcase undefined:\n\t\t\t\treturn {\n\t\t\t\t\tstdout: `${[\n\t\t\t\t\t\t`npm ${NPM_VERSION}`,\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"Usage: npm <command>\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"Commands:\",\n\t\t\t\t\t\t\" install (not available in virtual runtime)\",\n\t\t\t\t\t\t\" run (not available in virtual runtime)\",\n\t\t\t\t\t\t\" exec (not available in virtual runtime)\",\n\t\t\t\t\t\t\" list List installed packages\",\n\t\t\t\t\t\t\" version Print versions\",\n\t\t\t\t\t\t\" --version Print npm version\",\n\t\t\t\t\t].join(\"\\n\")}\\n`,\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `npm error: unknown command: ${sub}\\n`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t}\n\t},\n};\n\n/**\n * `npx` virtual runner. Requires `apt install npm` in the virtual package manager.\n * @category system\n * @params [\"<package> [args]\"]\n */\nexport const npxCommand: ShellModule = {\n\tname: \"npx\",\n\tdescription: \"Node.js package runner (virtual)\",\n\tcategory: \"system\",\n\tparams: [\"<package> [args]\"],\n\trun: ({ args, shell }) => {\n\t\tif (!shell.packageManager.isInstalled(\"npm\")) {\n\t\t\treturn {\n\t\t\t\tstderr:\n\t\t\t\t\t\"bash: npx: command not found\\nHint: install it with: apt install npm\\n\",\n\t\t\t\texitCode: 127,\n\t\t\t};\n\t\t}\n\n\t\tif (ifFlag(args, [\"--version\"])) {\n\t\t\treturn { stdout: `${NPM_VERSION}\\n`, exitCode: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\tstderr: `npx: package execution is not available in the virtual runtime.\\n`,\n\t\t\texitCode: 1,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const passwdCommand: ShellModule = {\n\tname: \"passwd\",\n\tdescription: \"Change user password\",\n\tcategory: \"users\",\n\tparams: [\"<username> <password>\"],\n\trun: async ({ authUser, args, shell }) => {\n\t\tconst [username, password] = args;\n\t\tif (!username || !password) {\n\t\t\treturn {\n\t\t\t\tstderr: \"passwd: usage: passwd <username> <password>\",\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\n\t\tif (authUser !== \"root\" && authUser !== username) {\n\t\t\treturn { stderr: \"passwd: permission denied\", exitCode: 1 };\n\t\t}\n\n\t\tawait shell.users.setPassword(username, password);\n\t\treturn {\n\t\t\tstdout: `passwd: password updated for '${username}'`,\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { parseArgs } from \"./command-helpers\";\n\nexport const pingCommand: ShellModule = {\n\tname: \"ping\",\n\tdescription: \"Send ICMP ECHO_REQUEST (mock)\",\n\tcategory: \"network\",\n\tparams: [\"[-c <count>] <host>\"],\n\trun: ({ args }) => {\n\t\tconst { flagsWithValues, positionals } = parseArgs(args, {\n\t\t\tflagsWithValue: [\"-c\", \"-i\", \"-W\"],\n\t\t});\n\t\tconst host = positionals[0] ?? \"localhost\";\n\t\tconst countArg = flagsWithValues.get(\"-c\");\n\t\tconst count = countArg ? Math.max(1, parseInt(countArg, 10) || 4) : 4;\n\t\tconst lines = [`PING ${host}: 56 data bytes`];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst ms = (Math.random() * 10 + 1).toFixed(3);\n\t\t\tlines.push(`64 bytes from ${host}: icmp_seq=${i} ttl=64 time=${ms} ms`);\n\t\t}\n\t\tlines.push(`--- ${host} ping statistics ---`);\n\t\tlines.push(\n\t\t\t`${count} packets transmitted, ${count} received, 0% packet loss`,\n\t\t);\n\t\treturn { stdout: lines.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\n/**\n * Render a printf format string with given arguments.\n * Supports: %s %d %i %f %o %x %X %% \\n \\t \\r \\\\\n */\nfunction renderPrintf(fmt: string, args: string[]): string {\n\tlet argIdx = 0;\n\tlet out = \"\";\n\tlet i = 0;\n\twhile (i < fmt.length) {\n\t\tif (fmt[i] === \"\\\\\" && i + 1 < fmt.length) {\n\t\t\tswitch (fmt[i + 1]) {\n\t\t\t\tcase \"n\":\n\t\t\t\t\tout += \"\\n\";\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\tcase \"t\":\n\t\t\t\t\tout += \"\\t\";\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\tcase \"r\":\n\t\t\t\t\tout += \"\\r\";\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\tcase \"\\\\\":\n\t\t\t\t\tout += \"\\\\\";\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\tcase \"a\":\n\t\t\t\t\tout += \"\\x07\";\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\tcase \"b\":\n\t\t\t\t\tout += \"\\x08\";\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\tcase \"f\":\n\t\t\t\t\tout += \"\\x0C\";\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\tcase \"v\":\n\t\t\t\t\tout += \"\\x0B\";\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\tdefault:\n\t\t\t\t\tout += fmt[i]!;\n\t\t\t\t\ti++;\n\t\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (fmt[i] === \"%\" && i + 1 < fmt.length) {\n\t\t\t// Optional width/precision: %[-][width][.prec]spec\n\t\t\tlet j = i + 1;\n\t\t\tif (fmt[j] === \"-\") j++;\n\t\t\twhile (j < fmt.length && /\\d/.test(fmt[j]!)) j++;\n\t\t\tif (fmt[j] === \".\") {\n\t\t\t\tj++;\n\t\t\t\twhile (j < fmt.length && /\\d/.test(fmt[j]!)) j++;\n\t\t\t}\n\t\t\tconst spec = fmt[j];\n\t\t\tconst arg = args[argIdx++] ?? \"\";\n\t\t\tswitch (spec) {\n\t\t\t\tcase \"s\":\n\t\t\t\t\tout += arg;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"d\":\n\t\t\t\tcase \"i\":\n\t\t\t\t\tout += String(parseInt(arg, 10) || 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"f\":\n\t\t\t\t\tout += String(parseFloat(arg) || 0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"o\":\n\t\t\t\t\tout += (parseInt(arg, 10) || 0).toString(8);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"x\":\n\t\t\t\t\tout += (parseInt(arg, 10) || 0).toString(16);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"X\":\n\t\t\t\t\tout += (parseInt(arg, 10) || 0).toString(16).toUpperCase();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"%\":\n\t\t\t\t\tout += \"%\";\n\t\t\t\t\targIdx--;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tout += fmt[i]!;\n\t\t\t\t\ti++;\n\t\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ti = j + 1;\n\t\t\tcontinue;\n\t\t}\n\t\tout += fmt[i]!;\n\t\ti++;\n\t}\n\treturn out;\n}\n\nexport const printfCommand: ShellModule = {\n\tname: \"printf\",\n\tdescription: \"Format and print data\",\n\tcategory: \"shell\",\n\tparams: [\"<format> [args...]\"],\n\trun: ({ args }) => {\n\t\tconst fmt = args[0];\n\t\tif (!fmt) return { stderr: \"printf: missing format string\", exitCode: 1 };\n\t\tconst output = renderPrintf(fmt, args.slice(1));\n\t\treturn { stdout: output, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n\nexport const psCommand: ShellModule = {\n\tname: \"ps\",\n\tdescription: \"Report process status\",\n\tcategory: \"system\",\n\tparams: [\"[-a] [-u] [-x] [aux]\"],\n\trun: ({ authUser, shell, args }) => {\n\t\tconst sessions = shell.users.listActiveSessions();\n\t\tconst showUser =\n\t\t\tifFlag(args, [\"-u\"]) ||\n\t\t\targs.includes(\"u\") ||\n\t\t\targs.includes(\"aux\") ||\n\t\t\targs.includes(\"au\");\n\t\tconst showAll =\n\t\t\tifFlag(args, [\"-a\", \"-x\"]) || args.includes(\"a\") || args.includes(\"aux\");\n\n\t\tif (showUser) {\n\t\t\tconst header =\n\t\t\t\t\"USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND\";\n\t\t\tconst rows: string[] = [header];\n\t\t\tlet pid = 1000;\n\t\t\tfor (const s of sessions) {\n\t\t\t\tconst user = s.username.padEnd(10).slice(0, 10);\n\t\t\t\tconst mem = (Math.random() * 0.5).toFixed(1);\n\t\t\t\tconst vsz = Math.floor(Math.random() * 20000 + 5000);\n\t\t\t\tconst rss = Math.floor(Math.random() * 5000 + 1000);\n\t\t\t\trows.push(\n\t\t\t\t\t`${user} ${String(pid).padStart(6)} 0.0 ${mem.padStart(4)} ${String(vsz).padStart(6)} ${String(rss).padStart(5)} ${s.tty.padEnd(8)} Ss 00:00 0:00 bash`,\n\t\t\t\t);\n\t\t\t\tpid++;\n\t\t\t}\n\t\t\trows.push(\n\t\t\t\t`root ${String(pid).padStart(6)} 0.0 0.0 0 0 ? S 00:00 0:00 ps`,\n\t\t\t);\n\t\t\treturn { stdout: rows.join(\"\\n\"), exitCode: 0 };\n\t\t}\n\n\t\tconst header = \" PID TTY TIME CMD\";\n\t\tconst rows: string[] = [header];\n\t\tlet pid = 1000;\n\t\tfor (const s of sessions) {\n\t\t\tif (!showAll && s.username !== authUser) continue;\n\t\t\trows.push(\n\t\t\t\t`${String(pid).padStart(5)} ${s.tty.padEnd(12)} 00:00:00 ${s.username === authUser ? \"bash\" : `bash (${s.username})`}`,\n\t\t\t);\n\t\t\tpid++;\n\t\t}\n\t\trows.push(`${String(pid).padStart(5)} pts/0 00:00:00 ps`);\n\t\treturn { stdout: rows.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const pwdCommand: ShellModule = {\n\tname: \"pwd\",\n\tdescription: \"Print working directory\",\n\tcategory: \"navigation\",\n\tparams: [],\n\trun: ({ cwd }) => ({ stdout: cwd, exitCode: 0 }),\n};\n", "/** biome-ignore-all lint/suspicious/useIterableCallbackReturn: intentional side-effect forEach */\n/**\n * python.ts \u2014 Virtual Python 3 interpreter.\n *\n * Implements a genuine mini-interpreter capable of:\n * - print(), len(), type(), range(), list(), str(), int(), float(), bool()\n * - max(), min(), abs(), sum(), sorted(), reversed(), enumerate(), zip()\n * - str methods: upper(), lower(), strip(), split(), join(), replace(),\n * startswith(), endswith(), format(), count(), find()\n * - list methods: append(), extend(), pop(), sort(), reverse(), index()\n * - dict: keys(), values(), items(), get()\n * - import os, sys, math, json, re (stubs)\n * - f-strings, multi-line scripts, assignments, for/while loops, if/elif/else\n * - functions (def), return, class basics\n */\nimport type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { resolvePath } from \"./helpers\";\n\nconst VERSION = \"Python 3.11.2\";\nconst _VERSION_SHORT = \"3.11.2\";\nconst VERSION_INFO = \"3.11.2 (default, Mar 13 2023, 12:18:29) [GCC 12.2.0]\";\n\n// \u2500\u2500\u2500 Python value type \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype PyVal =\n\t| null\n\t| boolean\n\t| number\n\t| string\n\t| PyVal[]\n\t| PyDict\n\t| PyRange\n\t| PyFunc\n\t| PyClass\n\t| PyInstance\n\t| PyNone;\ntype PyDict = { __pytype__: \"dict\"; data: Map<string, PyVal> };\ntype PyRange = {\n\t__pytype__: \"range\";\n\tstart: number;\n\tstop: number;\n\tstep: number;\n};\ntype PyFunc = {\n\t__pytype__: \"func\";\n\tname: string;\n\tparams: string[];\n\tbody: string[];\n\tclosure: Scope;\n};\ntype PyClass = {\n\t__pytype__: \"class\";\n\tname: string;\n\tmethods: Map<string, PyFunc>;\n\tbases: string[];\n};\ntype PyInstance = {\n\t__pytype__: \"instance\";\n\tcls: PyClass;\n\tattrs: Map<string, PyVal>;\n};\ntype PyNone = { __pytype__: \"none\" };\n\nconst NONE: PyNone = { __pytype__: \"none\" };\n\nfunction pyDict(entries: [string, PyVal][] = []): PyDict {\n\treturn { __pytype__: \"dict\", data: new Map(entries) };\n}\nfunction pyRange(start: number, stop: number, step = 1): PyRange {\n\treturn { __pytype__: \"range\", start, stop, step };\n}\n\nfunction isPyDict(v: PyVal): v is PyDict {\n\treturn (\n\t\t!!v &&\n\t\ttypeof v === \"object\" &&\n\t\t!Array.isArray(v) &&\n\t\t(v as PyDict).__pytype__ === \"dict\"\n\t);\n}\nfunction isPyRange(v: PyVal): v is PyRange {\n\treturn (\n\t\t!!v &&\n\t\ttypeof v === \"object\" &&\n\t\t!Array.isArray(v) &&\n\t\t(v as PyRange).__pytype__ === \"range\"\n\t);\n}\nfunction isPyFunc(v: PyVal): v is PyFunc {\n\treturn (\n\t\t!!v &&\n\t\ttypeof v === \"object\" &&\n\t\t!Array.isArray(v) &&\n\t\t(v as PyFunc).__pytype__ === \"func\"\n\t);\n}\nfunction isPyClass(v: PyVal): v is PyClass {\n\treturn (\n\t\t!!v &&\n\t\ttypeof v === \"object\" &&\n\t\t!Array.isArray(v) &&\n\t\t(v as PyClass).__pytype__ === \"class\"\n\t);\n}\nfunction isPyInstance(v: PyVal): v is PyInstance {\n\treturn (\n\t\t!!v &&\n\t\ttypeof v === \"object\" &&\n\t\t!Array.isArray(v) &&\n\t\t(v as PyInstance).__pytype__ === \"instance\"\n\t);\n}\nfunction isPyNone(v: PyVal): v is PyNone {\n\treturn (\n\t\t!!v &&\n\t\ttypeof v === \"object\" &&\n\t\t!Array.isArray(v) &&\n\t\t(v as PyNone).__pytype__ === \"none\"\n\t);\n}\n\n// \u2500\u2500\u2500 repr / str \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction pyRepr(v: PyVal): string {\n\tif (v === null || isPyNone(v)) return \"None\";\n\tif (v === true) return \"True\";\n\tif (v === false) return \"False\";\n\tif (typeof v === \"number\")\n\t\treturn Number.isInteger(v)\n\t\t\t? String(v)\n\t\t\t: v.toPrecision(12).replace(/\\.?0+$/, \"\");\n\tif (typeof v === \"string\") return `'${v.replace(/'/g, \"\\\\'\")}'`;\n\tif (Array.isArray(v)) return `[${v.map(pyRepr).join(\", \")}]`;\n\tif (isPyDict(v))\n\t\treturn `{${[...v.data.entries()].map(([k, val]) => `'${k}': ${pyRepr(val)}`).join(\", \")}}`;\n\tif (isPyRange(v))\n\t\treturn `range(${v.start}, ${v.stop}${v.step !== 1 ? `, ${v.step}` : \"\"})`;\n\tif (isPyFunc(v)) return `<function ${v.name} at 0x...>`;\n\tif (isPyClass(v)) return `<class '${v.name}'>`;\n\tif (isPyInstance(v)) return `<${v.cls.name} object at 0x...>`;\n\treturn String(v);\n}\n\nfunction pyStr(v: PyVal): string {\n\tif (v === null || isPyNone(v)) return \"None\";\n\tif (v === true) return \"True\";\n\tif (v === false) return \"False\";\n\tif (typeof v === \"number\")\n\t\treturn Number.isInteger(v)\n\t\t\t? String(v)\n\t\t\t: v.toPrecision(12).replace(/\\.?0+$/, \"\");\n\tif (typeof v === \"string\") return v;\n\tif (Array.isArray(v)) return `[${v.map(pyRepr).join(\", \")}]`;\n\tif (isPyDict(v))\n\t\treturn `{${[...v.data.entries()].map(([k, val]) => `'${k}': ${pyRepr(val)}`).join(\", \")}}`;\n\tif (isPyRange(v))\n\t\treturn `range(${v.start}, ${v.stop}${v.step !== 1 ? `, ${v.step}` : \"\"})`;\n\treturn pyRepr(v);\n}\n\nfunction pyBool(v: PyVal): boolean {\n\tif (v === null || isPyNone(v)) return false;\n\tif (typeof v === \"boolean\") return v;\n\tif (typeof v === \"number\") return v !== 0;\n\tif (typeof v === \"string\") return v.length > 0;\n\tif (Array.isArray(v)) return v.length > 0;\n\tif (isPyDict(v)) return v.data.size > 0;\n\tif (isPyRange(v)) return pyRangeLength(v) > 0;\n\treturn true;\n}\n\nfunction pyRangeLength(r: PyRange): number {\n\tif (r.step === 0) return 0;\n\tconst n = Math.ceil((r.stop - r.start) / r.step);\n\treturn Math.max(0, n);\n}\n\nfunction pyRangeItems(r: PyRange): number[] {\n\tconst items: number[] = [];\n\tfor (let i = r.start; r.step > 0 ? i < r.stop : i > r.stop; i += r.step) {\n\t\titems.push(i);\n\t\tif (items.length > 10000) break;\n\t}\n\treturn items;\n}\n\nfunction pyIter(v: PyVal): PyVal[] {\n\tif (Array.isArray(v)) return v;\n\tif (typeof v === \"string\") return [...v];\n\tif (isPyRange(v)) return pyRangeItems(v);\n\tif (isPyDict(v)) return [...v.data.keys()];\n\tthrow new PyError(\"TypeError\", `'${pyTypeName(v)}' object is not iterable`);\n}\n\nfunction pyTypeName(v: PyVal): string {\n\tif (v === null || isPyNone(v)) return \"NoneType\";\n\tif (typeof v === \"boolean\") return \"bool\";\n\tif (typeof v === \"number\") return Number.isInteger(v) ? \"int\" : \"float\";\n\tif (typeof v === \"string\") return \"str\";\n\tif (Array.isArray(v)) return \"list\";\n\tif (isPyDict(v)) return \"dict\";\n\tif (isPyRange(v)) return \"range\";\n\tif (isPyFunc(v)) return \"function\";\n\tif (isPyClass(v)) return \"type\";\n\tif (isPyInstance(v)) return v.cls.name;\n\treturn \"object\";\n}\n\nclass PyError {\n\tconstructor(\n\t\tpublic type: string,\n\t\tpublic message: string,\n\t) {}\n\ttoString() {\n\t\treturn `${this.type}: ${this.message}`;\n\t}\n}\nclass ReturnSignal {\n\tconstructor(public value: PyVal) {}\n}\nclass BreakSignal {}\nclass ContinueSignal {}\nclass ExitSignal {\n\tconstructor(public code: number) {}\n}\n\n// \u2500\u2500\u2500 scope \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype Scope = Map<string, PyVal>;\n\nfunction makeRootScope(cwd: string): Scope {\n\tconst scope = new Map<string, PyVal>();\n\n\t// Built-in modules (lazy)\n\tconst osModule = pyDict([\n\t\t[\"sep\", \"/\"],\n\t\t[\"linesep\", \"\\n\"],\n\t\t[\"curdir\", \".\"],\n\t\t[\"pardir\", \"..\"],\n\t]);\n\t(osModule as unknown as Record<string, PyVal>).__methods__ = {\n\t\tgetcwd: () => cwd,\n\t\tgetenv: (k: PyVal) =>\n\t\t\ttypeof k === \"string\" ? (process.env[k] ?? NONE) : NONE,\n\t\tpath: pyDict([\n\t\t\t[\"join\", NONE],\n\t\t\t[\"exists\", NONE],\n\t\t\t[\"dirname\", NONE],\n\t\t\t[\"basename\", NONE],\n\t\t]),\n\t\tlistdir: () => [],\n\t} as unknown as PyVal;\n\n\tscope.set(\"__builtins__\", NONE);\n\tscope.set(\"__name__\", \"__main__\");\n\tscope.set(\"__cwd__\", cwd);\n\n\treturn scope;\n}\n\n// \u2500\u2500\u2500 built-in modules \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction makeOsModule(cwd: string): PyDict {\n\tconst path = pyDict([\n\t\t[\"sep\", \"/\"],\n\t\t[\"curdir\", \".\"],\n\t]);\n\tconst os = pyDict([\n\t\t[\"sep\", \"/\"],\n\t\t[\"linesep\", \"\\n\"],\n\t\t[\"name\", \"posix\"],\n\t]);\n\t// We'll handle method calls in callMethod\n\t(os as unknown as { _cwd: string })._cwd = cwd;\n\t(path as unknown as { _cwd: string })._cwd = cwd;\n\t(os as unknown as { path: PyDict }).path = path;\n\treturn os;\n}\n\nfunction makeSysModule(): PyDict {\n\treturn pyDict([\n\t\t[\"version\", VERSION_INFO],\n\t\t[\n\t\t\t\"version_info\",\n\t\t\tpyDict(\n\t\t\t\t[\n\t\t\t\t\t[\"major\", 3],\n\t\t\t\t\t[\"minor\", 11],\n\t\t\t\t\t[\"micro\", 2],\n\t\t\t\t].map(([k, v]) => [k as string, v as number]),\n\t\t\t),\n\t\t],\n\t\t[\"platform\", \"linux\"],\n\t\t[\"executable\", \"/usr/bin/python3\"],\n\t\t[\"prefix\", \"/usr\"],\n\t\t[\"path\", [\"/usr/lib/python3.11\", \"/usr/lib/python3.11/lib-dynload\"]],\n\t\t[\"argv\", [\"\"]],\n\t\t[\"maxsize\", 9007199254740991],\n\t]);\n}\n\nfunction makeMathModule(): PyDict {\n\treturn pyDict([\n\t\t[\"pi\", Math.PI],\n\t\t[\"e\", Math.E],\n\t\t[\"tau\", Math.PI * 2],\n\t\t[\"inf\", Infinity],\n\t\t[\"nan\", NaN],\n\t\t[\"sqrt\", NONE],\n\t\t[\"floor\", NONE],\n\t\t[\"ceil\", NONE],\n\t\t[\"log\", NONE],\n\t\t[\"pow\", NONE],\n\t\t[\"sin\", NONE],\n\t\t[\"cos\", NONE],\n\t\t[\"tan\", NONE],\n\t\t[\"fabs\", NONE],\n\t\t[\"factorial\", NONE],\n\t]);\n}\n\nfunction makeJsonModule(): PyDict {\n\treturn pyDict([\n\t\t[\"dumps\", NONE],\n\t\t[\"loads\", NONE],\n\t]);\n}\n\nfunction makeReModule(): PyDict {\n\treturn pyDict([\n\t\t[\"match\", NONE],\n\t\t[\"search\", NONE],\n\t\t[\"findall\", NONE],\n\t\t[\"sub\", NONE],\n\t\t[\"split\", NONE],\n\t\t[\"compile\", NONE],\n\t]);\n}\n\nconst MODULE_FACTORIES: Record<string, (cwd: string) => PyDict> = {\n\tos: makeOsModule,\n\tsys: () => makeSysModule(),\n\tmath: () => makeMathModule(),\n\tjson: () => makeJsonModule(),\n\tre: () => makeReModule(),\n\trandom: () =>\n\t\tpyDict([\n\t\t\t[\"random\", NONE],\n\t\t\t[\"randint\", NONE],\n\t\t\t[\"choice\", NONE],\n\t\t\t[\"shuffle\", NONE],\n\t\t]),\n\ttime: () =>\n\t\tpyDict([\n\t\t\t[\"time\", NONE],\n\t\t\t[\"sleep\", NONE],\n\t\t\t[\"ctime\", NONE],\n\t\t]),\n\tdatetime: () =>\n\t\tpyDict([\n\t\t\t[\"datetime\", NONE],\n\t\t\t[\"date\", NONE],\n\t\t\t[\"timedelta\", NONE],\n\t\t]),\n\tcollections: () =>\n\t\tpyDict([\n\t\t\t[\"Counter\", NONE],\n\t\t\t[\"defaultdict\", NONE],\n\t\t\t[\"OrderedDict\", NONE],\n\t\t]),\n\titertools: () =>\n\t\tpyDict([\n\t\t\t[\"chain\", NONE],\n\t\t\t[\"product\", NONE],\n\t\t\t[\"combinations\", NONE],\n\t\t\t[\"permutations\", NONE],\n\t\t]),\n\tfunctools: () =>\n\t\tpyDict([\n\t\t\t[\"reduce\", NONE],\n\t\t\t[\"partial\", NONE],\n\t\t\t[\"lru_cache\", NONE],\n\t\t]),\n\tstring: () =>\n\t\tpyDict([\n\t\t\t[\"ascii_letters\", \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"],\n\t\t\t[\"digits\", \"0123456789\"],\n\t\t\t[\"punctuation\", \"!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~\"],\n\t\t]),\n};\n\n// \u2500\u2500\u2500 interpreter \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nclass Interpreter {\n\tprivate output: string[] = [];\n\tprivate stderr: string[] = [];\n\tprivate modules = new Map<string, PyDict>();\n\n\tconstructor(private readonly cwd: string) {}\n\n\tgetOutput(): string {\n\t\treturn this.output.join(\"\\n\") + (this.output.length ? \"\\n\" : \"\");\n\t}\n\tgetStderr(): string {\n\t\treturn this.stderr.join(\"\\n\") + (this.stderr.length ? \"\\n\" : \"\");\n\t}\n\n\t// \u2500\u2500 tokenizer / parser helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\tprivate splitArgs(s: string): string[] {\n\t\t// Split on commas respecting balanced parens, brackets, braces, quotes\n\t\tconst args: string[] = [];\n\t\tlet depth = 0,\n\t\t\tcur = \"\",\n\t\t\tinStr = false,\n\t\t\tstrChar = \"\";\n\t\tfor (let i = 0; i < s.length; i++) {\n\t\t\tconst ch = s[i]!;\n\t\t\tif (inStr) {\n\t\t\t\tcur += ch;\n\t\t\t\tif (ch === strChar && s[i - 1] !== \"\\\\\") inStr = false;\n\t\t\t} else if (ch === '\"' || ch === \"'\") {\n\t\t\t\tinStr = true;\n\t\t\t\tstrChar = ch;\n\t\t\t\tcur += ch;\n\t\t\t} else if (\"([{\".includes(ch)) {\n\t\t\t\tdepth++;\n\t\t\t\tcur += ch;\n\t\t\t} else if (\")]}\".includes(ch)) {\n\t\t\t\tdepth--;\n\t\t\t\tcur += ch;\n\t\t\t} else if (ch === \",\" && depth === 0) {\n\t\t\t\targs.push(cur.trim());\n\t\t\t\tcur = \"\";\n\t\t\t} else {\n\t\t\t\tcur += ch;\n\t\t\t}\n\t\t}\n\t\tif (cur.trim()) args.push(cur.trim());\n\t\treturn args;\n\t}\n\n\t// \u2500\u2500 expression evaluator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\tpyEval(expr: string, scope: Scope): PyVal {\n\t\texpr = expr.trim();\n\t\tif (!expr) return NONE;\n\n\t\t// None True False literals\n\t\tif (expr === \"None\") return NONE;\n\t\tif (expr === \"True\") return true;\n\t\tif (expr === \"False\") return false;\n\t\tif (expr === \"...\") return NONE;\n\n\t\t// Number literals\n\t\tif (/^-?\\d+$/.test(expr)) return parseInt(expr, 10);\n\t\tif (/^-?\\d+\\.\\d*$/.test(expr)) return parseFloat(expr);\n\t\tif (/^0x[0-9a-fA-F]+$/.test(expr)) return parseInt(expr, 16);\n\t\tif (/^0o[0-7]+$/.test(expr)) return parseInt(expr.slice(2), 8);\n\n\t\t// String literals (single, double, triple)\n\t\tif (/^('''[\\s\\S]*'''|\"\"\"[\\s\\S]*\"\"\")$/.test(expr)) {\n\t\t\treturn expr.slice(3, -3);\n\t\t}\n\t\tif (/^(['\"])(.*)\\1$/s.test(expr)) {\n\t\t\tconst inner = expr.slice(1, -1);\n\t\t\treturn inner\n\t\t\t\t.replace(/\\\\n/g, \"\\n\")\n\t\t\t\t.replace(/\\\\t/g, \"\\t\")\n\t\t\t\t.replace(/\\\\r/g, \"\\r\")\n\t\t\t\t.replace(/\\\\\\\\/g, \"\\\\\")\n\t\t\t\t.replace(/\\\\'/g, \"'\")\n\t\t\t\t.replace(/\\\\\"/g, '\"');\n\t\t}\n\n\t\t// f-strings\n\t\tconst fMatch = expr.match(/^f(['\"])([\\s\\S]*)\\1$/);\n\t\tif (fMatch) {\n\t\t\tlet result = fMatch[2]!;\n\t\t\tresult = result.replace(/\\{([^{}]+)\\}/g, (_, inner) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn pyStr(this.pyEval(inner.trim(), scope));\n\t\t\t\t} catch {\n\t\t\t\t\treturn `{${inner}}`;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\n\t\t// Byte strings b\"...\" \u2014 treat as string\n\t\tconst bMatch = expr.match(/^b(['\"])(.*)\\1$/s);\n\t\tif (bMatch) return bMatch[2]!;\n\n\t\t// List literal [...]\n\t\tif (expr.startsWith(\"[\") && expr.endsWith(\"]\")) {\n\t\t\tconst inner = expr.slice(1, -1).trim();\n\t\t\tif (!inner) return [];\n\t\t\t// List comprehension\n\t\t\tconst compMatch = inner.match(\n\t\t\t\t/^(.+?)\\s+for\\s+(\\w+)\\s+in\\s+(.+?)(?:\\s+if\\s+(.+))?$/,\n\t\t\t);\n\t\t\tif (compMatch) {\n\t\t\t\tconst [, itemExpr, varName, iterExpr, condExpr] = compMatch;\n\t\t\t\tconst iterable = pyIter(this.pyEval(iterExpr!.trim(), scope));\n\t\t\t\tconst result: PyVal[] = [];\n\t\t\t\tfor (const item of iterable) {\n\t\t\t\t\tconst inner2 = new Map(scope);\n\t\t\t\t\tinner2.set(varName!, item);\n\t\t\t\t\tif (condExpr && !pyBool(this.pyEval(condExpr, inner2))) continue;\n\t\t\t\t\tresult.push(this.pyEval(itemExpr!.trim(), inner2));\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn this.splitArgs(inner).map((a) => this.pyEval(a, scope));\n\t\t}\n\n\t\t// Tuple (...)\n\t\tif (expr.startsWith(\"(\") && expr.endsWith(\")\")) {\n\t\t\tconst inner = expr.slice(1, -1).trim();\n\t\t\tif (!inner) return [];\n\t\t\tconst parts = this.splitArgs(inner);\n\t\t\tif (parts.length === 1 && !inner.endsWith(\",\"))\n\t\t\t\treturn this.pyEval(parts[0]!, scope);\n\t\t\treturn parts.map((a) => this.pyEval(a, scope));\n\t\t}\n\n\t\t// Dict literal {...}\n\t\tif (expr.startsWith(\"{\") && expr.endsWith(\"}\")) {\n\t\t\tconst inner = expr.slice(1, -1).trim();\n\t\t\tif (!inner) return pyDict();\n\t\t\tconst dict = pyDict();\n\t\t\tfor (const entry of this.splitArgs(inner)) {\n\t\t\t\tconst colonIdx = entry.indexOf(\":\");\n\t\t\t\tif (colonIdx === -1) continue;\n\t\t\t\tconst k = pyStr(this.pyEval(entry.slice(0, colonIdx).trim(), scope));\n\t\t\t\tconst v = this.pyEval(entry.slice(colonIdx + 1).trim(), scope);\n\t\t\t\tdict.data.set(k, v);\n\t\t\t}\n\t\t\treturn dict;\n\t\t}\n\n\t\t// not expr\n\t\tconst notMatch = expr.match(/^not\\s+(.+)$/);\n\t\tif (notMatch) return !pyBool(this.pyEval(notMatch[1]!, scope));\n\n\t\t// Binary operators (right-to-left scan at lowest depth)\n\t\tconst binaryOps = [\n\t\t\t[\"or\"],\n\t\t\t[\"and\"],\n\t\t\t[\"in\", \"not in\", \"is not\", \"is\", \"==\", \"!=\", \"<=\", \">=\", \"<\", \">\"],\n\t\t\t[\"+\", \"-\"],\n\t\t\t[\"**\"],\n\t\t\t[\"*\", \"//\", \"/\", \"%\"],\n\t\t];\n\t\tfor (const ops of binaryOps) {\n\t\t\tconst result = this.tryBinaryOp(expr, ops, scope);\n\t\t\tif (result !== undefined) return result;\n\t\t}\n\n\t\t// Unary minus\n\t\tif (expr.startsWith(\"-\")) {\n\t\t\tconst val = this.pyEval(expr.slice(1), scope);\n\t\t\tif (typeof val === \"number\") return -val;\n\t\t}\n\n\t\t// Subscript: expr[key] or expr[start:stop]\n\t\tif (process.env.PY_DEBUG) console.error(\"eval:\", JSON.stringify(expr));\n\t\tif (expr.endsWith(\"]\") && !expr.startsWith(\"[\")) {\n\t\t\tconst bracketStart = this.findMatchingBracket(expr, \"[\");\n\t\t\tif (bracketStart !== -1) {\n\t\t\t\tconst obj = this.pyEval(expr.slice(0, bracketStart), scope);\n\t\t\t\tconst key = expr.slice(bracketStart + 1, -1);\n\t\t\t\treturn this.subscript(obj, key, scope);\n\t\t\t}\n\t\t}\n\n\t\t// Function call: name(args...) \u2014 must come BEFORE dotMatch to avoid\n\t\t// print('x'.upper()) being parsed as dotMatch(\"print('x'\", \"upper\", \"()\")\n\t\tconst callMatch = expr.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*\\(([\\s\\S]*)\\)$/);\n\t\tif (callMatch) {\n\t\t\tconst [, name, argsStr] = callMatch;\n\t\t\tconst callArgs = (argsStr?.trim() ? this.splitArgs(argsStr) : []).map(\n\t\t\t\t(a) => this.pyEval(a, scope),\n\t\t\t);\n\t\t\treturn this.callBuiltin(name!, callArgs, scope);\n\t\t}\n\n\t\t// Attribute access / method call: expr.attr or expr.method(args)\n\t\t// Uses a depth-aware scanner to find the rightmost dot at depth 0\n\t\tconst dotResult = this.findDotAccess(expr);\n\t\tif (dotResult) {\n\t\t\tconst { objExpr, attr, callPart } = dotResult;\n\t\t\tconst obj = this.pyEval(objExpr, scope);\n\t\t\tif (callPart !== undefined) {\n\t\t\t\tconst argsInner = callPart.slice(1, -1);\n\t\t\t\tconst callArgs = argsInner.trim()\n\t\t\t\t\t? this.splitArgs(argsInner).map((a) => this.pyEval(a, scope))\n\t\t\t\t\t: [];\n\t\t\t\treturn this.callMethod(obj, attr, callArgs, scope);\n\t\t\t}\n\t\t\treturn this.getAttr(obj, attr, scope);\n\t\t}\n\n\t\t// Variable lookup\n\t\tif (/^[A-Za-z_][A-Za-z0-9_]*$/.test(expr)) {\n\t\t\tif (scope.has(expr)) return scope.get(expr)!;\n\t\t\t// Check parent scopes (for closures)\n\t\t\tthrow new PyError(\"NameError\", `name '${expr}' is not defined`);\n\t\t}\n\n\t\t// Dotted name lookup (module.attr)\n\t\tif (/^[A-Za-z_][A-Za-z0-9_.]+$/.test(expr)) {\n\t\t\tconst parts = expr.split(\".\");\n\t\t\tlet val: PyVal =\n\t\t\t\tscope.get(parts[0]!) ??\n\t\t\t\t(() => {\n\t\t\t\t\tthrow new PyError(\"NameError\", `name '${parts[0]}' is not defined`);\n\t\t\t\t})();\n\t\t\tfor (const part of parts.slice(1)) {\n\t\t\t\tval = this.getAttr(val, part, scope);\n\t\t\t}\n\t\t\treturn val;\n\t\t}\n\n\t\treturn NONE;\n\t}\n\n\tprivate findMatchingBracket(s: string, open: string): number {\n\t\tconst close = open === \"[\" ? \"]\" : open === \"(\" ? \")\" : \"}\";\n\t\tlet depth = 0;\n\t\tfor (let i = s.length - 1; i >= 0; i--) {\n\t\t\tif (s[i] === close) depth++;\n\t\t\tif (s[i] === open) {\n\t\t\t\tdepth--;\n\t\t\t\tif (depth === 0) return i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Find the rightmost dot-attribute access at depth 0, respecting strings/parens.\n\t * Returns {objExpr, attr, callPart} or null if not a dot-access expression.\n\t */\n\tprivate findDotAccess(\n\t\texpr: string,\n\t): { objExpr: string; attr: string; callPart: string | undefined } | null {\n\t\t// Scan right to left for a dot at depth 0 (not inside strings/brackets)\n\t\tlet depth = 0,\n\t\t\tinStr = false,\n\t\t\tstrChar = \"\";\n\t\tfor (let i = expr.length - 1; i > 0; i--) {\n\t\t\tconst ch = expr[i]!;\n\t\t\tif (inStr) {\n\t\t\t\tif (ch === strChar && expr[i - 1] !== \"\\\\\") inStr = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (ch === '\"' || ch === \"'\") {\n\t\t\t\tinStr = true;\n\t\t\t\tstrChar = ch;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (\")]}\".includes(ch)) {\n\t\t\t\tdepth++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (\"([{\".includes(ch)) {\n\t\t\t\tdepth--;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (depth !== 0) continue;\n\t\t\tif (ch !== \".\") continue;\n\t\t\t// Found a dot at depth 0\n\t\t\tconst objExpr = expr.slice(0, i).trim();\n\t\t\tconst rest = expr.slice(i + 1); // \"attr\" or \"attr(args)\"\n\t\t\tconst attrMatch = rest.match(/^(\\w+)(\\([\\s\\S]*\\))?$/);\n\t\t\tif (!attrMatch) continue;\n\t\t\t// Skip float literals like 1.5\n\t\t\tif (/^-?\\d+$/.test(objExpr)) continue;\n\t\t\treturn { objExpr, attr: attrMatch[1]!, callPart: attrMatch[2] };\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate tryBinaryOp(\n\t\texpr: string,\n\t\tops: string[],\n\t\tscope: Scope,\n\t): PyVal | undefined {\n\t\tlet depth = 0,\n\t\t\tinStr = false,\n\t\t\tstrChar = \"\";\n\t\tfor (let i = expr.length - 1; i >= 0; i--) {\n\t\t\tconst ch = expr[i]!;\n\t\t\tif (inStr) {\n\t\t\t\tif (ch === strChar && expr[i - 1] !== \"\\\\\") inStr = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (ch === '\"' || ch === \"'\") {\n\t\t\t\tinStr = true;\n\t\t\t\tstrChar = ch;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (\")]}\".includes(ch)) {\n\t\t\t\tdepth++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (\"([{\".includes(ch)) {\n\t\t\t\tdepth--;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (depth !== 0) continue;\n\n\t\t\tfor (const op of ops) {\n\t\t\t\tif (expr.slice(i, i + op.length) === op) {\n\t\t\t\t\t// Skip \"*\" if it's actually part of \"**\"\n\t\t\t\t\tif (op === \"*\" && (expr[i + 1] === \"*\" || expr[i - 1] === \"*\"))\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t// Ensure it's a standalone operator (not part of identifier)\n\t\t\t\t\tconst before = expr[i - 1];\n\t\t\t\t\tconst after = expr[i + op.length];\n\t\t\t\t\tconst wordOp = /^[a-z]/.test(op);\n\t\t\t\t\tif (wordOp) {\n\t\t\t\t\t\tif (before && /\\w/.test(before)) continue;\n\t\t\t\t\t\tif (after && /\\w/.test(after)) continue;\n\t\t\t\t\t}\n\t\t\t\t\tconst left = expr.slice(0, i).trim();\n\t\t\t\t\tconst right = expr.slice(i + op.length).trim();\n\t\t\t\t\tif (!left || !right) continue;\n\t\t\t\t\treturn this.applyBinaryOp(op, left, right, scope);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate applyBinaryOp(\n\t\top: string,\n\t\tleftExpr: string,\n\t\trightExpr: string,\n\t\tscope: Scope,\n\t): PyVal {\n\t\tif (op === \"and\") {\n\t\t\tconst l = this.pyEval(leftExpr, scope);\n\t\t\treturn pyBool(l) ? this.pyEval(rightExpr, scope) : l;\n\t\t}\n\t\tif (op === \"or\") {\n\t\t\tconst l = this.pyEval(leftExpr, scope);\n\t\t\treturn pyBool(l) ? l : this.pyEval(rightExpr, scope);\n\t\t}\n\n\t\tconst left = this.pyEval(leftExpr, scope);\n\t\tconst right = this.pyEval(rightExpr, scope);\n\n\t\tswitch (op) {\n\t\t\tcase \"+\":\n\t\t\t\tif (typeof left === \"string\" && typeof right === \"string\")\n\t\t\t\t\treturn left + right;\n\t\t\t\tif (Array.isArray(left) && Array.isArray(right))\n\t\t\t\t\treturn [...left, ...right];\n\t\t\t\treturn (left as number) + (right as number);\n\t\t\tcase \"-\":\n\t\t\t\treturn (left as number) - (right as number);\n\t\t\tcase \"*\":\n\t\t\t\tif (typeof left === \"string\" && typeof right === \"number\")\n\t\t\t\t\treturn left.repeat(right);\n\t\t\t\tif (Array.isArray(left) && typeof right === \"number\") {\n\t\t\t\t\tconst arr: PyVal[] = [];\n\t\t\t\t\tfor (let i = 0; i < right; i++) arr.push(...left);\n\t\t\t\t\treturn arr;\n\t\t\t\t}\n\t\t\t\treturn (left as number) * (right as number);\n\t\t\tcase \"/\": {\n\t\t\t\tif ((right as number) === 0)\n\t\t\t\t\tthrow new PyError(\"ZeroDivisionError\", \"division by zero\");\n\t\t\t\treturn (left as number) / (right as number);\n\t\t\t}\n\t\t\tcase \"//\": {\n\t\t\t\tif ((right as number) === 0)\n\t\t\t\t\tthrow new PyError(\n\t\t\t\t\t\t\"ZeroDivisionError\",\n\t\t\t\t\t\t\"integer division or modulo by zero\",\n\t\t\t\t\t);\n\t\t\t\treturn Math.floor((left as number) / (right as number));\n\t\t\t}\n\t\t\tcase \"%\": {\n\t\t\t\tif (typeof left === \"string\")\n\t\t\t\t\treturn this.pyStringFormat(\n\t\t\t\t\t\tleft,\n\t\t\t\t\t\tArray.isArray(right) ? right : [right],\n\t\t\t\t\t);\n\t\t\t\tif ((right as number) === 0)\n\t\t\t\t\tthrow new PyError(\n\t\t\t\t\t\t\"ZeroDivisionError\",\n\t\t\t\t\t\t\"integer division or modulo by zero\",\n\t\t\t\t\t);\n\t\t\t\treturn (left as number) % (right as number);\n\t\t\t}\n\t\t\tcase \"**\":\n\t\t\t\treturn (left as number) ** (right as number);\n\t\t\tcase \"==\":\n\t\t\t\treturn pyRepr(left) === pyRepr(right) || left === right;\n\t\t\tcase \"!=\":\n\t\t\t\treturn pyRepr(left) !== pyRepr(right) && left !== right;\n\t\t\tcase \"<\":\n\t\t\t\treturn (left as number) < (right as number);\n\t\t\tcase \"<=\":\n\t\t\t\treturn (left as number) <= (right as number);\n\t\t\tcase \">\":\n\t\t\t\treturn (left as number) > (right as number);\n\t\t\tcase \">=\":\n\t\t\t\treturn (left as number) >= (right as number);\n\t\t\tcase \"in\":\n\t\t\t\treturn this.pyIn(right, left);\n\t\t\tcase \"not in\":\n\t\t\t\treturn !this.pyIn(right, left);\n\t\t\tcase \"is\":\n\t\t\t\treturn (\n\t\t\t\t\tleft === right ||\n\t\t\t\t\t(isPyNone(left as PyVal) && isPyNone(right as PyVal))\n\t\t\t\t);\n\t\t\tcase \"is not\":\n\t\t\t\treturn !(\n\t\t\t\t\tleft === right ||\n\t\t\t\t\t(isPyNone(left as PyVal) && isPyNone(right as PyVal))\n\t\t\t\t);\n\t\t}\n\t\treturn NONE;\n\t}\n\n\tprivate pyIn(container: PyVal, item: PyVal): boolean {\n\t\tif (typeof container === \"string\")\n\t\t\treturn typeof item === \"string\" && container.includes(item);\n\t\tif (Array.isArray(container))\n\t\t\treturn container.some((v) => pyRepr(v) === pyRepr(item));\n\t\tif (isPyDict(container)) return container.data.has(pyStr(item));\n\t\treturn false;\n\t}\n\n\tprivate subscript(obj: PyVal, key: string, scope: Scope): PyVal {\n\t\t// Slice\n\t\tif (key.includes(\":\")) {\n\t\t\tconst parts = key.split(\":\").map((p) => p.trim());\n\t\t\tconst start = parts[0]\n\t\t\t\t? (this.pyEval(parts[0], scope) as number)\n\t\t\t\t: undefined;\n\t\t\tconst stop = parts[1]\n\t\t\t\t? (this.pyEval(parts[1], scope) as number)\n\t\t\t\t: undefined;\n\t\t\tif (typeof obj === \"string\") return obj.slice(start, stop);\n\t\t\tif (Array.isArray(obj)) return obj.slice(start, stop);\n\t\t\treturn NONE;\n\t\t}\n\t\tconst k = this.pyEval(key, scope);\n\t\tif (Array.isArray(obj)) {\n\t\t\tlet idx = k as number;\n\t\t\tif (idx < 0) idx = obj.length + idx;\n\t\t\treturn obj[idx] ?? NONE;\n\t\t}\n\t\tif (typeof obj === \"string\") {\n\t\t\tlet idx = k as number;\n\t\t\tif (idx < 0) idx = obj.length + idx;\n\t\t\treturn obj[idx] ?? NONE;\n\t\t}\n\t\tif (isPyDict(obj)) return obj.data.get(pyStr(k)) ?? NONE;\n\t\tthrow new PyError(\"TypeError\", `'${pyTypeName(obj)}' is not subscriptable`);\n\t}\n\n\t// \u2500\u2500 attribute access \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\tprivate getAttr(obj: PyVal, attr: string, _scope: Scope): PyVal {\n\t\tif (isPyDict(obj)) {\n\t\t\tif (obj.data.has(attr)) return obj.data.get(attr)!;\n\t\t\t// Special dict attributes\n\t\t\tif (attr === \"path\" && (obj as unknown as { path: PyVal }).path)\n\t\t\t\treturn (obj as unknown as { path: PyVal }).path;\n\t\t\treturn NONE;\n\t\t}\n\t\tif (isPyInstance(obj)) return obj.attrs.get(attr) ?? NONE;\n\t\tif (typeof obj === \"string\") {\n\t\t\t// String attributes\n\t\t\tconst strMethods: Record<string, PyVal> = {\n\t\t\t\t__class__: { __pytype__: \"class\", name: \"str\" } as unknown as PyClass,\n\t\t\t};\n\t\t\treturn strMethods[attr] ?? NONE;\n\t\t}\n\t\treturn NONE;\n\t}\n\n\t// \u2500\u2500 method calls \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\tprivate callMethod(\n\t\tobj: PyVal,\n\t\tmethod: string,\n\t\targs: PyVal[],\n\t\t_scope: Scope,\n\t): PyVal {\n\t\t// String methods\n\t\tif (typeof obj === \"string\") {\n\t\t\tswitch (method) {\n\t\t\t\tcase \"upper\":\n\t\t\t\t\treturn obj.toUpperCase();\n\t\t\t\tcase \"lower\":\n\t\t\t\t\treturn obj.toLowerCase();\n\t\t\t\tcase \"strip\":\n\t\t\t\t\treturn (\n\t\t\t\t\t\targs[0] ? obj.replace(new RegExp(`[${args[0]}]+`, \"g\"), \"\") : obj\n\t\t\t\t\t).trim();\n\t\t\t\tcase \"lstrip\":\n\t\t\t\t\treturn obj.trimStart();\n\t\t\t\tcase \"rstrip\":\n\t\t\t\t\treturn obj.trimEnd();\n\t\t\t\tcase \"split\":\n\t\t\t\t\treturn obj\n\t\t\t\t\t\t.split(typeof args[0] === \"string\" ? args[0] : /\\s+/)\n\t\t\t\t\t\t.filter((s, i) => i > 0 || s !== \"\") as PyVal[];\n\t\t\t\tcase \"splitlines\":\n\t\t\t\t\treturn obj.split(\"\\n\") as PyVal[];\n\t\t\t\tcase \"join\":\n\t\t\t\t\treturn pyIter(args[0] ?? [])\n\t\t\t\t\t\t.map(pyStr)\n\t\t\t\t\t\t.join(obj);\n\t\t\t\tcase \"replace\":\n\t\t\t\t\treturn obj.replaceAll(pyStr(args[0] ?? \"\"), pyStr(args[1] ?? \"\"));\n\t\t\t\tcase \"startswith\":\n\t\t\t\t\treturn obj.startsWith(pyStr(args[0] ?? \"\"));\n\t\t\t\tcase \"endswith\":\n\t\t\t\t\treturn obj.endsWith(pyStr(args[0] ?? \"\"));\n\t\t\t\tcase \"find\":\n\t\t\t\t\treturn obj.indexOf(pyStr(args[0] ?? \"\"));\n\t\t\t\tcase \"index\": {\n\t\t\t\t\tconst i = obj.indexOf(pyStr(args[0] ?? \"\"));\n\t\t\t\t\tif (i === -1) throw new PyError(\"ValueError\", \"substring not found\");\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t\tcase \"count\":\n\t\t\t\t\treturn obj.split(pyStr(args[0] ?? \"\")).length - 1;\n\t\t\t\tcase \"format\":\n\t\t\t\t\treturn this.pyStringFormat(obj, args);\n\t\t\t\tcase \"encode\":\n\t\t\t\t\treturn obj; // bytes stub\n\t\t\t\tcase \"decode\":\n\t\t\t\t\treturn obj;\n\t\t\t\tcase \"isdigit\":\n\t\t\t\t\treturn /^\\d+$/.test(obj);\n\t\t\t\tcase \"isalpha\":\n\t\t\t\t\treturn /^[a-zA-Z]+$/.test(obj);\n\t\t\t\tcase \"isalnum\":\n\t\t\t\t\treturn /^[a-zA-Z0-9]+$/.test(obj);\n\t\t\t\tcase \"isspace\":\n\t\t\t\t\treturn /^\\s+$/.test(obj);\n\t\t\t\tcase \"isupper\":\n\t\t\t\t\treturn obj === obj.toUpperCase() && obj !== obj.toLowerCase();\n\t\t\t\tcase \"islower\":\n\t\t\t\t\treturn obj === obj.toLowerCase() && obj !== obj.toUpperCase();\n\t\t\t\tcase \"center\": {\n\t\t\t\t\tconst w = (args[0] as number) ?? 0;\n\t\t\t\t\tconst f = pyStr(args[1] ?? \" \");\n\t\t\t\t\treturn obj.padStart(Math.floor((w + obj.length) / 2), f).padEnd(w, f);\n\t\t\t\t}\n\t\t\t\tcase \"ljust\":\n\t\t\t\t\treturn obj.padEnd((args[0] as number) ?? 0, pyStr(args[1] ?? \" \"));\n\t\t\t\tcase \"rjust\":\n\t\t\t\t\treturn obj.padStart((args[0] as number) ?? 0, pyStr(args[1] ?? \" \"));\n\t\t\t\tcase \"zfill\":\n\t\t\t\t\treturn obj.padStart((args[0] as number) ?? 0, \"0\");\n\t\t\t\tcase \"title\":\n\t\t\t\t\treturn obj.replace(/\\b\\w/g, (c) => c.toUpperCase());\n\t\t\t\tcase \"capitalize\":\n\t\t\t\t\treturn obj[0]?.toUpperCase() + obj.slice(1).toLowerCase();\n\t\t\t\tcase \"swapcase\":\n\t\t\t\t\treturn [...obj]\n\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\tc === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase(),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"\");\n\t\t\t}\n\t\t}\n\n\t\t// List methods\n\t\tif (Array.isArray(obj)) {\n\t\t\tswitch (method) {\n\t\t\t\tcase \"append\":\n\t\t\t\t\tobj.push(args[0] ?? NONE);\n\t\t\t\t\treturn NONE;\n\t\t\t\tcase \"extend\":\n\t\t\t\t\tfor (const v of pyIter(args[0] ?? [])) obj.push(v);\n\t\t\t\t\treturn NONE;\n\t\t\t\tcase \"insert\":\n\t\t\t\t\tobj.splice((args[0] as number) ?? 0, 0, args[1] ?? NONE);\n\t\t\t\t\treturn NONE;\n\t\t\t\tcase \"pop\": {\n\t\t\t\t\tconst idx = args[0] !== undefined ? (args[0] as number) : -1;\n\t\t\t\t\tconst i = idx < 0 ? obj.length + idx : idx;\n\t\t\t\t\treturn obj.splice(i, 1)[0] ?? NONE;\n\t\t\t\t}\n\t\t\t\tcase \"remove\": {\n\t\t\t\t\tconst i = obj.findIndex((v) => pyRepr(v) === pyRepr(args[0] ?? NONE));\n\t\t\t\t\tif (i !== -1) obj.splice(i, 1);\n\t\t\t\t\treturn NONE;\n\t\t\t\t}\n\t\t\t\tcase \"index\": {\n\t\t\t\t\tconst i = obj.findIndex((v) => pyRepr(v) === pyRepr(args[0] ?? NONE));\n\t\t\t\t\tif (i === -1) throw new PyError(\"ValueError\", \"is not in list\");\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t\tcase \"count\":\n\t\t\t\t\treturn obj.filter((v) => pyRepr(v) === pyRepr(args[0] ?? NONE))\n\t\t\t\t\t\t.length;\n\t\t\t\tcase \"sort\":\n\t\t\t\t\tobj.sort((a, b) =>\n\t\t\t\t\t\ttypeof a === \"number\" && typeof b === \"number\"\n\t\t\t\t\t\t\t? a - b\n\t\t\t\t\t\t\t: pyStr(a).localeCompare(pyStr(b)),\n\t\t\t\t\t);\n\t\t\t\t\treturn NONE;\n\t\t\t\tcase \"reverse\":\n\t\t\t\t\tobj.reverse();\n\t\t\t\t\treturn NONE;\n\t\t\t\tcase \"copy\":\n\t\t\t\t\treturn [...obj];\n\t\t\t\tcase \"clear\":\n\t\t\t\t\tobj.splice(0);\n\t\t\t\t\treturn NONE;\n\t\t\t}\n\t\t}\n\n\t\t// Dict methods\n\t\tif (isPyDict(obj)) {\n\t\t\tswitch (method) {\n\t\t\t\tcase \"keys\":\n\t\t\t\t\treturn [...obj.data.keys()];\n\t\t\t\tcase \"values\":\n\t\t\t\t\treturn [...obj.data.values()];\n\t\t\t\tcase \"items\":\n\t\t\t\t\treturn [...obj.data.entries()].map(([k, v]) => [k, v] as PyVal);\n\t\t\t\tcase \"get\":\n\t\t\t\t\treturn obj.data.get(pyStr(args[0] ?? \"\")) ?? args[1] ?? NONE;\n\t\t\t\tcase \"update\": {\n\t\t\t\t\tif (isPyDict(args[0] ?? NONE))\n\t\t\t\t\t\tfor (const [k, v] of (args[0] as PyDict).data) obj.data.set(k, v);\n\t\t\t\t\treturn NONE;\n\t\t\t\t}\n\t\t\t\tcase \"pop\": {\n\t\t\t\t\tconst k = pyStr(args[0] ?? \"\");\n\t\t\t\t\tconst v = obj.data.get(k) ?? args[1] ?? NONE;\n\t\t\t\t\tobj.data.delete(k);\n\t\t\t\t\treturn v;\n\t\t\t\t}\n\t\t\t\tcase \"clear\":\n\t\t\t\t\tobj.data.clear();\n\t\t\t\t\treturn NONE;\n\t\t\t\tcase \"copy\":\n\t\t\t\t\treturn pyDict([...obj.data.entries()]);\n\t\t\t\tcase \"setdefault\": {\n\t\t\t\t\tconst k = pyStr(args[0] ?? \"\");\n\t\t\t\t\tif (!obj.data.has(k)) obj.data.set(k, args[1] ?? NONE);\n\t\t\t\t\treturn obj.data.get(k) ?? NONE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// os module methods\n\t\tif (\n\t\t\tisPyDict(obj) &&\n\t\t\tobj.data.has(\"name\") &&\n\t\t\tobj.data.get(\"name\") === \"posix\"\n\t\t) {\n\t\t\tswitch (method) {\n\t\t\t\tcase \"getcwd\":\n\t\t\t\t\treturn this.cwd;\n\t\t\t\tcase \"getenv\":\n\t\t\t\t\treturn typeof args[0] === \"string\"\n\t\t\t\t\t\t? (process.env[args[0]] ?? args[1] ?? NONE)\n\t\t\t\t\t\t: NONE;\n\t\t\t\tcase \"listdir\":\n\t\t\t\t\treturn [];\n\t\t\t\tcase \"path\":\n\t\t\t\t\treturn obj; // return self\n\t\t\t}\n\t\t}\n\n\t\t// os.path methods\n\t\tif (isPyDict(obj)) {\n\t\t\tswitch (method) {\n\t\t\t\tcase \"join\":\n\t\t\t\t\treturn args.map(pyStr).join(\"/\").replace(/\\/+/g, \"/\");\n\t\t\t\tcase \"exists\":\n\t\t\t\t\treturn false; // no real fs access\n\t\t\t\tcase \"dirname\": {\n\t\t\t\t\tconst p = pyStr(args[0] ?? \"\");\n\t\t\t\t\treturn p.split(\"/\").slice(0, -1).join(\"/\") || \"/\";\n\t\t\t\t}\n\t\t\t\tcase \"basename\": {\n\t\t\t\t\tconst p = pyStr(args[0] ?? \"\");\n\t\t\t\t\treturn p.split(\"/\").pop() ?? \"\";\n\t\t\t\t}\n\t\t\t\tcase \"abspath\":\n\t\t\t\t\treturn pyStr(args[0] ?? \"\");\n\t\t\t\tcase \"splitext\": {\n\t\t\t\t\tconst p = pyStr(args[0] ?? \"\");\n\t\t\t\t\tconst d = p.lastIndexOf(\".\");\n\t\t\t\t\treturn d > 0 ? [p.slice(0, d), p.slice(d)] : [p, \"\"];\n\t\t\t\t}\n\t\t\t\tcase \"isfile\":\n\t\t\t\t\treturn false;\n\t\t\t\tcase \"isdir\":\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// sys module\n\t\tif (\n\t\t\tisPyDict(obj) &&\n\t\t\tobj.data.has(\"version\") &&\n\t\t\tobj.data.get(\"version\") === VERSION_INFO\n\t\t) {\n\t\t\tswitch (method) {\n\t\t\t\tcase \"exit\":\n\t\t\t\t\tthrow new ExitSignal((args[0] as number) ?? 0);\n\t\t\t}\n\t\t}\n\n\t\t// math module\n\t\tif (isPyDict(obj)) {\n\t\t\tconst mathFns: Record<string, (...a: number[]) => number> = {\n\t\t\t\tsqrt: Math.sqrt,\n\t\t\t\tfloor: Math.floor,\n\t\t\t\tceil: Math.ceil,\n\t\t\t\tfabs: Math.abs,\n\t\t\t\tlog: Math.log,\n\t\t\t\tlog2: Math.log2,\n\t\t\t\tlog10: Math.log10,\n\t\t\t\tsin: Math.sin,\n\t\t\t\tcos: Math.cos,\n\t\t\t\ttan: Math.tan,\n\t\t\t\tasin: Math.asin,\n\t\t\t\tacos: Math.acos,\n\t\t\t\tatan: Math.atan,\n\t\t\t\tatan2: Math.atan2,\n\t\t\t\tpow: Math.pow,\n\t\t\t\texp: Math.exp,\n\t\t\t\thypot: Math.hypot,\n\t\t\t};\n\t\t\tif (method in mathFns) {\n\t\t\t\tconst fn = mathFns[method]!;\n\t\t\t\treturn fn(...args.map((a) => a as number));\n\t\t\t}\n\t\t\tif (method === \"factorial\") {\n\t\t\t\tlet n = (args[0] as number) ?? 0;\n\t\t\t\tlet r = 1;\n\t\t\t\twhile (n > 1) {\n\t\t\t\t\tr *= n--;\n\t\t\t\t}\n\t\t\t\treturn r;\n\t\t\t}\n\t\t\tif (method === \"gcd\") {\n\t\t\t\tlet a = Math.abs((args[0] as number) ?? 0);\n\t\t\t\tlet b = Math.abs((args[1] as number) ?? 0);\n\t\t\t\twhile (b) {\n\t\t\t\t\t[a, b] = [b, a % b];\n\t\t\t\t}\n\t\t\t\treturn a;\n\t\t\t}\n\t\t}\n\n\t\t// json module\n\t\tif (isPyDict(obj)) {\n\t\t\tif (method === \"dumps\") {\n\t\t\t\tconst opts: PyDict | undefined = isPyDict(args[1] ?? NONE)\n\t\t\t\t\t? (args[1] as PyDict)\n\t\t\t\t\t: undefined;\n\t\t\t\tconst indent = opts ? (opts.data.get(\"indent\") as number) : undefined;\n\t\t\t\treturn JSON.stringify(this.pyToJs(args[0] ?? NONE), null, indent);\n\t\t\t}\n\t\t\tif (method === \"loads\") {\n\t\t\t\treturn this.jsToPy(JSON.parse(pyStr(args[0] ?? \"\")));\n\t\t\t}\n\t\t}\n\n\t\t// Instance method calls\n\t\tif (isPyInstance(obj)) {\n\t\t\tconst fn: PyVal =\n\t\t\t\tobj.attrs.get(method) ?? obj.cls.methods.get(method) ?? NONE;\n\t\t\tif (isPyFunc(fn)) {\n\t\t\t\tconst callScope = new Map(fn.closure);\n\t\t\t\tcallScope.set(\"self\", obj);\n\t\t\t\tfn.params.slice(1).forEach((p, i) => callScope.set(p, args[i] ?? NONE));\n\t\t\t\treturn this.execBlock(fn.body, callScope);\n\t\t\t}\n\t\t}\n\n\t\tthrow new PyError(\n\t\t\t\"AttributeError\",\n\t\t\t`'${pyTypeName(obj)}' object has no attribute '${method}'`,\n\t\t);\n\t}\n\n\tprivate pyStringFormat(fmt: string, args: PyVal[]): string {\n\t\tlet i = 0;\n\t\treturn fmt.replace(/%([diouxXeEfFgGcrs%])/g, (_, spec: string) => {\n\t\t\tif (spec === \"%\") return \"%\";\n\t\t\tconst val = args[i++];\n\t\t\tswitch (spec) {\n\t\t\t\tcase \"d\":\n\t\t\t\tcase \"i\":\n\t\t\t\t\treturn String(Math.trunc(val as number));\n\t\t\t\tcase \"f\":\n\t\t\t\t\treturn (val as number).toFixed(6);\n\t\t\t\tcase \"s\":\n\t\t\t\t\treturn pyStr(val ?? NONE);\n\t\t\t\tcase \"r\":\n\t\t\t\t\treturn pyRepr(val ?? NONE);\n\t\t\t\tdefault:\n\t\t\t\t\treturn String(val);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate pyToJs(v: PyVal): unknown {\n\t\tif (isPyNone(v)) return null;\n\t\tif (isPyDict(v))\n\t\t\treturn Object.fromEntries(\n\t\t\t\t[...v.data.entries()].map(([k, val]) => [k, this.pyToJs(val)]),\n\t\t\t);\n\t\tif (Array.isArray(v)) return v.map((i) => this.pyToJs(i));\n\t\treturn v;\n\t}\n\n\tprivate jsToPy(v: unknown): PyVal {\n\t\tif (v === null || v === undefined) return NONE;\n\t\tif (typeof v === \"boolean\") return v;\n\t\tif (typeof v === \"number\") return v;\n\t\tif (typeof v === \"string\") return v;\n\t\tif (Array.isArray(v)) return v.map((i) => this.jsToPy(i));\n\t\tif (typeof v === \"object\")\n\t\t\treturn pyDict(\n\t\t\t\tObject.entries(v as Record<string, unknown>).map(([k, val]) => [\n\t\t\t\t\tk,\n\t\t\t\t\tthis.jsToPy(val),\n\t\t\t\t]),\n\t\t\t);\n\t\treturn NONE;\n\t}\n\n\t// \u2500\u2500 built-in functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\tprivate callBuiltin(name: string, args: PyVal[], scope: Scope): PyVal {\n\t\t// User-defined functions\n\t\tif (scope.has(name)) {\n\t\t\tconst fn: PyVal = scope.get(name) ?? NONE;\n\t\t\tif (isPyFunc(fn)) return this.callFunc(fn, args, scope);\n\t\t\tif (isPyClass(fn)) return this.instantiate(fn as PyClass, args, scope);\n\t\t\treturn fn;\n\t\t}\n\n\t\tswitch (name) {\n\t\t\t// Output\n\t\t\tcase \"print\": {\n\t\t\t\tconst sep = \" \",\n\t\t\t\t\tend = \"\\n\";\n\t\t\t\tthis.output.push(args.map(pyStr).join(sep) + end.replace(/\\\\n/g, \"\"));\n\t\t\t\treturn NONE;\n\t\t\t}\n\t\t\tcase \"input\": {\n\t\t\t\tthis.output.push(pyStr(args[0] ?? \"\"));\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\t// Type constructors\n\t\t\tcase \"int\": {\n\t\t\t\tif (args.length === 0) return 0;\n\t\t\t\tconst base = (args[1] as number) ?? 10;\n\t\t\t\tconst n = parseInt(pyStr(args[0] ?? 0), base);\n\t\t\t\treturn Number.isNaN(n)\n\t\t\t\t\t? (() => {\n\t\t\t\t\t\t\tthrow new PyError(\"ValueError\", `invalid literal for int()`);\n\t\t\t\t\t\t})()\n\t\t\t\t\t: n;\n\t\t\t}\n\t\t\tcase \"float\": {\n\t\t\t\tif (args.length === 0) return 0.0;\n\t\t\t\tconst f = parseFloat(pyStr(args[0] ?? 0));\n\t\t\t\treturn Number.isNaN(f)\n\t\t\t\t\t? (() => {\n\t\t\t\t\t\t\tthrow new PyError(\"ValueError\", `could not convert to float`);\n\t\t\t\t\t\t})()\n\t\t\t\t\t: f;\n\t\t\t}\n\t\t\tcase \"str\":\n\t\t\t\treturn args.length === 0 ? \"\" : pyStr(args[0] ?? NONE);\n\t\t\tcase \"bool\":\n\t\t\t\treturn args.length === 0 ? false : pyBool(args[0] ?? NONE);\n\t\t\tcase \"list\":\n\t\t\t\treturn args.length === 0 ? [] : pyIter(args[0] ?? []);\n\t\t\tcase \"tuple\":\n\t\t\t\treturn args.length === 0 ? [] : pyIter(args[0] ?? []);\n\t\t\tcase \"set\":\n\t\t\t\treturn args.length === 0\n\t\t\t\t\t? []\n\t\t\t\t\t: [...new Set(pyIter(args[0] ?? []).map(pyRepr))].map((s) => {\n\t\t\t\t\t\t\tconst v = pyIter(args[0] ?? []).find(\n\t\t\t\t\t\t\t\t(item) => pyRepr(item) === s,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn v ?? NONE;\n\t\t\t\t\t\t});\n\t\t\tcase \"dict\":\n\t\t\t\treturn args.length === 0\n\t\t\t\t\t? pyDict()\n\t\t\t\t\t: isPyDict(args[0] ?? NONE)\n\t\t\t\t\t\t? (args[0] as PyDict)\n\t\t\t\t\t\t: pyDict();\n\t\t\tcase \"bytes\":\n\t\t\t\treturn typeof args[0] === \"string\" ? args[0] : pyStr(args[0] ?? \"\");\n\t\t\tcase \"bytearray\":\n\t\t\t\treturn args.length === 0 ? \"\" : pyStr(args[0] ?? \"\");\n\n\t\t\t// Type inspection\n\t\t\tcase \"type\": {\n\t\t\t\tif (args.length === 1)\n\t\t\t\t\treturn `<class '${pyTypeName(args[0] ?? NONE)}'>`;\n\t\t\t\treturn NONE;\n\t\t\t}\n\t\t\tcase \"isinstance\":\n\t\t\t\treturn pyTypeName(args[0] ?? NONE) === pyStr(args[1] ?? \"\");\n\t\t\tcase \"issubclass\":\n\t\t\t\treturn false;\n\t\t\tcase \"callable\":\n\t\t\t\treturn isPyFunc(args[0] ?? NONE);\n\t\t\tcase \"hasattr\":\n\t\t\t\treturn isPyDict(args[0] ?? NONE)\n\t\t\t\t\t? (args[0] as PyDict).data.has(pyStr(args[1] ?? \"\"))\n\t\t\t\t\t: false;\n\t\t\tcase \"getattr\": {\n\t\t\t\tif (!isPyDict(args[0] ?? NONE)) return args[2] ?? NONE;\n\t\t\t\treturn (\n\t\t\t\t\t(args[0] as PyDict).data.get(pyStr(args[1] ?? \"\")) ?? args[2] ?? NONE\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"setattr\": {\n\t\t\t\tif (isPyDict(args[0] ?? NONE))\n\t\t\t\t\t(args[0] as PyDict).data.set(pyStr(args[1] ?? \"\"), args[2] ?? NONE);\n\t\t\t\treturn NONE;\n\t\t\t}\n\n\t\t\t// Functional\n\t\t\tcase \"len\": {\n\t\t\t\tconst v = args[0] ?? NONE;\n\t\t\t\tif (typeof v === \"string\") return v.length;\n\t\t\t\tif (Array.isArray(v)) return v.length;\n\t\t\t\tif (isPyDict(v)) return v.data.size;\n\t\t\t\tif (isPyRange(v)) return pyRangeLength(v);\n\t\t\t\tthrow new PyError(\n\t\t\t\t\t\"TypeError\",\n\t\t\t\t\t`object of type '${pyTypeName(v)}' has no len()`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"range\": {\n\t\t\t\tif (args.length === 1) return pyRange(0, args[0] as number);\n\t\t\t\tif (args.length === 2)\n\t\t\t\t\treturn pyRange(args[0] as number, args[1] as number);\n\t\t\t\treturn pyRange(args[0] as number, args[1] as number, args[2] as number);\n\t\t\t}\n\t\t\tcase \"enumerate\": {\n\t\t\t\tconst start = (args[1] as number) ?? 0;\n\t\t\t\treturn pyIter(args[0] ?? []).map((v, i) => [i + start, v] as PyVal);\n\t\t\t}\n\t\t\tcase \"zip\": {\n\t\t\t\tconst iters = args.map(pyIter);\n\t\t\t\tconst len = Math.min(...iters.map((it) => it.length));\n\t\t\t\treturn Array.from({ length: len }, (_, i) =>\n\t\t\t\t\titers.map((it) => it[i] ?? NONE),\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"map\": {\n\t\t\t\tconst fn: PyVal = args[0] ?? NONE;\n\t\t\t\treturn pyIter(args[1] ?? []).map((v) =>\n\t\t\t\t\tisPyFunc(fn) ? this.callFunc(fn, [v], scope) : NONE,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"filter\": {\n\t\t\t\tconst fn: PyVal = args[0] ?? NONE;\n\t\t\t\treturn pyIter(args[1] ?? []).filter((v) =>\n\t\t\t\t\tisPyFunc(fn) ? pyBool(this.callFunc(fn, [v], scope)) : pyBool(v),\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"reduce\": {\n\t\t\t\tconst fn: PyVal = args[0] ?? NONE;\n\t\t\t\tconst items = pyIter(args[1] ?? []);\n\t\t\t\tif (items.length === 0) return args[2] ?? NONE;\n\t\t\t\tlet acc: PyVal = args[2] !== undefined ? args[2] : items[0]!;\n\t\t\t\tfor (const item of args[2] !== undefined ? items : items.slice(1)) {\n\t\t\t\t\tacc = isPyFunc(fn)\n\t\t\t\t\t\t? this.callFunc(fn as PyFunc, [acc, item], scope)\n\t\t\t\t\t\t: NONE;\n\t\t\t\t}\n\t\t\t\treturn acc;\n\t\t\t}\n\t\t\tcase \"sorted\": {\n\t\t\t\tconst items = [...pyIter(args[0] ?? [])];\n\t\t\t\tconst sortArg1 = args[1] ?? NONE;\n\t\t\t\tconst keyFn: PyVal = isPyDict(sortArg1)\n\t\t\t\t\t? (sortArg1.data.get(\"key\") ?? NONE)\n\t\t\t\t\t: sortArg1;\n\t\t\t\titems.sort((a, b) => {\n\t\t\t\t\tconst ka: PyVal = isPyFunc(keyFn)\n\t\t\t\t\t\t? this.callFunc(keyFn, [a], scope)\n\t\t\t\t\t\t: a;\n\t\t\t\t\tconst kb: PyVal = isPyFunc(keyFn)\n\t\t\t\t\t\t? this.callFunc(keyFn, [b], scope)\n\t\t\t\t\t\t: b;\n\t\t\t\t\treturn typeof ka === \"number\" && typeof kb === \"number\"\n\t\t\t\t\t\t? ka - kb\n\t\t\t\t\t\t: pyStr(ka).localeCompare(pyStr(kb));\n\t\t\t\t});\n\t\t\t\treturn items;\n\t\t\t}\n\t\t\tcase \"reversed\":\n\t\t\t\treturn [...pyIter(args[0] ?? [])].reverse();\n\t\t\tcase \"any\":\n\t\t\t\treturn pyIter(args[0] ?? []).some(pyBool);\n\t\t\tcase \"all\":\n\t\t\t\treturn pyIter(args[0] ?? []).every(pyBool);\n\t\t\tcase \"sum\":\n\t\t\t\treturn pyIter(args[0] ?? []).reduce(\n\t\t\t\t\t(acc, v) => (acc as number) + (v as number),\n\t\t\t\t\t(args[1] ?? 0) as number,\n\t\t\t\t);\n\t\t\tcase \"max\": {\n\t\t\t\tconst items = args.length === 1 ? pyIter(args[0] ?? []) : args;\n\t\t\t\treturn items.reduce((a, b) => ((a as number) >= (b as number) ? a : b));\n\t\t\t}\n\t\t\tcase \"min\": {\n\t\t\t\tconst items = args.length === 1 ? pyIter(args[0] ?? []) : args;\n\t\t\t\treturn items.reduce((a, b) => ((a as number) <= (b as number) ? a : b));\n\t\t\t}\n\t\t\tcase \"abs\":\n\t\t\t\treturn Math.abs((args[0] as number) ?? 0);\n\t\t\tcase \"round\":\n\t\t\t\treturn args[1] !== undefined\n\t\t\t\t\t? parseFloat((args[0] as number).toFixed(args[1] as number))\n\t\t\t\t\t: Math.round((args[0] as number) ?? 0);\n\t\t\tcase \"divmod\": {\n\t\t\t\tconst a = args[0] as number,\n\t\t\t\t\tb = args[1] as number;\n\t\t\t\treturn [Math.floor(a / b), a % b];\n\t\t\t}\n\t\t\tcase \"pow\":\n\t\t\t\treturn (args[0] as number) ** (args[1] as number);\n\t\t\tcase \"hex\":\n\t\t\t\treturn `0x${(args[0] as number).toString(16)}`;\n\t\t\tcase \"oct\":\n\t\t\t\treturn `0o${(args[0] as number).toString(8)}`;\n\t\t\tcase \"bin\":\n\t\t\t\treturn `0b${(args[0] as number).toString(2)}`;\n\t\t\tcase \"ord\":\n\t\t\t\treturn pyStr(args[0] ?? \"\").charCodeAt(0);\n\t\t\tcase \"chr\":\n\t\t\t\treturn String.fromCharCode((args[0] as number) ?? 0);\n\t\t\tcase \"id\":\n\t\t\t\treturn Math.floor(Math.random() * 0xffffffff);\n\t\t\tcase \"hash\":\n\t\t\t\treturn typeof args[0] === \"number\"\n\t\t\t\t\t? args[0]\n\t\t\t\t\t: pyStr(args[0] ?? \"\")\n\t\t\t\t\t\t\t.split(\"\")\n\t\t\t\t\t\t\t.reduce((h, c) => (h * 31 + c.charCodeAt(0)) | 0, 0);\n\n\t\t\t// I/O\n\t\t\tcase \"open\":\n\t\t\t\tthrow new PyError(\n\t\t\t\t\t\"PermissionError\",\n\t\t\t\t\t\"open() not available in virtual runtime\",\n\t\t\t\t);\n\t\t\tcase \"repr\":\n\t\t\t\treturn pyRepr(args[0] ?? NONE);\n\n\t\t\t// Iteration helpers\n\t\t\tcase \"iter\":\n\t\t\t\treturn args[0] ?? NONE; // simplification\n\t\t\tcase \"next\": {\n\t\t\t\tif (Array.isArray(args[0]) && args[0].length > 0)\n\t\t\t\t\treturn args[0].shift()!;\n\t\t\t\treturn (\n\t\t\t\t\targs[1] ??\n\t\t\t\t\t(() => {\n\t\t\t\t\t\tthrow new PyError(\"StopIteration\", \"\");\n\t\t\t\t\t})()\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// vars/globals/locals\n\t\t\tcase \"vars\":\n\t\t\t\treturn pyDict([...scope.entries()].map(([k, v]) => [k, v]));\n\t\t\tcase \"globals\":\n\t\t\t\treturn pyDict([...scope.entries()].map(([k, v]) => [k, v]));\n\t\t\tcase \"locals\":\n\t\t\t\treturn pyDict([...scope.entries()].map(([k, v]) => [k, v]));\n\t\t\tcase \"dir\": {\n\t\t\t\tif (args.length === 0) return [...scope.keys()];\n\t\t\t\tconst obj = args[0] ?? NONE;\n\t\t\t\tif (typeof obj === \"string\")\n\t\t\t\t\treturn [\n\t\t\t\t\t\t\"upper\",\n\t\t\t\t\t\t\"lower\",\n\t\t\t\t\t\t\"strip\",\n\t\t\t\t\t\t\"split\",\n\t\t\t\t\t\t\"join\",\n\t\t\t\t\t\t\"replace\",\n\t\t\t\t\t\t\"find\",\n\t\t\t\t\t\t\"format\",\n\t\t\t\t\t\t\"encode\",\n\t\t\t\t\t\t\"startswith\",\n\t\t\t\t\t\t\"endswith\",\n\t\t\t\t\t\t\"count\",\n\t\t\t\t\t\t\"isdigit\",\n\t\t\t\t\t\t\"isalpha\",\n\t\t\t\t\t\t\"title\",\n\t\t\t\t\t\t\"capitalize\",\n\t\t\t\t\t];\n\t\t\t\tif (Array.isArray(obj))\n\t\t\t\t\treturn [\n\t\t\t\t\t\t\"append\",\n\t\t\t\t\t\t\"extend\",\n\t\t\t\t\t\t\"insert\",\n\t\t\t\t\t\t\"pop\",\n\t\t\t\t\t\t\"remove\",\n\t\t\t\t\t\t\"index\",\n\t\t\t\t\t\t\"count\",\n\t\t\t\t\t\t\"sort\",\n\t\t\t\t\t\t\"reverse\",\n\t\t\t\t\t\t\"copy\",\n\t\t\t\t\t\t\"clear\",\n\t\t\t\t\t];\n\t\t\t\tif (isPyDict(obj))\n\t\t\t\t\treturn [\n\t\t\t\t\t\t\"keys\",\n\t\t\t\t\t\t\"values\",\n\t\t\t\t\t\t\"items\",\n\t\t\t\t\t\t\"get\",\n\t\t\t\t\t\t\"update\",\n\t\t\t\t\t\t\"pop\",\n\t\t\t\t\t\t\"clear\",\n\t\t\t\t\t\t\"copy\",\n\t\t\t\t\t\t\"setdefault\",\n\t\t\t\t\t];\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\t// Exception\n\t\t\tcase \"Exception\":\n\t\t\tcase \"ValueError\":\n\t\t\tcase \"TypeError\":\n\t\t\tcase \"KeyError\":\n\t\t\tcase \"IndexError\":\n\t\t\tcase \"AttributeError\":\n\t\t\tcase \"NameError\":\n\t\t\tcase \"RuntimeError\":\n\t\t\tcase \"StopIteration\":\n\t\t\tcase \"NotImplementedError\":\n\t\t\tcase \"OSError\":\n\t\t\tcase \"IOError\":\n\t\t\t\tthrow new PyError(name, pyStr(args[0] ?? \"\"));\n\n\t\t\t// exec/eval\n\t\t\tcase \"exec\": {\n\t\t\t\tthis.execScript(pyStr(args[0] ?? \"\"), scope);\n\t\t\t\treturn NONE;\n\t\t\t}\n\t\t\tcase \"eval\":\n\t\t\t\treturn this.pyEval(pyStr(args[0] ?? \"\"), scope);\n\n\t\t\tdefault:\n\t\t\t\tthrow new PyError(\"NameError\", `name '${name}' is not defined`);\n\t\t}\n\t}\n\n\tprivate callFunc(fn: PyFunc, args: PyVal[], _scope: Scope): PyVal {\n\t\tconst callScope = new Map(fn.closure);\n\t\tfn.params.forEach((p, i) => {\n\t\t\tif (p.startsWith(\"*\")) {\n\t\t\t\tcallScope.set(p.slice(1), args.slice(i));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcallScope.set(p, args[i] ?? NONE);\n\t\t});\n\t\ttry {\n\t\t\treturn this.execBlock(fn.body, callScope);\n\t\t} catch (e) {\n\t\t\tif (e instanceof ReturnSignal) return e.value;\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tprivate instantiate(cls: PyClass, args: PyVal[], scope: Scope): PyInstance {\n\t\tconst inst: PyInstance = { __pytype__: \"instance\", cls, attrs: new Map() };\n\t\tconst init = cls.methods.get(\"__init__\");\n\t\tif (init) this.callMethod(inst, \"__init__\", args, scope);\n\t\treturn inst;\n\t}\n\n\t// \u2500\u2500 statement executor \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\texecScript(code: string, scope: Scope): void {\n\t\tconst lines = code.split(\"\\n\");\n\t\tthis.execLines(lines, 0, scope);\n\t}\n\n\tprivate execLines(lines: string[], startIdx: number, scope: Scope): number {\n\t\tlet i = startIdx;\n\t\twhile (i < lines.length) {\n\t\t\tconst raw = lines[i]!;\n\t\t\tif (!raw.trim() || raw.trim().startsWith(\"#\")) {\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ti = this.execStatement(lines, i, scope);\n\t\t}\n\t\treturn i;\n\t}\n\n\tprivate execBlock(bodyLines: string[], scope: Scope): PyVal {\n\t\ttry {\n\t\t\tthis.execLines(bodyLines, 0, scope);\n\t\t} catch (e) {\n\t\t\tif (e instanceof ReturnSignal) return e.value;\n\t\t\tthrow e;\n\t\t}\n\t\treturn NONE;\n\t}\n\n\tprivate getIndent(line: string): number {\n\t\tlet n = 0;\n\t\tfor (const ch of line) {\n\t\t\tif (ch === \" \") n++;\n\t\t\telse if (ch === \"\\t\") n += 4;\n\t\t\telse break;\n\t\t}\n\t\treturn n;\n\t}\n\n\tprivate collectBlock(\n\t\tlines: string[],\n\t\tstartIdx: number,\n\t\tbaseIndent: number,\n\t): string[] {\n\t\tconst block: string[] = [];\n\t\tfor (let i = startIdx; i < lines.length; i++) {\n\t\t\tconst l = lines[i]!;\n\t\t\tif (!l.trim()) {\n\t\t\t\tblock.push(\"\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (this.getIndent(l) <= baseIndent) break;\n\t\t\tblock.push(l.slice(baseIndent + 4));\n\t\t}\n\t\treturn block;\n\t}\n\n\tprivate execStatement(lines: string[], idx: number, scope: Scope): number {\n\t\tconst raw = lines[idx]!;\n\t\tconst line = raw.trim();\n\t\tconst indent = this.getIndent(raw);\n\n\t\t// pass\n\t\tif (line === \"pass\") return idx + 1;\n\n\t\t// break / continue\n\t\tif (line === \"break\") {\n\t\t\tthrow new BreakSignal();\n\t\t}\n\t\tif (line === \"continue\") {\n\t\t\tthrow new ContinueSignal();\n\t\t}\n\n\t\t// return\n\t\tconst retMatch = line.match(/^return(?:\\s+(.+))?$/);\n\t\tif (retMatch)\n\t\t\tthrow new ReturnSignal(\n\t\t\t\tretMatch[1] ? this.pyEval(retMatch[1], scope) : NONE,\n\t\t\t);\n\n\t\t// raise\n\t\tconst raiseMatch = line.match(/^raise(?:\\s+(.+))?$/);\n\t\tif (raiseMatch) {\n\t\t\tif (raiseMatch[1]) {\n\t\t\t\tconst ex = this.pyEval(raiseMatch[1], scope);\n\t\t\t\tthrow new PyError(\n\t\t\t\t\ttypeof ex === \"string\" ? ex : pyTypeName(ex),\n\t\t\t\t\tpyStr(ex),\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new PyError(\"RuntimeError\", \"\");\n\t\t}\n\n\t\t// assert\n\t\tconst assertMatch = line.match(/^assert\\s+(.+?)(?:,\\s*(.+))?$/);\n\t\tif (assertMatch) {\n\t\t\tif (!pyBool(this.pyEval(assertMatch[1]!, scope))) {\n\t\t\t\tthrow new PyError(\n\t\t\t\t\t\"AssertionError\",\n\t\t\t\t\tassertMatch[2] ? pyStr(this.pyEval(assertMatch[2], scope)) : \"\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn idx + 1;\n\t\t}\n\n\t\t// del\n\t\tconst delMatch = line.match(/^del\\s+(.+)$/);\n\t\tif (delMatch) {\n\t\t\tscope.delete(delMatch[1]!.trim());\n\t\t\treturn idx + 1;\n\t\t}\n\n\t\t// import / from\n\t\tconst importMatch = line.match(/^import\\s+(\\w+)(?:\\s+as\\s+(\\w+))?$/);\n\t\tif (importMatch) {\n\t\t\tconst [, modName, alias] = importMatch;\n\t\t\tconst factory = MODULE_FACTORIES[modName!];\n\t\t\tif (factory) {\n\t\t\t\tconst mod = factory(this.cwd);\n\t\t\t\tthis.modules.set(modName!, mod);\n\t\t\t\tscope.set(alias ?? modName!, mod);\n\t\t\t}\n\t\t\treturn idx + 1;\n\t\t}\n\n\t\tconst fromMatch = line.match(/^from\\s+(\\w+)\\s+import\\s+(.+)$/);\n\t\tif (fromMatch) {\n\t\t\tconst [, modName, imports] = fromMatch;\n\t\t\tconst factory = MODULE_FACTORIES[modName!];\n\t\t\tif (factory) {\n\t\t\t\tconst mod = factory(this.cwd);\n\t\t\t\tif (imports?.trim() === \"*\") {\n\t\t\t\t\tfor (const [k, v] of mod.data) scope.set(k, v);\n\t\t\t\t} else {\n\t\t\t\t\tfor (const name of imports!.split(\",\").map((s) => s.trim())) {\n\t\t\t\t\t\tscope.set(name, mod.data.get(name) ?? NONE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn idx + 1;\n\t\t}\n\n\t\t// def\n\t\tconst defMatch = line.match(/^def\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*:$/);\n\t\tif (defMatch) {\n\t\t\tconst [, fnName, paramsStr] = defMatch;\n\t\t\tconst params = paramsStr!\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((p) => p.trim())\n\t\t\t\t.filter(Boolean);\n\t\t\tconst body = this.collectBlock(lines, idx + 1, indent);\n\t\t\tconst fn: PyFunc = {\n\t\t\t\t__pytype__: \"func\",\n\t\t\t\tname: fnName!,\n\t\t\t\tparams,\n\t\t\t\tbody,\n\t\t\t\tclosure: new Map(scope),\n\t\t\t};\n\t\t\tscope.set(fnName!, fn);\n\t\t\treturn idx + 1 + body.length;\n\t\t}\n\n\t\t// class\n\t\tconst classMatch = line.match(/^class\\s+(\\w+)(?:\\(([^)]*)\\))?\\s*:$/);\n\t\tif (classMatch) {\n\t\t\tconst [, className, basesStr] = classMatch;\n\t\t\tconst bases = basesStr ? basesStr.split(\",\").map((s) => s.trim()) : [];\n\t\t\tconst body = this.collectBlock(lines, idx + 1, indent);\n\t\t\tconst cls: PyClass = {\n\t\t\t\t__pytype__: \"class\",\n\t\t\t\tname: className!,\n\t\t\t\tmethods: new Map(),\n\t\t\t\tbases,\n\t\t\t};\n\t\t\t// Parse method definitions from body\n\t\t\tlet j = 0;\n\t\t\twhile (j < body.length) {\n\t\t\t\tconst bl = body[j]!.trim();\n\t\t\t\tconst mMatch = bl.match(/^def\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*:$/);\n\t\t\t\tif (mMatch) {\n\t\t\t\t\tconst [, mName, mParams] = mMatch;\n\t\t\t\t\tconst params = mParams!\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((p) => p.trim())\n\t\t\t\t\t\t.filter(Boolean);\n\t\t\t\t\tconst mBody = this.collectBlock(body, j + 1, 0);\n\t\t\t\t\tcls.methods.set(mName!, {\n\t\t\t\t\t\t__pytype__: \"func\",\n\t\t\t\t\t\tname: mName!,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tbody: mBody,\n\t\t\t\t\t\tclosure: new Map(scope),\n\t\t\t\t\t});\n\t\t\t\t\tj += 1 + mBody.length;\n\t\t\t\t} else {\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tscope.set(className!, cls);\n\t\t\treturn idx + 1 + body.length;\n\t\t}\n\n\t\t// if / elif / else\n\t\tif (line.startsWith(\"if \") && line.endsWith(\":\")) {\n\t\t\tconst cond = line.slice(3, -1).trim();\n\t\t\tconst body = this.collectBlock(lines, idx + 1, indent);\n\t\t\tconst _skip = body.length + 1;\n\n\t\t\tif (pyBool(this.pyEval(cond, scope))) {\n\t\t\t\tthis.execBlock(\n\t\t\t\t\tbody,\n\t\t\t\t\tnew Map(scope).also?.((s) => {\n\t\t\t\t\t\tfor (const [k, v] of scope) s.set(k, v);\n\t\t\t\t\t}) ?? scope,\n\t\t\t\t);\n\t\t\t\t// Update scope from block (assignments)\n\t\t\t\tthis.runBlockInScope(body, scope);\n\t\t\t\t// Skip elif/else\n\t\t\t\tlet j = idx + 1 + body.length;\n\t\t\t\twhile (j < lines.length) {\n\t\t\t\t\tconst l = lines[j]!.trim();\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.getIndent(lines[j]!) < indent ||\n\t\t\t\t\t\t(!l.startsWith(\"elif\") && !l.startsWith(\"else\"))\n\t\t\t\t\t)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tconst bk = this.collectBlock(lines, j + 1, indent);\n\t\t\t\t\tj += 1 + bk.length;\n\t\t\t\t}\n\t\t\t\treturn j;\n\t\t\t}\n\n\t\t\t// Check elif / else\n\t\t\tlet j = idx + 1 + body.length;\n\t\t\twhile (j < lines.length) {\n\t\t\t\tconst el = lines[j]!;\n\t\t\t\tconst elt = el.trim();\n\t\t\t\tif (this.getIndent(el) !== indent) break;\n\n\t\t\t\tconst elifMatch = elt.match(/^elif\\s+(.+):$/);\n\t\t\t\tif (elifMatch) {\n\t\t\t\t\tconst eBody = this.collectBlock(lines, j + 1, indent);\n\t\t\t\t\tif (pyBool(this.pyEval(elifMatch[1]!, scope))) {\n\t\t\t\t\t\tthis.runBlockInScope(eBody, scope);\n\t\t\t\t\t\tj += 1 + eBody.length;\n\t\t\t\t\t\t// Skip remaining elif/else\n\t\t\t\t\t\twhile (j < lines.length) {\n\t\t\t\t\t\t\tconst sl = lines[j]!.trim();\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tthis.getIndent(lines[j]!) !== indent ||\n\t\t\t\t\t\t\t\t(!sl.startsWith(\"elif\") && !sl.startsWith(\"else\"))\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tconst sb = this.collectBlock(lines, j + 1, indent);\n\t\t\t\t\t\t\tj += 1 + sb.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn j;\n\t\t\t\t\t}\n\t\t\t\t\tj += 1 + eBody.length;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (elt === \"else:\") {\n\t\t\t\t\tconst eBody = this.collectBlock(lines, j + 1, indent);\n\t\t\t\t\tthis.runBlockInScope(eBody, scope);\n\t\t\t\t\treturn j + 1 + eBody.length;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn j;\n\t\t}\n\n\t\t// for\n\t\tconst forMatch = line.match(/^for\\s+(.+?)\\s+in\\s+(.+?)\\s*:$/);\n\t\tif (forMatch) {\n\t\t\tconst [, target, iterExpr] = forMatch;\n\t\t\tconst iterable = pyIter(this.pyEval(iterExpr!.trim(), scope));\n\t\t\tconst body = this.collectBlock(lines, idx + 1, indent);\n\n\t\t\t// Check for else clause\n\t\t\tlet elseBody: string[] = [];\n\t\t\tlet afterIdx = idx + 1 + body.length;\n\t\t\tif (afterIdx < lines.length && lines[afterIdx]?.trim() === \"else:\") {\n\t\t\t\telseBody = this.collectBlock(lines, afterIdx + 1, indent);\n\t\t\t\tafterIdx += 1 + elseBody.length;\n\t\t\t}\n\n\t\t\tlet broken = false;\n\t\t\tfor (const item of iterable) {\n\t\t\t\t// Unpack\n\t\t\t\tif (target!.includes(\",\")) {\n\t\t\t\t\tconst targets = target!.split(\",\").map((t) => t.trim());\n\t\t\t\t\tconst items = Array.isArray(item) ? item : [item];\n\t\t\t\t\ttargets.forEach((t, i) => scope.set(t, items[i] ?? NONE));\n\t\t\t\t} else {\n\t\t\t\t\tscope.set(target!.trim(), item);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tthis.runBlockInScope(body, scope);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e instanceof BreakSignal) {\n\t\t\t\t\t\tbroken = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (e instanceof ContinueSignal) continue;\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!broken && elseBody.length) this.runBlockInScope(elseBody, scope);\n\t\t\treturn afterIdx;\n\t\t}\n\n\t\t// while\n\t\tconst whileMatch = line.match(/^while\\s+(.+?)\\s*:$/);\n\t\tif (whileMatch) {\n\t\t\tconst cond = whileMatch[1]!;\n\t\t\tconst body = this.collectBlock(lines, idx + 1, indent);\n\t\t\tlet iterations = 0;\n\t\t\twhile (pyBool(this.pyEval(cond, scope)) && iterations++ < 100000) {\n\t\t\t\ttry {\n\t\t\t\t\tthis.runBlockInScope(body, scope);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e instanceof BreakSignal) break;\n\t\t\t\t\tif (e instanceof ContinueSignal) continue;\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn idx + 1 + body.length;\n\t\t}\n\n\t\t// try / except\n\t\tif (line === \"try:\") {\n\t\t\tconst tryBody = this.collectBlock(lines, idx + 1, indent);\n\t\t\tlet j = idx + 1 + tryBody.length;\n\t\t\tconst exceptClauses: Array<{ exc: string | null; body: string[] }> = [];\n\t\t\tlet finallyBody: string[] = [];\n\t\t\tlet elseBody: string[] = [];\n\n\t\t\twhile (j < lines.length) {\n\t\t\t\tconst el = lines[j]!;\n\t\t\t\tconst elt = el.trim();\n\t\t\t\tif (this.getIndent(el) !== indent) break;\n\t\t\t\tif (elt.startsWith(\"except\")) {\n\t\t\t\t\tconst excMatch = elt.match(\n\t\t\t\t\t\t/^except(?:\\s+(\\w+)(?:\\s+as\\s+(\\w+))?)?\\s*:$/,\n\t\t\t\t\t);\n\t\t\t\t\tconst excName = excMatch?.[1] ?? null;\n\t\t\t\t\tconst excAlias = excMatch?.[2];\n\t\t\t\t\tconst excBody = this.collectBlock(lines, j + 1, indent);\n\t\t\t\t\texceptClauses.push({ exc: excName, body: excBody });\n\t\t\t\t\tif (excAlias) scope.set(excAlias, \"\");\n\t\t\t\t\tj += 1 + excBody.length;\n\t\t\t\t} else if (elt === \"else:\") {\n\t\t\t\t\telseBody = this.collectBlock(lines, j + 1, indent);\n\t\t\t\t\tj += 1 + elseBody.length;\n\t\t\t\t} else if (elt === \"finally:\") {\n\t\t\t\t\tfinallyBody = this.collectBlock(lines, j + 1, indent);\n\t\t\t\t\tj += 1 + finallyBody.length;\n\t\t\t\t} else break;\n\t\t\t}\n\n\t\t\tlet _caughtErr: PyError | null = null;\n\t\t\ttry {\n\t\t\t\tthis.runBlockInScope(tryBody, scope);\n\t\t\t\tif (elseBody.length) this.runBlockInScope(elseBody, scope);\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof PyError) {\n\t\t\t\t\t_caughtErr = e;\n\t\t\t\t\tlet handled = false;\n\t\t\t\t\tfor (const clause of exceptClauses) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tclause.exc === null ||\n\t\t\t\t\t\t\tclause.exc === e.type ||\n\t\t\t\t\t\t\tclause.exc === \"Exception\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.runBlockInScope(clause.body, scope);\n\t\t\t\t\t\t\thandled = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!handled) throw e;\n\t\t\t\t} else throw e;\n\t\t\t} finally {\n\t\t\t\tif (finallyBody.length) this.runBlockInScope(finallyBody, scope);\n\t\t\t}\n\t\t\treturn j;\n\t\t}\n\n\t\t// with\n\t\tconst withMatch = line.match(/^with\\s+(.+?)\\s+as\\s+(\\w+)\\s*:$/);\n\t\tif (withMatch) {\n\t\t\tconst body = this.collectBlock(lines, idx + 1, indent);\n\t\t\tscope.set(withMatch[2]!, NONE); // stub: just set to None\n\t\t\tthis.runBlockInScope(body, scope);\n\t\t\treturn idx + 1 + body.length;\n\t\t}\n\n\t\t// Augmented assignments: +=, -=, *=, /=, //=, %= **=\n\t\tconst augMatch = line.match(\n\t\t\t/^([A-Za-z_][A-Za-z0-9_]*)\\s*(\\+=|-=|\\*=|\\/\\/=|\\/=|%=|\\*\\*=|&=|\\|=)\\s*(.+)$/,\n\t\t);\n\t\tif (augMatch) {\n\t\t\tconst [, name, op, rhsExpr] = augMatch;\n\t\t\tconst lhs = scope.get(name!) ?? 0;\n\t\t\tconst rhs = this.pyEval(rhsExpr!, scope);\n\t\t\tlet result: PyVal;\n\t\t\tswitch (op) {\n\t\t\t\tcase \"+=\":\n\t\t\t\t\tresult =\n\t\t\t\t\t\ttypeof lhs === \"string\"\n\t\t\t\t\t\t\t? lhs + pyStr(rhs)\n\t\t\t\t\t\t\t: (lhs as number) + (rhs as number);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"-=\":\n\t\t\t\t\tresult = (lhs as number) - (rhs as number);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"*=\":\n\t\t\t\t\tresult = (lhs as number) * (rhs as number);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/=\":\n\t\t\t\t\tresult = (lhs as number) / (rhs as number);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"//=\":\n\t\t\t\t\tresult = Math.floor((lhs as number) / (rhs as number));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"%=\":\n\t\t\t\t\tresult = (lhs as number) % (rhs as number);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"**=\":\n\t\t\t\t\tresult = (lhs as number) ** (rhs as number);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tresult = rhs;\n\t\t\t}\n\t\t\tscope.set(name!, result);\n\t\t\treturn idx + 1;\n\t\t}\n\n\t\t// Subscript assignment: obj[key] = val\n\t\tconst subAssignMatch = line.match(\n\t\t\t/^([A-Za-z_][A-Za-z0-9_]*)\\[(.+)\\]\\s*=\\s*(.+)$/,\n\t\t);\n\t\tif (subAssignMatch) {\n\t\t\tconst [, name, key, valExpr] = subAssignMatch;\n\t\t\tconst obj = scope.get(name!) ?? NONE;\n\t\t\tconst val: PyVal = this.pyEval(valExpr!, scope) ?? NONE;\n\t\t\tconst k: PyVal = this.pyEval(key!, scope) ?? NONE;\n\t\t\tif (Array.isArray(obj)) (obj as PyVal[])[k as number] = val;\n\t\t\telse if (isPyDict(obj)) obj.data.set(pyStr(k), val);\n\t\t\treturn idx + 1;\n\t\t}\n\n\t\t// Attribute assignment: obj.attr = val\n\t\tconst attrAssignMatch = line.match(\n\t\t\t/^([A-Za-z_][A-Za-z0-9_.]+)\\s*=\\s*(.+)$/,\n\t\t);\n\t\tif (attrAssignMatch) {\n\t\t\tconst dotIdx = attrAssignMatch[1]!.lastIndexOf(\".\");\n\t\t\tif (dotIdx !== -1) {\n\t\t\t\tconst objExpr = attrAssignMatch[1]!.slice(0, dotIdx);\n\t\t\t\tconst attr = attrAssignMatch[1]!.slice(dotIdx + 1);\n\t\t\t\tconst val = this.pyEval(attrAssignMatch[2]!, scope);\n\t\t\t\tconst obj = this.pyEval(objExpr, scope);\n\t\t\t\tif (isPyDict(obj)) obj.data.set(attr, val);\n\t\t\t\telse if (isPyInstance(obj)) obj.attrs.set(attr, val);\n\t\t\t\treturn idx + 1;\n\t\t\t}\n\t\t}\n\n\t\t// Tuple / multi-assignment: a, b = expr\n\t\tconst multiAssignMatch = line.match(\n\t\t\t/^([A-Za-z_][A-Za-z0-9_,\\s]*),\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.+)$/,\n\t\t);\n\t\tif (multiAssignMatch) {\n\t\t\tconst rhs = this.pyEval(multiAssignMatch[3]!, scope);\n\t\t\tconst targets = line\n\t\t\t\t.split(\"=\")[0]!\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((s) => s.trim());\n\t\t\tconst values = pyIter(rhs);\n\t\t\ttargets.forEach((t, i) => scope.set(t, values[i] ?? NONE));\n\t\t\treturn idx + 1;\n\t\t}\n\n\t\t// Simple assignment: name = expr (or name: type = expr)\n\t\tconst assignMatch = line.match(\n\t\t\t/^([A-Za-z_][A-Za-z0-9_]*)\\s*(?::[^=]+)?\\s*=\\s*(.+)$/,\n\t\t);\n\t\tif (assignMatch) {\n\t\t\tconst [, name, rhs] = assignMatch;\n\t\t\tscope.set(name!, this.pyEval(rhs!, scope));\n\t\t\treturn idx + 1;\n\t\t}\n\n\t\t// Expression statement (function call, etc.)\n\t\ttry {\n\t\t\tthis.pyEval(line, scope);\n\t\t} catch (e) {\n\t\t\tif (e instanceof PyError || e instanceof ExitSignal) throw e;\n\t\t\t// Ignore eval errors for expression statements\n\t\t}\n\t\treturn idx + 1;\n\t}\n\n\tprivate runBlockInScope(body: string[], scope: Scope): void {\n\t\tthis.execLines(body, 0, scope);\n\t}\n\n\trun(code: string): { stdout: string; stderr: string; exitCode: number } {\n\t\tconst scope = makeRootScope(this.cwd);\n\t\ttry {\n\t\t\tthis.execScript(code, scope);\n\t\t} catch (e) {\n\t\t\tif (e instanceof ExitSignal)\n\t\t\t\treturn {\n\t\t\t\t\tstdout: this.getOutput(),\n\t\t\t\t\tstderr: this.getStderr(),\n\t\t\t\t\texitCode: e.code,\n\t\t\t\t};\n\t\t\tif (e instanceof PyError) {\n\t\t\t\tthis.stderr.push(e.toString());\n\t\t\t\treturn {\n\t\t\t\t\tstdout: this.getOutput(),\n\t\t\t\t\tstderr: this.getStderr(),\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (e instanceof ReturnSignal)\n\t\t\t\treturn {\n\t\t\t\t\tstdout: this.getOutput(),\n\t\t\t\t\tstderr: this.getStderr(),\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\tthis.stderr.push(`RuntimeError: ${e}`);\n\t\t\treturn {\n\t\t\t\tstdout: this.getOutput(),\n\t\t\t\tstderr: this.getStderr(),\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\t\treturn { stdout: this.getOutput(), stderr: this.getStderr(), exitCode: 0 };\n\t}\n}\n\n// Polyfill: Map doesn't have .also in TS\ndeclare global {\n\tinterface Map<K, V> {\n\t\talso?: ((fn: (m: Map<K, V>) => void) => Map<K, V>) | undefined;\n\t}\n}\n\n// \u2500\u2500\u2500 command \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Virtual Python 3 interpreter command. Implements a small Python subset\n * for scripts and `-c` invocations. Requires `apt install python3` in the\n * virtual package manager to be available.\n * @category system\n * @params [\"[--version] [-c <code>] [-V] [file]\"]\n */\nexport const python3Command: ShellModule = {\n\tname: \"python3\",\n\taliases: [\"python\"],\n\tdescription: \"Python 3 interpreter (virtual)\",\n\tcategory: \"system\",\n\tparams: [\"[--version] [-c <code>] [-V] [file]\"],\n\trun: ({ args, shell, cwd }) => {\n\t\t// Require explicit installation via `apt install python3`\n\t\tif (!shell.packageManager.isInstalled(\"python3\")) {\n\t\t\treturn {\n\t\t\t\tstderr:\n\t\t\t\t\t\"bash: python3: command not found\\nHint: install it with: apt install python3\\n\",\n\t\t\t\texitCode: 127,\n\t\t\t};\n\t\t}\n\t\tif (ifFlag(args, [\"--version\", \"-V\"])) {\n\t\t\treturn { stdout: `${VERSION}\\n`, exitCode: 0 };\n\t\t}\n\t\tif (ifFlag(args, [\"--version-full\"])) {\n\t\t\treturn { stdout: `${VERSION_INFO}\\n`, exitCode: 0 };\n\t\t}\n\n\t\tconst cIdx = args.indexOf(\"-c\");\n\t\tif (cIdx !== -1) {\n\t\t\tconst code = args[cIdx + 1];\n\t\t\tif (!code)\n\t\t\t\treturn {\n\t\t\t\t\tstderr: \"python3: -c requires a code argument\\n\",\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t// Handle \\n as actual newlines\n\t\t\tconst normalised = code.replace(/\\\\n/g, \"\\n\").replace(/\\\\t/g, \"\\t\");\n\t\t\tconst interp = new Interpreter(cwd);\n\t\t\tconst { stdout, stderr, exitCode } = interp.run(normalised);\n\t\t\treturn {\n\t\t\t\tstdout: stdout || undefined,\n\t\t\t\tstderr: stderr || undefined,\n\t\t\t\texitCode,\n\t\t\t};\n\t\t}\n\n\t\tconst file = args.find((a) => !a.startsWith(\"-\"));\n\t\tif (file) {\n\t\t\tconst filePath = resolvePath(cwd, file);\n\t\t\tif (!shell.vfs.exists(filePath)) {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `python3: can't open file '${file}': [Errno 2] No such file or directory\\n`,\n\t\t\t\t\texitCode: 2,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst code = shell.vfs.readFile(filePath);\n\t\t\tconst interp = new Interpreter(cwd);\n\t\t\tconst { stdout, stderr, exitCode } = interp.run(code);\n\t\t\treturn {\n\t\t\t\tstdout: stdout || undefined,\n\t\t\t\tstderr: stderr || undefined,\n\t\t\t\texitCode,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstdout: `${VERSION_INFO}\\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\\n>>> `,\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n\nexport const readCommand: ShellModule = {\n\tname: \"read\",\n\tdescription: \"Read a line from stdin into variables\",\n\tcategory: \"shell\",\n\tparams: [\"[-r] [-p prompt] <var...>\"],\n\trun: ({ args, stdin, env }) => {\n\t\tconst _promptIdx = args.indexOf(\"-p\");\n\t\tconst varNames = args.filter(\n\t\t\t(a, i) => a !== \"-r\" && a !== \"-p\" && args[i - 1] !== \"-p\",\n\t\t);\n\n\t\t// In non-interactive context, read from stdin pipe\n\t\tconst input = (stdin ?? \"\").split(\"\\n\")[0] ?? \"\";\n\t\tconst line = ifFlag(args, [\"-r\"])\n\t\t\t? input\n\t\t\t: input.replace(/\\\\(?:\\r?\\n|.)/g, (m) =>\n\t\t\t\t\tm[1] === \"\\n\" || m[1] === \"\\r\" ? \"\" : m[1]!,\n\t\t\t\t);\n\n\t\tif (!env) return { exitCode: 0 };\n\n\t\tif (varNames.length === 0) {\n\t\t\t// No var names: store into REPLY\n\t\t\tenv.vars.REPLY = line;\n\t\t} else if (varNames.length === 1) {\n\t\t\tenv.vars[varNames[0]!] = line;\n\t\t} else {\n\t\t\t// Split on whitespace, last var gets remainder\n\t\t\tconst parts = line.split(/\\s+/);\n\t\t\tfor (let i = 0; i < varNames.length; i++) {\n\t\t\t\tenv.vars[varNames[i]!] =\n\t\t\t\t\ti < varNames.length - 1 ? (parts[i] ?? \"\") : parts.slice(i).join(\" \");\n\t\t\t}\n\t\t}\n\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg, ifFlag } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const rmCommand: ShellModule = {\n\tname: \"rm\",\n\tdescription: \"Remove files or directories\",\n\tcategory: \"files\",\n\tparams: [\"[-r|-rf] <path>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tif (args.length === 0) {\n\t\t\treturn { stderr: \"rm: missing operand\", exitCode: 1 };\n\t\t}\n\n\t\tconst recursive = ifFlag(args, [\"-r\", \"-rf\", \"-fr\"]);\n\t\tconst targets: string[] = [];\n\t\tfor (let index = 0; ; index += 1) {\n\t\t\tconst target = getArg(args, index, { flags: [\"-r\", \"-rf\", \"-fr\"] });\n\t\t\tif (!target) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttargets.push(target);\n\t\t}\n\n\t\tif (targets.length === 0) {\n\t\t\treturn { stderr: \"rm: missing operand\", exitCode: 1 };\n\t\t}\n\n\t\tfor (const target of targets) {\n\t\t\tconst resolvedTarget = resolvePath(cwd, target);\n\t\t\tassertPathAccess(authUser, resolvedTarget, \"rm\");\n\t\t\tshell.vfs.remove(resolvedTarget, { recursive });\n\t\t}\n\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getFlag, ifFlag } from \"./command-helpers\";\nimport { resolvePath } from \"./helpers\";\n\nexport const sedCommand: ShellModule = {\n\tname: \"sed\",\n\tdescription: \"Stream editor for filtering and transforming text\",\n\tcategory: \"text\",\n\tparams: [\"-e <expr> [file]\", \"s/pattern/replace/[g]\"],\n\trun: ({ authUser, shell, cwd, args, stdin }) => {\n\t\tconst inPlace = ifFlag(args, [\"-i\"]);\n\t\tconst expr =\n\t\t\t(getFlag(args, [\"-e\"]) as string | undefined) ??\n\t\t\targs.find((a) => !a.startsWith(\"-\"));\n\t\tconst fileArg = args.filter((a) => !a.startsWith(\"-\") && a !== expr).pop();\n\n\t\tif (!expr) return { stderr: \"sed: no expression\", exitCode: 1 };\n\n\t\tlet content = stdin ?? \"\";\n\t\tif (fileArg) {\n\t\t\tconst p = resolvePath(cwd, fileArg);\n\t\t\ttry {\n\t\t\t\tcontent = shell.vfs.readFile(p);\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `sed: ${fileArg}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// Parse s/from/to/[g]\n\t\tconst sMatch = expr.match(/^s([^a-zA-Z0-9])(.+?)\\1(.*?)\\1([gi]*)$/);\n\t\tif (!sMatch)\n\t\t\treturn { stderr: `sed: unrecognized command: ${expr}`, exitCode: 1 };\n\n\t\tconst [, , from, to, flags] = sMatch;\n\t\tconst regexFlags = (flags ?? \"\").includes(\"i\")\n\t\t\t? \"gi\"\n\t\t\t: (flags ?? \"\").includes(\"g\")\n\t\t\t\t? \"g\"\n\t\t\t\t: \"\";\n\t\tlet regex: RegExp;\n\t\ttry {\n\t\t\tregex = new RegExp(from!, regexFlags || \"\");\n\t\t} catch (_e) {\n\t\t\treturn { stderr: `sed: invalid regex: ${from}`, exitCode: 1 };\n\t\t}\n\n\t\tconst result =\n\t\t\t(flags ?? \"\").includes(\"g\") || regexFlags.includes(\"g\")\n\t\t\t\t? content.replace(regex, to ?? \"\")\n\t\t\t\t: content.replace(regex, to ?? \"\");\n\n\t\tif (inPlace && fileArg) {\n\t\t\tconst p = resolvePath(cwd, fileArg);\n\t\t\tshell.writeFileAsUser(authUser, p, result);\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\treturn { stdout: result, exitCode: 0 };\n\t},\n};\n", "import { runCommandDirect } from \"../commands\";\nimport { resolvePath } from \"../commands/helpers\";\nimport type { CommandMode, CommandResult, ShellEnv } from \"../types/commands\";\nimport type {\n\tPipeline,\n\tPipelineCommand,\n\tScript,\n\tStatement,\n} from \"../types/pipeline\";\nimport type { VirtualShell } from \"../VirtualShell\";\n\n// \u2500\u2500 Script executor (handles &&/||/;) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function executeScript(\n\tscript: Script,\n\tauthUser: string,\n\thostname: string,\n\tmode: CommandMode,\n\tcwd: string,\n\tshell: VirtualShell,\n\tenv: ShellEnv,\n): Promise<CommandResult> {\n\tif (!script.isValid)\n\t\treturn { stderr: script.error || \"Syntax error\", exitCode: 1 };\n\n\tlet lastResult: CommandResult = { exitCode: 0 };\n\n\tfor (const stmt of script.statements) {\n\t\t// Decide whether to run this statement based on previous op\n\t\tlastResult = await executePipeline(\n\t\t\tstmt.pipeline,\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\tmode,\n\t\t\tcwd,\n\t\t\tshell,\n\t\t\tenv,\n\t\t);\n\t\tenv.lastExitCode = lastResult.exitCode ?? 0;\n\n\t\t// Propagate session-control signals\n\t\tif (\n\t\t\tlastResult.closeSession ||\n\t\t\tlastResult.switchUser ||\n\t\t\tlastResult.nextCwd\n\t\t) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn lastResult;\n}\n\n/** Execute statements connected by &&/||/; */\nexport async function executeStatements(\n\tstatements: Statement[],\n\tauthUser: string,\n\thostname: string,\n\tmode: CommandMode,\n\tcwd: string,\n\tshell: VirtualShell,\n\tenv: ShellEnv,\n): Promise<CommandResult> {\n\tlet last: CommandResult = { exitCode: 0 };\n\tlet i = 0;\n\n\twhile (i < statements.length) {\n\t\tconst stmt = statements[i]!;\n\t\tlast = await executePipeline(\n\t\t\tstmt.pipeline,\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\tmode,\n\t\t\tcwd,\n\t\t\tshell,\n\t\t\tenv,\n\t\t);\n\t\tenv.lastExitCode = last.exitCode ?? 0;\n\n\t\tif (last.closeSession || last.switchUser) return last;\n\n\t\tconst op = stmt.op;\n\t\tif (!op || op === \";\") {\n\t\t\t// always run next\n\t\t} else if (op === \"&&\") {\n\t\t\tif ((last.exitCode ?? 0) !== 0) {\n\t\t\t\t// skip until next ; or end\n\t\t\t\twhile (i < statements.length && statements[i]?.op === \"&&\") i++;\n\t\t\t}\n\t\t} else if (op === \"||\") {\n\t\t\tif ((last.exitCode ?? 0) === 0) {\n\t\t\t\t// skip until next ; or end\n\t\t\t\twhile (i < statements.length && statements[i]?.op === \"||\") i++;\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\treturn last;\n}\n\n// \u2500\u2500 Pipeline executor \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function executePipeline(\n\tpipeline: Pipeline,\n\tauthUser: string,\n\thostname: string,\n\tmode: CommandMode,\n\tcwd: string,\n\tshell: VirtualShell,\n\tenv?: ShellEnv,\n): Promise<CommandResult> {\n\tif (!pipeline.isValid)\n\t\treturn { stderr: pipeline.error || \"Syntax error\", exitCode: 1 };\n\tif (pipeline.commands.length === 0) return { exitCode: 0 };\n\n\tconst shellEnv: ShellEnv = env ?? { vars: {}, lastExitCode: 0 };\n\n\tif (pipeline.commands.length === 1) {\n\t\treturn executeSingleCommandWithRedirections(\n\t\t\tpipeline.commands[0] as PipelineCommand,\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\tmode,\n\t\t\tcwd,\n\t\t\tshell,\n\t\t\tshellEnv,\n\t\t);\n\t}\n\n\treturn executePipelineChain(\n\t\tpipeline.commands as PipelineCommand[],\n\t\tauthUser,\n\t\thostname,\n\t\tmode,\n\t\tcwd,\n\t\tshell,\n\t\tshellEnv,\n\t);\n}\n\nasync function executeSingleCommandWithRedirections(\n\tcmd: PipelineCommand,\n\tauthUser: string,\n\thostname: string,\n\tmode: CommandMode,\n\tcwd: string,\n\tshell: VirtualShell,\n\tenv: ShellEnv,\n): Promise<CommandResult> {\n\tlet stdin: string | undefined;\n\tif (cmd.inputFile) {\n\t\tconst inputPath = resolvePath(cwd, cmd.inputFile);\n\t\ttry {\n\t\t\tstdin = shell.vfs.readFile(inputPath);\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tstderr: `${cmd.inputFile}: No such file or directory`,\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\t}\n\n\tconst result = await runCommandDirect(\n\t\tcmd.name,\n\t\tcmd.args,\n\t\tauthUser,\n\t\thostname,\n\t\tmode,\n\t\tcwd,\n\t\tshell,\n\t\tstdin,\n\t\tenv,\n\t);\n\n\tif (cmd.outputFile) {\n\t\tconst outputPath = resolvePath(cwd, cmd.outputFile);\n\t\tconst output = result.stdout || \"\";\n\t\ttry {\n\t\t\tif (cmd.appendOutput) {\n\t\t\t\tconst existing = (() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn shell.vfs.readFile(outputPath);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t\tshell.writeFileAsUser(authUser, outputPath, existing + output);\n\t\t\t} else {\n\t\t\t\tshell.writeFileAsUser(authUser, outputPath, output);\n\t\t\t}\n\t\t\treturn { ...result, stdout: \"\" };\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\t...result,\n\t\t\t\tstderr: `Failed to write to ${cmd.outputFile}`,\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn result;\n}\n\nasync function executePipelineChain(\n\tcommands: PipelineCommand[],\n\tauthUser: string,\n\thostname: string,\n\tmode: CommandMode,\n\tcwd: string,\n\tshell: VirtualShell,\n\tenv: ShellEnv,\n): Promise<CommandResult> {\n\tlet currentOutput = \"\";\n\tlet exitCode = 0;\n\n\tfor (let i = 0; i < commands.length; i++) {\n\t\tconst cmd = commands[i] as PipelineCommand;\n\n\t\tif (i === 0 && cmd.inputFile) {\n\t\t\tconst inputPath = resolvePath(cwd, cmd.inputFile);\n\t\t\ttry {\n\t\t\t\tcurrentOutput = shell.vfs.readFile(inputPath);\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `${cmd.inputFile}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst result = await runCommandDirect(\n\t\t\tcmd.name,\n\t\t\tcmd.args,\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\tmode,\n\t\t\tcwd,\n\t\t\tshell,\n\t\t\tcurrentOutput,\n\t\t\tenv,\n\t\t);\n\t\texitCode = result.exitCode ?? 0;\n\n\t\tif (i === commands.length - 1 && cmd.outputFile) {\n\t\t\tconst outputPath = resolvePath(cwd, cmd.outputFile);\n\t\t\tconst output = result.stdout || \"\";\n\t\t\ttry {\n\t\t\t\tif (cmd.appendOutput) {\n\t\t\t\t\tconst existing = (() => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn shell.vfs.readFile(outputPath);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t\tshell.writeFileAsUser(authUser, outputPath, existing + output);\n\t\t\t\t} else {\n\t\t\t\t\tshell.writeFileAsUser(authUser, outputPath, output);\n\t\t\t\t}\n\t\t\t\tcurrentOutput = \"\";\n\t\t\t} catch {\n\t\t\t\treturn { stderr: `Failed to write to ${cmd.outputFile}`, exitCode: 1 };\n\t\t\t}\n\t\t} else {\n\t\t\tcurrentOutput = result.stdout || \"\";\n\t\t}\n\n\t\tif (result.stderr && exitCode !== 0)\n\t\t\treturn { stderr: result.stderr, exitCode };\n\t\tif (result.closeSession || result.switchUser) return result;\n\t}\n\n\treturn { stdout: currentOutput, exitCode };\n}\n", "import type {\n\tPipeline,\n\tPipelineCommand,\n\tScript,\n\tStatement,\n\tLogicalOp,\n} from \"../types/pipeline\";\n\n// \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Parse a shell input line into a Script (sequence of statements connected\n * by && / || / ;). Each statement contains one Pipeline (commands connected\n * by |).\n */\nexport function parseScript(rawInput: string): Script {\n\tconst trimmed = rawInput.trim();\n\tif (!trimmed) return { statements: [], isValid: true };\n\n\ttry {\n\t\tconst statements = parseStatements(trimmed);\n\t\treturn { statements, isValid: true };\n\t} catch (e) {\n\t\treturn { statements: [], isValid: false, error: (e as Error).message };\n\t}\n}\n\n/** Legacy compat: parse a single pipeline (no &&/||/;) */\nexport function parseShellPipeline(rawInput: string): Pipeline {\n\tconst trimmed = rawInput.trim();\n\tif (!trimmed) return { commands: [], isValid: true };\n\ttry {\n\t\tconst commands = parsePipeline(trimmed);\n\t\treturn { commands, isValid: true };\n\t} catch (e) {\n\t\treturn { commands: [], isValid: false, error: (e as Error).message };\n\t}\n}\n\n// \u2500\u2500 Variable & tilde expansion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Expand ~ and $VAR / ${VAR} / ${VAR:-default} / $(cmd placeholder) in a\n * token, given the current env vars and home path.\n * Command substitution $(\u2026) is NOT executed here \u2014 it's left as a marker so\n * the executor can handle it.\n */\nexport function expandToken(\n\ttoken: string,\n\tenv: Record<string, string>,\n\tauthUser: string,\n\tlastExitCode = 0,\n): string {\n\t// tilde expansion\n\ttoken = token.replace(/^~(\\/|$)/, `/home/${authUser}$1`);\n\n\t// $? special var\n\ttoken = token.replace(/\\$\\?/g, String(lastExitCode));\n\t// $$ PID (mock)\n\ttoken = token.replace(/\\$\\$/g, \"1\");\n\t// $# argc (0 for interactive)\n\ttoken = token.replace(/\\$#/g, \"0\");\n\n\t// ${VAR:-default} and ${VAR:+value}\n\ttoken = token.replace(\n\t\t/\\$\\{([^}:]+):-([^}]*)\\}/g,\n\t\t(_, name, def) => env[name] ?? def,\n\t);\n\ttoken = token.replace(/\\$\\{([^}:]+):\\+([^}]*)\\}/g, (_, name, val) =>\n\t\tenv[name] ? val : \"\",\n\t);\n\n\t// ${VAR}\n\ttoken = token.replace(/\\$\\{([^}]+)\\}/g, (_, name) => env[name] ?? \"\");\n\n\t// $VAR (greedy: match longest valid identifier)\n\ttoken = token.replace(\n\t\t/\\$([A-Za-z_][A-Za-z0-9_]*)/g,\n\t\t(_, name) => env[name] ?? \"\",\n\t);\n\n\treturn token;\n}\n\n/**\n * Expand glob patterns (*, ?, [abc]) against a list of entries.\n * Returns the original pattern if no match.\n */\nexport function expandGlob(pattern: string, entries: string[]): string[] {\n\tif (!/[*?[]/.test(pattern)) return [pattern];\n\tconst regex = globToRegex(pattern);\n\tconst matches = entries.filter((e) => regex.test(e));\n\treturn matches.length > 0 ? matches.sort() : [pattern];\n}\n\nfunction globToRegex(pattern: string): RegExp {\n\tlet re = \"^\";\n\tfor (let i = 0; i < pattern.length; i++) {\n\t\tconst c = pattern[i]!;\n\t\tif (c === \"*\") re += \".*\";\n\t\telse if (c === \"?\") re += \".\";\n\t\telse if (c === \"[\") {\n\t\t\tconst close = pattern.indexOf(\"]\", i + 1);\n\t\t\tif (close === -1) re += \"\\\\[\";\n\t\t\telse {\n\t\t\t\tre += `[${pattern.slice(i + 1, close)}]`;\n\t\t\t\ti = close;\n\t\t\t}\n\t\t} else re += c.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t}\n\treturn new RegExp(`${re}$`);\n}\n\n// \u2500\u2500 Internal parser \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction parseStatements(input: string): Statement[] {\n\t// Split by ;, &&, || \u2014 respecting quotes and parens\n\tconst segments = splitByLogicalOps(input);\n\tconst statements: Statement[] = [];\n\n\tfor (const seg of segments) {\n\t\tconst commands = parsePipeline(seg.text.trim());\n\t\tconst stmt: Statement = { pipeline: { commands, isValid: true } };\n\t\tif (seg.op) stmt.op = seg.op;\n\t\tstatements.push(stmt);\n\t}\n\n\treturn statements;\n}\n\ninterface Segment {\n\ttext: string;\n\top?: LogicalOp;\n}\n\nfunction splitByLogicalOps(input: string): Segment[] {\n\tconst segments: Segment[] = [];\n\tlet current = \"\";\n\tlet depth = 0; // parens/subshell depth\n\tlet inQ = false;\n\tlet qChar = \"\";\n\tlet i = 0;\n\n\tconst flush = (op?: LogicalOp) => {\n\t\tif (current.trim()) segments.push({ text: current, op });\n\t\tcurrent = \"\";\n\t};\n\n\twhile (i < input.length) {\n\t\tconst ch = input[i]!;\n\t\tconst ch2 = input.slice(i, i + 2);\n\n\t\tif ((ch === '\"' || ch === \"'\") && !inQ) {\n\t\t\tinQ = true;\n\t\t\tqChar = ch;\n\t\t\tcurrent += ch;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inQ && ch === qChar) {\n\t\t\tinQ = false;\n\t\t\tcurrent += ch;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inQ) {\n\t\t\tcurrent += ch;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === \"(\") {\n\t\t\tdepth++;\n\t\t\tcurrent += ch;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \")\") {\n\t\t\tdepth--;\n\t\t\tcurrent += ch;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (depth > 0) {\n\t\t\tcurrent += ch;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch2 === \"&&\") {\n\t\t\tflush(\"&&\");\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch2 === \"||\") {\n\t\t\tflush(\"||\");\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \";\") {\n\t\t\tflush(\";\");\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tcurrent += ch;\n\t\ti++;\n\t}\n\tflush();\n\treturn segments;\n}\n\nfunction parsePipeline(input: string): PipelineCommand[] {\n\tconst pipeTokens = splitByPipe(input);\n\treturn pipeTokens.map(parseCommandWithRedirections);\n}\n\nfunction splitByPipe(input: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet inQ = false;\n\tlet qChar = \"\";\n\n\tfor (let i = 0; i < input.length; i++) {\n\t\tconst ch = input[i]!;\n\t\tif ((ch === '\"' || ch === \"'\") && !inQ) {\n\t\t\tinQ = true;\n\t\t\tqChar = ch;\n\t\t\tcurrent += ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inQ && ch === qChar) {\n\t\t\tinQ = false;\n\t\t\tcurrent += ch;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inQ) {\n\t\t\tcurrent += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// || was already consumed at statement level, bare | is pipe\n\t\tif (ch === \"|\" && input[i + 1] !== \"|\") {\n\t\t\tif (!current.trim())\n\t\t\t\tthrow new Error(\"Syntax error near unexpected token '|'\");\n\t\t\ttokens.push(current.trim());\n\t\t\tcurrent = \"\";\n\t\t} else {\n\t\t\tcurrent += ch;\n\t\t}\n\t}\n\n\tconst tail = current.trim();\n\tif (!tail && tokens.length > 0)\n\t\tthrow new Error(\"Syntax error near unexpected token '|'\");\n\tif (tail) tokens.push(tail);\n\treturn tokens;\n}\n\nfunction parseCommandWithRedirections(token: string): PipelineCommand {\n\tconst parts = tokenizeCommand(token);\n\tif (parts.length === 0) return { name: \"\", args: [] };\n\n\tconst cmdParts: string[] = [];\n\tlet inputFile: string | undefined;\n\tlet outputFile: string | undefined;\n\tlet appendOutput = false;\n\tlet i = 0;\n\n\twhile (i < parts.length) {\n\t\tconst part = parts[i]!;\n\t\tif (part === \"<\") {\n\t\t\ti++;\n\t\t\tif (i >= parts.length)\n\t\t\t\tthrow new Error(\"Syntax error: expected filename after <\");\n\t\t\tinputFile = parts[i];\n\t\t\ti++;\n\t\t} else if (part === \">>\") {\n\t\t\ti++;\n\t\t\tif (i >= parts.length)\n\t\t\t\tthrow new Error(\"Syntax error: expected filename after >>\");\n\t\t\toutputFile = parts[i];\n\t\t\tappendOutput = true;\n\t\t\ti++;\n\t\t} else if (part === \">\") {\n\t\t\ti++;\n\t\t\tif (i >= parts.length)\n\t\t\t\tthrow new Error(\"Syntax error: expected filename after >\");\n\t\t\toutputFile = parts[i];\n\t\t\tappendOutput = false;\n\t\t\ti++;\n\t\t} else {\n\t\t\tcmdParts.push(part);\n\t\t\ti++;\n\t\t}\n\t}\n\n\tconst name = (cmdParts[0] ?? \"\").toLowerCase();\n\treturn { name, args: cmdParts.slice(1), inputFile, outputFile, appendOutput };\n}\n\nfunction tokenizeCommand(input: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet inQ = false;\n\tlet qChar = \"\";\n\tlet i = 0;\n\n\twhile (i < input.length) {\n\t\tconst ch = input[i]!;\n\t\tconst next = input[i + 1];\n\n\t\tif ((ch === '\"' || ch === \"'\") && !inQ) {\n\t\t\tinQ = true;\n\t\t\tqChar = ch;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inQ && ch === qChar) {\n\t\t\tinQ = false;\n\t\t\tqChar = \"\";\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inQ) {\n\t\t\tcurrent += ch;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === \" \") {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ((ch === \">\" || ch === \"<\") && !inQ) {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tif (ch === \">\" && next === \">\") {\n\t\t\t\ttokens.push(\">>\");\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\ttokens.push(ch);\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcurrent += ch;\n\t\ti++;\n\t}\n\tif (current) tokens.push(current);\n\treturn tokens;\n}\n", "/** biome-ignore-all lint/style/useNamingConvention: ENV VARIABLES */\nimport { executeStatements } from \"../SSHMimic/executor\";\nimport type { VirtualShell } from \"../VirtualShell\";\nimport { parseScript } from \"../VirtualShell/shellParser\";\nimport type {\n CommandMode,\n CommandResult,\n ShellEnv,\n} from \"../types/commands\";\nimport { expandAsync } from \"../utils/expand\";\nimport { resolveModule } from \"./registry\";\n\n// \u2500\u2500 Tokenize command input respecting quotes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction tokenizeCommand(input: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet inQ = false;\n\tlet qChar = \"\";\n\tlet i = 0;\n\n\twhile (i < input.length) {\n\t\tconst ch = input[i]!;\n\t\tconst next = input[i + 1];\n\n\t\tif ((ch === '\"' || ch === \"'\") && !inQ) {\n\t\t\tinQ = true;\n\t\t\tqChar = ch;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inQ && ch === qChar) {\n\t\t\tinQ = false;\n\t\t\tqChar = \"\";\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inQ) {\n\t\t\tcurrent += ch;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === \" \") {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ((ch === \">\" || ch === \"<\") && !inQ) {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tif (ch === \">\" && next === \">\") {\n\t\t\t\ttokens.push(\">>\");\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\ttokens.push(ch);\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcurrent += ch;\n\t\ti++;\n\t}\n\tif (current) tokens.push(current);\n\treturn tokens;\n}\n\nexport function makeDefaultEnv(authUser: string, hostname: string): ShellEnv {\n\treturn {\n\t\tvars: {\n\t\t\tPATH: \"/usr/local/bin:/usr/bin:/bin\",\n\t\t\tHOME: `/home/${authUser}`,\n\t\t\tUSER: authUser,\n\t\t\tLOGNAME: authUser,\n\t\t\tSHELL: \"/bin/sh\",\n\t\t\tTERM: \"xterm-256color\",\n\t\t\tHOSTNAME: hostname,\n\t\t\tPS1: \"\\\\u@\\\\h:\\\\w\\\\$ \",\n\t\t},\n\t\tlastExitCode: 0,\n\t};\n}\n\nfunction resolveVfsBinary(\n\tname: string,\n\tenv: ShellEnv,\n\tshell: VirtualShell,\n\tauthUser: string,\n): string | null {\n\tif (name.startsWith(\"/\")) {\n\t\tif (!shell.vfs.exists(name)) return null;\n\t\ttry {\n\t\t\tconst st = shell.vfs.stat(name);\n\t\t\tif (st.type !== \"file\") return null;\n\t\t\tif (!(st.mode & 0o111)) return null;\n\t\t\tif (\n\t\t\t\t(name.startsWith(\"/sbin/\") || name.startsWith(\"/usr/sbin/\")) &&\n\t\t\t\tauthUser !== \"root\"\n\t\t\t)\n\t\t\t\treturn null;\n\t\t\treturn name;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tconst pathDirs = (env.vars.PATH ?? \"/usr/local/bin:/usr/bin:/bin\").split(\":\");\n\tfor (const dir of pathDirs) {\n\t\tif ((dir === \"/sbin\" || dir === \"/usr/sbin\") && authUser !== \"root\")\n\t\t\tcontinue;\n\t\tconst full = `${dir}/${name}`;\n\t\tif (!shell.vfs.exists(full)) continue;\n\t\ttry {\n\t\t\tconst st = shell.vfs.stat(full);\n\t\t\tif (st.type !== \"file\") continue;\n\t\t\tif (!(st.mode & 0o111)) continue;\n\t\t\treturn full;\n\t\t} catch {}\n\t}\n\treturn null;\n}\n\nexport async function runCommandDirect(\n\tname: string,\n\targs: string[],\n\tauthUser: string,\n\thostname: string,\n\tmode: CommandMode,\n\tcwd: string,\n\tshell: VirtualShell,\n\tstdin: string | undefined,\n\tenv: ShellEnv,\n): Promise<CommandResult> {\n\tconst aliasVal = env.vars[`__alias_${name}`];\n\tif (aliasVal) {\n\t\treturn runCommand(\n\t\t\t`${aliasVal} ${args.join(\" \")}`,\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\tmode,\n\t\t\tcwd,\n\t\t\tshell,\n\t\t\tstdin,\n\t\t\tenv,\n\t\t);\n\t}\n\n\tconst mod = resolveModule(name);\n\tif (!mod) {\n\t\tconst vfsBinary = resolveVfsBinary(name, env, shell, authUser);\n\t\tif (vfsBinary) {\n\t\t\tconst stubContent = shell.vfs.readFile(vfsBinary);\n\t\t\tconst builtinMatch = stubContent.match(/exec\\s+builtin\\s+(\\S+)/);\n\t\t\tif (builtinMatch) {\n\t\t\t\tconst builtinMod = resolveModule(builtinMatch[1]!);\n\t\t\t\tif (builtinMod) {\n\t\t\t\t\treturn await builtinMod.run({\n\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\thostname,\n\t\t\t\t\t\tactiveSessions: shell.users.listActiveSessions(),\n\t\t\t\t\t\trawInput: [name, ...args].join(\" \"),\n\t\t\t\t\t\tmode,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\tstdin,\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tshell,\n\t\t\t\t\t\tenv,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst shMod = resolveModule(\"sh\");\n\t\t\tif (shMod) {\n\t\t\t\treturn await shMod.run({\n\t\t\t\t\tauthUser,\n\t\t\t\t\thostname,\n\t\t\t\t\tactiveSessions: shell.users.listActiveSessions(),\n\t\t\t\t\trawInput: `sh -c ${JSON.stringify(stubContent)}`,\n\t\t\t\t\tmode,\n\t\t\t\t\targs: [\"-c\", stubContent, \"--\", ...args],\n\t\t\t\t\tstdin,\n\t\t\t\t\tcwd,\n\t\t\t\t\tshell,\n\t\t\t\t\tenv,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn { stderr: `${name}: command not found`, exitCode: 127 };\n\t}\n\n\ttry {\n\t\treturn await mod.run({\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\tactiveSessions: shell.users.listActiveSessions(),\n\t\t\trawInput: [name, ...args].join(\" \"),\n\t\t\tmode,\n\t\t\targs,\n\t\t\tstdin,\n\t\t\tcwd,\n\t\t\tshell,\n\t\t\tenv,\n\t\t});\n\t} catch (error: unknown) {\n\t\treturn {\n\t\t\tstderr: error instanceof Error ? error.message : \"Command failed\",\n\t\t\texitCode: 1,\n\t\t};\n\t}\n}\n\nexport async function runCommand(\n\trawInput: string,\n\tauthUser: string,\n\thostname: string,\n\tmode: CommandMode,\n\tcwd: string,\n\tshell: VirtualShell,\n\tstdin?: string,\n\tenv?: ShellEnv,\n): Promise<CommandResult> {\n\tconst trimmed = rawInput.trim();\n\tif (trimmed.length === 0) return { exitCode: 0 };\n\n\tconst shellEnv: ShellEnv = env ?? makeDefaultEnv(authUser, hostname);\n\n\tconst rawTokens = tokenizeCommand(trimmed);\n\tconst rawFirstWord = rawTokens[0]?.toLowerCase() ?? \"\";\n\tconst aliasVal = shellEnv.vars[`__alias_${rawFirstWord}`];\n\tconst aliasExpanded = aliasVal\n\t\t? trimmed.replace(rawFirstWord, aliasVal)\n\t\t: trimmed;\n\n\tconst hasOperators =\n\t\t/(?<![|&])[|](?![|])/.test(aliasExpanded) ||\n\t\taliasExpanded.includes(\">\") ||\n\t\taliasExpanded.includes(\"<\") ||\n\t\taliasExpanded.includes(\"&&\") ||\n\t\taliasExpanded.includes(\"||\") ||\n\t\taliasExpanded.includes(\";\");\n\n\tif (hasOperators) {\n\t\tconst script = parseScript(aliasExpanded);\n\t\tif (!script.isValid)\n\t\t\treturn { stderr: script.error || \"Syntax error\", exitCode: 1 };\n\t\ttry {\n\t\t\treturn await executeStatements(\n\t\t\t\tscript.statements,\n\t\t\t\tauthUser,\n\t\t\t\thostname,\n\t\t\t\tmode,\n\t\t\t\tcwd,\n\t\t\t\tshell,\n\t\t\t\tshellEnv,\n\t\t\t);\n\t\t} catch (error: unknown) {\n\t\t\treturn {\n\t\t\t\tstderr: error instanceof Error ? error.message : \"Execution failed\",\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\t}\n\n\tconst expanded = await expandAsync(\n\t\taliasExpanded,\n\t\tshellEnv.vars,\n\t\tshellEnv.lastExitCode,\n\t\t(sub) =>\n\t\t\trunCommand(\n\t\t\t\tsub,\n\t\t\t\tauthUser,\n\t\t\t\thostname,\n\t\t\t\tmode,\n\t\t\t\tcwd,\n\t\t\t\tshell,\n\t\t\t\tundefined,\n\t\t\t\tshellEnv,\n\t\t\t).then((r) => r.stdout ?? \"\"),\n\t);\n\n\tconst parts = tokenizeCommand(expanded.trim());\n\tconst commandName = parts[0]?.toLowerCase() ?? \"\";\n\tconst args = parts.slice(1);\n\tconst mod = resolveModule(commandName);\n\n\tif (!mod) {\n\t\tconst vfsBinary = resolveVfsBinary(commandName, shellEnv, shell, authUser);\n\t\tif (vfsBinary) {\n\t\t\tconst stubContent = shell.vfs.readFile(vfsBinary);\n\t\t\tconst builtinMatch = stubContent.match(/exec\\s+builtin\\s+(\\S+)/);\n\t\t\tif (builtinMatch) {\n\t\t\t\tconst builtinName = builtinMatch[1]!;\n\t\t\t\tconst builtinMod = resolveModule(builtinName);\n\t\t\t\tif (builtinMod) {\n\t\t\t\t\treturn await builtinMod.run({\n\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\thostname,\n\t\t\t\t\t\tactiveSessions: shell.users.listActiveSessions(),\n\t\t\t\t\t\trawInput: [commandName, ...args].join(\" \"),\n\t\t\t\t\t\tmode,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\tstdin,\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tshell,\n\t\t\t\t\t\tenv: shellEnv,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst shMod = resolveModule(\"sh\");\n\t\t\tif (shMod) {\n\t\t\t\treturn await shMod.run({\n\t\t\t\t\tauthUser,\n\t\t\t\t\thostname,\n\t\t\t\t\tactiveSessions: shell.users.listActiveSessions(),\n\t\t\t\t\trawInput: `sh -c ${JSON.stringify(stubContent)}`,\n\t\t\t\t\tmode,\n\t\t\t\t\targs: [\"-c\", stubContent, \"--\", ...args],\n\t\t\t\t\tstdin,\n\t\t\t\t\tcwd,\n\t\t\t\t\tshell,\n\t\t\t\t\tenv: shellEnv,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn { stderr: `${commandName}: command not found`, exitCode: 127 };\n\t}\n\n\ttry {\n\t\treturn await mod.run({\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\tactiveSessions: shell.users.listActiveSessions(),\n\t\t\trawInput: expanded,\n\t\t\tmode,\n\t\t\targs,\n\t\t\tstdin,\n\t\t\tcwd,\n\t\t\tshell,\n\t\t\tenv: shellEnv,\n\t\t});\n\t} catch (error: unknown) {\n\t\treturn {\n\t\t\tstderr: error instanceof Error ? error.message : \"Command failed\",\n\t\t\texitCode: 1,\n\t\t};\n\t}\n}\n", "import type {\n CommandContext,\n CommandResult,\n ShellModule,\n} from \"../types/commands\";\nimport { expandAsync } from \"../utils/expand\";\nimport { ifFlag } from \"./command-helpers\";\nimport { resolvePath } from \"./helpers\";\nimport { runCommand } from \"./runtime\";\n\n/** Alias for clarity inside sh.ts */\ntype ShellContext = CommandContext;\n\n/**\n * Expand all shell forms including $(cmd) substitution.\n * Delegates to centralised expandAsync (single-quote-aware, depth-tracked).\n */\nasync function expandVars(\n\tline: string,\n\tenv: Record<string, string>,\n\tlastExit: number,\n\tctx: ShellContext,\n): Promise<string> {\n\treturn expandAsync(line, env, lastExit, (sub) =>\n\t\trunCommand(\n\t\t\tsub,\n\t\t\tctx.authUser,\n\t\t\tctx.hostname,\n\t\t\tctx.mode,\n\t\t\tctx.cwd,\n\t\t\tctx.shell,\n\t\t\tundefined,\n\t\t\tctx.env,\n\t\t).then((r) => r.stdout ?? \"\"),\n\t);\n}\n\ntype Block =\n\t| {\n\t\t\ttype: \"if\";\n\t\t\tcond: string;\n\t\t\tthen_: string[];\n\t\t\telif: Array<{ cond: string; body: string[] }>;\n\t\t\telse_: string[];\n\t }\n\t| { type: \"for\"; var: string; list: string; body: string[] }\n\t| { type: \"while\"; cond: string; body: string[] }\n\t| { type: \"cmd\"; line: string };\n\n/** Very small shell interpreter: supports if/elif/else/fi, for/do/done, while/do/done */\nfunction parseBlocks(lines: string[]): Block[] {\n\tconst blocks: Block[] = [];\n\tlet i = 0;\n\twhile (i < lines.length) {\n\t\tconst line = lines[i]!.trim();\n\t\tif (!line || line.startsWith(\"#\")) {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (line.startsWith(\"if \") || line === \"if\") {\n\t\t\tconst cond = line\n\t\t\t\t.replace(/^if\\s+/, \"\")\n\t\t\t\t.replace(/;\\s*then\\s*$/, \"\")\n\t\t\t\t.trim();\n\t\t\tconst thenLines: string[] = [];\n\t\t\tconst elifBlocks: Array<{ cond: string; body: string[] }> = [];\n\t\t\tconst elseLines: string[] = [];\n\t\t\tlet section: \"then\" | \"elif\" | \"else\" = \"then\";\n\t\t\tlet elifCond = \"\";\n\t\t\ti++;\n\t\t\twhile (i < lines.length && lines[i]?.trim() !== \"fi\") {\n\t\t\t\tconst l = lines[i]!.trim();\n\t\t\t\tif (l.startsWith(\"elif \")) {\n\t\t\t\t\tsection = \"elif\";\n\t\t\t\t\telifCond = l\n\t\t\t\t\t\t.replace(/^elif\\s+/, \"\")\n\t\t\t\t\t\t.replace(/;\\s*then\\s*$/, \"\")\n\t\t\t\t\t\t.trim();\n\t\t\t\t\telifBlocks.push({ cond: elifCond, body: [] });\n\t\t\t\t} else if (l === \"else\") {\n\t\t\t\t\tsection = \"else\";\n\t\t\t\t} else if (l !== \"then\") {\n\t\t\t\t\tif (section === \"then\") thenLines.push(l);\n\t\t\t\t\telse if (section === \"elif\" && elifBlocks.length > 0)\n\t\t\t\t\t\telifBlocks[elifBlocks.length - 1]!.body.push(l);\n\t\t\t\t\telse elseLines.push(l);\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tblocks.push({\n\t\t\t\ttype: \"if\",\n\t\t\t\tcond,\n\t\t\t\tthen_: thenLines,\n\t\t\t\telif: elifBlocks,\n\t\t\t\telse_: elseLines,\n\t\t\t});\n\t\t} else if (line.startsWith(\"for \")) {\n\t\t\tconst m = line.match(/^for\\s+(\\w+)\\s+in\\s+(.+?)(?:\\s*;\\s*do)?$/);\n\t\t\tif (m) {\n\t\t\t\tconst body: string[] = [];\n\t\t\t\ti++;\n\t\t\t\twhile (i < lines.length && lines[i]?.trim() !== \"done\") {\n\t\t\t\t\tconst l = lines[i]!.trim().replace(/^do\\s+/, \"\");\n\t\t\t\t\tif (l && l !== \"do\") body.push(l);\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tblocks.push({ type: \"for\", var: m[1]!, list: m[2]!, body });\n\t\t\t} else {\n\t\t\t\tblocks.push({ type: \"cmd\", line });\n\t\t\t}\n\t\t} else if (line.startsWith(\"while \")) {\n\t\t\tconst cond = line\n\t\t\t\t.replace(/^while\\s+/, \"\")\n\t\t\t\t.replace(/;\\s*do\\s*$/, \"\")\n\t\t\t\t.trim();\n\t\t\tconst body: string[] = [];\n\t\t\ti++;\n\t\t\twhile (i < lines.length && lines[i]?.trim() !== \"done\") {\n\t\t\t\tconst l = lines[i]!.trim().replace(/^do\\s+/, \"\");\n\t\t\t\tif (l && l !== \"do\") body.push(l);\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tblocks.push({ type: \"while\", cond, body });\n\t\t} else {\n\t\t\tblocks.push({ type: \"cmd\", line });\n\t\t}\n\t\ti++;\n\t}\n\treturn blocks;\n}\n\nasync function evalCondition(\n\tcond: string,\n\tctx: CommandContext,\n): Promise<boolean> {\n\tconst expanded = await expandVars(\n\t\tcond,\n\t\tctx.env.vars,\n\t\tctx.env.lastExitCode,\n\t\tctx,\n\t);\n\t// test -f / test -d / [ ... ]\n\tconst testMatch = expanded.match(/^\\[?\\s*(.+?)\\s*\\]?$/);\n\tif (testMatch) {\n\t\tconst expr = testMatch[1]!;\n\t\t// -f file\n\t\tconst fTest = expr.match(/^-([fdeznr])\\s+(.+)$/);\n\t\tif (fTest) {\n\t\t\tconst [, flag, arg] = fTest;\n\t\t\tconst p = resolvePath(ctx.cwd, arg!);\n\t\t\tif (flag === \"f\")\n\t\t\t\treturn ctx.shell.vfs.exists(p) && ctx.shell.vfs.stat(p).type === \"file\";\n\t\t\tif (flag === \"d\")\n\t\t\t\treturn (\n\t\t\t\t\tctx.shell.vfs.exists(p) && ctx.shell.vfs.stat(p).type === \"directory\"\n\t\t\t\t);\n\t\t\tif (flag === \"e\") return ctx.shell.vfs.exists(p);\n\t\t\tif (flag === \"z\") return (arg ?? \"\").length === 0;\n\t\t\tif (flag === \"n\") return (arg ?? \"\").length > 0;\n\t\t}\n\t\t// string comparison\n\t\tconst cmpMatch = expr.match(/^\"?([^\"]*)\"?\\s*(==|!=|=|<|>)\\s*\"?([^\"]*)\"?$/);\n\t\tif (cmpMatch) {\n\t\t\tconst [, a, op, b] = cmpMatch;\n\t\t\tif (op === \"==\" || op === \"=\") return a === b;\n\t\t\tif (op === \"!=\") return a !== b;\n\t\t}\n\t\t// numeric\n\t\tconst numMatch = expr.match(/^(\\S+)\\s+(-eq|-ne|-lt|-le|-gt|-ge)\\s+(\\S+)$/);\n\t\tif (numMatch) {\n\t\t\tconst [, a, op, b] = numMatch;\n\t\t\tconst na = Number(a),\n\t\t\t\tnb = Number(b);\n\t\t\tif (op === \"-eq\") return na === nb;\n\t\t\tif (op === \"-ne\") return na !== nb;\n\t\t\tif (op === \"-lt\") return na < nb;\n\t\t\tif (op === \"-le\") return na <= nb;\n\t\t\tif (op === \"-gt\") return na > nb;\n\t\t\tif (op === \"-ge\") return na >= nb;\n\t\t}\n\t}\n\t// fallback: run command and check exit code\n\tconst r = await runCommand(\n\t\texpanded,\n\t\tctx.authUser,\n\t\tctx.hostname,\n\t\tctx.mode,\n\t\tctx.cwd,\n\t\tctx.shell,\n\t\tundefined,\n\t\tctx.env,\n\t);\n\treturn (r.exitCode ?? 0) === 0;\n}\n\nasync function runBlocks(\n\tblocks: Block[],\n\tctx: CommandContext,\n): Promise<CommandResult> {\n\tlet lastResult: CommandResult = { exitCode: 0 };\n\tlet output = \"\";\n\n\tfor (const block of blocks) {\n\t\tif (block.type === \"cmd\") {\n\t\t\tconst expanded = await expandVars(\n\t\t\t\tblock.line,\n\t\t\t\tctx.env.vars,\n\t\t\t\tctx.env.lastExitCode,\n\t\t\t\tctx,\n\t\t\t);\n\n\t\t\t// Bare VAR=val assignment(s) \u2014 handle before dispatching to runCommand\n\t\t\tconst assignRe = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)/;\n\t\t\tconst tokens = expanded.trim().split(/\\s+/);\n\t\t\tif (tokens.length > 0 && assignRe.test(tokens[0]!)) {\n\t\t\t\tconst allAssign = tokens.every((t) => assignRe.test(t));\n\t\t\t\tif (allAssign) {\n\t\t\t\t\tfor (const tok of tokens) {\n\t\t\t\t\t\tconst m = tok.match(assignRe)!;\n\t\t\t\t\t\tctx.env.vars[m[1]!] = m[2]!;\n\t\t\t\t\t}\n\t\t\t\t\tctx.env.lastExitCode = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst r = await runCommand(\n\t\t\t\texpanded,\n\t\t\t\tctx.authUser,\n\t\t\t\tctx.hostname,\n\t\t\t\tctx.mode,\n\t\t\t\tctx.cwd,\n\t\t\t\tctx.shell,\n\t\t\t\tundefined,\n\t\t\t\tctx.env,\n\t\t\t);\n\t\t\tctx.env.lastExitCode = r.exitCode ?? 0;\n\t\t\tif (r.stdout) output += `${r.stdout}\\n`;\n\t\t\tif (r.stderr) return { ...r, stdout: output.trim() };\n\t\t\tlastResult = r;\n\t\t} else if (block.type === \"if\") {\n\t\t\tlet ran = false;\n\t\t\tif (await evalCondition(block.cond, ctx)) {\n\t\t\t\tconst sub = await runBlocks(parseBlocks(block.then_), ctx);\n\t\t\t\tif (sub.stdout) output += `${sub.stdout}\\n`;\n\t\t\t\tran = true;\n\t\t\t} else {\n\t\t\t\tfor (const elif of block.elif) {\n\t\t\t\t\tif (await evalCondition(elif.cond, ctx)) {\n\t\t\t\t\t\tconst sub = await runBlocks(parseBlocks(elif.body), ctx);\n\t\t\t\t\t\tif (sub.stdout) output += `${sub.stdout}\\n`;\n\t\t\t\t\t\tran = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!ran && block.else_.length > 0) {\n\t\t\t\t\tconst sub = await runBlocks(parseBlocks(block.else_), ctx);\n\t\t\t\t\tif (sub.stdout) output += `${sub.stdout}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (block.type === \"for\") {\n\t\t\tconst listExpanded = await expandVars(\n\t\t\t\tblock.list,\n\t\t\t\tctx.env.vars,\n\t\t\t\tctx.env.lastExitCode,\n\t\t\t\tctx,\n\t\t\t);\n\t\t\tconst items = listExpanded.trim().split(/\\s+/);\n\t\t\tfor (const item of items) {\n\t\t\t\tctx.env.vars[block.var] = item;\n\t\t\t\tconst sub = await runBlocks(parseBlocks(block.body), ctx);\n\t\t\t\tif (sub.stdout) output += `${sub.stdout}\\n`;\n\t\t\t\tif (sub.closeSession) return sub;\n\t\t\t}\n\t\t} else if (block.type === \"while\") {\n\t\t\tlet iterations = 0;\n\t\t\twhile (iterations < 1000 && (await evalCondition(block.cond, ctx))) {\n\t\t\t\tconst sub = await runBlocks(parseBlocks(block.body), ctx);\n\t\t\t\tif (sub.stdout) output += `${sub.stdout}\\n`;\n\t\t\t\tif (sub.closeSession) return sub;\n\t\t\t\titerations++;\n\t\t\t}\n\t\t}\n\t}\n\treturn { ...lastResult, stdout: output.trim() || lastResult.stdout };\n}\n\nexport const shCommand: ShellModule = {\n\tname: \"sh\",\n\taliases: [\"bash\"],\n\tdescription: \"Execute shell script or command\",\n\tcategory: \"shell\",\n\tparams: [\"-c <script>\", \"[<file>]\"],\n\trun: async (ctx: CommandContext) => {\n\t\tconst { args, shell, cwd } = ctx;\n\n\t\t// sh -c \"inline script\"\n\t\tif (ifFlag(args, \"-c\")) {\n\t\t\tconst script = args[args.indexOf(\"-c\") + 1] ?? \"\";\n\t\t\tif (!script) return { stderr: \"sh: -c requires a script\", exitCode: 1 };\n\t\t\tconst lines = script\n\t\t\t\t.split(/[;\\n]/)\n\t\t\t\t.map((l) => l.trim())\n\t\t\t\t.filter((l) => l && !l.startsWith(\"#\"));\n\t\t\tconst blocks = parseBlocks(lines);\n\t\t\treturn runBlocks(blocks, ctx);\n\t\t}\n\n\t\t// sh <file>\n\t\tconst fileArg = args[0];\n\t\tif (fileArg) {\n\t\t\tconst p = resolvePath(cwd, fileArg);\n\t\t\tif (!shell.vfs.exists(p))\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `sh: ${fileArg}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\tconst content = shell.vfs.readFile(p);\n\t\t\tconst lines = content\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.map((l) => l.trim())\n\t\t\t\t.filter((l) => l && !l.startsWith(\"#\"));\n\t\t\tconst blocks = parseBlocks(lines);\n\t\t\treturn runBlocks(blocks, ctx);\n\t\t}\n\n\t\treturn {\n\t\t\tstderr: \"sh: invalid usage. Use: sh -c 'cmd' or sh <file>\",\n\t\t\texitCode: 1,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const shiftCommand: ShellModule = {\n\tname: \"shift\",\n\tdescription: \"Shift positional parameters\",\n\tcategory: \"shell\",\n\tparams: [\"[n]\"],\n\t// shift is meaningful only inside sh scripts where positional params exist.\n\t// In the current impl, positional params ($1 $2 \u2026) aren't tracked in env by default.\n\t// We store them under env.vars.__argv and shift there if present.\n\trun: ({ args, env }) => {\n\t\tif (!env) return { exitCode: 0 };\n\t\tconst n = parseInt(args[0] ?? \"1\", 10) || 1;\n\t\tconst argv = env.vars.__argv?.split(\"\\x00\").filter(Boolean) ?? [];\n\t\tenv.vars.__argv = argv.slice(n).join(\"\\x00\");\n\t\t// Update $1 $2 \u2026 in env\n\t\tconst shifted = argv.slice(n);\n\t\tfor (let i = 1; i <= 9; i++) {\n\t\t\tenv.vars[String(i)] = shifted[i - 1] ?? \"\";\n\t\t}\n\t\treturn { exitCode: 0 };\n\t},\n};\n\nexport const trapCommand: ShellModule = {\n\tname: \"trap\",\n\tdescription: \"Trap signals and events\",\n\tcategory: \"shell\",\n\tparams: [\"[action] [signal...]\"],\n\t// Store trap handlers in env for EXIT signal support\n\trun: ({ args, env }) => {\n\t\tif (!env || args.length === 0) return { exitCode: 0 };\n\t\tconst action = args[0] ?? \"\";\n\t\tconst signals = args.slice(1);\n\t\tfor (const sig of signals) {\n\t\t\tenv.vars[`__trap_${sig.toUpperCase()}`] = action;\n\t\t}\n\t\treturn { exitCode: 0 };\n\t},\n};\n\nexport const returnCommand: ShellModule = {\n\tname: \"return\",\n\tdescription: \"Return from a shell function\",\n\tcategory: \"shell\",\n\tparams: [\"[n]\"],\n\trun: ({ args, env }) => {\n\t\tconst code = parseInt(args[0] ?? \"0\", 10);\n\t\tif (env) env.lastExitCode = code;\n\t\t// Signal the caller via exitCode; function return is handled by runBlocks\n\t\treturn { exitCode: code };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const sleepCommand: ShellModule = {\n\tname: \"sleep\",\n\tdescription: \"Delay execution\",\n\tcategory: \"system\",\n\tparams: [\"<seconds>\"],\n\trun: async ({ args }) => {\n\t\tconst secs = parseFloat(args[0] ?? \"1\");\n\t\tif (Number.isNaN(secs) || secs < 0)\n\t\t\treturn { stderr: \"sleep: invalid time\", exitCode: 1 };\n\t\tawait new Promise((r) => setTimeout(r, secs * 1000));\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const sortCommand: ShellModule = {\n\tname: \"sort\",\n\tdescription: \"Sort lines of text\",\n\tcategory: \"text\",\n\tparams: [\"[-r] [-n] [-u] [-k <col>] [file...]\"],\n\trun: ({ authUser, shell, cwd, args, stdin }) => {\n\t\tconst reverse = ifFlag(args, [\"-r\"]);\n\t\tconst numeric = ifFlag(args, [\"-n\"]);\n\t\tconst unique = ifFlag(args, [\"-u\"]);\n\t\tconst files = args.filter((a) => !a.startsWith(\"-\"));\n\n\t\tconst getContent = (): string => {\n\t\t\tif (files.length > 0) {\n\t\t\t\treturn files\n\t\t\t\t\t.map((f) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tassertPathAccess(authUser, resolvePath(cwd, f), \"sort\");\n\t\t\t\t\t\t\treturn shell.vfs.readFile(resolvePath(cwd, f));\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t}\n\t\t\treturn stdin ?? \"\";\n\t\t};\n\n\t\tconst lines = getContent().split(\"\\n\").filter(Boolean);\n\t\tconst sorted = [...lines].sort((a, b) => {\n\t\t\tif (numeric) return Number(a) - Number(b);\n\t\t\treturn a.localeCompare(b);\n\t\t});\n\t\tconst result = reverse ? sorted.reverse() : sorted;\n\t\tconst out = unique ? [...new Set(result)] : result;\n\t\treturn { stdout: out.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { resolvePath } from \"./helpers\";\nimport { runCommand } from \"./runtime\";\n\nexport const sourceCommand: ShellModule = {\n\tname: \"source\",\n\taliases: [\".\"],\n\tdescription: \"Execute commands from a file in the current shell environment\",\n\tcategory: \"shell\",\n\tparams: [\"<file> [args...]\"],\n\trun: async ({ args, authUser, hostname, cwd, shell, env }) => {\n\t\tconst fileArg = args[0];\n\t\tif (!fileArg) {\n\t\t\treturn { stderr: \"source: missing filename\", exitCode: 1 };\n\t\t}\n\n\t\tconst filePath = resolvePath(cwd, fileArg);\n\t\tif (!shell.vfs.exists(filePath)) {\n\t\t\treturn {\n\t\t\t\tstderr: `source: ${fileArg}: No such file or directory`,\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\n\t\tconst content = shell.vfs.readFile(filePath);\n\t\tlet lastExitCode = 0;\n\n\t\tfor (const line of content.split(\"\\n\")) {\n\t\t\tconst l = line.trim();\n\t\t\tif (!l || l.startsWith(\"#\")) continue;\n\t\t\tconst result = await runCommand(\n\t\t\t\tl,\n\t\t\t\tauthUser,\n\t\t\t\thostname,\n\t\t\t\t\"shell\",\n\t\t\t\tcwd,\n\t\t\t\tshell,\n\t\t\t\tundefined,\n\t\t\t\tenv,\n\t\t\t);\n\t\t\tlastExitCode = result.exitCode ?? 0;\n\t\t\tif (result.closeSession || result.switchUser) return result;\n\t\t}\n\n\t\treturn { exitCode: lastExitCode };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg } from \"./command-helpers\";\n\nexport const suCommand: ShellModule = {\n\tname: \"su\",\n\tdescription: \"Switch user\",\n\tcategory: \"users\",\n\tparams: [\"- <username>\"],\n\trun: ({ authUser, shell, args }) => {\n\t\tconst users = shell.users!;\n\t\tconst targetUser = getArg(args, 0, { flags: [\"-\"] });\n\n\t\tif (!targetUser) {\n\t\t\treturn { stderr: \"su: missing username\", exitCode: 1 };\n\t\t}\n\n\t\tif (!users.isSudoer(authUser) && authUser !== \"root\") {\n\t\t\treturn { stderr: \"su: permission denied\", exitCode: 1 };\n\t\t}\n\n\t\tif (\n\t\t\t!users.verifyPassword(targetUser, getArg(args, 1) ?? \"\") &&\n\t\t\tauthUser !== \"root\"\n\t\t) {\n\t\t\treturn { stderr: \"su: authentication failure\", exitCode: 1 };\n\t\t}\n\n\t\treturn {\n\t\t\tswitchUser: targetUser,\n\t\t\tnextCwd: `/home/${targetUser}`,\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { parseArgs } from \"./command-helpers\";\nimport { runCommand } from \"./runtime\";\n\nfunction parseSudoArgs(args: string[]): {\n\ttargetUser: string;\n\tloginShell: boolean;\n\tcommandLine: string | null;\n} {\n\tconst { flags, flagsWithValues, positionals } = parseArgs(args, {\n\t\tflags: [\"-i\", \"-S\"],\n\t\tflagsWithValue: [\"-u\", \"--user\"],\n\t});\n\n\tconst loginShell = flags.has(\"-i\");\n\tconst targetUser =\n\t\tflagsWithValues.get(\"-u\") || flagsWithValues.get(\"--user\") || \"root\";\n\tconst commandLine = positionals.length > 0 ? positionals.join(\" \") : null;\n\n\treturn { targetUser, loginShell, commandLine };\n}\nexport const sudoCommand: ShellModule = {\n\tname: \"sudo\",\n\tdescription: \"Execute as superuser\",\n\tcategory: \"users\",\n\tparams: [\"<command...>\"],\n\trun: async ({ authUser, hostname, mode, cwd, shell, args }) => {\n\t\tconst { targetUser, loginShell, commandLine } = parseSudoArgs(args);\n\n\t\tif (authUser !== \"root\" && !shell.users.isSudoer(authUser)) {\n\t\t\treturn { stderr: \"sudo: permission denied\", exitCode: 1 };\n\t\t}\n\n\t\tconst effectiveUser = targetUser || \"root\";\n\t\tconst prompt = `[sudo] password for ${authUser}: `;\n\n\t\tif (authUser === \"root\") {\n\t\t\tif (!commandLine && loginShell) {\n\t\t\t\treturn {\n\t\t\t\t\tswitchUser: effectiveUser,\n\t\t\t\t\tnextCwd: `/home/${effectiveUser}`,\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!commandLine) {\n\t\t\t\treturn { stderr: \"sudo: missing command\", exitCode: 1 };\n\t\t\t}\n\n\t\t\treturn runCommand(\n\t\t\t\tcommandLine,\n\t\t\t\teffectiveUser,\n\t\t\t\thostname,\n\t\t\t\tmode,\n\t\t\t\tloginShell ? `/home/${effectiveUser}` : cwd,\n\t\t\t\tshell,\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tsudoChallenge: {\n\t\t\t\tusername: authUser,\n\t\t\t\ttargetUser: effectiveUser,\n\t\t\t\tcommandLine,\n\t\t\t\tloginShell,\n\t\t\t\tprompt,\n\t\t\t},\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getFlag } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const tailCommand: ShellModule = {\n\tname: \"tail\",\n\tdescription: \"Output last lines\",\n\tcategory: \"text\",\n\tparams: [\"[-n <lines>] [file...]\"],\n\trun: ({ authUser, shell, cwd, args, stdin }) => {\n\t\tconst nArg = getFlag(args, [\"-n\"]);\n\t\tconst n = typeof nArg === \"string\" ? parseInt(nArg, 10) : 10;\n\t\tconst positionals = args.filter((a) => !a.startsWith(\"-\") && a !== nArg);\n\n\t\tconst take = (content: string) => {\n\t\t\tconst lines = content.split(\"\\n\");\n\t\t\treturn lines.slice(Math.max(0, lines.length - n)).join(\"\\n\");\n\t\t};\n\n\t\tif (positionals.length === 0) {\n\t\t\treturn { stdout: take(stdin ?? \"\"), exitCode: 0 };\n\t\t}\n\n\t\tconst results: string[] = [];\n\t\tfor (const file of positionals) {\n\t\t\tconst filePath = resolvePath(cwd, file);\n\t\t\ttry {\n\t\t\t\tassertPathAccess(authUser, filePath, \"tail\");\n\t\t\t\tresults.push(take(shell.vfs.readFile(filePath)));\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `tail: ${file}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn { stdout: results.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { resolvePath } from \"./helpers\";\n\nexport const tarCommand: ShellModule = {\n\tname: \"tar\",\n\tdescription: \"Archive utility\",\n\tcategory: \"archive\",\n\tparams: [\"[-czf|-xzf|-tf] <archive> [files...]\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst create = ifFlag(args, [\"-c\"]);\n\t\tconst extract = ifFlag(args, [\"-x\"]);\n\t\tconst list = ifFlag(args, [\"-t\"]);\n\t\tconst fFlag = args.findIndex((a) => a.includes(\"f\"));\n\t\tconst archiveName =\n\t\t\tfFlag !== -1\n\t\t\t\t? args[fFlag + 1]\n\t\t\t\t: args.find(\n\t\t\t\t\t\t(a) =>\n\t\t\t\t\t\t\ta.endsWith(\".tar\") || a.endsWith(\".tar.gz\") || a.endsWith(\".tgz\"),\n\t\t\t\t\t);\n\n\t\tif (!archiveName)\n\t\t\treturn { stderr: \"tar: no archive specified\", exitCode: 1 };\n\t\tconst archivePath = resolvePath(cwd, archiveName);\n\n\t\tif (create) {\n\t\t\tconst fileArgs = args.filter(\n\t\t\t\t(a) => !a.startsWith(\"-\") && a !== archiveName,\n\t\t\t);\n\t\t\tconst entries: Record<string, string> = {};\n\t\t\tfor (const f of fileArgs) {\n\t\t\t\tconst p = resolvePath(cwd, f);\n\t\t\t\ttry {\n\t\t\t\t\tconst stat = shell.vfs.stat(p);\n\t\t\t\t\tif (stat.type === \"file\") entries[f] = shell.vfs.readFile(p);\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst walk = (dir: string, prefix: string) => {\n\t\t\t\t\t\t\tfor (const e of shell.vfs.list(dir)) {\n\t\t\t\t\t\t\t\tconst full = `${dir}/${e}`,\n\t\t\t\t\t\t\t\t\trel = `${prefix}/${e}`;\n\t\t\t\t\t\t\t\tconst s = shell.vfs.stat(full);\n\t\t\t\t\t\t\t\tif (s.type === \"file\") entries[rel] = shell.vfs.readFile(full);\n\t\t\t\t\t\t\t\telse walk(full, rel);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\twalk(p, f);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstderr: `tar: ${f}: No such file or directory`,\n\t\t\t\t\t\texitCode: 1,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tshell.writeFileAsUser(authUser, archivePath, JSON.stringify(entries));\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\tif (list || extract) {\n\t\t\tlet entries: Record<string, string>;\n\t\t\ttry {\n\t\t\t\tentries = JSON.parse(shell.vfs.readFile(archivePath));\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `tar: ${archiveName}: cannot open archive`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (list) return { stdout: Object.keys(entries).join(\"\\n\"), exitCode: 0 };\n\t\t\tfor (const [name, content] of Object.entries(entries)) {\n\t\t\t\tshell.writeFileAsUser(authUser, resolvePath(cwd, name), content);\n\t\t\t}\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\treturn { stderr: \"tar: must specify -c, -x, or -t\", exitCode: 1 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { resolvePath } from \"./helpers\";\n\nexport const teeCommand: ShellModule = {\n\tname: \"tee\",\n\tdescription: \"Read stdin, write to stdout and files\",\n\tcategory: \"text\",\n\tparams: [\"[-a] <file...>\"],\n\trun: ({ authUser, shell, cwd, args, stdin }) => {\n\t\tconst append = ifFlag(args, [\"-a\"]);\n\t\tconst files = args.filter((a) => !a.startsWith(\"-\"));\n\t\tconst input = stdin ?? \"\";\n\t\tfor (const f of files) {\n\t\t\tconst p = resolvePath(cwd, f);\n\t\t\tif (append) {\n\t\t\t\tconst existing = (() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn shell.vfs.readFile(p);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t\tshell.writeFileAsUser(authUser, p, existing + input);\n\t\t\t} else {\n\t\t\t\tshell.writeFileAsUser(authUser, p, input);\n\t\t\t}\n\t\t}\n\t\treturn { stdout: input, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\n/**\n * Evaluate a POSIX test expression.\n * Supports: -f, -d, -e, -r, -w, -x, -s, -z, -n,\n * string =, !=, numeric -eq -ne -lt -le -gt -ge,\n * ! (negate), -a (and), -o (or).\n */\nfunction evalTest(\n\ttokens: string[],\n\tshell: import(\"../VirtualShell\").VirtualShell,\n\tcwd: string,\n): boolean {\n\t// When called via [ command, ] is the last arg \u2014 strip it\n\t// When called via test command, no brackets present\n\tif (tokens[tokens.length - 1] === \"]\") {\n\t\ttokens = tokens.slice(0, -1);\n\t}\n\t// Also strip leading [ if present (shouldn't normally happen but be safe)\n\tif (tokens[0] === \"[\") {\n\t\ttokens = tokens.slice(1);\n\t}\n\n\tif (tokens.length === 0) return false;\n\n\t// Negation\n\tif (tokens[0] === \"!\") return !evalTest(tokens.slice(1), shell, cwd);\n\n\t// Boolean -a / -o (simple left-right, no precedence)\n\tconst andIdx = tokens.indexOf(\"-a\");\n\tif (andIdx !== -1) {\n\t\treturn (\n\t\t\tevalTest(tokens.slice(0, andIdx), shell, cwd) &&\n\t\t\tevalTest(tokens.slice(andIdx + 1), shell, cwd)\n\t\t);\n\t}\n\tconst orIdx = tokens.indexOf(\"-o\");\n\tif (orIdx !== -1) {\n\t\treturn (\n\t\t\tevalTest(tokens.slice(0, orIdx), shell, cwd) ||\n\t\t\tevalTest(tokens.slice(orIdx + 1), shell, cwd)\n\t\t);\n\t}\n\n\t// Unary file tests\n\tif (tokens.length === 2) {\n\t\tconst [flag, operand = \"\"] = tokens;\n\t\tconst resolvePath = (p: string) =>\n\t\t\tp.startsWith(\"/\") ? p : `${cwd}/${p}`.replace(/\\/+/g, \"/\");\n\t\tconst path = resolvePath(operand);\n\n\t\tswitch (flag) {\n\t\t\tcase \"-e\":\n\t\t\t\treturn shell.vfs.exists(path);\n\t\t\tcase \"-f\":\n\t\t\t\treturn shell.vfs.exists(path) && shell.vfs.stat(path).type === \"file\";\n\t\t\tcase \"-d\":\n\t\t\t\treturn (\n\t\t\t\t\tshell.vfs.exists(path) && shell.vfs.stat(path).type === \"directory\"\n\t\t\t\t);\n\t\t\tcase \"-r\":\n\t\t\t\treturn shell.vfs.exists(path); // all readable in virtual env\n\t\t\tcase \"-w\":\n\t\t\t\treturn shell.vfs.exists(path);\n\t\t\tcase \"-x\":\n\t\t\t\treturn shell.vfs.exists(path) && !!(shell.vfs.stat(path).mode & 0o111);\n\t\t\tcase \"-s\":\n\t\t\t\treturn (\n\t\t\t\t\tshell.vfs.exists(path) &&\n\t\t\t\t\tshell.vfs.stat(path).type === \"file\" &&\n\t\t\t\t\t(shell.vfs.stat(path) as import(\"../types/vfs\").VfsFileNode).size > 0\n\t\t\t\t);\n\t\t\tcase \"-z\":\n\t\t\t\treturn operand.length === 0;\n\t\t\tcase \"-n\":\n\t\t\t\treturn operand.length > 0;\n\t\t\tcase \"-L\":\n\t\t\t\treturn shell.vfs.isSymlink(path);\n\t\t}\n\t}\n\n\t// Binary comparisons\n\tif (tokens.length === 3) {\n\t\tconst [left = \"\", op, right = \"\"] = tokens;\n\t\tconst leftN = Number(left);\n\t\tconst rightN = Number(right);\n\n\t\tswitch (op) {\n\t\t\t// String\n\t\t\tcase \"=\":\n\t\t\tcase \"==\":\n\t\t\t\treturn left === right;\n\t\t\tcase \"!=\":\n\t\t\t\treturn left !== right;\n\t\t\tcase \"<\":\n\t\t\t\treturn left < right;\n\t\t\tcase \">\":\n\t\t\t\treturn left > right;\n\t\t\t// Numeric\n\t\t\tcase \"-eq\":\n\t\t\t\treturn leftN === rightN;\n\t\t\tcase \"-ne\":\n\t\t\t\treturn leftN !== rightN;\n\t\t\tcase \"-lt\":\n\t\t\t\treturn leftN < rightN;\n\t\t\tcase \"-le\":\n\t\t\t\treturn leftN <= rightN;\n\t\t\tcase \"-gt\":\n\t\t\t\treturn leftN > rightN;\n\t\t\tcase \"-ge\":\n\t\t\t\treturn leftN >= rightN;\n\t\t}\n\t}\n\n\t// Single string (truthy if non-empty)\n\tif (tokens.length === 1) return (tokens[0] ?? \"\").length > 0;\n\n\treturn false;\n}\n\nexport const testCommand: ShellModule = {\n\tname: \"test\",\n\taliases: [\"[\"],\n\tdescription: \"Evaluate conditional expression\",\n\tcategory: \"shell\",\n\tparams: [\"<expression>\"],\n\trun: ({ args, shell, cwd }) => {\n\t\ttry {\n\t\t\tconst result = evalTest([...args], shell, cwd);\n\t\t\treturn { exitCode: result ? 0 : 1 };\n\t\t} catch {\n\t\t\treturn { stderr: \"test: malformed expression\", exitCode: 2 };\n\t\t}\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const touchCommand: ShellModule = {\n\tname: \"touch\",\n\tdescription: \"Create or update files\",\n\tcategory: \"files\",\n\tparams: [\"<file>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tif (args.length === 0) {\n\t\t\treturn { stderr: \"touch: missing file operand\", exitCode: 1 };\n\t\t}\n\n\t\tfor (const file of args) {\n\t\t\tconst target = resolvePath(cwd, file);\n\t\t\tassertPathAccess(authUser, target, \"touch\");\n\t\t\tif (!shell.vfs.exists(target)) {\n\t\t\t\tshell.writeFileAsUser(authUser, target, \"\");\n\t\t\t}\n\t\t}\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n\nexport const trCommand: ShellModule = {\n\tname: \"tr\",\n\tdescription: \"Translate or delete characters\",\n\tcategory: \"text\",\n\tparams: [\"[-d] <set1> [set2]\"],\n\trun: ({ args, stdin }) => {\n\t\tconst del = ifFlag(args, [\"-d\"]);\n\t\tconst positionals = args.filter((a) => !a.startsWith(\"-\"));\n\t\tconst set1 = positionals[0] ?? \"\";\n\t\tconst set2 = positionals[1] ?? \"\";\n\t\tlet input = stdin ?? \"\";\n\t\tif (del) {\n\t\t\tfor (const c of set1) input = input.split(c).join(\"\");\n\t\t} else if (set2) {\n\t\t\tfor (let i = 0; i < set1.length; i++) {\n\t\t\t\tinput = input\n\t\t\t\t\t.split(set1[i]!)\n\t\t\t\t\t.join(set2[i] ?? set2[set2.length - 1] ?? \"\");\n\t\t\t}\n\t\t}\n\t\treturn { stdout: input, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const treeCommand: ShellModule = {\n\tname: \"tree\",\n\tdescription: \"Display directory tree\",\n\tcategory: \"navigation\",\n\tparams: [\"[path]\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst target = resolvePath(cwd, getArg(args, 0) ?? cwd);\n\t\tassertPathAccess(authUser, target, \"tree\");\n\t\treturn { stdout: shell.vfs.tree(target), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const trueCommand: ShellModule = {\n\tname: \"true\",\n\tdescription: \"Return success exit code\",\n\tcategory: \"shell\",\n\tparams: [],\n\trun: () => ({ exitCode: 0 }),\n};\n\nexport const falseCommand: ShellModule = {\n\tname: \"false\",\n\tdescription: \"Return failure exit code\",\n\tcategory: \"shell\",\n\tparams: [],\n\trun: () => ({ exitCode: 1 }),\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { resolveModule } from \"./registry\";\n\nexport const typeCommand: ShellModule = {\n\tname: \"type\",\n\tdescription: \"Describe how a command would be interpreted\",\n\tcategory: \"shell\",\n\tparams: [\"<command...>\"],\n\trun: ({ args, shell, env }) => {\n\t\tif (args.length === 0)\n\t\t\treturn { stderr: \"type: missing argument\", exitCode: 1 };\n\n\t\tconst pathDirs = (env?.vars?.PATH ?? \"/usr/local/bin:/usr/bin:/bin\").split(\n\t\t\t\":\",\n\t\t);\n\t\tconst lines: string[] = [];\n\t\tlet exitCode = 0;\n\n\t\tfor (const name of args) {\n\t\t\tif (resolveModule(name)) {\n\t\t\t\tlines.push(`${name} is a shell builtin`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet found = false;\n\t\t\tfor (const dir of pathDirs) {\n\t\t\t\tconst full = `${dir}/${name}`;\n\t\t\t\tif (shell.vfs.exists(full)) {\n\t\t\t\t\tlines.push(`${name} is ${full}`);\n\t\t\t\t\tfound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!found) {\n\t\t\t\tlines.push(`${name}: not found`);\n\t\t\t\texitCode = 1;\n\t\t\t}\n\t\t}\n\n\t\treturn { stdout: lines.join(\"\\n\"), exitCode };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n\nexport const unameCommand: ShellModule = {\n\tname: \"uname\",\n\tdescription: \"Print system information\",\n\tcategory: \"system\",\n\tparams: [\"[-a] [-s] [-r] [-m]\"],\n\trun: ({ shell, args }) => {\n\t\tconst all = ifFlag(args, [\"-a\"]);\n\t\tconst sysname = \"Linux\";\n\t\tconst release = shell.properties?.kernel ?? \"5.15.0\";\n\t\tconst machine = shell.properties?.arch ?? \"x86_64\";\n\t\tconst hostname = shell.hostname;\n\t\tif (all)\n\t\t\treturn {\n\t\t\t\tstdout: `${sysname} ${hostname} ${release} #1 SMP ${machine} GNU/Linux`,\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\tif (ifFlag(args, [\"-r\"])) return { stdout: release, exitCode: 0 };\n\t\tif (ifFlag(args, [\"-m\"])) return { stdout: machine, exitCode: 0 };\n\t\treturn { stdout: sysname, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n\nexport const uniqCommand: ShellModule = {\n\tname: \"uniq\",\n\tdescription: \"Report or filter out repeated lines\",\n\tcategory: \"text\",\n\tparams: [\"[-c] [-d] [-u] [file]\"],\n\trun: ({ args, stdin }) => {\n\t\tconst count = ifFlag(args, [\"-c\"]);\n\t\tconst dupOnly = ifFlag(args, [\"-d\"]);\n\t\tconst uniqOnly = ifFlag(args, [\"-u\"]);\n\t\tconst lines = (stdin ?? \"\").split(\"\\n\");\n\t\tconst out: string[] = [];\n\t\tlet i = 0;\n\t\twhile (i < lines.length) {\n\t\t\tlet j = i;\n\t\t\twhile (j < lines.length && lines[j] === lines[i]) j++;\n\t\t\tconst n = j - i;\n\t\t\tconst line = lines[i]!;\n\t\t\tif (dupOnly && n === 1) {\n\t\t\t\ti = j;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (uniqOnly && n > 1) {\n\t\t\t\ti = j;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tout.push(count ? `${String(n).padStart(4)} ${line}` : line);\n\t\t\ti = j;\n\t\t}\n\t\treturn { stdout: out.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const unsetCommand: ShellModule = {\n\tname: \"unset\",\n\tdescription: \"Remove shell variable\",\n\tcategory: \"shell\",\n\tparams: [\"<VAR>\"],\n\trun: ({ args, env }) => {\n\t\tfor (const name of args) delete env.vars[name];\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\n\nexport const uptimeCommand: ShellModule = {\n\tname: \"uptime\",\n\tdescription: \"Tell how long the system has been running\",\n\tcategory: \"system\",\n\tparams: [\"[-p] [-s]\"],\n\trun: ({ args, shell }) => {\n\t\tconst pretty = ifFlag(args, [\"-p\"]);\n\t\tconst since = ifFlag(args, [\"-s\"]);\n\n\t\tconst uptimeSec = Math.floor((Date.now() - shell.startTime) / 1000);\n\t\tconst days = Math.floor(uptimeSec / 86400);\n\t\tconst hours = Math.floor((uptimeSec % 86400) / 3600);\n\t\tconst mins = Math.floor((uptimeSec % 3600) / 60);\n\n\t\tif (since) {\n\t\t\treturn {\n\t\t\t\tstdout: new Date(shell.startTime)\n\t\t\t\t\t.toISOString()\n\t\t\t\t\t.slice(0, 19)\n\t\t\t\t\t.replace(\"T\", \" \"),\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\tif (pretty) {\n\t\t\tconst parts: string[] = [];\n\t\t\tif (days > 0) parts.push(`${days} day${days > 1 ? \"s\" : \"\"}`);\n\t\t\tif (hours > 0) parts.push(`${hours} hour${hours > 1 ? \"s\" : \"\"}`);\n\t\t\tparts.push(`${mins} minute${mins !== 1 ? \"s\" : \"\"}`);\n\t\t\treturn { stdout: `up ${parts.join(\", \")}`, exitCode: 0 };\n\t\t}\n\n\t\tconst timeStr = new Date().toTimeString().slice(0, 8);\n\t\tconst uptimeStr =\n\t\t\tdays > 0\n\t\t\t\t? `${days} day${days > 1 ? \"s\" : \"\"}, ${String(hours).padStart(2)}:${String(mins).padStart(2, \"0\")}`\n\t\t\t\t: `${String(hours).padStart(2)}:${String(mins).padStart(2, \"0\")}`;\n\t\tconst sessions = shell.users.listActiveSessions().length;\n\t\tconst load = (Math.random() * 0.5).toFixed(2);\n\n\t\treturn {\n\t\t\tstdout: ` ${timeStr} up ${uptimeStr}, ${sessions} user${sessions !== 1 ? \"s\" : \"\"}, load average: ${load}, ${load}, ${load}`,\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const wcCommand: ShellModule = {\n\tname: \"wc\",\n\tdescription: \"Count words/lines/bytes\",\n\tcategory: \"text\",\n\tparams: [\"[-l] [-w] [-c] [file...]\"],\n\trun: ({ authUser, shell, cwd, args, stdin }) => {\n\t\tconst lines = ifFlag(args, [\"-l\"]);\n\t\tconst words = ifFlag(args, [\"-w\"]);\n\t\tconst bytes = ifFlag(args, [\"-c\"]);\n\t\tconst showAll = !lines && !words && !bytes;\n\t\tconst positionals = args.filter((a) => !a.startsWith(\"-\"));\n\n\t\tconst count = (content: string, label: string): string => {\n\t\t\tconst l = content.split(\"\\n\").length - (content.endsWith(\"\\n\") ? 1 : 0);\n\t\t\tconst w = content.trim().split(/\\s+/).filter(Boolean).length;\n\t\t\tconst c = Buffer.byteLength(content, \"utf8\");\n\t\t\tconst parts: string[] = [];\n\t\t\tif (showAll || lines) parts.push(String(l).padStart(7));\n\t\t\tif (showAll || words) parts.push(String(w).padStart(7));\n\t\t\tif (showAll || bytes) parts.push(String(c).padStart(7));\n\t\t\tif (label) parts.push(` ${label}`);\n\t\t\treturn parts.join(\"\");\n\t\t};\n\n\t\tif (positionals.length === 0) {\n\t\t\tconst content = stdin ?? \"\";\n\t\t\treturn { stdout: count(content, \"\"), exitCode: 0 };\n\t\t}\n\n\t\tconst results: string[] = [];\n\t\tfor (const file of positionals) {\n\t\t\tconst filePath = resolvePath(cwd, file);\n\t\t\ttry {\n\t\t\t\tassertPathAccess(authUser, filePath, \"wc\");\n\t\t\t\tconst content = shell.vfs.readFile(filePath);\n\t\t\t\tresults.push(count(content, file));\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `wc: ${file}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn { stdout: results.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { ifFlag, parseArgs } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath, stripUrlFilename } from \"./helpers\";\n\nexport const wgetCommand: ShellModule = {\n\tname: \"wget\",\n\tdescription: \"File downloader (pure fetch)\",\n\tcategory: \"network\",\n\tparams: [\"[options] <url>\"],\n\trun: async ({ authUser, cwd, args, shell }) => {\n\t\tconst { flagsWithValues, positionals } = parseArgs(args, {\n\t\t\tflagsWithValue: [\n\t\t\t\t\"-O\",\n\t\t\t\t\"--output-document\",\n\t\t\t\t\"-o\",\n\t\t\t\t\"--output-file\",\n\t\t\t\t\"-P\",\n\t\t\t\t\"--directory-prefix\",\n\t\t\t\t\"--tries\",\n\t\t\t\t\"--timeout\",\n\t\t\t],\n\t\t});\n\n\t\tif (ifFlag(args, [\"-h\", \"--help\"])) {\n\t\t\treturn {\n\t\t\t\tstdout: [\n\t\t\t\t\t\"Usage: wget [option]... [URL]...\",\n\t\t\t\t\t\" -O, --output-document=FILE Write to FILE ('-' for stdout)\",\n\t\t\t\t\t\" -P, --directory-prefix=DIR Save files in DIR\",\n\t\t\t\t\t\" -q, --quiet Quiet mode\",\n\t\t\t\t\t\" -v, --verbose Verbose output (default)\",\n\t\t\t\t\t\" -c, --continue Continue partial download\",\n\t\t\t\t\t\" --tries=N Retry N times\",\n\t\t\t\t\t\" --timeout=N Timeout in seconds\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\tif (ifFlag(args, [\"-V\", \"--version\"])) {\n\t\t\treturn {\n\t\t\t\tstdout: \"GNU Wget 1.21.3 (virtual) built on Fortune GNU/Linux.\",\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst url = positionals[0];\n\t\tif (!url)\n\t\t\treturn {\n\t\t\t\tstderr: \"wget: missing URL\\nUsage: wget [OPTION]... [URL]...\",\n\t\t\t\texitCode: 1,\n\t\t\t};\n\n\t\tconst outputArg =\n\t\t\tflagsWithValues.get(\"-O\") ??\n\t\t\tflagsWithValues.get(\"--output-document\") ??\n\t\t\tnull;\n\t\tconst dirPrefix =\n\t\t\tflagsWithValues.get(\"-P\") ??\n\t\t\tflagsWithValues.get(\"--directory-prefix\") ??\n\t\t\tnull;\n\t\tconst quiet = ifFlag(args, [\"-q\", \"--quiet\"]);\n\n\t\t// Derive target filename\n\t\tconst filename =\n\t\t\toutputArg === \"-\" ? null : (outputArg ?? stripUrlFilename(url));\n\t\tconst targetPath = filename\n\t\t\t? resolvePath(cwd, dirPrefix ? `${dirPrefix}/${filename}` : filename)\n\t\t\t: null;\n\n\t\tif (targetPath) assertPathAccess(authUser, targetPath, \"wget\");\n\n\t\tconst stderrLines: string[] = [];\n\t\tif (!quiet) {\n\t\t\tstderrLines.push(`--${new Date().toISOString()}-- ${url}`);\n\t\t\tstderrLines.push(`Resolving ${new URL(url).host}...`);\n\t\t\tstderrLines.push(`Connecting to ${new URL(url).host}...`);\n\t\t}\n\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await fetch(url, {\n\t\t\t\theaders: { \"User-Agent\": \"Wget/1.21.3 (Fortune GNU/Linux)\" },\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\tstderrLines.push(`wget: unable to resolve host: ${msg}`);\n\t\t\treturn { stderr: stderrLines.join(\"\\n\"), exitCode: 4 };\n\t\t}\n\n\t\tif (!response.ok) {\n\t\t\tstderrLines.push(`ERROR ${response.status}: ${response.statusText}`);\n\t\t\treturn { stderr: stderrLines.join(\"\\n\"), exitCode: 8 };\n\t\t}\n\n\t\tlet body: string;\n\t\ttry {\n\t\t\tbody = await response.text();\n\t\t} catch {\n\t\t\treturn { stderr: \"wget: failed to read response\", exitCode: 1 };\n\t\t}\n\n\t\tif (!quiet) {\n\t\t\tconst ct =\n\t\t\t\tresponse.headers.get(\"content-type\") ?? \"application/octet-stream\";\n\t\t\tstderrLines.push(\n\t\t\t\t`HTTP request sent, awaiting response... ${response.status} ${response.statusText}`,\n\t\t\t);\n\t\t\tstderrLines.push(`Length: ${body.length} [${ct}]`);\n\t\t}\n\n\t\t// Output to stdout (pipe) or file\n\t\tif (outputArg === \"-\") {\n\t\t\treturn {\n\t\t\t\tstdout: body,\n\t\t\t\tstderr: stderrLines.join(\"\\n\") || undefined,\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\tif (targetPath) {\n\t\t\tshell.writeFileAsUser(authUser, targetPath, body);\n\t\t\tif (!quiet)\n\t\t\t\tstderrLines.push(\n\t\t\t\t\t`Saving to: '${targetPath}'\\n${targetPath} 100%[==================>] ${body.length} B`,\n\t\t\t\t);\n\t\t\treturn { stderr: stderrLines.join(\"\\n\") || undefined, exitCode: 0 };\n\t\t}\n\n\t\treturn { stdout: body, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const whichCommand: ShellModule = {\n\tname: \"which\",\n\tdescription: \"Locate a command in PATH\",\n\tcategory: \"shell\",\n\tparams: [\"<command...>\"],\n\trun: ({ args, shell, env }) => {\n\t\tif (args.length === 0)\n\t\t\treturn { stderr: \"which: missing argument\", exitCode: 1 };\n\n\t\tconst pathDirs = (env?.vars?.PATH ?? \"/usr/local/bin:/usr/bin:/bin\").split(\n\t\t\t\":\",\n\t\t);\n\t\tconst lines: string[] = [];\n\t\tlet anyMissing = false;\n\n\t\tfor (const name of args) {\n\t\t\tlet found = false;\n\t\t\tfor (const dir of pathDirs) {\n\t\t\t\tconst full = `${dir}/${name}`;\n\t\t\t\tif (shell.vfs.exists(full)) {\n\t\t\t\t\tconst st = shell.vfs.stat(full);\n\t\t\t\t\tif (st.type === \"file\") {\n\t\t\t\t\t\tlines.push(full);\n\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!found) anyMissing = true;\n\t\t}\n\n\t\tif (lines.length === 0) return { exitCode: 1 };\n\t\treturn { stdout: lines.join(\"\\n\"), exitCode: anyMissing ? 1 : 0 };\n\t},\n};\n", "export function formatLoginDate(date: Date): string {\n\tconst weekday = date.toLocaleString(\"en-US\", { weekday: \"short\" });\n\tconst month = date.toLocaleString(\"en-US\", { month: \"short\" });\n\tconst day = date.getDate().toString().padStart(2, \"0\");\n\tconst hh = date.getHours().toString().padStart(2, \"0\");\n\tconst mm = date.getMinutes().toString().padStart(2, \"0\");\n\tconst ss = date.getSeconds().toString().padStart(2, \"0\");\n\tconst year = date.getFullYear();\n\treturn `${weekday} ${month} ${day} ${hh}:${mm}:${ss} ${year}`;\n}\n", "import { formatLoginDate } from \"../SSHMimic/loginFormat\";\nimport type { ShellModule } from \"../types/commands\";\n\nexport const whoCommand: ShellModule = {\n\tname: \"who\",\n\tdescription: \"Show active sessions\",\n\tcategory: \"system\",\n\tparams: [],\n\trun: ({ shell }) => {\n\t\tconst lines = shell.users.listActiveSessions().map((session) => {\n\t\t\tconst loginAt = new Date(session.startedAt);\n\t\t\tconst displayDate = Number.isNaN(loginAt.getTime())\n\t\t\t\t? session.startedAt\n\t\t\t\t: formatLoginDate(loginAt);\n\t\t\treturn `${session.username} ${session.tty} ${displayDate} (${session.remoteAddress || \"unknown\"})`;\n\t\t});\n\n\t\treturn { stdout: lines.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const whoamiCommand: ShellModule = {\n\tname: \"whoami\",\n\tdescription: \"Print current user\",\n\tcategory: \"system\",\n\tparams: [],\n\trun: ({ authUser }) => ({ stdout: authUser, exitCode: 0 }),\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { runCommand } from \"./runtime\";\n\nexport const xargsCommand: ShellModule = {\n\tname: \"xargs\",\n\tdescription: \"Build and execute command lines from stdin\",\n\tcategory: \"text\",\n\tparams: [\"[command] [args...]\"],\n\trun: async ({ authUser, hostname, mode, cwd, args, stdin, shell, env }) => {\n\t\tconst baseCmd = args[0] ?? \"echo\";\n\t\tconst extraArgs = args.slice(1);\n\t\tconst items = (stdin ?? \"\").trim().split(/\\s+/).filter(Boolean);\n\t\tif (items.length === 0) return { exitCode: 0 };\n\t\tconst fullCmd = [baseCmd, ...extraArgs, ...items].join(\" \");\n\t\treturn runCommand(\n\t\t\tfullCmd,\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\tmode,\n\t\t\tcwd,\n\t\t\tshell,\n\t\t\tundefined,\n\t\t\tenv,\n\t\t);\n\t},\n};\n", "/** biome-ignore-all lint/style/useNamingConvention: ENV VARIABLES */\nimport type { CommandContext, CommandResult, ShellModule } from \"../types/commands\";\nimport { adduserCommand } from \"./adduser\";\nimport { aliasCommand, unaliasCommand } from \"./alias\";\nimport { aptCacheCommand, aptCommand } from \"./apt\";\nimport { awkCommand } from \"./awk\";\nimport { base64Command } from \"./base64\";\nimport { catCommand } from \"./cat\";\nimport { cdCommand } from \"./cd\";\nimport { chmodCommand } from \"./chmod\";\nimport { clearCommand } from \"./clear\";\nimport { cpCommand } from \"./cp\";\nimport { curlCommand } from \"./curl\";\nimport { cutCommand } from \"./cut\";\nimport { dateCommand } from \"./date\";\nimport { declareCommand } from \"./declare\";\nimport { deluserCommand } from \"./deluser\";\nimport { dfCommand } from \"./df\";\nimport { diffCommand } from \"./diff\";\nimport { dpkgCommand, dpkgQueryCommand } from \"./dpkg\";\nimport { duCommand } from \"./du\";\nimport { echoCommand } from \"./echo\";\nimport { envCommand } from \"./env\";\nimport { exitCommand } from \"./exit\";\nimport { exportCommand } from \"./export\";\nimport { findCommand } from \"./find\";\nimport { freeCommand } from \"./free\";\nimport { grepCommand } from \"./grep\";\nimport { groupsCommand } from \"./groups\";\nimport { gunzipCommand, gzipCommand } from \"./gzip\";\nimport { headCommand } from \"./head\";\nimport { createHelpCommand } from \"./help\";\nimport { historyCommand } from \"./history\";\nimport { hostnameCommand } from \"./hostname\";\nimport { htopCommand } from \"./htop\";\nimport { idCommand } from \"./id\";\nimport { killCommand } from \"./kill\";\nimport { lnCommand } from \"./ln\";\nimport { lsCommand } from \"./ls\";\nimport { lsbReleaseCommand } from \"./lsb-release\";\nimport { manCommand } from \"./man\";\nimport { mkdirCommand } from \"./mkdir\";\nimport { mvCommand } from \"./mv\";\nimport { nanoCommand } from \"./nano\";\nimport { neofetchCommand } from \"./neofetch\";\nimport { nodeCommand } from \"./node\";\nimport { npmCommand, npxCommand } from \"./npm\";\nimport { passwdCommand } from \"./passwd\";\nimport { pingCommand } from \"./ping\";\nimport { printfCommand } from \"./printf\";\nimport { psCommand } from \"./ps\";\nimport { pwdCommand } from \"./pwd\";\nimport { python3Command } from \"./python\";\nimport { readCommand } from \"./read\";\nimport { rmCommand } from \"./rm\";\nimport { sedCommand } from \"./sed\";\nimport { setCommand } from \"./set\";\nimport { shCommand } from \"./sh\";\nimport { returnCommand, shiftCommand, trapCommand } from \"./shift\";\nimport { sleepCommand } from \"./sleep\";\nimport { sortCommand } from \"./sort\";\nimport { sourceCommand } from \"./source\";\nimport { suCommand } from \"./su\";\nimport { sudoCommand } from \"./sudo\";\nimport { tailCommand } from \"./tail\";\nimport { tarCommand } from \"./tar\";\nimport { teeCommand } from \"./tee\";\nimport { testCommand } from \"./test\";\nimport { touchCommand } from \"./touch\";\nimport { trCommand } from \"./tr\";\nimport { treeCommand } from \"./tree\";\nimport { falseCommand, trueCommand } from \"./true\";\nimport { typeCommand } from \"./type\";\nimport { unameCommand } from \"./uname\";\nimport { uniqCommand } from \"./uniq\";\nimport { unsetCommand } from \"./unset\";\nimport { uptimeCommand } from \"./uptime\";\nimport { wcCommand } from \"./wc\";\nimport { wgetCommand } from \"./wget\";\nimport { whichCommand } from \"./which\";\nimport { whoCommand } from \"./who\";\nimport { whoamiCommand } from \"./whoami\";\nimport { xargsCommand } from \"./xargs\";\n\nconst BASE_COMMANDS: ShellModule[] = [\n\t// Navigation\n\tpwdCommand,\n\tcdCommand,\n\tlsCommand,\n\ttreeCommand,\n\t// Files\n\tcatCommand,\n\ttouchCommand,\n\trmCommand,\n\tmkdirCommand,\n\tcpCommand,\n\tmvCommand,\n\tlnCommand,\n\tchmodCommand,\n\tfindCommand,\n\t// Text processing\n\tgrepCommand,\n\tsedCommand,\n\tawkCommand,\n\tsortCommand,\n\tuniqCommand,\n\twcCommand,\n\theadCommand,\n\ttailCommand,\n\tcutCommand,\n\ttrCommand,\n\tteeCommand,\n\txargsCommand,\n\tdiffCommand,\n\t// Archives\n\ttarCommand,\n\tgzipCommand,\n\tgunzipCommand,\n\tbase64Command,\n\t// System info\n\twhoamiCommand,\n\twhoCommand,\n\thostnameCommand,\n\tidCommand,\n\tgroupsCommand,\n\tunameCommand,\n\tpsCommand,\n\tkillCommand,\n\tdfCommand,\n\tduCommand,\n\tdateCommand,\n\tsleepCommand,\n\tpingCommand,\n\t// Shell\n\techoCommand,\n\tenvCommand,\n\texportCommand,\n\tsetCommand,\n\tunsetCommand,\n\tshCommand,\n\tclearCommand,\n\texitCommand,\n\t// Editors\n\tnanoCommand,\n\thtopCommand,\n\t// Network\n\tcurlCommand,\n\twgetCommand,\n\t// Users\n\tadduserCommand,\n\tpasswdCommand,\n\tdeluserCommand,\n\tsudoCommand,\n\tsuCommand,\n\t// Misc\n\tneofetchCommand,\n\t// Package management\n\taptCommand,\n\taptCacheCommand,\n\tdpkgCommand,\n\tdpkgQueryCommand,\n\t// Shell (extended)\n\twhichCommand,\n\ttypeCommand,\n\tmanCommand,\n\taliasCommand,\n\tunaliasCommand,\n\ttestCommand,\n\tsourceCommand,\n\thistoryCommand,\n\tprintfCommand,\n\treadCommand,\n\tdeclareCommand,\n\tshiftCommand,\n\ttrapCommand,\n\treturnCommand,\n\ttrueCommand,\n\tfalseCommand,\n\tnpmCommand,\n\tnpxCommand,\n\tnodeCommand,\n\tpython3Command,\n\t// System (extended)\n\tuptimeCommand,\n\tfreeCommand,\n\tlsbReleaseCommand,\n];\n\nconst customCommands: ShellModule[] = [];\nconst commandRegistry = new Map<string, ShellModule>();\nlet cachedCommandNames: string[] | null = null;\n\nconst helpCommand = createHelpCommand(() =>\n\tgetCommandModules().map((cmd) => cmd.name),\n);\n\nfunction buildCache(): void {\n\tcommandRegistry.clear();\n\tfor (const mod of getCommandModules()) {\n\t\tcommandRegistry.set(mod.name, mod);\n\t\tfor (const alias of mod.aliases ?? []) commandRegistry.set(alias, mod);\n\t}\n\tcachedCommandNames = Array.from(commandRegistry.keys()).sort();\n}\n\nfunction getCommandModules(): ShellModule[] {\n\treturn [...BASE_COMMANDS, ...customCommands, helpCommand];\n}\n\nexport function registerCommand(module: ShellModule): void {\n\tconst normalized: ShellModule = {\n\t\t...module,\n\t\tname: module.name.trim().toLowerCase(),\n\t\taliases: module.aliases?.map((a) => a.trim().toLowerCase()),\n\t};\n\tconst names = [normalized.name, ...(normalized.aliases ?? [])];\n\tif (names.some((n) => n.length === 0 || /\\s/.test(n))) {\n\t\tthrow new Error(\"Command names must be non-empty and contain no spaces\");\n\t}\n\tcustomCommands.push(normalized);\n\tbuildCache();\n}\n\nexport function createCustomCommand(\n\tname: string,\n\tparams: string[],\n\trun: (ctx: CommandContext) => CommandResult | Promise<CommandResult>,\n): ShellModule {\n\treturn { name, params, run };\n}\n\nexport function getCommandNames(): string[] {\n\tif (!cachedCommandNames) buildCache();\n\treturn cachedCommandNames!;\n}\n\nexport function getCommandModulesPublic(): ShellModule[] {\n\treturn getCommandModules();\n}\n\nexport function resolveModule(name: string): ShellModule | undefined {\n\tif (!cachedCommandNames) buildCache();\n\treturn commandRegistry.get(name.toLowerCase());\n}\n", "/** biome-ignore-all lint/style/useNamingConvention: ENV VAR KEYS */\n/**\n * linuxRootfs.ts\n *\n * Bootstraps a realistic Linux directory hierarchy in the VFS.\n * Called once during VirtualShell initialization. Idempotent \u2014 skips\n * paths that already exist so FS-mode snapshots survive restarts.\n */\n\nimport * as os from \"node:os\";\nimport type { ShellProperties } from \"../VirtualShell\";\nimport type VirtualFileSystem from \"../VirtualFileSystem\";\nimport type { VirtualUserManager } from \"../VirtualUserManager\";\n\n// \u2500\u2500\u2500 helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction ensureDir(vfs: VirtualFileSystem, path: string, mode = 0o755): void {\n\tif (!vfs.exists(path)) vfs.mkdir(path, mode);\n}\n\nfunction ensureFile(\n\tvfs: VirtualFileSystem,\n\tpath: string,\n\tcontent: string,\n\tmode = 0o644,\n): void {\n\tif (!vfs.exists(path)) vfs.writeFile(path, content, { mode });\n}\n\n// \u2500\u2500\u2500 /etc \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction bootstrapEtc(\n\tvfs: VirtualFileSystem,\n\thostname: string,\n\tprops: ShellProperties,\n): void {\n\tensureDir(vfs, \"/etc\");\n\n\t// os-release \u2014 authoritative distro identity used by neofetch, lsb_release\n\tensureFile(\n\t\tvfs,\n\t\t\"/etc/os-release\",\n\t\t`${[\n\t\t\t`NAME=\"Fortune GNU/Linux\"`,\n\t\t\t`PRETTY_NAME=\"${props.os}\"`,\n\t\t\t`ID=fortune`,\n\t\t\t`ID_LIKE=debian`,\n\t\t\t`HOME_URL=\"https://github.com/itsrealfortune/typescript-virtual-container\"`,\n\t\t\t`VERSION_CODENAME=aurora`,\n\t\t\t`VERSION_ID=\"1.0\"`,\n\t\t].join(\"\\n\")}\\n`,\n\t);\n\n\tensureFile(vfs, \"/etc/debian_version\", \"12.0\\n\");\n\tensureFile(vfs, \"/etc/hostname\", `${hostname}\\n`);\n\tensureFile(vfs, \"/etc/shells\", \"/bin/sh\\n/bin/bash\\n/usr/bin/bash\\n\");\n\tensureFile(\n\t\tvfs,\n\t\t\"/etc/profile\",\n\t\t`${[\n\t\t\t\"export PATH=/usr/local/bin:/usr/bin:/bin\",\n\t\t\t\"export PS1='\\\\u@\\\\h:\\\\w\\\\$ '\",\n\t\t].join(\"\\n\")}\\n`,\n\t);\n\n\tensureFile(vfs, \"/etc/issue\", `Fortune GNU/Linux 1.0 \\\\n \\\\l\\n`);\n\n\tensureFile(\n\t\tvfs,\n\t\t\"/etc/motd\",\n\t\t[\"\", `Welcome to ${props.os}`, `Kernel: ${props.kernel}`, \"\"].join(\"\\n\"),\n\t);\n\n\t// APT sources\n\tensureDir(vfs, \"/etc/apt\");\n\tensureDir(vfs, \"/etc/apt/sources.list.d\");\n\tensureFile(\n\t\tvfs,\n\t\t\"/etc/apt/sources.list\",\n\t\t`${[\n\t\t\t\"# Fortune GNU/Linux package sources\",\n\t\t\t\"deb [virtual] fortune://packages.fortune.local aurora main contrib\",\n\t\t\t\"deb [virtual] fortune://security.fortune.local aurora-security main\",\n\t\t].join(\"\\n\")}\\n`,\n\t);\n\n\t// network stubs\n\tensureDir(vfs, \"/etc/network\");\n\tensureFile(\n\t\tvfs,\n\t\t\"/etc/network/interfaces\",\n\t\t`${[\n\t\t\t\"auto lo\",\n\t\t\t\"iface lo inet loopback\",\n\t\t\t\"\",\n\t\t\t\"auto eth0\",\n\t\t\t\"iface eth0 inet dhcp\",\n\t\t].join(\"\\n\")}\\n`,\n\t);\n\n\tensureFile(\n\t\tvfs,\n\t\t\"/etc/resolv.conf\",\n\t\t\"nameserver 1.1.1.1\\nnameserver 8.8.8.8\\n\",\n\t);\n\n\tensureFile(\n\t\tvfs,\n\t\t\"/etc/hosts\",\n\t\t`${[\n\t\t\t\"127.0.0.1 localhost\",\n\t\t\t`127.0.1.1 ${hostname}`,\n\t\t\t\"::1 localhost ip6-localhost ip6-loopback\",\n\t\t].join(\"\\n\")}\\n`,\n\t);\n\n\tensureDir(vfs, \"/etc/cron.d\");\n\tensureDir(vfs, \"/etc/init.d\");\n\tensureDir(vfs, \"/etc/systemd\");\n\tensureDir(vfs, \"/etc/systemd/system\");\n}\n\n// \u2500\u2500\u2500 /etc/passwd + /etc/group + /etc/shadow \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Sync `/etc/passwd`, `/etc/group`, and `/etc/shadow` from the\n * VirtualUserManager's current user list into the VFS.\n * @param vfs VirtualFileSystem instance to write files into\n * @param users VirtualUserManager to source users from\n */\nexport function syncEtcPasswd(\n\tvfs: VirtualFileSystem,\n\tusers: VirtualUserManager,\n): void {\n\tconst userList = users.listUsers();\n\n\tconst passwdLines = [\n\t\t\"root:x:0:0:root:/root:/bin/bash\",\n\t\t\"daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\",\n\t\t\"www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\",\n\t\t\"nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\",\n\t];\n\n\tlet uid = 1000;\n\tfor (const u of userList) {\n\t\tif (u === \"root\") continue;\n\t\tpasswdLines.push(`${u}:x:${uid}:${uid}::/home/${u}:/bin/bash`);\n\t\tuid++;\n\t}\n\n\tvfs.writeFile(\"/etc/passwd\", `${passwdLines.join(\"\\n\")}\\n`);\n\n\tconst groupLines = [\n\t\t\"root:x:0:\",\n\t\t\"daemon:x:1:\",\n\t\t`sudo:x:27:${userList.filter((u) => users.isSudoer(u)).join(\",\")}`,\n\t\t`users:x:100:${userList.filter((u) => u !== \"root\").join(\",\")}`,\n\t\t\"nogroup:x:65534:\",\n\t];\n\tvfs.writeFile(\"/etc/group\", `${groupLines.join(\"\\n\")}\\n`);\n\n\t// shadow \u2014 fake hashes, never real\n\tconst shadowLines = [\n\t\t\"root:*:19000:0:99999:7:::\",\n\t\t\"daemon:*:19000:0:99999:7:::\",\n\t];\n\tfor (const u of userList) {\n\t\tif (u === \"root\") continue;\n\t\tshadowLines.push(`${u}:!:19000:0:99999:7:::`);\n\t}\n\tvfs.writeFile(\"/etc/shadow\", `${shadowLines.join(\"\\n\")}\\n`, { mode: 0o640 });\n}\n\n// \u2500\u2500\u2500 /proc \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Derive a stable virtual PID from a tty string like \"pts/0\" \u2192 1000, \"pts/1\" \u2192 1001 */\nfunction ttyToPid(tty: string): number {\n\tconst match = tty.match(/(\\d+)$/);\n\treturn 1000 + (match?.[1] ? parseInt(match[1], 10) : 0);\n}\n\n/** Write /proc/<pid>/ subtree for a single virtual process */\nfunction writeProcPid(\n\tvfs: VirtualFileSystem,\n\tpid: number,\n\tusername: string,\n\t_tty: string,\n\tcmdline: string,\n\tstartedAt: string,\n\tenv: Record<string, string>,\n): void {\n\tconst dir = `/proc/${pid}`;\n\tensureDir(vfs, dir);\n\tensureDir(vfs, `${dir}/fd`);\n\tensureDir(vfs, `${dir}/fdinfo`);\n\n\tconst uptimeSec = Math.floor(\n\t\t(Date.now() - new Date(startedAt).getTime()) / 1000,\n\t);\n\n\tvfs.writeFile(`${dir}/cmdline`, `${cmdline.replace(/\\s+/g, \"\\0\")}\\0`);\n\tvfs.writeFile(`${dir}/comm`, cmdline.split(/\\s+/)[0] ?? \"bash\");\n\tvfs.writeFile(\n\t\t`${dir}/status`,\n\t\t`${[\n\t\t\t`Name: ${cmdline.split(/\\s+/)[0] ?? \"bash\"}`,\n\t\t\t`State: S (sleeping)`,\n\t\t\t`Pid: ${pid}`,\n\t\t\t`PPid: 1`,\n\t\t\t`Uid: 0\\t0\\t0\\t0`,\n\t\t\t`Gid: 0\\t0\\t0\\t0`,\n\t\t\t`VmRSS: 4096 kB`,\n\t\t\t`VmSize: 16384 kB`,\n\t\t\t`Threads: 1`,\n\t\t].join(\"\\n\")}\\n`,\n\t);\n\tvfs.writeFile(\n\t\t`${dir}/stat`,\n\t\t`${pid} (${cmdline.split(/\\s+/)[0] ?? \"bash\"}) S 1 ${pid} ${pid} 0 -1 4194304 0 0 0 0 ${uptimeSec} 0 0 0 20 0 1 0 0 16384 4096 0\\n`,\n\t);\n\tvfs.writeFile(\n\t\t`${dir}/environ`,\n\t\t`${Object.entries(env)\n\t\t\t.map(([k, v]) => `${k}=${v}`)\n\t\t\t.join(\"\\0\")}\\0`,\n\t);\n\tvfs.writeFile(`${dir}/cwd`, `/home/${username}\\0`);\n\tvfs.writeFile(`${dir}/exe`, \"/bin/bash\\0\");\n\n\t// Standard fd entries\n\tvfs.writeFile(`${dir}/fd/0`, \"\");\n\tvfs.writeFile(`${dir}/fd/1`, \"\");\n\tvfs.writeFile(`${dir}/fd/2`, \"\");\n}\n\n/**\n * Populate and refresh `/proc` virtual entries based on host stats and\n * provided active sessions. Rewrites `/proc/uptime`, `/proc/meminfo`,\n * `/proc/cpuinfo`, `/proc/<pid>` entries and `/proc/self` content.\n * @param vfs VirtualFileSystem instance\n * @param props ShellProperties used for version strings\n * @param hostname Hostname to write into /proc/hostname\n * @param shellStartTime Start time used to compute uptime\n * @param sessions Optional active sessions list to populate per-pid entries\n */\nexport function refreshProc(\n\tvfs: VirtualFileSystem,\n\tprops: ShellProperties,\n\thostname: string,\n\tshellStartTime: number,\n\tsessions?: import(\"../VirtualUserManager\").VirtualActiveSession[],\n): void {\n\tensureDir(vfs, \"/proc\");\n\n\tconst uptimeSec = Math.floor((Date.now() - shellStartTime) / 1000);\n\tvfs.writeFile(\n\t\t\"/proc/uptime\",\n\t\t`${uptimeSec}.00 ${Math.floor(uptimeSec * 0.9)}.00\\n`,\n\t);\n\n\tconst totalMemKb = Math.floor(os.totalmem() / 1024);\n\tconst freeMemKb = Math.floor(os.freemem() / 1024);\n\tconst availMemKb = Math.floor(freeMemKb * 0.95);\n\tvfs.writeFile(\n\t\t\"/proc/meminfo\",\n\t\t`${[\n\t\t\t`MemTotal: ${String(totalMemKb).padStart(10)} kB`,\n\t\t\t`MemFree: ${String(freeMemKb).padStart(10)} kB`,\n\t\t\t`MemAvailable: ${String(availMemKb).padStart(10)} kB`,\n\t\t\t`Buffers: ${String(Math.floor(totalMemKb * 0.02)).padStart(10)} kB`,\n\t\t\t`Cached: ${String(Math.floor(totalMemKb * 0.15)).padStart(10)} kB`,\n\t\t\t`SwapTotal: ${String(Math.floor(totalMemKb * 0.5)).padStart(10)} kB`,\n\t\t\t`SwapFree: ${String(Math.floor(totalMemKb * 0.5)).padStart(10)} kB`,\n\t\t].join(\"\\n\")}\\n`,\n\t);\n\n\tconst cpus = os.cpus();\n\tconst cpuLines: string[] = [];\n\tfor (let i = 0; i < cpus.length; i++) {\n\t\tconst c = cpus[i];\n\t\tif (!c) continue;\n\t\tconst mhz = c.speed.toFixed(3);\n\t\tcpuLines.push(\n\t\t\t`processor\\t: ${i}`,\n\t\t\t`model name\\t: ${c.model}`,\n\t\t\t`cpu MHz\\t\\t: ${mhz}`,\n\t\t\t`cache size\\t: 8192 KB`,\n\t\t\t\"\",\n\t\t);\n\t}\n\tvfs.writeFile(\"/proc/cpuinfo\", `${cpuLines.join(\"\\n\")}\\n`);\n\n\tvfs.writeFile(\n\t\t\"/proc/version\",\n\t\t`Linux version ${props.kernel} (fortune@build) (gcc version 12.2.0) #1 SMP\\n`,\n\t);\n\n\tvfs.writeFile(\"/proc/hostname\", `${hostname}\\n`);\n\n\t// /proc/loadavg\n\tconst load = (Math.random() * 0.5).toFixed(2);\n\tconst numProcs = 1 + (sessions?.length ?? 0);\n\tvfs.writeFile(\n\t\t\"/proc/loadavg\",\n\t\t`${load} ${load} ${load} ${numProcs}/${numProcs} 1\\n`,\n\t);\n\n\t// /proc/net stubs\n\tensureDir(vfs, \"/proc/net\");\n\tensureFile(\n\t\tvfs,\n\t\t\"/proc/net/dev\",\n\t\t`${[\n\t\t\t\"Inter-| Receive | Transmit\",\n\t\t\t\" face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed\",\n\t\t\t\" lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\",\n\t\t\t\" eth0: 131072 1024 0 0 0 0 0 0 65536 512 0 0 0 0 0 0\",\n\t\t].join(\"\\n\")}\\n`,\n\t);\n\n\t// \u2500\u2500 /proc/1 \u2014 init process \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\twriteProcPid(\n\t\tvfs,\n\t\t1,\n\t\t\"root\",\n\t\t\"pts/0\",\n\t\t\"/sbin/init\",\n\t\tnew Date(shellStartTime).toISOString(),\n\t\t{},\n\t);\n\n\t// \u2500\u2500 /proc/<pid> per session \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\tconst activeSessions = sessions ?? [];\n\tfor (const session of activeSessions) {\n\t\tconst pid = ttyToPid(session.tty);\n\t\twriteProcPid(\n\t\t\tvfs,\n\t\t\tpid,\n\t\t\tsession.username,\n\t\t\tsession.tty,\n\t\t\t\"bash\",\n\t\t\tsession.startedAt,\n\t\t\t{\n\t\t\t\tUSER: session.username,\n\t\t\t\tHOME: `/home/${session.username}`,\n\t\t\t\tTERM: \"xterm-256color\",\n\t\t\t\tSHELL: \"/bin/bash\",\n\t\t\t},\n\t\t);\n\t}\n\n\t// \u2500\u2500 /proc/self \u2014 symlink to current session PID or 1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\t// We can't know which session is \"current\" at populate time,\n\t// so /proc/self is a directory that mirrors the most recent session,\n\t// or init if no sessions. Commands that read /proc/self get consistent data.\n\tconst selfPid =\n\t\tactiveSessions.length > 0\n\t\t\t? ttyToPid(activeSessions[activeSessions.length - 1]!.tty)\n\t\t\t: 1;\n\n\t// Remove existing /proc/self and recreate as content copy\n\tif (vfs.exists(\"/proc/self\")) {\n\t\ttry {\n\t\t\tvfs.remove(\"/proc/self\");\n\t\t} catch {}\n\t}\n\t// /proc/self is a real directory (not a symlink, which VFS may not support for dirs)\n\tconst selfSrc = `/proc/${selfPid}`;\n\tif (vfs.exists(selfSrc)) {\n\t\tensureDir(vfs, \"/proc/self\");\n\t\tensureDir(vfs, \"/proc/self/fd\");\n\t\tfor (const entry of vfs.list(selfSrc)) {\n\t\t\tconst srcPath = `${selfSrc}/${entry}`;\n\t\t\tconst dstPath = `/proc/self/${entry}`;\n\t\t\ttry {\n\t\t\t\tconst st = vfs.stat(srcPath);\n\t\t\t\tif (st.type === \"file\") {\n\t\t\t\t\tvfs.writeFile(dstPath, vfs.readFile(srcPath));\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t\tvfs.writeFile(\n\t\t\t\"/proc/self/status\",\n\t\t\tvfs.exists(`${selfSrc}/status`) ? vfs.readFile(`${selfSrc}/status`) : \"\",\n\t\t);\n\t} else {\n\t\t// Fallback minimal /proc/self\n\t\tensureDir(vfs, \"/proc/self\");\n\t\tvfs.writeFile(\"/proc/self/cmdline\", \"bash\\0\");\n\t\tvfs.writeFile(\"/proc/self/comm\", \"bash\");\n\t\tvfs.writeFile(\n\t\t\t\"/proc/self/status\",\n\t\t\t\"Name:\\tbash\\nState:\\tS (sleeping)\\nPid:\\t1\\nPPid:\\t0\\n\",\n\t\t);\n\t\tvfs.writeFile(\"/proc/self/environ\", \"\");\n\t\tvfs.writeFile(\"/proc/self/cwd\", \"/root\\0\");\n\t\tvfs.writeFile(\"/proc/self/exe\", \"/bin/bash\\0\");\n\t}\n}\n\n// \u2500\u2500\u2500 /sys \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction bootstrapSys(vfs: VirtualFileSystem, props: ShellProperties): void {\n\tensureDir(vfs, \"/sys\");\n\tensureDir(vfs, \"/sys/devices\");\n\tensureDir(vfs, \"/sys/devices/virtual\");\n\tensureDir(vfs, \"/sys/devices/virtual/dmi\");\n\tensureDir(vfs, \"/sys/devices/virtual/dmi/id\");\n\n\tensureFile(\n\t\tvfs,\n\t\t\"/sys/devices/virtual/dmi/id/sys_vendor\",\n\t\t\"Fortune Systems\\n\",\n\t);\n\tensureFile(\n\t\tvfs,\n\t\t\"/sys/devices/virtual/dmi/id/product_name\",\n\t\t\"VirtualContainer v1\\n\",\n\t);\n\tensureFile(vfs, \"/sys/devices/virtual/dmi/id/board_name\", \"fortune-board\\n\");\n\n\tensureDir(vfs, \"/sys/class\");\n\tensureDir(vfs, \"/sys/class/net\");\n\n\tensureDir(vfs, \"/sys/kernel\");\n\tensureFile(vfs, \"/sys/kernel/hostname\", \"fortune-vm\\n\");\n\tensureFile(vfs, \"/sys/kernel/osrelease\", `${props.kernel}\\n`);\n\tensureFile(vfs, \"/sys/kernel/ostype\", \"Linux\\n\");\n}\n\n// \u2500\u2500\u2500 /dev \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction bootstrapDev(vfs: VirtualFileSystem): void {\n\tensureDir(vfs, \"/dev\");\n\tensureFile(vfs, \"/dev/null\", \"\", 0o666);\n\tensureFile(vfs, \"/dev/zero\", \"\", 0o666);\n\tensureFile(vfs, \"/dev/random\", \"\", 0o444);\n\tensureFile(vfs, \"/dev/urandom\", \"\", 0o444);\n\tensureDir(vfs, \"/dev/pts\");\n\tensureDir(vfs, \"/dev/shm\");\n}\n\n// \u2500\u2500\u2500 /usr \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction bootstrapUsr(vfs: VirtualFileSystem): void {\n\tensureDir(vfs, \"/usr\");\n\tensureDir(vfs, \"/usr/bin\");\n\tensureDir(vfs, \"/usr/sbin\");\n\tensureDir(vfs, \"/usr/local\");\n\tensureDir(vfs, \"/usr/local/bin\");\n\tensureDir(vfs, \"/usr/local/lib\");\n\tensureDir(vfs, \"/usr/local/share\");\n\tensureDir(vfs, \"/usr/share\");\n\tensureDir(vfs, \"/usr/share/doc\");\n\tensureDir(vfs, \"/usr/share/man\");\n\tensureDir(vfs, \"/usr/share/man/man1\");\n\tensureDir(vfs, \"/usr/lib\");\n\n\t// Stub binaries so `which` can find built-in commands\n\tconst builtins = [\n\t\t\"sh\",\n\t\t\"bash\",\n\t\t\"ls\",\n\t\t\"cat\",\n\t\t\"echo\",\n\t\t\"grep\",\n\t\t\"find\",\n\t\t\"sort\",\n\t\t\"head\",\n\t\t\"tail\",\n\t\t\"cut\",\n\t\t\"tr\",\n\t\t\"sed\",\n\t\t\"awk\",\n\t\t\"wc\",\n\t\t\"tee\",\n\t\t\"tar\",\n\t\t\"gzip\",\n\t\t\"gunzip\",\n\t\t\"touch\",\n\t\t\"mkdir\",\n\t\t\"rm\",\n\t\t\"mv\",\n\t\t\"cp\",\n\t\t\"chmod\",\n\t\t\"ln\",\n\t\t\"pwd\",\n\t\t\"env\",\n\t\t\"date\",\n\t\t\"sleep\",\n\t\t\"id\",\n\t\t\"whoami\",\n\t\t\"hostname\",\n\t\t\"uname\",\n\t\t\"ps\",\n\t\t\"kill\",\n\t\t\"df\",\n\t\t\"du\",\n\t\t\"curl\",\n\t\t\"wget\",\n\t\t\"nano\",\n\t\t\"diff\",\n\t\t\"uniq\",\n\t\t\"xargs\",\n\t\t\"base64\",\n\t];\n\tfor (const bin of builtins) {\n\t\tensureFile(\n\t\t\tvfs,\n\t\t\t`/usr/bin/${bin}`,\n\t\t\t`#!/bin/sh\\nexec builtin ${bin} \"$@\"\\n`,\n\t\t\t0o755,\n\t\t);\n\t}\n\n\t// lsb_release script\n\tensureFile(\n\t\tvfs,\n\t\t\"/usr/bin/lsb_release\",\n\t\t'#!/bin/sh\\nexec lsb_release \"$@\"\\n',\n\t\t0o755,\n\t);\n}\n\n// \u2500\u2500\u2500 /var \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction bootstrapVar(vfs: VirtualFileSystem): void {\n\tensureDir(vfs, \"/var\");\n\tensureDir(vfs, \"/var/log\");\n\tensureDir(vfs, \"/var/tmp\");\n\tensureDir(vfs, \"/var/run\");\n\tensureDir(vfs, \"/var/cache\");\n\tensureDir(vfs, \"/var/cache/apt\");\n\tensureDir(vfs, \"/var/cache/apt/archives\");\n\tensureDir(vfs, \"/var/lib\");\n\tensureDir(vfs, \"/var/lib/apt\");\n\tensureDir(vfs, \"/var/lib/apt/lists\");\n\tensureDir(vfs, \"/var/lib/dpkg\");\n\tensureDir(vfs, \"/var/lib/dpkg/info\");\n\n\t// dpkg status \u2014 starts empty, apt install populates it\n\tensureFile(vfs, \"/var/lib/dpkg/status\", \"\");\n\tensureFile(vfs, \"/var/lib/dpkg/available\", \"\");\n\n\t// syslog stub\n\tensureFile(\n\t\tvfs,\n\t\t\"/var/log/syslog\",\n\t\t`${new Date().toUTCString()} fortune kernel: Virtual container started\\n`,\n\t);\n\tensureFile(vfs, \"/var/log/auth.log\", \"\");\n\tensureFile(vfs, \"/var/log/dpkg.log\", \"\");\n\tensureFile(vfs, \"/var/log/apt/history.log\", \"\");\n\tensureFile(vfs, \"/var/log/apt/term.log\", \"\");\n}\n\n// \u2500\u2500\u2500 /bin + /sbin symlinks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction bootstrapBin(vfs: VirtualFileSystem): void {\n\t// On modern Debian/Ubuntu /bin is a symlink to /usr/bin\n\tif (!vfs.exists(\"/bin\")) {\n\t\tvfs.symlink(\"/usr/bin\", \"/bin\");\n\t}\n\tif (!vfs.exists(\"/sbin\")) {\n\t\tvfs.symlink(\"/usr/sbin\", \"/sbin\");\n\t}\n\tif (!vfs.exists(\"/lib\")) {\n\t\tensureDir(vfs, \"/lib\");\n\t}\n\tif (!vfs.exists(\"/lib64\")) {\n\t\tensureDir(vfs, \"/lib64\");\n\t}\n}\n\n// \u2500\u2500\u2500 /tmp \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction bootstrapTmp(vfs: VirtualFileSystem): void {\n\tensureDir(vfs, \"/tmp\", 0o1777);\n}\n\n// \u2500\u2500\u2500 /root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction bootstrapRoot(vfs: VirtualFileSystem): void {\n\tensureDir(vfs, \"/root\", 0o700);\n\tensureFile(\n\t\tvfs,\n\t\t\"/root/.bashrc\",\n\t\t`${[\n\t\t\t\"# root .bashrc\",\n\t\t\t\"export PS1='\\\\[\\\\033[0;31m\\\\]\\\\u@\\\\h\\\\[\\\\033[0m\\\\]:\\\\[\\\\033[0;34m\\\\]\\\\w\\\\[\\\\033[0m\\\\]# '\",\n\t\t\t\"export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n\t\t\t\"alias ll='ls -la'\",\n\t\t\t\"alias la='ls -A'\",\n\t\t].join(\"\\n\")}\\n`,\n\t);\n\tensureFile(vfs, \"/root/.profile\", \"[ -f ~/.bashrc ] && . ~/.bashrc\\n\");\n\t// Fix: /home/root should map to /root for root user\n\tif (!vfs.exists(\"/home/root\")) {\n\t\tvfs.symlink(\"/root\", \"/home/root\");\n\t}\n}\n\n// \u2500\u2500\u2500 /opt + /srv + /mnt + /media \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction bootstrapMisc(vfs: VirtualFileSystem): void {\n\tensureDir(vfs, \"/opt\");\n\tensureDir(vfs, \"/srv\");\n\tensureDir(vfs, \"/mnt\");\n\tensureDir(vfs, \"/media\");\n}\n\n// \u2500\u2500\u2500 main entry point \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Bootstraps the full Linux rootfs hierarchy in the VFS.\n * Safe to call multiple times \u2014 idempotent.\n *\n * @param vfs Target virtual filesystem.\n * @param users User manager (for /etc/passwd sync).\n * @param hostname Virtual hostname.\n * @param props Shell properties (kernel, os, arch).\n * @param shellStartTime Unix ms of shell creation (for uptime).\n */\nexport function bootstrapLinuxRootfs(\n\tvfs: VirtualFileSystem,\n\tusers: VirtualUserManager,\n\thostname: string,\n\tprops: ShellProperties,\n\tshellStartTime: number,\n): void {\n\tbootstrapEtc(vfs, hostname, props);\n\tbootstrapSys(vfs, props);\n\tbootstrapDev(vfs);\n\tbootstrapUsr(vfs);\n\tbootstrapVar(vfs);\n\tbootstrapBin(vfs);\n\tbootstrapTmp(vfs);\n\tbootstrapRoot(vfs);\n\tbootstrapMisc(vfs);\n\trefreshProc(vfs, props, hostname, shellStartTime, []);\n\tsyncEtcPasswd(vfs, users);\n}\n", "export type PerfLogger = {\n\tenabled: boolean;\n\tmark: (label: string) => void;\n\tdone: (label?: string) => void;\n};\n\nfunction isTruthyEnv(value: string | undefined): boolean {\n\treturn value === \"1\" || value === \"true\";\n}\n\nfunction nowMs(): number {\n\tif (\n\t\ttypeof performance !== \"undefined\" &&\n\t\ttypeof performance.now === \"function\"\n\t) {\n\t\treturn performance.now();\n\t}\n\n\treturn Date.now();\n}\n\nexport function isPerfLoggingEnabled(): boolean {\n\treturn (\n\t\tisTruthyEnv(process.env.DEV_MODE) || isTruthyEnv(process.env.RENDER_PERF)\n\t);\n}\n\nexport function createPerfLogger(scope: string): PerfLogger {\n\tconst enabled = isPerfLoggingEnabled();\n\tif (!enabled) {\n\t\treturn {\n\t\t\tenabled,\n\t\t\tmark: () => undefined,\n\t\t\tdone: () => undefined,\n\t\t};\n\t}\n\n\tconst startedAt = nowMs();\n\n\tconst mark = (label: string): void => {\n\t\tconst elapsedMs = nowMs() - startedAt;\n\t\tconsole.log(`[perf][${scope}] ${label}: ${elapsedMs.toFixed(1)}ms`);\n\t};\n\n\tconst done = (label = \"done\"): void => {\n\t\tmark(label);\n\t};\n\n\treturn {\n\t\tenabled,\n\t\tmark,\n\t\tdone,\n\t};\n}\n\nexport async function withPerf<T>(\n\tscope: string,\n\tlabel: string,\n\twork: () => Promise<T>,\n): Promise<T> {\n\tconst perf = createPerfLogger(scope);\n\tif (!perf.enabled) {\n\t\treturn work();\n\t}\n\n\tperf.mark(`${label}:start`);\n\ttry {\n\t\treturn await work();\n\t} finally {\n\t\tperf.done(`${label}:done`);\n\t}\n}\n", "import { EventEmitter } from \"node:events\";\nimport * as fsSync from \"node:fs\";\nimport * as path from \"node:path\";\nimport { gunzipSync, gzipSync } from \"node:zlib\";\nimport type {\n\tInternalDirectoryNode,\n\tInternalFileNode,\n\tInternalNode,\n} from \"./internalTypes\";\nimport { decodeVfs, encodeVfs, isBinarySnapshot } from \"./binaryPack\";\nimport { getNode, getParentDirectory, normalizePath } from \"./path\";\nimport type {\n\tRemoveOptions,\n\tVfsNodeStats,\n\tVfsSnapshot,\n\tVfsSnapshotDirectoryNode,\n\tVfsSnapshotFileNode,\n\tVfsSnapshotNode,\n\tWriteFileOptions,\n} from \"../types/vfs\";\n\n// \u2500\u2500 Persistence options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * \"memory\" \u2014 pure in-memory, no disk I/O (default).\n *\n * \"fs\" \u2014 mirrors the VFS tree to a directory on the host filesystem.\n * `snapshotPath` must be set to the directory where the binary\n * snapshot file will be read/written (`vfs-snapshot.vfsb`).\n */\nexport type VfsPersistenceMode = \"memory\" | \"fs\";\n\nexport interface VfsOptions {\n\t/**\n\t * Persistence mode.\n\t * - `\"memory\"` (default): no disk access, snapshot via `toSnapshot()`.\n\t * - `\"fs\"`: auto-save JSON snapshot to `snapshotPath` on every\n\t * `flushMirror()` call, and restore from it on `restoreMirror()`.\n\t */\n\tmode?: VfsPersistenceMode;\n\t/**\n\t * Directory used by `\"fs\"` mode.\n\t * The snapshot file will be written to `<snapshotPath>/vfs-snapshot.json`.\n\t * Required when `mode` is `\"fs\"`.\n\t */\n\tsnapshotPath?: string;\n}\n\n// \u2500\u2500 VirtualFileSystem \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * In-memory virtual filesystem with optional JSON-snapshot persistence.\n *\n * **Memory mode** (default) \u2014 all state lives in a fast recursive tree.\n * Use `toSnapshot()` / `fromSnapshot()` / `importSnapshot()` for serialisation.\n *\n * **FS mode** \u2014 same in-memory tree, but `restoreMirror()` loads a binary\n * snapshot from disk and `flushMirror()` writes it back. This gives you\n * persistent VFS state across process restarts without any real POSIX filesystem\n * semantics leaking through.\n *\n * @example\n * ```ts\n * // Pure in-memory (default)\n * const vfs = new VirtualFileSystem();\n *\n * // With disk persistence\n * const vfs = new VirtualFileSystem({ mode: \"fs\", snapshotPath: \"./data\" });\n * await vfs.restoreMirror(); // load from disk (no-op if no snapshot yet)\n * // ... use vfs ...\n * await vfs.flushMirror(); // persist to disk\n * ```\n */\nclass VirtualFileSystem extends EventEmitter {\n\tprivate root: InternalDirectoryNode;\n\tprivate readonly mode: VfsPersistenceMode;\n\tprivate readonly snapshotFile: string | null;\n\n\tconstructor(options: VfsOptions = {}) {\n\t\tsuper();\n\t\tthis.mode = options.mode ?? \"memory\";\n\t\tif (this.mode === \"fs\") {\n\t\t\tif (!options.snapshotPath) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'VirtualFileSystem: \"snapshotPath\" is required when mode is \"fs\".',\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.snapshotFile = path.resolve(\n\t\t\t\toptions.snapshotPath,\n\t\t\t\t\"vfs-snapshot.vfsb\",\n\t\t\t);\n\t\t} else {\n\t\t\tthis.snapshotFile = null;\n\t\t}\n\t\tthis.root = this.makeDir(\"\", 0o755);\n\t}\n\n\t// \u2500\u2500 Internal helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\tprivate makeDir(name: string, mode: number): InternalDirectoryNode {\n\t\tconst now = new Date();\n\t\treturn {\n\t\t\ttype: \"directory\",\n\t\t\tname,\n\t\t\tmode,\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t\tchildren: new Map(),\n\t\t};\n\t}\n\n\tprivate makeFile(\n\t\tname: string,\n\t\tcontent: Buffer,\n\t\tmode: number,\n\t\tcompressed: boolean,\n\t): InternalFileNode {\n\t\tconst now = new Date();\n\t\treturn {\n\t\t\ttype: \"file\",\n\t\t\tname,\n\t\t\tcontent,\n\t\t\tmode,\n\t\t\tcompressed,\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t};\n\t}\n\n\tprivate mkdirRecursive(targetPath: string, mode: number): void {\n\t\tconst normalized = normalizePath(targetPath);\n\t\tif (normalized === \"/\") return;\n\t\tconst parts = normalized.split(\"/\").filter(Boolean);\n\t\tlet current = this.root;\n\t\tlet builtPath = \"\";\n\t\tfor (const part of parts) {\n\t\t\tbuiltPath += `/${part}`;\n\t\t\tlet child = current.children.get(part);\n\t\t\tif (!child) {\n\t\t\t\tchild = this.makeDir(part, mode);\n\t\t\t\tcurrent.children.set(part, child);\n\t\t\t\tthis.emit(\"dir:create\", { path: builtPath, mode });\n\t\t\t} else if (child.type !== \"directory\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Cannot create directory '${builtPath}': path is a file.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcurrent = child as InternalDirectoryNode;\n\t\t}\n\t}\n\n\t// \u2500\u2500 Persistence \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\t/**\n\t * In `\"fs\"` mode: reads the binary snapshot (`vfs-snapshot.vfsb`) from disk.\n\t * Automatically falls back to legacy JSON format for backward compatibility.\n\t * Silently succeeds when the snapshot file does not exist yet.\n\t *\n\t * In `\"memory\"` mode: no-op (kept for API compatibility).\n\t */\n\tpublic async restoreMirror(): Promise<void> {\n\t\tif (this.mode !== \"fs\" || !this.snapshotFile) return;\n\n\t\tif (!fsSync.existsSync(this.snapshotFile)) return;\n\n\t\ttry {\n\t\t\tconst raw = fsSync.readFileSync(this.snapshotFile);\n\t\t\tif (isBinarySnapshot(raw)) {\n\t\t\t\t// Fast binary format (current)\n\t\t\t\tthis.root = decodeVfs(raw);\n\t\t\t} else {\n\t\t\t\t// Legacy JSON fallback \u2014 auto-migrates on next flushMirror()\n\t\t\t\tconst snapshot: VfsSnapshot = JSON.parse(raw.toString(\"utf8\"));\n\t\t\t\tthis.root = this.deserializeDir(snapshot.root, \"\");\n\t\t\t\tconsole.info(\n\t\t\t\t\t\"[VirtualFileSystem] Migrating legacy JSON snapshot to binary format.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.emit(\"snapshot:restore\", { path: this.snapshotFile });\n\t\t} catch (err) {\n\t\t\t// Corrupt or unreadable snapshot \u2014 start fresh and warn\n\t\t\tconsole.warn(\n\t\t\t\t`[VirtualFileSystem] Could not restore snapshot from ${this.snapshotFile}:`,\n\t\t\t\terr instanceof Error ? err.message : String(err),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * In `\"fs\"` mode: serialises the in-memory tree to a binary snapshot on disk\n\t * (`vfs-snapshot.vfsb`). ~27% smaller and significantly faster than JSON+base64.\n\t * The directory is created if it does not exist.\n\t *\n\t * In `\"memory\"` mode: emits `\"mirror:flush\"` and returns (no disk write).\n\t */\n\tpublic async flushMirror(): Promise<void> {\n\t\tif (this.mode !== \"fs\" || !this.snapshotFile) {\n\t\t\tthis.emit(\"mirror:flush\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst dir = path.dirname(this.snapshotFile);\n\t\tfsSync.mkdirSync(dir, { recursive: true });\n\t\tconst binary = encodeVfs(this.root);\n\t\tfsSync.writeFileSync(this.snapshotFile, binary);\n\t\tthis.emit(\"mirror:flush\", { path: this.snapshotFile });\n\t}\n\n\t/** Returns the current persistence mode. */\n\tpublic getMode(): VfsPersistenceMode {\n\t\treturn this.mode;\n\t}\n\n\t/** Returns the snapshot file path used in `\"fs\"` mode, or `null`. */\n\tpublic getSnapshotPath(): string | null {\n\t\treturn this.snapshotFile;\n\t}\n\n\t// \u2500\u2500 Public filesystem API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\t/** Creates a directory (and any missing parents). */\n\tpublic mkdir(targetPath: string, mode: number = 0o755): void {\n\t\tconst normalized = normalizePath(targetPath);\n\t\tconst existing = (() => {\n\t\t\ttry {\n\t\t\t\treturn getNode(this.root, normalized);\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t})();\n\t\tif (existing && existing.type !== \"directory\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot create directory '${normalized}': path is a file.`,\n\t\t\t);\n\t\t}\n\t\tthis.mkdirRecursive(normalized, mode);\n\t}\n\n\t/**\n\t * Writes UTF-8 text or binary content into a file.\n\t * Parent directories are created when missing.\n\t */\n\tpublic writeFile(\n\t\ttargetPath: string,\n\t\tcontent: string | Buffer,\n\t\toptions: WriteFileOptions = {},\n\t): void {\n\t\tconst normalized = normalizePath(targetPath);\n\t\tconst { parent, name } = getParentDirectory(\n\t\t\tthis.root,\n\t\t\tnormalized,\n\t\t\ttrue,\n\t\t\t(p) => this.mkdirRecursive(p, 0o755),\n\t\t);\n\n\t\tconst existing = parent.children.get(name);\n\t\tif (existing?.type === \"directory\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot write file '${normalized}': path is a directory.`,\n\t\t\t);\n\t\t}\n\n\t\tconst rawContent = Buffer.isBuffer(content)\n\t\t\t? content\n\t\t\t: Buffer.from(content, \"utf8\");\n\t\tconst shouldCompress = options.compress ?? false;\n\t\tconst storedContent = shouldCompress ? gzipSync(rawContent) : rawContent;\n\t\tconst mode = options.mode ?? 0o644;\n\n\t\tif (existing) {\n\t\t\tconst f = existing as InternalFileNode;\n\t\t\tf.content = storedContent;\n\t\t\tf.compressed = shouldCompress;\n\t\t\tf.mode = mode;\n\t\t\tf.updatedAt = new Date();\n\t\t} else {\n\t\t\tparent.children.set(\n\t\t\t\tname,\n\t\t\t\tthis.makeFile(name, storedContent, mode, shouldCompress),\n\t\t\t);\n\t\t}\n\n\t\tthis.emit(\"file:write\", { path: normalized, size: storedContent.length });\n\t}\n\n\t/**\n\t * Reads file content as a UTF-8 string.\n\t * Gzip-compressed files are transparently decompressed.\n\t */\n\tpublic readFile(targetPath: string): string {\n\t\tconst normalized = normalizePath(targetPath);\n\t\tconst node = getNode(this.root, normalized);\n\t\tif (node.type !== \"file\") {\n\t\t\tthrow new Error(`Cannot read '${targetPath}': not a file.`);\n\t\t}\n\t\tconst f = node as InternalFileNode;\n\t\tconst raw = f.compressed ? gunzipSync(f.content) : f.content;\n\t\tthis.emit(\"file:read\", { path: normalized, size: raw.length });\n\t\treturn raw.toString(\"utf8\");\n\t}\n\n\t/** Reads file content as a Buffer (decompresses if needed). */\n\tpublic readFileRaw(targetPath: string): Buffer {\n\t\tconst normalized = normalizePath(targetPath);\n\t\tconst node = getNode(this.root, normalized);\n\t\tif (node.type !== \"file\") {\n\t\t\tthrow new Error(`Cannot read '${targetPath}': not a file.`);\n\t\t}\n\t\tconst f = node as InternalFileNode;\n\t\tconst raw = f.compressed ? gunzipSync(f.content) : f.content;\n\t\tthis.emit(\"file:read\", { path: normalized, size: raw.length });\n\t\treturn raw;\n\t}\n\n\t/** Returns true when a file or directory exists at path. */\n\tpublic exists(targetPath: string): boolean {\n\t\ttry {\n\t\t\tgetNode(this.root, normalizePath(targetPath));\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/** Updates mode bits on a node. */\n\tpublic chmod(targetPath: string, mode: number): void {\n\t\tgetNode(this.root, normalizePath(targetPath)).mode = mode;\n\t}\n\n\t/** Returns metadata for a file or directory. */\n\tpublic stat(targetPath: string): VfsNodeStats {\n\t\tconst normalized = normalizePath(targetPath);\n\t\tconst node = getNode(this.root, normalized);\n\t\tconst name = normalized === \"/\" ? \"\" : path.posix.basename(normalized);\n\t\tif (node.type === \"file\") {\n\t\t\tconst f = node as InternalFileNode;\n\t\t\treturn {\n\t\t\t\ttype: \"file\",\n\t\t\t\tname,\n\t\t\t\tpath: normalized,\n\t\t\t\tmode: f.mode,\n\t\t\t\tcreatedAt: f.createdAt,\n\t\t\t\tupdatedAt: f.updatedAt,\n\t\t\t\tcompressed: f.compressed,\n\t\t\t\tsize: f.content.length,\n\t\t\t};\n\t\t}\n\t\tconst d = node as InternalDirectoryNode;\n\t\treturn {\n\t\t\ttype: \"directory\",\n\t\t\tname,\n\t\t\tpath: normalized,\n\t\t\tmode: d.mode,\n\t\t\tcreatedAt: d.createdAt,\n\t\t\tupdatedAt: d.updatedAt,\n\t\t\tchildrenCount: d.children.size,\n\t\t};\n\t}\n\n\t/** Lists direct children names of a directory (sorted). */\n\tpublic list(dirPath: string = \"/\"): string[] {\n\t\tconst normalized = normalizePath(dirPath);\n\t\tconst node = getNode(this.root, normalized);\n\t\tif (node.type !== \"directory\") {\n\t\t\tthrow new Error(`Cannot list '${dirPath}': not a directory.`);\n\t\t}\n\t\treturn Array.from((node as InternalDirectoryNode).children.keys()).sort();\n\t}\n\n\t/** Renders ASCII tree view of a directory hierarchy. */\n\tpublic tree(dirPath: string = \"/\"): string {\n\t\tconst normalized = normalizePath(dirPath);\n\t\tconst node = getNode(this.root, normalized);\n\t\tif (node.type !== \"directory\") {\n\t\t\tthrow new Error(`Cannot render tree for '${dirPath}': not a directory.`);\n\t\t}\n\t\tconst label = dirPath === \"/\" ? \"/\" : path.posix.basename(normalized);\n\t\treturn this.renderTreeLines(node as InternalDirectoryNode, label);\n\t}\n\n\tprivate renderTreeLines(dir: InternalDirectoryNode, label: string): string {\n\t\tconst lines = [label];\n\t\tconst entries = Array.from(dir.children.keys()).sort();\n\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\tconst name = entries[i]!;\n\t\t\tconst child = dir.children.get(name)!;\n\t\t\tconst isLast = i === entries.length - 1;\n\t\t\tconst connector = isLast ? \"\u2514\u2500\u2500 \" : \"\u251C\u2500\u2500 \";\n\t\t\tconst nextPrefix = isLast ? \" \" : \"\u2502 \";\n\t\t\tlines.push(`${connector}${name}`);\n\t\t\tif (child.type === \"directory\") {\n\t\t\t\tconst sub = this.renderTreeLines(child as InternalDirectoryNode, \"\")\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.slice(1)\n\t\t\t\t\t.map((l) => `${nextPrefix}${l}`);\n\t\t\t\tlines.push(...sub);\n\t\t\t}\n\t\t}\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\t/** Computes total stored bytes under a path. */\n\tpublic getUsageBytes(targetPath: string = \"/\"): number {\n\t\treturn this.computeUsage(getNode(this.root, normalizePath(targetPath)));\n\t}\n\n\tprivate computeUsage(node: InternalNode): number {\n\t\tif (node.type === \"file\") return (node as InternalFileNode).content.length;\n\t\tlet total = 0;\n\t\tfor (const child of (node as InternalDirectoryNode).children.values()) {\n\t\t\ttotal += this.computeUsage(child);\n\t\t}\n\t\treturn total;\n\t}\n\n\t/** Compresses a file's content with gzip in place. */\n\tpublic compressFile(targetPath: string): void {\n\t\tconst node = getNode(this.root, normalizePath(targetPath));\n\t\tif (node.type !== \"file\")\n\t\t\tthrow new Error(`Cannot compress '${targetPath}': not a file.`);\n\t\tconst f = node as InternalFileNode;\n\t\tif (!f.compressed) {\n\t\t\tf.content = gzipSync(f.content);\n\t\t\tf.compressed = true;\n\t\t\tf.updatedAt = new Date();\n\t\t}\n\t}\n\n\t/** Decompresses a gzip-compressed file in place. */\n\tpublic decompressFile(targetPath: string): void {\n\t\tconst node = getNode(this.root, normalizePath(targetPath));\n\t\tif (node.type !== \"file\")\n\t\t\tthrow new Error(`Cannot decompress '${targetPath}': not a file.`);\n\t\tconst f = node as InternalFileNode;\n\t\tif (f.compressed) {\n\t\t\tf.content = gunzipSync(f.content);\n\t\t\tf.compressed = false;\n\t\t\tf.updatedAt = new Date();\n\t\t}\n\t}\n\n\t/**\n\t * Creates a symbolic link.\n\t * The link node is stored with mode `0o120777` (POSIX symlink convention).\n\t */\n\tpublic symlink(targetPath: string, linkPath: string): void {\n\t\tconst normalizedLink = normalizePath(linkPath);\n\t\tconst normalizedTarget = targetPath.startsWith(\"/\")\n\t\t\t? normalizePath(targetPath)\n\t\t\t: targetPath;\n\t\tconst { parent, name } = getParentDirectory(\n\t\t\tthis.root,\n\t\t\tnormalizedLink,\n\t\t\ttrue,\n\t\t\t(p) => this.mkdirRecursive(p, 0o755),\n\t\t);\n\t\tconst symNode: InternalFileNode = {\n\t\t\ttype: \"file\",\n\t\t\tname,\n\t\t\tcontent: Buffer.from(normalizedTarget, \"utf8\"),\n\t\t\tmode: 0o120777,\n\t\t\tcompressed: false,\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t};\n\t\tparent.children.set(name, symNode);\n\t\tthis.emit(\"symlink:create\", {\n\t\t\tlink: normalizedLink,\n\t\t\ttarget: normalizedTarget,\n\t\t});\n\t}\n\n\t/** Returns true when the path is a symbolic link node. */\n\tpublic isSymlink(targetPath: string): boolean {\n\t\ttry {\n\t\t\tconst node = getNode(this.root, normalizePath(targetPath));\n\t\t\treturn node.type === \"file\" && node.mode === 0o120777;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Resolves a symlink chain up to `maxDepth` hops.\n\t * Throws when the chain is too long (circular links).\n\t */\n\tpublic resolveSymlink(linkPath: string, maxDepth = 8): string {\n\t\tlet current = normalizePath(linkPath);\n\t\tfor (let depth = 0; depth < maxDepth; depth++) {\n\t\t\ttry {\n\t\t\t\tconst node = getNode(this.root, current);\n\t\t\t\tif (node.type === \"file\" && node.mode === 0o120777) {\n\t\t\t\t\tconst target = (node as InternalFileNode).content.toString(\"utf8\");\n\t\t\t\t\tcurrent = target.startsWith(\"/\")\n\t\t\t\t\t\t? target\n\t\t\t\t\t\t: normalizePath(\n\t\t\t\t\t\t\t\tpath.posix.join(path.posix.dirname(current), target),\n\t\t\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn current;\n\t\t}\n\t\tthrow new Error(`Too many levels of symbolic links: ${linkPath}`);\n\t}\n\n\t/** Removes a file or directory node. */\n\tpublic remove(targetPath: string, options: RemoveOptions = {}): void {\n\t\tconst normalized = normalizePath(targetPath);\n\t\tif (normalized === \"/\") throw new Error(\"Cannot remove root directory.\");\n\t\tconst node = getNode(this.root, normalized);\n\t\tif (node.type === \"directory\") {\n\t\t\tconst dir = node as InternalDirectoryNode;\n\t\t\tif (!options.recursive && dir.children.size > 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Directory '${normalized}' is not empty. Use recursive option.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst { parent, name } = getParentDirectory(\n\t\t\tthis.root,\n\t\t\tnormalized,\n\t\t\tfalse,\n\t\t\t() => {},\n\t\t);\n\t\tparent.children.delete(name);\n\t\tthis.emit(\"node:remove\", { path: normalized });\n\t}\n\n\t/** Moves or renames a node. */\n\tpublic move(fromPath: string, toPath: string): void {\n\t\tconst fromNormalized = normalizePath(fromPath);\n\t\tconst toNormalized = normalizePath(toPath);\n\t\tif (fromNormalized === \"/\" || toNormalized === \"/\") {\n\t\t\tthrow new Error(\"Cannot move root directory.\");\n\t\t}\n\t\tconst node = getNode(this.root, fromNormalized);\n\t\tif (this.exists(toNormalized)) {\n\t\t\tthrow new Error(`Destination '${toNormalized}' already exists.`);\n\t\t}\n\t\tthis.mkdirRecursive(path.posix.dirname(toNormalized), 0o755);\n\t\tconst { parent: destParent, name: destName } = getParentDirectory(\n\t\t\tthis.root,\n\t\t\ttoNormalized,\n\t\t\tfalse,\n\t\t\t() => {},\n\t\t);\n\t\tconst { parent: srcParent, name: srcName } = getParentDirectory(\n\t\t\tthis.root,\n\t\t\tfromNormalized,\n\t\t\tfalse,\n\t\t\t() => {},\n\t\t);\n\t\tsrcParent.children.delete(srcName);\n\t\tnode.name = destName;\n\t\tdestParent.children.set(destName, node);\n\t}\n\n\t// \u2500\u2500 Snapshot serialisation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\t/**\n\t * Exports the entire filesystem as a JSON-serialisable snapshot.\n\t *\n\t * Works regardless of the persistence mode. Useful for test fixtures,\n\t * manual backups, or passing VFS state between processes.\n\t */\n\tpublic toSnapshot(): VfsSnapshot {\n\t\treturn { root: this.serializeDir(this.root) };\n\t}\n\n\tprivate serializeDir(dir: InternalDirectoryNode): VfsSnapshotDirectoryNode {\n\t\tconst children: VfsSnapshotNode[] = [];\n\t\tfor (const child of dir.children.values()) {\n\t\t\tchildren.push(\n\t\t\t\tchild.type === \"file\"\n\t\t\t\t\t? this.serializeFile(child as InternalFileNode)\n\t\t\t\t\t: this.serializeDir(child as InternalDirectoryNode),\n\t\t\t);\n\t\t}\n\t\treturn {\n\t\t\ttype: \"directory\",\n\t\t\tname: dir.name,\n\t\t\tmode: dir.mode,\n\t\t\tcreatedAt: dir.createdAt.toISOString(),\n\t\t\tupdatedAt: dir.updatedAt.toISOString(),\n\t\t\tchildren,\n\t\t};\n\t}\n\n\tprivate serializeFile(file: InternalFileNode): VfsSnapshotFileNode {\n\t\treturn {\n\t\t\ttype: \"file\",\n\t\t\tname: file.name,\n\t\t\tmode: file.mode,\n\t\t\tcreatedAt: file.createdAt.toISOString(),\n\t\t\tupdatedAt: file.updatedAt.toISOString(),\n\t\t\tcompressed: file.compressed,\n\t\t\tcontentBase64: file.content.toString(\"base64\"),\n\t\t};\n\t}\n\n\t/**\n\t * Creates a new `VirtualFileSystem` instance (memory mode) from a snapshot.\n\t *\n\t * @example\n\t * ```ts\n\t * const vfs = VirtualFileSystem.fromSnapshot(savedSnapshot);\n\t * ```\n\t */\n\tpublic static fromSnapshot(snapshot: VfsSnapshot): VirtualFileSystem {\n\t\tconst vfs = new VirtualFileSystem();\n\t\tvfs.root = vfs.deserializeDir(snapshot.root, \"\");\n\t\treturn vfs;\n\t}\n\n\t/**\n\t * Replaces the current filesystem state with the content of a snapshot.\n\t * The persistence mode is preserved.\n\t *\n\t * @example\n\t * ```ts\n\t * vfs.importSnapshot(savedSnapshot);\n\t * ```\n\t */\n\tpublic importSnapshot(snapshot: VfsSnapshot): void {\n\t\tthis.root = this.deserializeDir(snapshot.root, \"\");\n\t\tthis.emit(\"snapshot:import\");\n\t}\n\n\tprivate deserializeDir(\n\t\tsnap: VfsSnapshotDirectoryNode,\n\t\tname: string,\n\t): InternalDirectoryNode {\n\t\tconst dir: InternalDirectoryNode = {\n\t\t\ttype: \"directory\",\n\t\t\tname,\n\t\t\tmode: snap.mode,\n\t\t\tcreatedAt: new Date(snap.createdAt),\n\t\t\tupdatedAt: new Date(snap.updatedAt),\n\t\t\tchildren: new Map(),\n\t\t};\n\t\tfor (const child of snap.children) {\n\t\t\tif (child.type === \"file\") {\n\t\t\t\tconst f = child as VfsSnapshotFileNode;\n\t\t\t\tdir.children.set(f.name, {\n\t\t\t\t\ttype: \"file\",\n\t\t\t\t\tname: f.name,\n\t\t\t\t\tmode: f.mode,\n\t\t\t\t\tcreatedAt: new Date(f.createdAt),\n\t\t\t\t\tupdatedAt: new Date(f.updatedAt),\n\t\t\t\t\tcompressed: f.compressed,\n\t\t\t\t\tcontent: Buffer.from(f.contentBase64, \"base64\"),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst sub = this.deserializeDir(\n\t\t\t\t\tchild as VfsSnapshotDirectoryNode,\n\t\t\t\t\tchild.name,\n\t\t\t\t);\n\t\t\t\tdir.children.set(child.name, sub);\n\t\t\t}\n\t\t}\n\t\treturn dir;\n\t}\n}\n\nexport default VirtualFileSystem;\n", "/**\n * Binary serialisation format for VirtualFileSystem snapshots.\n *\n * Replaces the JSON+base64 approach. No external dependencies.\n *\n * Wire format (little-endian throughout):\n *\n * File header:\n * [4] magic = 0x56 0x46 0x53 0x21 (\"VFS!\")\n * [1] version = 0x01\n *\n * Node (recursive):\n * [1] type = 0x01 (file) | 0x02 (directory)\n * [2] name length (uint16)\n * [N] name bytes (utf8)\n * [4] mode (uint32)\n * [8] createdAt ms (float64)\n * [8] updatedAt ms (float64)\n *\n * File node extra:\n * [1] compressed flag (0x00 | 0x01)\n * [4] content length (uint32)\n * [N] content bytes (raw \u2014 no base64)\n *\n * Directory node extra:\n * [4] children count (uint32)\n * [N] children nodes (recursive)\n *\n * Total overhead vs JSON+base64 for 1 MB of file data:\n * JSON+base64 : ~1.37 MB (base64 33% bloat) + JSON string wrapping\n * Binary pack : ~1.00 MB + ~40 bytes/node header \u2192 ~27% smaller, no string parsing\n */\n\nimport type {\n\tInternalDirectoryNode,\n\tInternalFileNode,\n\tInternalNode,\n} from \"./internalTypes\";\n\nconst MAGIC = Buffer.from([0x56, 0x46, 0x53, 0x21]); // \"VFS!\"\nconst VERSION = 0x01;\nconst TYPE_FILE = 0x01;\nconst TYPE_DIR = 0x02;\n\n// \u2500\u2500 Encoder \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nclass Encoder {\n\tprivate chunks: Buffer[] = [];\n\n\twrite(buf: Buffer): void {\n\t\tthis.chunks.push(buf);\n\t}\n\n\twriteUint8(n: number): void {\n\t\tconst b = Buffer.allocUnsafe(1);\n\t\tb.writeUInt8(n, 0);\n\t\tthis.chunks.push(b);\n\t}\n\n\twriteUint16(n: number): void {\n\t\tconst b = Buffer.allocUnsafe(2);\n\t\tb.writeUInt16LE(n, 0);\n\t\tthis.chunks.push(b);\n\t}\n\n\twriteUint32(n: number): void {\n\t\tconst b = Buffer.allocUnsafe(4);\n\t\tb.writeUInt32LE(n, 0);\n\t\tthis.chunks.push(b);\n\t}\n\n\twriteFloat64(n: number): void {\n\t\tconst b = Buffer.allocUnsafe(8);\n\t\tb.writeDoubleBE(n, 0);\n\t\tthis.chunks.push(b);\n\t}\n\n\twriteString(s: string): void {\n\t\tconst encoded = Buffer.from(s, \"utf8\");\n\t\tthis.writeUint16(encoded.length);\n\t\tthis.chunks.push(encoded);\n\t}\n\n\twriteBytes(bytes: Buffer): void {\n\t\tthis.writeUint32(bytes.length);\n\t\tthis.chunks.push(bytes);\n\t}\n\n\ttoBuffer(): Buffer {\n\t\treturn Buffer.concat(this.chunks);\n\t}\n}\n\nfunction encodeNode(enc: Encoder, node: InternalNode): void {\n\tif (node.type === \"file\") {\n\t\tconst f = node as InternalFileNode;\n\t\tenc.writeUint8(TYPE_FILE);\n\t\tenc.writeString(f.name);\n\t\tenc.writeUint32(f.mode);\n\t\tenc.writeFloat64(f.createdAt.getTime());\n\t\tenc.writeFloat64(f.updatedAt.getTime());\n\t\tenc.writeUint8(f.compressed ? 0x01 : 0x00);\n\t\tenc.writeBytes(f.content);\n\t} else {\n\t\tconst d = node as InternalDirectoryNode;\n\t\tenc.writeUint8(TYPE_DIR);\n\t\tenc.writeString(d.name);\n\t\tenc.writeUint32(d.mode);\n\t\tenc.writeFloat64(d.createdAt.getTime());\n\t\tenc.writeFloat64(d.updatedAt.getTime());\n\t\tconst children = Array.from(d.children.values());\n\t\tenc.writeUint32(children.length);\n\t\tfor (const child of children) encodeNode(enc, child);\n\t}\n}\n\n/**\n * Serialise an in-memory VFS root to a compact binary Buffer.\n * No base64, no JSON. ~27% smaller than the JSON+base64 format for typical VFS trees.\n */\nexport function encodeVfs(root: InternalDirectoryNode): Buffer {\n\tconst enc = new Encoder();\n\tenc.write(MAGIC);\n\tenc.writeUint8(VERSION);\n\tencodeNode(enc, root);\n\treturn enc.toBuffer();\n}\n\n// \u2500\u2500 Decoder \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nclass Decoder {\n\tprivate pos = 0;\n\tconstructor(private readonly buf: Buffer) {}\n\n\treadUint8(): number {\n\t\treturn this.buf.readUInt8(this.pos++);\n\t}\n\n\treadUint16(): number {\n\t\tconst v = this.buf.readUInt16LE(this.pos);\n\t\tthis.pos += 2;\n\t\treturn v;\n\t}\n\n\treadUint32(): number {\n\t\tconst v = this.buf.readUInt32LE(this.pos);\n\t\tthis.pos += 4;\n\t\treturn v;\n\t}\n\n\treadFloat64(): number {\n\t\tconst v = this.buf.readDoubleBE(this.pos);\n\t\tthis.pos += 8;\n\t\treturn v;\n\t}\n\n\treadString(): string {\n\t\tconst len = this.readUint16();\n\t\tconst s = this.buf.toString(\"utf8\", this.pos, this.pos + len);\n\t\tthis.pos += len;\n\t\treturn s;\n\t}\n\n\treadBytes(): Buffer {\n\t\tconst len = this.readUint32();\n\t\tconst b = this.buf.slice(this.pos, this.pos + len);\n\t\tthis.pos += len;\n\t\treturn b;\n\t}\n\n\tremaining(): number {\n\t\treturn this.buf.length - this.pos;\n\t}\n}\n\nfunction decodeNode(dec: Decoder): InternalNode {\n\tconst type = dec.readUint8();\n\tconst name = dec.readString();\n\tconst mode = dec.readUint32();\n\tconst createdAt = new Date(dec.readFloat64());\n\tconst updatedAt = new Date(dec.readFloat64());\n\n\tif (type === TYPE_FILE) {\n\t\tconst compressed = dec.readUint8() === 0x01;\n\t\tconst content = dec.readBytes();\n\t\treturn {\n\t\t\ttype: \"file\",\n\t\t\tname,\n\t\t\tmode,\n\t\t\tcreatedAt,\n\t\t\tupdatedAt,\n\t\t\tcompressed,\n\t\t\tcontent,\n\t\t} satisfies InternalFileNode;\n\t}\n\n\tif (type === TYPE_DIR) {\n\t\tconst count = dec.readUint32();\n\t\tconst children = new Map<string, InternalNode>();\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst child = decodeNode(dec);\n\t\t\tchildren.set(child.name, child);\n\t\t}\n\t\treturn {\n\t\t\ttype: \"directory\",\n\t\t\tname,\n\t\t\tmode,\n\t\t\tcreatedAt,\n\t\t\tupdatedAt,\n\t\t\tchildren,\n\t\t} satisfies InternalDirectoryNode;\n\t}\n\n\tthrow new Error(`[VFS binary] Unknown node type: 0x${type.toString(16)}`);\n}\n\n/**\n * Deserialise a binary Buffer produced by {@link encodeVfs} back into an\n * InternalDirectoryNode tree. Throws on magic/version mismatch or truncation.\n */\nexport function decodeVfs(buf: Buffer): InternalDirectoryNode {\n\tif (buf.length < 5) throw new Error(\"[VFS binary] Buffer too short\");\n\n\tconst magic = buf.slice(0, 4);\n\tif (!magic.equals(MAGIC)) {\n\t\tthrow new Error(\"[VFS binary] Invalid magic \u2014 not a VFS binary snapshot\");\n\t}\n\n\tconst dec = new Decoder(buf);\n\t// skip magic (4) + version (1)\n\tfor (let i = 0; i < 5; i++) dec.readUint8();\n\n\tconst root = decodeNode(dec);\n\tif (root.type !== \"directory\") {\n\t\tthrow new Error(\"[VFS binary] Root node must be a directory\");\n\t}\n\treturn root as InternalDirectoryNode;\n}\n\n/**\n * Returns true if `buf` looks like a VFS binary snapshot (starts with magic bytes).\n * Used to auto-detect format when loading from disk.\n */\nexport function isBinarySnapshot(buf: Buffer): boolean {\n\treturn buf.length >= 4 && buf.slice(0, 4).equals(MAGIC);\n}\n", "import * as path from \"node:path\";\nimport type { InternalDirectoryNode, InternalNode } from \"./internalTypes\";\n\nexport function normalizePath(rawPath: string): string {\n\tif (!rawPath || rawPath.trim() === \"\") {\n\t\treturn \"/\";\n\t}\n\n\tconst normalized = path.posix.normalize(\n\t\trawPath.startsWith(\"/\") ? rawPath : `/${rawPath}`,\n\t);\n\treturn normalized === \"\" ? \"/\" : normalized;\n}\n\nexport function splitPath(normalizedPath: string): string[] {\n\treturn normalizedPath.split(\"/\").filter(Boolean);\n}\n\nexport function getNode(\n\troot: InternalDirectoryNode,\n\ttargetPath: string,\n): InternalNode {\n\tconst normalized = normalizePath(targetPath);\n\tif (normalized === \"/\") {\n\t\treturn root;\n\t}\n\n\tconst parts = splitPath(normalized);\n\tlet current: InternalNode = root;\n\n\tfor (const part of parts) {\n\t\tif (current.type !== \"directory\") {\n\t\t\tthrow new Error(`Path '${normalized}' does not exist.`);\n\t\t}\n\n\t\tconst next = current.children.get(part);\n\t\tif (!next) {\n\t\t\tthrow new Error(`Path '${normalized}' does not exist.`);\n\t\t}\n\t\tcurrent = next;\n\t}\n\n\treturn current;\n}\n\nexport function getParentDirectory(\n\troot: InternalDirectoryNode,\n\ttargetPath: string,\n\tcreateIfMissing: boolean,\n\tcreatePath: (pathToCreate: string) => void,\n): { parent: InternalDirectoryNode; name: string } {\n\tconst normalized = normalizePath(targetPath);\n\tif (normalized === \"/\") {\n\t\tthrow new Error(\"Root path has no parent directory.\");\n\t}\n\n\tconst parentPath = path.posix.dirname(normalized);\n\tconst name = path.posix.basename(normalized);\n\n\tif (!name) {\n\t\tthrow new Error(`Invalid path '${targetPath}'.`);\n\t}\n\n\tif (createIfMissing) {\n\t\tcreatePath(parentPath);\n\t}\n\n\tconst parentNode = getNode(root, parentPath);\n\tif (parentNode.type !== \"directory\") {\n\t\tthrow new Error(`Parent path '${parentPath}' is not a directory.`);\n\t}\n\n\treturn { parent: parentNode, name };\n}\n", "import type VirtualFileSystem from \"../VirtualFileSystem\";\nimport type { VirtualUserManager } from \"../VirtualUserManager\";\n\n// \u2500\u2500\u2500 types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * A single file entry written into the VFS when a package is installed.\n */\nexport interface PackageFile {\n\t/** Absolute VFS destination path (e.g. `\"/usr/bin/vim\"`). */\n\tpath: string;\n\t/** Text content to write. */\n\tcontent: string;\n\t/** POSIX mode bits (default `0o644`; use `0o755` for executables). */\n\tmode?: number;\n}\n\n/**\n * Metadata and behaviour definition for a single package in the registry.\n *\n * Used both for the built-in registry entries and for consumer-supplied custom\n * packages. `files` are written to the VFS on `install()`, and `onInstall` /\n * `onRemove` hooks allow arbitrary VFS mutations.\n */\nexport interface PackageDefinition {\n\t/** Package name \u2014 lowercase, no spaces (e.g. `\"vim\"`, `\"build-essential\"`). */\n\tname: string;\n\t/** Debian-style version string (e.g. `\"2:9.0.1378-2\"`). */\n\tversion: string;\n\t/** CPU architecture label (default `\"amd64\"`). */\n\tarchitecture?: string;\n\t/** Maintainer name and email shown in `apt show` output. */\n\tmaintainer?: string;\n\t/** Full package description. */\n\tdescription: string;\n\t/** Short one-line summary shown in `apt search` results. */\n\tshortDesc?: string;\n\t/** Installed disk usage in kilobytes (informational). */\n\tinstalledSizeKb?: number;\n\t/** Other package names that must be installed first (resolved recursively). */\n\tdepends?: string[];\n\t/** Repository section (e.g. `\"utils\"`, `\"net\"`, `\"editors\"`, `\"devel\"`). */\n\tsection?: string;\n\t/** Files to write into the VFS during installation. */\n\tfiles?: PackageFile[];\n\t/**\n\t * Hook called after all files are written.\n\t * Use to create directories, write config, or register shell commands.\n\t */\n\tonInstall?: (vfs: VirtualFileSystem, users: VirtualUserManager) => void;\n\t/** Hook called before VFS files are removed during uninstall. */\n\tonRemove?: (vfs: VirtualFileSystem) => void;\n}\n\n/**\n * Runtime record of an installed package, persisted to `/var/lib/dpkg/status`.\n */\nexport interface InstalledPackage {\n\t/** Package name. */\n\tname: string;\n\t/** Installed version string. */\n\tversion: string;\n\t/** CPU architecture. */\n\tarchitecture: string;\n\t/** Maintainer display string. */\n\tmaintainer: string;\n\t/** Full description. */\n\tdescription: string;\n\t/** Repository section. */\n\tsection: string;\n\t/** Installed disk usage in kilobytes. */\n\tinstalledSizeKb: number;\n\t/** ISO-8601 timestamp of when the package was installed. */\n\tinstalledAt: string;\n\t/** Absolute VFS paths written by this package (used by `dpkg -L`). */\n\tfiles: string[];\n}\n\n// \u2500\u2500\u2500 built-in package registry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PACKAGE_REGISTRY: PackageDefinition[] = [\n\t{\n\t\tname: \"vim\",\n\t\tversion: \"2:9.0.1378-2\",\n\t\tsection: \"editors\",\n\t\tdescription: \"Vi IMproved - enhanced vi editor\",\n\t\tshortDesc: \"Vi IMproved\",\n\t\tinstalledSizeKb: 3812,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/vim\",\n\t\t\t\tcontent:\n\t\t\t\t\t\"#!/bin/sh\\necho 'vim: use nano for editing in this environment'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/vi\",\n\t\t\t\tcontent: '#!/bin/sh\\nexec vim \"$@\"\\n',\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/share/doc/vim/README\",\n\t\t\t\tcontent: \"Vim editor \u2014 virtual package.\\n\",\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"git\",\n\t\tversion: \"1:2.39.2-1\",\n\t\tsection: \"vcs\",\n\t\tdescription: \"Fast, scalable, distributed revision control system\",\n\t\tshortDesc: \"fast distributed version control system\",\n\t\tinstalledSizeKb: 11240,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/git\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'git: virtual stub \u2014 no host access'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/share/doc/git/README.Debian\",\n\t\t\t\tcontent: \"Git virtual package for Fortune GNU/Linux.\\n\",\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"python3\",\n\t\tversion: \"3.11.2-1+b1\",\n\t\tsection: \"python\",\n\t\tdescription: \"Interactive high-level object-oriented language (version 3)\",\n\t\tshortDesc: \"interactive high-level object-oriented language\",\n\t\tinstalledSizeKb: 512,\n\t\tdepends: [\"python3-minimal\"],\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/python3\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'Python 3.11.2 (virtual)'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/python3.11\",\n\t\t\t\tcontent: '#!/bin/sh\\nexec python3 \"$@\"\\n',\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{ path: \"/usr/lib/python3.11/.keep\", content: \"\" },\n\t\t],\n\t},\n\t{\n\t\tname: \"python3-minimal\",\n\t\tversion: \"3.11.2-1+b1\",\n\t\tsection: \"python\",\n\t\tdescription: \"Minimal subset of the Python language (version 3)\",\n\t\tshortDesc: \"minimal subset of Python language\",\n\t\tinstalledSizeKb: 196,\n\t\tfiles: [{ path: \"/usr/lib/python3-minimal/.keep\", content: \"\" }],\n\t},\n\t{\n\t\tname: \"nodejs\",\n\t\tversion: \"18.19.0+dfsg-6\",\n\t\tsection: \"javascript\",\n\t\tdescription: \"Evented I/O for V8 javascript - runtime executable\",\n\t\tshortDesc: \"Node.js JavaScript runtime\",\n\t\tinstalledSizeKb: 15360,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/node\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'node v18.19.0 (virtual)'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/nodejs\",\n\t\t\t\tcontent: '#!/bin/sh\\nexec node \"$@\"\\n',\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/share/doc/nodejs/README\",\n\t\t\t\tcontent: \"Node.js virtual package.\\n\",\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"npm\",\n\t\tversion: \"9.2.0~ds1-2\",\n\t\tsection: \"javascript\",\n\t\tdescription: \"package manager for Node.js\",\n\t\tshortDesc: \"package manager for Node.js\",\n\t\tinstalledSizeKb: 9814,\n\t\tdepends: [\"nodejs\"],\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/npm\",\n\t\t\t\tcontent: '#!/bin/sh\\nexec builtin npm \"$@\"\\n',\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/npx\",\n\t\t\t\tcontent: '#!/bin/sh\\nexec builtin npx \"$@\"\\n',\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"curl\",\n\t\tversion: \"7.88.1-10+deb12u5\",\n\t\tsection: \"web\",\n\t\tdescription: \"command line tool for transferring data with URL syntax\",\n\t\tshortDesc: \"command line tool for transferring data\",\n\t\tinstalledSizeKb: 368,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/curl\",\n\t\t\t\tcontent: '#!/bin/sh\\nexec builtin curl \"$@\"\\n',\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"wget\",\n\t\tversion: \"1.21.3-1+b2\",\n\t\tsection: \"web\",\n\t\tdescription: \"Retrieves files from the web\",\n\t\tshortDesc: \"retrieves files from the web\",\n\t\tinstalledSizeKb: 952,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/wget\",\n\t\t\t\tcontent: '#!/bin/sh\\nexec builtin wget \"$@\"\\n',\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"htop\",\n\t\tversion: \"3.2.2-2\",\n\t\tsection: \"utils\",\n\t\tdescription: \"interactive processes viewer\",\n\t\tshortDesc: \"interactive process viewer\",\n\t\tinstalledSizeKb: 412,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/htop\",\n\t\t\t\tcontent: \"#!/bin/sh\\nexec builtin htop\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"openssh-client\",\n\t\tversion: \"1:9.2p1-2+deb12u2\",\n\t\tsection: \"net\",\n\t\tdescription: \"Secure Shell (SSH) client\",\n\t\tshortDesc: \"secure shell (SSH) client\",\n\t\tinstalledSizeKb: 4540,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/ssh\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'ssh: virtual stub'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/ssh-keygen\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'ssh-keygen: virtual stub'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/etc/ssh/ssh_config\",\n\t\t\t\tcontent: \"Host *\\n StrictHostKeyChecking ask\\n\",\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"openssh-server\",\n\t\tversion: \"1:9.2p1-2+deb12u2\",\n\t\tsection: \"net\",\n\t\tdescription: \"Secure Shell server (sshd)\",\n\t\tshortDesc: \"secure shell server\",\n\t\tinstalledSizeKb: 1732,\n\t\tdepends: [\"openssh-client\"],\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/sbin/sshd\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'sshd: virtual \u2014 server already running'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/etc/ssh/sshd_config\",\n\t\t\t\tcontent: \"Port 22\\nPermitRootLogin yes\\nPasswordAuthentication yes\\n\",\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"net-tools\",\n\t\tversion: \"2.10-0.1\",\n\t\tsection: \"net\",\n\t\tdescription: \"NET-3 networking toolkit (ifconfig, netstat, route)\",\n\t\tshortDesc: \"networking toolkit\",\n\t\tinstalledSizeKb: 988,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/ifconfig\",\n\t\t\t\tcontent:\n\t\t\t\t\t\"#!/bin/sh\\necho 'eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500'\\necho ' inet 10.0.0.2 netmask 255.255.255.0 broadcast 10.0.0.255'\\necho ' ether 02:42:0a:00:00:02 txqueuelen 0 (Ethernet)'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/netstat\",\n\t\t\t\tcontent:\n\t\t\t\t\t\"#!/bin/sh\\necho 'Active Internet connections (only servers)'\\necho 'Proto Recv-Q Send-Q Local Address Foreign Address State'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/route\",\n\t\t\t\tcontent:\n\t\t\t\t\t\"#!/bin/sh\\necho 'Kernel IP routing table'\\necho 'Destination Gateway Genmask Flags Metric Ref Use Iface'\\necho '0.0.0.0 10.0.0.1 0.0.0.0 UG 0 0 0 eth0'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"iputils-ping\",\n\t\tversion: \"3:20221126-1\",\n\t\tsection: \"net\",\n\t\tdescription: \"Tools to test the reachability of network hosts\",\n\t\tshortDesc: \"test reachability of network hosts\",\n\t\tinstalledSizeKb: 164,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/ping\",\n\t\t\t\tcontent: '#!/bin/sh\\nexec builtin ping \"$@\"\\n',\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"jq\",\n\t\tversion: \"1.6-2.1\",\n\t\tsection: \"utils\",\n\t\tdescription: \"Lightweight and flexible command-line JSON processor\",\n\t\tshortDesc: \"command-line JSON processor\",\n\t\tinstalledSizeKb: 296,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/jq\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'jq: virtual stub \u2014 pipe JSON here'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"build-essential\",\n\t\tversion: \"12.9\",\n\t\tsection: \"devel\",\n\t\tdescription: \"Informational list of build-essential packages\",\n\t\tshortDesc: \"build-essential meta-package\",\n\t\tinstalledSizeKb: 12,\n\t\tdepends: [\"gcc\", \"g++\", \"make\"],\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/share/doc/build-essential/README\",\n\t\t\t\tcontent: \"Build-essential virtual meta-package.\\n\",\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"gcc\",\n\t\tversion: \"4:12.2.0-3\",\n\t\tsection: \"devel\",\n\t\tdescription: \"GNU C compiler\",\n\t\tshortDesc: \"GNU C compiler\",\n\t\tinstalledSizeKb: 24448,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/gcc\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'gcc (Fortune GNU/Linux) 12.2.0 (virtual)'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/gcc-12\",\n\t\t\t\tcontent: '#!/bin/sh\\nexec gcc \"$@\"\\n',\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"g++\",\n\t\tversion: \"4:12.2.0-3\",\n\t\tsection: \"devel\",\n\t\tdescription: \"GNU C++ compiler\",\n\t\tshortDesc: \"GNU C++ compiler\",\n\t\tinstalledSizeKb: 1024,\n\t\tdepends: [\"gcc\"],\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/g++\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'g++ (Fortune GNU/Linux) 12.2.0 (virtual)'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"make\",\n\t\tversion: \"4.3-4.1\",\n\t\tsection: \"devel\",\n\t\tdescription: \"Utility for directing compilation\",\n\t\tshortDesc: \"build utility\",\n\t\tinstalledSizeKb: 504,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/make\",\n\t\t\t\tcontent:\n\t\t\t\t\t\"#!/bin/sh\\necho 'make: *** No targets specified and no makefile found. Stop.'\\nexit 2\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"less\",\n\t\tversion: \"590-2\",\n\t\tsection: \"text\",\n\t\tdescription: \"Pager program similar to more\",\n\t\tshortDesc: \"pager program\",\n\t\tinstalledSizeKb: 328,\n\t\tfiles: [\n\t\t\t{ path: \"/usr/bin/less\", content: '#!/bin/sh\\ncat \"$@\"\\n', mode: 0o755 },\n\t\t],\n\t},\n\t{\n\t\tname: \"unzip\",\n\t\tversion: \"6.0-28\",\n\t\tsection: \"utils\",\n\t\tdescription: \"De-archiver for .zip files\",\n\t\tshortDesc: \"de-archiver for .zip files\",\n\t\tinstalledSizeKb: 464,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/unzip\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'unzip: virtual stub'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"rsync\",\n\t\tversion: \"3.2.7-1\",\n\t\tsection: \"net\",\n\t\tdescription: \"Fast, versatile, remote (and local) file-copying tool\",\n\t\tshortDesc: \"fast remote file copy program\",\n\t\tinstalledSizeKb: 716,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/rsync\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'rsync: virtual stub'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"tmux\",\n\t\tversion: \"3.3a-3\",\n\t\tsection: \"utils\",\n\t\tdescription: \"Terminal multiplexer\",\n\t\tshortDesc: \"terminal multiplexer\",\n\t\tinstalledSizeKb: 812,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/tmux\",\n\t\t\t\tcontent:\n\t\t\t\t\t\"#!/bin/sh\\necho 'tmux: terminal multiplexer (virtual stub)'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"tree\",\n\t\tversion: \"2.1.0-1\",\n\t\tsection: \"utils\",\n\t\tdescription: \"Displays an indented directory tree, in color\",\n\t\tshortDesc: \"list files in tree format\",\n\t\tinstalledSizeKb: 108,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/tree\",\n\t\t\t\tcontent: '#!/bin/sh\\nexec builtin tree \"$@\"\\n',\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"ca-certificates\",\n\t\tversion: \"20230311\",\n\t\tsection: \"misc\",\n\t\tdescription: \"Common CA certificates\",\n\t\tshortDesc: \"common CA certificates\",\n\t\tinstalledSizeKb: 388,\n\t\tfiles: [\n\t\t\t{ path: \"/etc/ssl/certs/.keep\", content: \"\" },\n\t\t\t{ path: \"/etc/ssl/private/.keep\", content: \"\" },\n\t\t\t{ path: \"/usr/share/ca-certificates/.keep\", content: \"\" },\n\t\t],\n\t\tonInstall: (vfs) => {\n\t\t\tif (!vfs.exists(\"/etc/ssl\")) vfs.mkdir(\"/etc/ssl\", 0o755);\n\t\t\tif (!vfs.exists(\"/etc/ssl/certs\")) vfs.mkdir(\"/etc/ssl/certs\", 0o755);\n\t\t},\n\t},\n\t{\n\t\tname: \"locales\",\n\t\tversion: \"2.36-9+deb12u3\",\n\t\tsection: \"localization\",\n\t\tdescription: \"GNU C Library: National Language (locale) data\",\n\t\tshortDesc: \"locale data\",\n\t\tinstalledSizeKb: 16484,\n\t\tfiles: [\n\t\t\t{ path: \"/etc/locale.gen\", content: \"en_US.UTF-8 UTF-8\\n\" },\n\t\t\t{\n\t\t\t\tpath: \"/etc/default/locale\",\n\t\t\t\tcontent: \"LANG=en_US.UTF-8\\nLANGUAGE=en_US:en\\n\",\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"sudo\",\n\t\tversion: \"1.9.13p3-1+deb12u1\",\n\t\tsection: \"admin\",\n\t\tdescription: \"Provide limited super user privileges to specific users\",\n\t\tshortDesc: \"super user privilege execution\",\n\t\tinstalledSizeKb: 2304,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/sudo\",\n\t\t\t\tcontent: '#!/bin/sh\\nexec builtin sudo \"$@\"\\n',\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/etc/sudoers\",\n\t\t\t\tcontent: \"root ALL=(ALL:ALL) ALL\\n%sudo ALL=(ALL:ALL) ALL\\n\",\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"systemd\",\n\t\tversion: \"252.22-1~deb12u1\",\n\t\tsection: \"admin\",\n\t\tdescription: \"System and service manager\",\n\t\tshortDesc: \"system and service manager\",\n\t\tinstalledSizeKb: 26624,\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/systemctl\",\n\t\t\t\tcontent:\n\t\t\t\t\t\"#!/bin/sh\\necho 'systemd is not running in this virtual container.'\\nexit 1\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \"/usr/bin/journalctl\",\n\t\t\t\tcontent: \"#!/bin/sh\\necho 'journalctl: virtual stub'\\n\",\n\t\t\t\tmode: 0o755,\n\t\t\t},\n\t\t],\n\t},\n];\n\n/**\n * Pure-TypeScript APT/dpkg package manager backed by a built-in registry.\n *\n * Accessed via `shell.packageManager` \u2014 not constructed directly.\n *\n * `install()` resolves dependencies recursively, writes declared files to the\n * VFS, runs `onInstall` hooks, and persists state to `/var/lib/dpkg/status`.\n * `remove()` reverses the process. All state survives VFS snapshot round-trips.\n *\n * @example\n * ```ts\n * const pm = shell.packageManager;\n * pm.install([\"vim\", \"git\"]);\n * console.log(pm.isInstalled(\"vim\")); // true\n * console.log(pm.installedCount()); // 2\n * ```\n */\nexport class VirtualPackageManager {\n\tprivate readonly installed = new Map<string, InstalledPackage>();\n\tprivate readonly registryPath = \"/var/lib/dpkg/status\";\n\tprivate readonly logPath = \"/var/log/dpkg.log\";\n\tprivate readonly aptLogPath = \"/var/log/apt/history.log\";\n\n\t/**\n\t * @param vfs Backing virtual filesystem for file I/O and dpkg status persistence.\n\t * @param users User manager reference passed to `onInstall` hooks.\n\t */\n\tconstructor(\n\t\tprivate readonly vfs: VirtualFileSystem,\n\t\tprivate readonly users: VirtualUserManager,\n\t) {}\n\n\t/**\n\t * Loads installed package state from `/var/lib/dpkg/status` in the VFS.\n\t *\n\t * Called automatically by `VirtualShell` after `bootstrapLinuxRootfs`.\n\t * Safe to call again to reload state after a snapshot restore.\n\t */\n\tpublic load(): void {\n\t\tif (!this.vfs.exists(this.registryPath)) return;\n\t\tconst status = this.vfs.readFile(this.registryPath);\n\t\tif (!status.trim()) return;\n\n\t\tconst blocks = status.split(/\\n\\n+/);\n\t\tfor (const block of blocks) {\n\t\t\tif (!block.trim()) continue;\n\t\t\tconst fields = this.parseFields(block);\n\t\t\tconst name = fields.Package;\n\t\t\tif (!name) continue;\n\t\t\tthis.installed.set(name, {\n\t\t\t\tname,\n\t\t\t\tversion: fields.Version ?? \"unknown\",\n\t\t\t\tarchitecture: fields.Architecture ?? \"amd64\",\n\t\t\t\tmaintainer: fields.Maintainer ?? \"Fortune Maintainers\",\n\t\t\t\tdescription: fields.Description ?? \"\",\n\t\t\t\tsection: fields.Section ?? \"misc\",\n\t\t\t\tinstalledSizeKb: Number(fields[\"Installed-Size\"] ?? 0),\n\t\t\t\tinstalledAt: fields[\"X-Installed-At\"] ?? new Date().toISOString(),\n\t\t\t\tfiles: (fields[\"X-Files\"] ?? \"\").split(\"|\").filter(Boolean),\n\t\t\t});\n\t\t}\n\t}\n\n\t/** Persist installed state to /var/lib/dpkg/status. */\n\tprivate persist(): void {\n\t\tconst blocks: string[] = [];\n\t\tfor (const pkg of this.installed.values()) {\n\t\t\tblocks.push(\n\t\t\t\t[\n\t\t\t\t\t`Package: ${pkg.name}`,\n\t\t\t\t\t`Status: install ok installed`,\n\t\t\t\t\t`Priority: optional`,\n\t\t\t\t\t`Section: ${pkg.section}`,\n\t\t\t\t\t`Installed-Size: ${pkg.installedSizeKb}`,\n\t\t\t\t\t`Maintainer: ${pkg.maintainer}`,\n\t\t\t\t\t`Architecture: ${pkg.architecture}`,\n\t\t\t\t\t`Version: ${pkg.version}`,\n\t\t\t\t\t`Description: ${pkg.description}`,\n\t\t\t\t\t`X-Installed-At: ${pkg.installedAt}`,\n\t\t\t\t\t`X-Files: ${pkg.files.join(\"|\")}`,\n\t\t\t\t].join(\"\\n\"),\n\t\t\t);\n\t\t}\n\t\tthis.vfs.writeFile(this.registryPath, `${blocks.join(\"\\n\\n\")}\\n`);\n\t}\n\n\tprivate parseFields(block: string): Record<string, string> {\n\t\tconst result: Record<string, string> = {};\n\t\tfor (const line of block.split(\"\\n\")) {\n\t\t\tconst idx = line.indexOf(\": \");\n\t\t\tif (idx === -1) continue;\n\t\t\tresult[line.slice(0, idx)] = line.slice(idx + 2);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate log(msg: string): void {\n\t\tconst ts = new Date().toISOString().replace(\"T\", \" \").slice(0, 19);\n\t\tconst line = `${ts} ${msg}\\n`;\n\t\tconst existing = this.vfs.exists(this.logPath)\n\t\t\t? this.vfs.readFile(this.logPath)\n\t\t\t: \"\";\n\t\tthis.vfs.writeFile(this.logPath, existing + line);\n\t}\n\n\tprivate aptLog(action: string, pkgs: string[]): void {\n\t\tconst ts = new Date().toISOString();\n\t\tconst existing = this.vfs.exists(this.aptLogPath)\n\t\t\t? this.vfs.readFile(this.aptLogPath)\n\t\t\t: \"\";\n\t\tconst entry = [\n\t\t\t`Start-Date: ${ts}`,\n\t\t\t`Commandline: apt-get ${action} ${pkgs.join(\" \")}`,\n\t\t\t`${action === \"install\" ? \"Install\" : \"Remove\"}: ${pkgs.join(\", \")}`,\n\t\t\t`End-Date: ${ts}`,\n\t\t\t\"\",\n\t\t].join(\"\\n\");\n\t\tthis.vfs.writeFile(this.aptLogPath, existing + entry);\n\t}\n\n\t/**\n\t * Looks up a package definition in the built-in registry by name.\n\t *\n\t * @param name Package name (case-insensitive).\n\t * @returns The matching `PackageDefinition`, or `undefined` if not found.\n\t */\n\tpublic findInRegistry(name: string): PackageDefinition | undefined {\n\t\treturn PACKAGE_REGISTRY.find(\n\t\t\t(p) => p.name.toLowerCase() === name.toLowerCase(),\n\t\t);\n\t}\n\n\t/**\n\t * Returns all packages in the built-in registry, sorted alphabetically.\n\t *\n\t * @returns Array of `PackageDefinition` entries.\n\t */\n\tpublic listAvailable(): PackageDefinition[] {\n\t\treturn [...PACKAGE_REGISTRY].sort((a, b) => a.name.localeCompare(b.name));\n\t}\n\n\t/**\n\t * Returns all currently installed packages, sorted alphabetically.\n\t *\n\t * @returns Array of `InstalledPackage` records.\n\t */\n\tpublic listInstalled(): InstalledPackage[] {\n\t\treturn [...this.installed.values()].sort((a, b) =>\n\t\t\ta.name.localeCompare(b.name),\n\t\t);\n\t}\n\n\t/**\n\t * Returns `true` when the given package is currently installed.\n\t *\n\t * @param name Package name (case-insensitive).\n\t */\n\tpublic isInstalled(name: string): boolean {\n\t\treturn this.installed.has(name.toLowerCase());\n\t}\n\n\t/**\n\t * Returns the total number of installed packages.\n\t *\n\t * Used by `neofetch` to populate the `Packages:` field.\n\t */\n\tpublic installedCount(): number {\n\t\treturn this.installed.size;\n\t}\n\n\t/**\n\t * Installs one or more packages from the registry.\n\t *\n\t * Dependencies listed in `PackageDefinition.depends` are resolved and\n\t * installed automatically. Already-installed packages are skipped. Files\n\t * declared in `PackageDefinition.files` are written to the VFS and\n\t * `onInstall` hooks are called in dependency order.\n\t *\n\t * @param names Package names to install.\n\t * @param opts Installation options.\n\t * @param opts.quiet Suppress progress output lines when `true`.\n\t * @returns Terminal-style `output` string and an APT-compatible `exitCode`\n\t * (`0` on success, `100` when a package is not found).\n\t */\n\tpublic install(\n\t\tnames: string[],\n\t\topts: { quiet?: boolean } = {},\n\t): { output: string; exitCode: number } {\n\t\tconst lines: string[] = [];\n\t\tconst toInstall: PackageDefinition[] = [];\n\t\tconst notFound: string[] = [];\n\n\t\t// Resolve + deduplicate including deps\n\t\tconst resolve = (name: string, seen = new Set<string>()): void => {\n\t\t\tif (seen.has(name)) return;\n\t\t\tseen.add(name);\n\t\t\tif (this.isInstalled(name)) return;\n\t\t\tconst def = this.findInRegistry(name);\n\t\t\tif (!def) {\n\t\t\t\tnotFound.push(name);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const dep of def.depends ?? []) resolve(dep, seen);\n\t\t\tif (!toInstall.find((p) => p.name === def.name)) {\n\t\t\t\ttoInstall.push(def);\n\t\t\t}\n\t\t};\n\n\t\tfor (const n of names) resolve(n);\n\n\t\tif (notFound.length > 0) {\n\t\t\treturn {\n\t\t\t\toutput: `E: Unable to locate package ${notFound.join(\", \")}`,\n\t\t\t\texitCode: 100,\n\t\t\t};\n\t\t}\n\n\t\tif (toInstall.length === 0) {\n\t\t\treturn {\n\t\t\t\toutput: names\n\t\t\t\t\t.map((n) => `${n} is already the newest version.`)\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst totalKb = toInstall.reduce(\n\t\t\t(acc, p) => acc + (p.installedSizeKb ?? 0),\n\t\t\t0,\n\t\t);\n\n\t\tif (!opts.quiet) {\n\t\t\tlines.push(\n\t\t\t\t`Reading package lists... Done`,\n\t\t\t\t`Building dependency tree... Done`,\n\t\t\t\t`Reading state information... Done`,\n\t\t\t\t`The following NEW packages will be installed:`,\n\t\t\t\t` ${toInstall.map((p) => p.name).join(\" \")}`,\n\t\t\t\t`0 upgraded, ${toInstall.length} newly installed, 0 to remove and 0 not upgraded.`,\n\t\t\t\t`Need to get 0 B/${totalKb} kB of archives.`,\n\t\t\t\t`After this operation, ${totalKb} kB of additional disk space will be used.`,\n\t\t\t\t``,\n\t\t\t);\n\t\t}\n\n\t\tfor (const def of toInstall) {\n\t\t\tif (!opts.quiet) {\n\t\t\t\tlines.push(`Selecting previously unselected package ${def.name}.`);\n\t\t\t\tlines.push(\n\t\t\t\t\t`(Reading database ... 12345 files and directories currently installed.)`,\n\t\t\t\t);\n\t\t\t\tlines.push(\n\t\t\t\t\t`Preparing to unpack .../archives/${def.name}_${def.version}_amd64.deb ...`,\n\t\t\t\t);\n\t\t\t\tlines.push(`Unpacking ${def.name} (${def.version}) ...`);\n\t\t\t}\n\n\t\t\t// Write files\n\t\t\tfor (const f of def.files ?? []) {\n\t\t\t\tconst dir = f.path.slice(0, f.path.lastIndexOf(\"/\"));\n\t\t\t\tif (dir && !this.vfs.exists(dir)) this.vfs.mkdir(dir, 0o755);\n\t\t\t\tthis.vfs.writeFile(f.path, f.content, { mode: f.mode ?? 0o644 });\n\t\t\t}\n\n\t\t\t// Run install hook\n\t\t\tdef.onInstall?.(this.vfs, this.users);\n\n\t\t\tif (!opts.quiet) {\n\t\t\t\tlines.push(`Setting up ${def.name} (${def.version}) ...`);\n\t\t\t}\n\n\t\t\tconst now = new Date().toISOString();\n\t\t\tthis.installed.set(def.name, {\n\t\t\t\tname: def.name,\n\t\t\t\tversion: def.version,\n\t\t\t\tarchitecture: def.architecture ?? \"amd64\",\n\t\t\t\tmaintainer: def.maintainer ?? \"Fortune Maintainers <pkg@fortune.local>\",\n\t\t\t\tdescription: def.description,\n\t\t\t\tsection: def.section ?? \"misc\",\n\t\t\t\tinstalledSizeKb: def.installedSizeKb ?? 0,\n\t\t\t\tinstalledAt: now,\n\t\t\t\tfiles: (def.files ?? []).map((f) => f.path),\n\t\t\t});\n\n\t\t\tthis.log(`install ${def.name} ${def.version}`);\n\t\t}\n\n\t\tthis.aptLog(\n\t\t\t\"install\",\n\t\t\ttoInstall.map((p) => p.name),\n\t\t);\n\t\tthis.persist();\n\n\t\tif (!opts.quiet) {\n\t\t\tlines.push(`Processing triggers for man-db (2.11.2-2) ...`);\n\t\t}\n\n\t\treturn { output: lines.join(\"\\n\"), exitCode: 0 };\n\t}\n\n\t/**\n\t * Removes one or more installed packages.\n\t *\n\t * Package files are deleted from the VFS. Config files (paths under\n\t * `/etc/` or ending in `.conf`) are preserved unless `opts.purge` is set.\n\t * The `onRemove` hook is called for each package.\n\t *\n\t * @param names Package names to remove.\n\t * @param opts Removal options.\n\t * @param opts.purge Also delete configuration files when `true`.\n\t * @param opts.quiet Suppress progress output lines when `true`.\n\t * @returns Terminal-style `output` string and exit code (`0` on success).\n\t */\n\tpublic remove(\n\t\tnames: string[],\n\t\topts: { purge?: boolean; quiet?: boolean } = {},\n\t): { output: string; exitCode: number } {\n\t\tconst lines: string[] = [];\n\t\tconst toRemove: InstalledPackage[] = [];\n\n\t\tfor (const name of names) {\n\t\t\tconst pkg = this.installed.get(name.toLowerCase());\n\t\t\tif (!pkg) {\n\t\t\t\tlines.push(`Package '${name}' is not installed, so not removed`);\n\t\t\t} else {\n\t\t\t\ttoRemove.push(pkg);\n\t\t\t}\n\t\t}\n\n\t\tif (toRemove.length === 0) {\n\t\t\treturn { output: lines.join(\"\\n\") || \"Nothing to remove.\", exitCode: 0 };\n\t\t}\n\n\t\tif (!opts.quiet) {\n\t\t\tlines.push(\n\t\t\t\t`Reading package lists... Done`,\n\t\t\t\t`Building dependency tree... Done`,\n\t\t\t\t`The following packages will be REMOVED:`,\n\t\t\t\t` ${toRemove.map((p) => p.name).join(\" \")}`,\n\t\t\t\t`0 upgraded, 0 newly installed, ${toRemove.length} to remove and 0 not upgraded.`,\n\t\t\t);\n\t\t}\n\n\t\tfor (const pkg of toRemove) {\n\t\t\tif (!opts.quiet) lines.push(`Removing ${pkg.name} (${pkg.version}) ...`);\n\n\t\t\t// Remove files (if purge, include config files)\n\t\t\tfor (const filePath of pkg.files) {\n\t\t\t\tif (\n\t\t\t\t\t!opts.purge &&\n\t\t\t\t\t(filePath.startsWith(\"/etc/\") || filePath.endsWith(\".conf\"))\n\t\t\t\t) {\n\t\t\t\t\tcontinue; // keep config unless --purge\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tif (this.vfs.exists(filePath)) this.vfs.remove(filePath);\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\t// Run remove hook\n\t\t\tconst def = this.findInRegistry(pkg.name);\n\t\t\tdef?.onRemove?.(this.vfs);\n\n\t\t\tthis.installed.delete(pkg.name);\n\t\t\tthis.log(`remove ${pkg.name} ${pkg.version}`);\n\t\t}\n\n\t\tthis.aptLog(\n\t\t\t\"remove\",\n\t\t\ttoRemove.map((p) => p.name),\n\t\t);\n\t\tthis.persist();\n\n\t\treturn { output: lines.join(\"\\n\"), exitCode: 0 };\n\t}\n\n\t/**\n\t * Searches the registry for packages whose name or description contains\n\t * the given term (case-insensitive). Equivalent to `apt-cache search`.\n\t *\n\t * @param term Search string.\n\t * @returns Matching `PackageDefinition` entries sorted alphabetically.\n\t */\n\tpublic search(term: string): PackageDefinition[] {\n\t\tconst t = term.toLowerCase();\n\t\treturn PACKAGE_REGISTRY.filter(\n\t\t\t(p) =>\n\t\t\t\tp.name.includes(t) ||\n\t\t\t\tp.description.toLowerCase().includes(t) ||\n\t\t\t\t(p.shortDesc ?? \"\").toLowerCase().includes(t),\n\t\t).sort((a, b) => a.name.localeCompare(b.name));\n\t}\n\n\t/**\n\t * Returns a dpkg-style metadata block for a package, including its\n\t * install status. Equivalent to `apt-cache show` / `dpkg -s`.\n\t *\n\t * @param name Package name.\n\t * @returns Multi-line metadata string, or `null` if not in the registry.\n\t */\n\tpublic show(name: string): string | null {\n\t\tconst def = this.findInRegistry(name);\n\t\tif (!def) return null;\n\t\tconst inst = this.installed.get(name);\n\t\treturn [\n\t\t\t`Package: ${def.name}`,\n\t\t\t`Version: ${def.version}`,\n\t\t\t`Architecture: ${def.architecture ?? \"amd64\"}`,\n\t\t\t`Maintainer: ${def.maintainer ?? \"Fortune Maintainers <pkg@fortune.local>\"}`,\n\t\t\t`Installed-Size: ${def.installedSizeKb ?? 0}`,\n\t\t\t`Depends: ${(def.depends ?? []).join(\", \") || \"(none)\"}`,\n\t\t\t`Section: ${def.section ?? \"misc\"}`,\n\t\t\t`Priority: optional`,\n\t\t\t`Description: ${def.description}`,\n\t\t\t`Status: ${inst ? \"install ok installed\" : \"install ok not-installed\"}`,\n\t\t].join(\"\\n\");\n\t}\n}\n", "import { createHash, randomBytes, randomUUID, scryptSync } from \"node:crypto\";\nimport { EventEmitter } from \"node:events\";\nimport * as path from \"node:path\";\nimport type { PerfLogger } from \"../utils/perfLogger\";\nimport { createPerfLogger } from \"../utils/perfLogger\";\nimport type VirtualFileSystem from \"../VirtualFileSystem\";\n\n/** Persisted virtual user credential record. */\nexport interface VirtualUserRecord {\n\t/** Unique login name. */\n\tusername: string;\n\t/** Per-user random salt used for password hashing. */\n\tsalt: string;\n\t/** Scrypt-derived password hash in hex encoding. */\n\tpasswordHash: string;\n}\n\n/** Runtime representation of authenticated SSH session. */\nexport interface VirtualActiveSession {\n\t/** Stable session identifier (UUID). */\n\tid: string;\n\t/** Username bound to session. */\n\tusername: string;\n\t/** Virtual terminal identifier (pts/*). */\n\ttty: string;\n\t/** Remote client IP or host label. */\n\tremoteAddress: string;\n\t/** ISO-8601 start timestamp. */\n\tstartedAt: string;\n}\n\nfunction resolveFastPasswordHash(): boolean {\n\tconst configured = process.env.SSH_MIMIC_FAST_PASSWORD_HASH;\n\treturn (\n\t\t!!configured &&\n\t\t![\"0\", \"false\", \"no\", \"off\"].includes(configured.toLowerCase())\n\t);\n}\n\nconst perf: PerfLogger = createPerfLogger(\"VirtualUserManager\");\n\n/**\n * Persistent user, sudoers, and active-session manager for the shell runtime.\n *\n * Passwords are hashed with scrypt by default and stored in the backing virtual filesystem.\n */\nexport class VirtualUserManager extends EventEmitter {\n\tprivate static readonly recordCache = new Map<string, VirtualUserRecord>();\n\tprivate static readonly fastPasswordHash = resolveFastPasswordHash();\n\tprivate readonly usersPath = \"/virtual-env-js/.auth/htpasswd\";\n\tprivate readonly sudoersPath = \"/virtual-env-js/.auth/sudoers\";\n\tprivate readonly quotasPath = \"/virtual-env-js/.auth/quotas\";\n\tprivate readonly authDirPath = \"/virtual-env-js/.auth\";\n\tprivate readonly users = new Map<string, VirtualUserRecord>();\n\tprivate readonly sudoers = new Set<string>();\n\tprivate readonly quotas = new Map<string, number>();\n\tprivate readonly activeSessions = new Map<string, VirtualActiveSession>();\n\tprivate nextTty = 0;\n\n\t/**\n\t * Creates a user manager instance backed by a virtual filesystem.\n\t *\n\t * @param vfs Backing virtual filesystem used for persistence.\n\t * @param defaultRootPassword Initial root password used when root is created.\n\t * @param autoSudoForNewUsers Whether newly created users are added to sudoers.\n\t */\n\tconstructor(\n\t\tprivate readonly vfs: VirtualFileSystem,\n\t\t// private readonly defaultRootPassword: string = process.env\n\t\t// .SSH_MIMIC_ROOT_PASSWORD || \"root\",\n\t\tprivate readonly autoSudoForNewUsers: boolean = true,\n\t) {\n\t\tsuper();\n\t\tperf.mark(\"constructor\");\n\t}\n\n\t/**\n\t * Loads users/sudoers from disk and ensures root account exists.\n\t * Also creates the current system user if not already present.\n\t */\n\tpublic async initialize(): Promise<void> {\n\t\tperf.mark(\"initialize\");\n\t\tthis.loadFromVfs();\n\t\tthis.loadSudoersFromVfs();\n\t\tthis.loadQuotasFromVfs();\n\n\t\tlet changed = false;\n\t\tif (!this.users.has(\"root\")) {\n\t\t\tthis.users.set(\"root\", this.createRecord(\"root\", \"\"));\n\t\t\tchanged = true;\n\t\t}\n\n\t\tthis.sudoers.add(\"root\");\n\n\t\t// Auto-create current system user for easier authentication\n\t\t// const currentUser = process.env.USER || process.env.USERNAME;\n\t\t// if (currentUser && currentUser !== \"root\" && !this.users.has(currentUser)) {\n\t\t// \tconst userPassword = this.defaultRootPassword;\n\t\t// \tthis.users.set(currentUser, this.createRecord(currentUser, userPassword));\n\t\t// \tthis.sudoers.add(currentUser);\n\t\t// \tchanged = true;\n\n\t\t// \tconst homePath = `/home/${currentUser}`;\n\t\t// \tif (!this.vfs.exists(homePath)) {\n\t\t// \t\tthis.vfs.mkdir(homePath, 0o755);\n\t\t// \t\tthis.vfs.writeFile(\n\t\t// \t\t\t`${homePath}/README.txt`,\n\t\t// \t\t\t`Welcome to the virtual environment, ${currentUser}`,\n\t\t// \t\t);\n\t\t// \t}\n\t\t// }\n\n\t\tif (changed) {\n\t\t\tawait this.persist();\n\t\t}\n\t\tthis.emit(\"initialized\");\n\t}\n\n\t/**\n\t * Sets max allowed bytes under /home/<username>.\n\t *\n\t * @param username Target username.\n\t * @param maxBytes Quota ceiling in bytes.\n\t */\n\tpublic async setQuotaBytes(\n\t\tusername: string,\n\t\tmaxBytes: number,\n\t): Promise<void> {\n\t\tperf.mark(\"setQuotaBytes\");\n\t\tthis.validateUsername(username);\n\t\tif (!this.users.has(username)) {\n\t\t\tthrow new Error(`quota: user '${username}' does not exist`);\n\t\t}\n\n\t\tif (!Number.isFinite(maxBytes) || maxBytes < 0) {\n\t\t\tthrow new Error(\"quota: maxBytes must be a non-negative number\");\n\t\t}\n\n\t\tthis.quotas.set(username, Math.floor(maxBytes));\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Removes quota for a user.\n\t *\n\t * @param username Target username.\n\t */\n\tpublic async clearQuota(username: string): Promise<void> {\n\t\tperf.mark(\"clearQuota\");\n\t\tthis.validateUsername(username);\n\t\tthis.quotas.delete(username);\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Gets configured quota in bytes for a user.\n\t *\n\t * @param username Target username.\n\t * @returns Quota in bytes, or null when unlimited.\n\t */\n\tpublic getQuotaBytes(username: string): number | null {\n\t\tperf.mark(\"getQuotaBytes\");\n\t\treturn this.quotas.get(username) ?? null;\n\t}\n\n\t/**\n\t * Computes current usage under /home/<username>.\n\t *\n\t * @param username Target username.\n\t * @returns Current usage in bytes.\n\t */\n\tpublic getUsageBytes(username: string): number {\n\t\tperf.mark(\"getUsageBytes\");\n\t\tconst homePath = `/home/${username}`;\n\t\tif (!this.vfs.exists(homePath)) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn this.vfs.getUsageBytes(homePath);\n\t}\n\n\t/**\n\t * Validates that writing file content would not exceed user quota.\n\t *\n\t * Quotas are enforced only for writes inside /home/<username>.\n\t *\n\t * @param username Authenticated user.\n\t * @param targetPath Target file path.\n\t * @param nextContent New file content.\n\t */\n\tpublic assertWriteWithinQuota(\n\t\tusername: string,\n\t\ttargetPath: string,\n\t\tnextContent: string | Buffer,\n\t): void {\n\t\tperf.mark(\"assertWriteWithinQuota\");\n\t\tconst quota = this.quotas.get(username);\n\t\tif (quota === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst normalizedPath = normalizeVfsPath(targetPath);\n\t\tconst homePath = normalizeVfsPath(`/home/${username}`);\n\t\tconst inUserHome =\n\t\t\tnormalizedPath === homePath || normalizedPath.startsWith(`${homePath}/`);\n\t\tif (!inUserHome) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentUsage = this.getUsageBytes(username);\n\t\tlet existingSize = 0;\n\t\tif (this.vfs.exists(normalizedPath)) {\n\t\t\tconst existing = this.vfs.stat(normalizedPath);\n\t\t\tif (existing.type === \"file\") {\n\t\t\t\texistingSize = existing.size;\n\t\t\t}\n\t\t}\n\n\t\tconst incomingSize = Buffer.isBuffer(nextContent)\n\t\t\t? nextContent.length\n\t\t\t: Buffer.byteLength(nextContent, \"utf8\");\n\t\tconst projectedUsage = currentUsage - existingSize + incomingSize;\n\n\t\tif (projectedUsage > quota) {\n\t\t\tthrow new Error(\n\t\t\t\t`quota exceeded for '${username}': ${projectedUsage}/${quota} bytes`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Verifies plaintext password against stored record.\n\t *\n\t * @param username User login name.\n\t * @param password Plaintext password candidate.\n\t * @returns True when credentials are valid.\n\t */\n\tpublic verifyPassword(username: string, password: string): boolean {\n\t\tperf.mark(\"verifyPassword\");\n\t\tconst record = this.users.get(username);\n\t\tif (!record) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.hashPassword(password) === record.passwordHash;\n\t}\n\n\t/**\n\t * Creates user, home directory, and sudo access entry.\n\t *\n\t * @param username New username.\n\t * @param password Initial plaintext password.\n\t */\n\tpublic async addUser(username: string, password: string): Promise<void> {\n\t\tperf.mark(\"addUser\");\n\t\tthis.validateUsername(username);\n\t\tthis.validatePassword(password);\n\n\t\tif (this.users.has(username)) {\n\t\t\treturn;\n\t\t\t// throw new Error(`adduser: user '${username}' already exists`);\n\t\t}\n\n\t\tthis.users.set(username, this.createRecord(username, password));\n\t\tif (this.autoSudoForNewUsers) {\n\t\t\tthis.sudoers.add(username);\n\t\t}\n\t\tconst homePath = `/home/${username}`;\n\t\tif (!this.vfs.exists(homePath)) {\n\t\t\tthis.vfs.mkdir(homePath, 0o755);\n\t\t\tthis.vfs.writeFile(\n\t\t\t\t`${homePath}/README.txt`,\n\t\t\t\t`Welcome to the virtual environment, ${username}`,\n\t\t\t);\n\t\t}\n\t\tawait this.persist();\n\t\tthis.emit(\"user:add\", { username });\n\t}\n\n\t/**\n\t * Retrieves stored password hash for a user, or null if user does not exist.\n\t *\n\t * @param username Target username.\n\t * @returns Password hash in hex encoding, or null when user is not found.\n\t */\n\tpublic getPasswordHash(username: string): string | null {\n\t\tperf.mark(\"getPasswordHash\");\n\t\tconst record = this.users.get(username);\n\t\treturn record ? record.passwordHash : null;\n\t}\n\n\t/**\n\t * Updates the password for an existing user account.\n\t *\n\t * @param username Username to update.\n\t * @param password New plaintext password (must be non-empty).\n\t * @throws When the user does not exist or the password is empty.\n\t */\n\tpublic async setPassword(username: string, password: string): Promise<void> {\n\t\tperf.mark(\"setPassword\");\n\t\tthis.validateUsername(username);\n\t\tthis.validatePassword(password);\n\n\t\tif (!this.users.has(username)) {\n\t\t\tthrow new Error(`passwd: user '${username}' does not exist`);\n\t\t}\n\n\t\tthis.users.set(username, this.createRecord(username, password));\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Deletes an existing non-root user account and revokes sudo access.\n\t *\n\t * @param username Username to remove.\n\t * @throws When `username` is `\"root\"` or the user does not exist.\n\t */\n\tpublic async deleteUser(username: string): Promise<void> {\n\t\tperf.mark(\"deleteUser\");\n\t\tthis.validateUsername(username);\n\n\t\tif (username === \"root\") {\n\t\t\tthrow new Error(\"deluser: cannot delete root\");\n\t\t}\n\n\t\tif (!this.users.delete(username)) {\n\t\t\tthrow new Error(`deluser: user '${username}' does not exist`);\n\t\t}\n\n\t\tthis.sudoers.delete(username);\n\n\t\tthis.emit(\"user:delete\", { username });\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Checks whether user is member of sudoers set.\n\t *\n\t * @param username Username to test.\n\t * @returns True when user can run sudo.\n\t */\n\tpublic isSudoer(username: string): boolean {\n\t\tperf.mark(\"isSudoer\");\n\t\treturn this.sudoers.has(username);\n\t}\n\n\t/**\n\t * Grants sudo privileges to an existing user.\n\t *\n\t * @param username Username to promote.\n\t * @throws When the user does not exist.\n\t */\n\tpublic async addSudoer(username: string): Promise<void> {\n\t\tperf.mark(\"addSudoer\");\n\t\tthis.validateUsername(username);\n\t\tif (!this.users.has(username)) {\n\t\t\tthrow new Error(`sudoers: user '${username}' does not exist`);\n\t\t}\n\n\t\tthis.sudoers.add(username);\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Revokes sudo privileges from a user. Root cannot be demoted.\n\t *\n\t * @param username Username to demote.\n\t * @throws When `username` is `\"root\"`.\n\t */\n\tpublic async removeSudoer(username: string): Promise<void> {\n\t\tperf.mark(\"removeSudoer\");\n\t\tthis.validateUsername(username);\n\t\tif (username === \"root\") {\n\t\t\tthrow new Error(\"sudoers: cannot remove root\");\n\t\t}\n\n\t\tthis.sudoers.delete(username);\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Registers a new active session and allocates a virtual TTY identifier.\n\t *\n\t * Called by the SSH server when a client is authenticated. The returned\n\t * descriptor is visible in `who` output and `listActiveSessions()`.\n\t *\n\t * @param username Authenticated username bound to the session.\n\t * @param remoteAddress IP address or hostname of the connecting client.\n\t * @returns The newly created `VirtualActiveSession` descriptor.\n\t */\n\tpublic registerSession(\n\t\tusername: string,\n\t\tremoteAddress: string,\n\t): VirtualActiveSession {\n\t\tperf.mark(\"registerSession\");\n\t\tconst session: VirtualActiveSession = {\n\t\t\tid: randomUUID(),\n\t\t\tusername,\n\t\t\ttty: `pts/${this.nextTty++}`,\n\t\t\tremoteAddress,\n\t\t\tstartedAt: new Date().toISOString(),\n\t\t};\n\t\tthis.activeSessions.set(session.id, session);\n\t\tthis.emit(\"session:register\", {\n\t\t\tsessionId: session.id,\n\t\t\tusername,\n\t\t\tremoteAddress,\n\t\t});\n\t\treturn session;\n\t}\n\n\t/**\n\t * Removes an active session record when the connection closes.\n\t *\n\t * Safe to call with a `null` or `undefined` session ID \u2014 it will be a no-op.\n\t *\n\t * @param sessionId Session UUID returned by `registerSession()`, or nullish.\n\t */\n\tpublic unregisterSession(sessionId: string | null | undefined): void {\n\t\tperf.mark(\"unregisterSession\");\n\t\tif (!sessionId) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.activeSessions.get(sessionId);\n\t\tthis.activeSessions.delete(sessionId);\n\t\tif (session) {\n\t\t\tthis.emit(\"session:unregister\", {\n\t\t\t\tsessionId,\n\t\t\t\tusername: session.username,\n\t\t\t});\n\t\t}\n\t\tthis.activeSessions.delete(sessionId);\n\t}\n\n\t/**\n\t * Updates the username and remote address metadata for an active session.\n\t *\n\t * Called internally by `su` and `sudo` when the effective user changes\n\t * within a session. Silently ignored when the session ID is nullish or\n\t * unknown.\n\t *\n\t * @param sessionId Session UUID to update, or nullish for no-op.\n\t * @param username New effective username.\n\t * @param remoteAddress New remote address (usually unchanged).\n\t */\n\tpublic updateSession(\n\t\tsessionId: string | null | undefined,\n\t\tusername: string,\n\t\tremoteAddress: string,\n\t): void {\n\t\tperf.mark(\"updateSession\");\n\t\tif (!sessionId) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.activeSessions.get(sessionId);\n\t\tif (!session) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.activeSessions.set(sessionId, {\n\t\t\t...session,\n\t\t\tusername,\n\t\t\tremoteAddress,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a snapshot of all currently active sessions, sorted by start time.\n\t *\n\t * Used by `who`, `ps`, `uptime`, and the `HoneyPot` auditor.\n\t *\n\t * @returns Array of `VirtualActiveSession` descriptors.\n\t */\n\tpublic listActiveSessions(): VirtualActiveSession[] {\n\t\tperf.mark(\"listActiveSessions\");\n\t\treturn Array.from(this.activeSessions.values()).sort((left, right) =>\n\t\t\tleft.startedAt.localeCompare(right.startedAt),\n\t\t);\n\t}\n\n\t/**\n\t * Returns a sorted list of all registered usernames.\n\t *\n\t * @returns Array of username strings sorted alphabetically.\n\t */\n\tpublic listUsers(): string[] {\n\t\treturn Array.from(this.users.keys()).sort();\n\t}\n\n\tprivate loadFromVfs(): void {\n\t\tthis.users.clear();\n\n\t\tif (!this.vfs.exists(this.usersPath)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst raw = this.vfs.readFile(this.usersPath);\n\t\tfor (const line of raw.split(\"\\n\")) {\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (trimmed.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst parts = trimmed.split(\":\");\n\t\t\tif (parts.length < 3) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [username, salt, passwordHash] = parts;\n\t\t\tif (!username || !salt || !passwordHash) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.users.set(username, { username, salt, passwordHash });\n\t\t}\n\t}\n\n\tprivate loadSudoersFromVfs(): void {\n\t\tthis.sudoers.clear();\n\n\t\tif (!this.vfs.exists(this.sudoersPath)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst raw = this.vfs.readFile(this.sudoersPath);\n\t\tfor (const line of raw.split(\"\\n\")) {\n\t\t\tconst username = line.trim();\n\t\t\tif (username.length > 0) {\n\t\t\t\tthis.sudoers.add(username);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate loadQuotasFromVfs(): void {\n\t\tthis.quotas.clear();\n\n\t\tif (!this.vfs.exists(this.quotasPath)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst raw = this.vfs.readFile(this.quotasPath);\n\t\tfor (const line of raw.split(\"\\n\")) {\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (trimmed.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [username, value] = trimmed.split(\":\");\n\t\t\tconst bytes = Number.parseInt(value ?? \"\", 10);\n\t\t\tif (!username || !Number.isFinite(bytes) || bytes < 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.quotas.set(username, bytes);\n\t\t}\n\t}\n\n\tprivate async persist(): Promise<void> {\n\t\tif (!this.vfs.exists(this.authDirPath)) {\n\t\t\tthis.vfs.mkdir(this.authDirPath, 0o700);\n\t\t}\n\n\t\tconst authContent = Array.from(this.users.values())\n\t\t\t.sort((left, right) => left.username.localeCompare(right.username))\n\t\t\t.map((record) =>\n\t\t\t\t[record.username, record.salt, record.passwordHash].join(\":\"),\n\t\t\t)\n\t\t\t.join(\"\\n\");\n\t\tconst sudoersContent = Array.from(this.sudoers.values()).sort().join(\"\\n\");\n\t\tconst quotasContent = Array.from(this.quotas.entries())\n\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t.map(([username, maxBytes]) => `${username}:${maxBytes}`)\n\t\t\t.join(\"\\n\");\n\n\t\tlet changed = false;\n\t\tchanged =\n\t\t\tthis.writeIfChanged(\n\t\t\t\tthis.usersPath,\n\t\t\t\tauthContent.length > 0 ? `${authContent}\\n` : \"\",\n\t\t\t\t0o600,\n\t\t\t) || changed;\n\t\tchanged =\n\t\t\tthis.writeIfChanged(\n\t\t\t\tthis.sudoersPath,\n\t\t\t\tsudoersContent.length > 0 ? `${sudoersContent}\\n` : \"\",\n\t\t\t\t0o600,\n\t\t\t) || changed;\n\t\tchanged =\n\t\t\tthis.writeIfChanged(\n\t\t\t\tthis.quotasPath,\n\t\t\t\tquotasContent.length > 0 ? `${quotasContent}\\n` : \"\",\n\t\t\t\t0o600,\n\t\t\t) || changed;\n\n\t\tif (changed) {\n\t\t\tawait this.vfs.flushMirror();\n\t\t}\n\t}\n\n\tprivate writeIfChanged(\n\t\ttargetPath: string,\n\t\tcontent: string,\n\t\tmode: number,\n\t): boolean {\n\t\tif (this.vfs.exists(targetPath)) {\n\t\t\tconst existing = this.vfs.readFile(targetPath);\n\t\t\tif (existing === content) {\n\t\t\t\tthis.vfs.chmod(targetPath, mode);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.vfs.writeFile(targetPath, content, { mode });\n\t\treturn true;\n\t}\n\n\tprivate createRecord(username: string, password: string): VirtualUserRecord {\n\t\tconst cacheKey = `${username}:${password}`;\n\t\tconst cached = VirtualUserManager.recordCache.get(cacheKey);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst salt = randomBytes(16).toString(\"hex\");\n\t\tconst record = {\n\t\t\tusername,\n\t\t\tsalt,\n\t\t\tpasswordHash: this.hashPassword(password),\n\t\t};\n\n\t\tVirtualUserManager.recordCache.set(cacheKey, record);\n\t\treturn record;\n\t}\n\n\t/**\n\t * Returns `true` when the user has a non-empty password set.\n\t *\n\t * A user with no password (or whose password hash matches the empty-string\n\t * hash) is allowed to authenticate without a credential check.\n\t *\n\t * @param username Target username.\n\t */\n\tpublic hasPassword(username: string): boolean {\n\t\tperf.mark(\"hasPassword\");\n\t\tif (this.getPasswordHash(username) === this.hashPassword(\"\")) {\n\t\t\treturn false;\n\t\t}\n\t\tconst record = this.users.get(username);\n\t\treturn !!record && !!record.passwordHash;\n\t}\n\n\t/**\n\t * Hashes a plaintext password using scrypt (or SHA-256 in fast-hash mode).\n\t *\n\t * Set `SSH_MIMIC_FAST_PASSWORD_HASH=1` to switch to SHA-256 for test\n\t * environments where scrypt latency is undesirable.\n\t *\n\t * @param password Plaintext password string.\n\t * @returns Hex-encoded hash string.\n\t */\n\tpublic hashPassword(password: string): string {\n\t\tif (VirtualUserManager.fastPasswordHash) {\n\t\t\treturn createHash(\"sha256\").update(`${password}`).digest(\"hex\");\n\t\t}\n\n\t\treturn scryptSync(password, \"\", 32).toString(\"hex\");\n\t}\n\n\tprivate validateUsername(username: string): void {\n\t\tif (!username || username.trim() === \"\") {\n\t\t\tthrow new Error(\"invalid username\");\n\t\t}\n\n\t\tif (!/^[a-z_][a-z0-9_-]{0,31}$/i.test(username)) {\n\t\t\tthrow new Error(\"invalid username\");\n\t\t}\n\t}\n\n\tprivate validatePassword(password: string): void {\n\t\tif (!password || password.trim() === \"\") {\n\t\t\tthrow new Error(\"invalid password\");\n\t\t}\n\t}\n\tprivate readonly authorizedKeys = new Map<\n\t\tstring,\n\t\tArray<{ algo: string; data: Buffer }>\n\t>();\n\n\t/**\n\t * Adds an SSH public key for a user, enabling public-key authentication.\n\t *\n\t * @param username Target user.\n\t * @param algo Key algorithm (e.g. \"ssh-rsa\", \"ssh-ed25519\").\n\t * @param data Raw key data as a Buffer (the base64-decoded key bytes).\n\t */\n\tpublic addAuthorizedKey(username: string, algo: string, data: Buffer): void {\n\t\tperf.mark(\"addAuthorizedKey\");\n\t\tconst keys = this.authorizedKeys.get(username) ?? [];\n\t\tkeys.push({ algo, data });\n\t\tthis.authorizedKeys.set(username, keys);\n\t\tthis.emit(\"key:add\", { username, algo });\n\t}\n\n\t/**\n\t * Removes all authorized keys for a user.\n\t *\n\t * @param username Target user.\n\t */\n\tpublic removeAuthorizedKeys(username: string): void {\n\t\tthis.authorizedKeys.delete(username);\n\t\tthis.emit(\"key:remove\", { username });\n\t}\n\n\t/**\n\t * Returns the list of authorized keys for a user.\n\t * Returns an empty array when no keys are registered.\n\t *\n\t * @param username Target user.\n\t */\n\tpublic getAuthorizedKeys(\n\t\tusername: string,\n\t): Array<{ algo: string; data: Buffer }> {\n\t\treturn this.authorizedKeys.get(username) ?? [];\n\t}\n}\n\nfunction normalizeVfsPath(targetPath: string): string {\n\tconst normalized = path.posix.normalize(targetPath);\n\treturn normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n", "import type { ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { readFile, unlink, writeFile } from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { ShellProperties, VirtualShell } from \".\";\nimport { getCommandNames, makeDefaultEnv, runCommand } from \"../commands\";\nimport type { ShellEnv } from \"../types/commands\";\nimport {\n\tspawnHtopProcess,\n\tspawnNanoEditorProcess,\n} from \"../modules/shellInteractive\";\nimport {\n\tgetVisibleHtopPidList,\n\tresolvePath,\n\ttype TerminalSize,\n\ttoTtyLines,\n} from \"../modules/shellRuntime\";\nimport { formatLoginDate } from \"../SSHMimic/loginFormat\";\nimport { buildPrompt } from \"../SSHMimic/prompt\";\nimport type { ShellStream } from \"../types/streams\";\nimport type VirtualFileSystem from \"../VirtualFileSystem\";\n\ninterface NanoSession {\n\tkind: \"nano\" | \"htop\";\n\ttargetPath: string;\n\ttempPath: string;\n\tprocess: ChildProcessWithoutNullStreams;\n}\n\ninterface PendingSudo {\n\tusername: string;\n\ttargetUser: string;\n\tcommandLine: string | null;\n\tloginShell: boolean;\n\tprompt: string;\n\tbuffer: string;\n}\n\nexport function startShell(\n\tproperties: ShellProperties,\n\tstream: ShellStream,\n\tauthUser: string,\n\thostname: string,\n\tsessionId: string | null,\n\tremoteAddress = \"unknown\",\n\tterminalSize: TerminalSize = { cols: 80, rows: 24 },\n\tshell: VirtualShell,\n): void {\n\tlet lineBuffer = \"\";\n\tlet cursorPos = 0;\n\tlet history = loadHistory(shell.vfs);\n\tlet historyIndex: number | null = null;\n\tlet historyDraft = \"\";\n\tlet cwd = `/home/${authUser}`;\n\tconst shellEnv: ShellEnv = makeDefaultEnv(authUser, hostname);\n\tlet nanoSession: NanoSession | null = null;\n\tlet pendingSudo: PendingSudo | null = null;\n\tconst buildCurrentPrompt = (): string => {\n\t\tconst homePath = `/home/${authUser}`;\n\t\tconst cwdLabel = cwd === homePath ? \"~\" : path.posix.basename(cwd) || \"/\";\n\t\treturn buildPrompt(authUser, hostname, cwdLabel);\n\t};\n\tconst commandNames = Array.from(new Set(getCommandNames())).sort();\n\tconsole.log(\n\t\t`[${sessionId}] Shell started for user '${authUser}' at ${remoteAddress}`,\n\t);\n\n\t// Load .bashrc if it exists\n\tvoid (async () => {\n\t\tconst bashrcPath = `/home/${authUser}/.bashrc`;\n\t\tif (shell.vfs.exists(bashrcPath)) {\n\t\t\ttry {\n\t\t\t\tconst bashrc = shell.vfs.readFile(bashrcPath);\n\t\t\t\tfor (const line of bashrc.split(\"\\n\")) {\n\t\t\t\t\tconst l = line.trim();\n\t\t\t\t\tif (!l || l.startsWith(\"#\")) continue;\n\t\t\t\t\tawait runCommand(\n\t\t\t\t\t\tl,\n\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\thostname,\n\t\t\t\t\t\t\"shell\",\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tshell,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tshellEnv,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t/* ignore bashrc errors */\n\t\t\t}\n\t\t}\n\t})();\n\n\tfunction renderLine(): void {\n\t\tconst prompt = buildCurrentPrompt();\n\t\tstream.write(`\\r${prompt}${lineBuffer}\\u001b[K`);\n\n\t\tconst moveLeft = lineBuffer.length - cursorPos;\n\t\tif (moveLeft > 0) {\n\t\t\tstream.write(`\\u001b[${moveLeft}D`);\n\t\t}\n\t}\n\n\tfunction clearCurrentLine(): void {\n\t\tstream.write(\"\\r\\u001b[K\");\n\t}\n\n\tfunction startSudoPrompt(challenge: {\n\t\tusername: string;\n\t\ttargetUser: string;\n\t\tcommandLine: string | null;\n\t\tloginShell: boolean;\n\t\tprompt: string;\n\t}): void {\n\t\tpendingSudo = {\n\t\t\t...challenge,\n\t\t\tbuffer: \"\",\n\t\t};\n\t\tclearCurrentLine();\n\t\tstream.write(challenge.prompt);\n\t}\n\n\tasync function finishSudoPrompt(success: boolean): Promise<void> {\n\t\tif (!pendingSudo) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst challenge = pendingSudo;\n\t\tpendingSudo = null;\n\n\t\tif (!success) {\n\t\t\tstream.write(\"\\r\\nSorry, try again.\\r\\n\");\n\t\t\trenderLine();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!challenge.commandLine) {\n\t\t\tauthUser = challenge.targetUser;\n\t\t\tcwd = `/home/${authUser}`;\n\t\t\tshell.users.updateSession(sessionId, authUser, remoteAddress);\n\t\t\tstream.write(\"\\r\\n\");\n\t\t\trenderLine();\n\t\t\treturn;\n\t\t}\n\n\t\tconst runCwd = challenge.loginShell ? `/home/${challenge.targetUser}` : cwd;\n\t\tconst result = await Promise.resolve(\n\t\t\trunCommand(\n\t\t\t\tchallenge.commandLine,\n\t\t\t\tchallenge.targetUser,\n\t\t\t\thostname,\n\t\t\t\t\"shell\",\n\t\t\t\trunCwd,\n\t\t\t\tshell,\n\t\t\t),\n\t\t);\n\n\t\tstream.write(\"\\r\\n\");\n\n\t\tif (result.openEditor) {\n\t\t\tawait startNanoEditor(\n\t\t\t\tresult.openEditor.targetPath,\n\t\t\t\tresult.openEditor.initialContent,\n\t\t\t\tresult.openEditor.tempPath,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (result.openHtop) {\n\t\t\tawait startHtop();\n\t\t\treturn;\n\t\t}\n\n\t\tif (result.clearScreen) {\n\t\t\tstream.write(\"\\u001b[2J\\u001b[H\");\n\t\t}\n\n\t\tif (result.stdout) {\n\t\t\tstream.write(`${toTtyLines(result.stdout)}\\r\\n`);\n\t\t}\n\n\t\tif (result.stderr) {\n\t\t\tstream.write(`${toTtyLines(result.stderr)}\\r\\n`);\n\t\t}\n\n\t\tif (result.switchUser) {\n\t\t\tauthUser = result.switchUser;\n\t\t\tcwd = result.nextCwd ?? `/home/${authUser}`;\n\t\t\tshell.users.updateSession(sessionId, authUser, remoteAddress);\n\t\t} else if (result.nextCwd) {\n\t\t\tcwd = result.nextCwd;\n\t\t}\n\n\t\tawait shell.vfs.flushMirror();\n\t\trenderLine();\n\t}\n\n\tasync function finishNanoEditor(): Promise<void> {\n\t\tif (!nanoSession) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst activeSession = nanoSession;\n\n\t\tif (activeSession.kind === \"nano\") {\n\t\t\ttry {\n\t\t\t\tconst updatedContent = await readFile(activeSession.tempPath, \"utf8\");\n\t\t\t\tshell.writeFileAsUser(\n\t\t\t\t\tauthUser,\n\t\t\t\t\tactiveSession.targetPath,\n\t\t\t\t\tupdatedContent,\n\t\t\t\t);\n\t\t\t\tawait shell.vfs.flushMirror();\n\t\t\t} catch {\n\t\t\t\t// If temp file does not exist, nano exited without writing.\n\t\t\t}\n\n\t\t\tawait unlink(activeSession.tempPath).catch(() => undefined);\n\t\t}\n\n\t\tnanoSession = null;\n\t\tlineBuffer = \"\";\n\t\tcursorPos = 0;\n\t\tstream.write(\"\\r\\n\");\n\t\trenderLine();\n\t}\n\n\tasync function startNanoEditor(\n\t\ttargetPath: string,\n\t\tinitialContent: string,\n\t\ttempPath: string,\n\t): Promise<void> {\n\t\tif (shell.vfs.exists(targetPath)) {\n\t\t\tawait writeFile(tempPath, initialContent, \"utf8\");\n\t\t}\n\n\t\tconst editor = spawnNanoEditorProcess(tempPath, terminalSize, stream);\n\n\t\teditor.on(\"error\", (error: Error) => {\n\t\t\tstream.write(`nano: ${error.message}\\r\\n`);\n\t\t\tvoid finishNanoEditor();\n\t\t});\n\n\t\teditor.on(\"close\", () => {\n\t\t\tvoid finishNanoEditor();\n\t\t});\n\n\t\tnanoSession = {\n\t\t\tkind: \"nano\",\n\t\t\ttargetPath,\n\t\t\ttempPath,\n\t\t\tprocess: editor,\n\t\t};\n\t}\n\n\tasync function startHtop(): Promise<void> {\n\t\tconst pidList = await getVisibleHtopPidList();\n\t\tif (!pidList) {\n\t\t\tstream.write(\"htop: no child_process processes to display\\r\\n\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst monitor = spawnHtopProcess(pidList, terminalSize, stream);\n\n\t\tmonitor.on(\"error\", (error: Error) => {\n\t\t\tstream.write(`htop: ${error.message}\\r\\n`);\n\t\t\tvoid finishNanoEditor();\n\t\t});\n\n\t\tmonitor.on(\"close\", () => {\n\t\t\tvoid finishNanoEditor();\n\t\t});\n\n\t\tnanoSession = {\n\t\t\tkind: \"htop\",\n\t\t\ttargetPath: \"\",\n\t\t\ttempPath: \"\",\n\t\t\tprocess: monitor,\n\t\t};\n\t}\n\n\tfunction applyHistoryLine(nextLine: string): void {\n\t\tlineBuffer = nextLine;\n\t\tcursorPos = lineBuffer.length;\n\t\trenderLine();\n\t}\n\n\tfunction insertText(text: string): void {\n\t\tlineBuffer = `${lineBuffer.slice(0, cursorPos)}${text}${lineBuffer.slice(cursorPos)}`;\n\t\tcursorPos += text.length;\n\t\trenderLine();\n\t}\n\n\tfunction getTokenRange(\n\t\tline: string,\n\t\tcursor: number,\n\t): { start: number; end: number } {\n\t\tlet start = cursor;\n\t\twhile (start > 0 && !/\\s/.test(line[start - 1]!)) {\n\t\t\tstart -= 1;\n\t\t}\n\n\t\tlet end = cursor;\n\t\twhile (end < line.length && !/\\s/.test(line[end]!)) {\n\t\t\tend += 1;\n\t\t}\n\n\t\treturn { start, end };\n\t}\n\n\tfunction listPathCompletions(prefix: string): string[] {\n\t\tconst slashIndex = prefix.lastIndexOf(\"/\");\n\t\tconst dirPart = slashIndex >= 0 ? prefix.slice(0, slashIndex + 1) : \"\";\n\t\tconst namePart = slashIndex >= 0 ? prefix.slice(slashIndex + 1) : prefix;\n\t\tconst basePath = resolvePath(cwd, dirPart || \".\");\n\n\t\ttry {\n\t\t\treturn shell.vfs\n\t\t\t\t.list(basePath)\n\t\t\t\t.filter((entry) => !entry.startsWith(\".\"))\n\t\t\t\t.filter((entry) => entry.startsWith(namePart))\n\t\t\t\t.map((entry) => {\n\t\t\t\t\tconst fullPath = path.posix.join(basePath, entry);\n\t\t\t\t\tconst st = shell.vfs.stat(fullPath);\n\t\t\t\t\tconst suffix = st.type === \"directory\" ? \"/\" : \"\";\n\t\t\t\t\treturn `${dirPart}${entry}${suffix}`;\n\t\t\t\t})\n\t\t\t\t.sort();\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tfunction handleTabCompletion(): void {\n\t\tconst { start, end } = getTokenRange(lineBuffer, cursorPos);\n\t\tconst token = lineBuffer.slice(start, cursorPos);\n\n\t\tif (token.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst firstToken = lineBuffer.slice(0, start).trim().length === 0;\n\t\tconst commandCandidates = firstToken\n\t\t\t? commandNames.filter((name) => name.startsWith(token))\n\t\t\t: [];\n\t\tconst pathCandidates = listPathCompletions(token);\n\t\tconst candidates = Array.from(\n\t\t\tnew Set([...commandCandidates, ...pathCandidates]),\n\t\t).sort();\n\n\t\tif (candidates.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (candidates.length === 1) {\n\t\t\tconst completed = candidates[0]!;\n\t\t\tconst suffix = completed.endsWith(\"/\") ? \"\" : \" \";\n\t\t\tlineBuffer = `${lineBuffer.slice(0, start)}${completed}${suffix}${lineBuffer.slice(end)}`;\n\t\t\tcursorPos = start + completed.length + suffix.length;\n\t\t\trenderLine();\n\t\t\treturn;\n\t\t}\n\n\t\tstream.write(\"\\r\\n\");\n\t\tstream.write(`${candidates.join(\" \")}\\r\\n`);\n\t\trenderLine();\n\t}\n\n\tfunction pushHistory(cmd: string): void {\n\t\tif (cmd.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\thistory.push(cmd);\n\t\tif (history.length > 500) {\n\t\t\thistory = history.slice(history.length - 500);\n\t\t}\n\n\t\tconst data = history.length > 0 ? `${history.join(\"\\n\")}\\n` : \"\";\n\t\tshell.vfs.writeFile(\"/virtual-env-js/.bash_history\", data);\n\t}\n\n\tfunction readLastLogin(): { at: string; from: string } | null {\n\t\tconst lastlogPath = `/virtual-env-js/.lastlog/${authUser}.json`;\n\t\tif (!shell.vfs.exists(lastlogPath)) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\treturn JSON.parse(shell.vfs.readFile(lastlogPath)) as {\n\t\t\t\tat: string;\n\t\t\t\tfrom: string;\n\t\t\t};\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tfunction writeLastLogin(nowIso: string): void {\n\t\tconst dir = \"/virtual-env-js/.lastlog\";\n\t\tif (!shell.vfs.exists(dir)) {\n\t\t\tshell.vfs.mkdir(dir, 0o700);\n\t\t}\n\n\t\tconst lastlogPath = `${dir}/${authUser}.json`;\n\t\tshell.vfs.writeFile(\n\t\t\tlastlogPath,\n\t\t\tJSON.stringify({ at: nowIso, from: remoteAddress }),\n\t\t);\n\t}\n\n\tfunction renderLoginBanner(): void {\n\t\tconst last = readLastLogin();\n\t\tconst nowIso = new Date().toISOString();\n\n\t\tstream.write(\n\t\t\t`Linux ${hostname} ${properties.kernel} ${properties.arch}\\r\\n`,\n\t\t);\n\t\tstream.write(\"\\r\\n\");\n\t\tstream.write(\n\t\t\t\"The programs included with the Fortune GNU/Linux system are free software;\\r\\n\",\n\t\t);\n\t\tstream.write(\n\t\t\t\"the exact distribution terms for each program are described in the\\r\\n\",\n\t\t);\n\t\tstream.write(\"individual files in /usr/share/doc/*/copyright.\\r\\n\");\n\t\tstream.write(\"\\r\\n\");\n\t\tstream.write(\n\t\t\t\"Fortune GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent\\r\\n\",\n\t\t);\n\t\tstream.write(\"permitted by applicable law.\\r\\n\");\n\n\t\tif (last) {\n\t\t\tconst when = new Date(last.at);\n\t\t\tconst displayed = Number.isNaN(when.getTime())\n\t\t\t\t? last.at\n\t\t\t\t: formatLoginDate(when);\n\t\t\tstream.write(\n\t\t\t\t`Last login: ${displayed} from ${last.from || \"unknown\"}\\r\\n`,\n\t\t\t);\n\t\t}\n\n\t\tstream.write(\"\\r\\n\");\n\t\twriteLastLogin(nowIso);\n\t}\n\n\trenderLoginBanner();\n\trenderLine();\n\n\tstream.on(\"data\", async (chunk: Buffer) => {\n\t\tif (nanoSession) {\n\t\t\tnanoSession.process.stdin.write(chunk);\n\t\t\treturn;\n\t\t}\n\n\t\tif (pendingSudo) {\n\t\t\tconst input = chunk.toString(\"utf8\");\n\n\t\t\tfor (let i = 0; i < input.length; i += 1) {\n\t\t\t\tconst ch = input[i]!;\n\n\t\t\t\tif (ch === \"\\u0003\") {\n\t\t\t\t\tpendingSudo = null;\n\t\t\t\t\tstream.write(\"^C\\r\\n\");\n\t\t\t\t\trenderLine();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (ch === \"\\u007f\" || ch === \"\\b\") {\n\t\t\t\t\tpendingSudo.buffer = pendingSudo.buffer.slice(0, -1);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (ch === \"\\r\" || ch === \"\\n\") {\n\t\t\t\t\tconst password = pendingSudo.buffer;\n\t\t\t\t\tpendingSudo.buffer = \"\";\n\t\t\t\t\tconst valid = shell.users.verifyPassword(\n\t\t\t\t\t\tpendingSudo.username,\n\t\t\t\t\t\tpassword,\n\t\t\t\t\t);\n\t\t\t\t\tawait finishSudoPrompt(valid);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (ch >= \" \") {\n\t\t\t\t\tpendingSudo.buffer += ch;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst input = chunk.toString(\"utf8\");\n\n\t\tfor (let i = 0; i < input.length; i += 1) {\n\t\t\tconst ch = input[i]!;\n\n\t\t\tif (ch === \"\\u0004\") {\n\t\t\t\tlineBuffer = \"\";\n\t\t\t\tcursorPos = 0;\n\t\t\t\thistoryIndex = null;\n\t\t\t\thistoryDraft = \"\";\n\t\t\t\tstream.write(\"bye\\r\\n\");\n\t\t\t\tpushHistory(\"bye\");\n\t\t\t\tawait shell.vfs.flushMirror();\n\t\t\t\tstream.write(\"logout\\r\\n\");\n\t\t\t\tstream.exit(0);\n\t\t\t\tstream.end();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (ch === \"\\t\") {\n\t\t\t\thandleTabCompletion();\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ch === \"\\u001b\") {\n\t\t\t\tconst next = input[i + 1];\n\t\t\t\tconst third = input[i + 2];\n\t\t\t\tconst fourth = input[i + 3];\n\n\t\t\t\tif (next === \"[\" && third) {\n\t\t\t\t\tif (third === \"A\") {\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\tif (history.length > 0) {\n\t\t\t\t\t\t\tif (historyIndex === null) {\n\t\t\t\t\t\t\t\thistoryDraft = lineBuffer;\n\t\t\t\t\t\t\t\thistoryIndex = history.length - 1;\n\t\t\t\t\t\t\t} else if (historyIndex > 0) {\n\t\t\t\t\t\t\t\thistoryIndex -= 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tapplyHistoryLine(history[historyIndex] ?? \"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (third === \"B\") {\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\tif (historyIndex !== null) {\n\t\t\t\t\t\t\tif (historyIndex < history.length - 1) {\n\t\t\t\t\t\t\t\thistoryIndex += 1;\n\t\t\t\t\t\t\t\tapplyHistoryLine(history[historyIndex] ?? \"\");\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thistoryIndex = null;\n\t\t\t\t\t\t\t\tapplyHistoryLine(historyDraft);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (third === \"C\") {\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\tif (cursorPos < lineBuffer.length) {\n\t\t\t\t\t\t\tcursorPos += 1;\n\t\t\t\t\t\t\tstream.write(\"\\u001b[C\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (third === \"D\") {\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\tif (cursorPos > 0) {\n\t\t\t\t\t\t\tcursorPos -= 1;\n\t\t\t\t\t\t\tstream.write(\"\\u001b[D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (third === \"3\" && fourth === \"~\") {\n\t\t\t\t\t\ti += 3;\n\t\t\t\t\t\tif (cursorPos < lineBuffer.length) {\n\t\t\t\t\t\t\tlineBuffer = `${lineBuffer.slice(0, cursorPos)}${lineBuffer.slice(cursorPos + 1)}`;\n\t\t\t\t\t\t\trenderLine();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ch === \"\\u0003\") {\n\t\t\t\tlineBuffer = \"\";\n\t\t\t\tcursorPos = 0;\n\t\t\t\thistoryIndex = null;\n\t\t\t\thistoryDraft = \"\";\n\t\t\t\tstream.write(\"^C\\r\\n\");\n\t\t\t\trenderLine();\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ch === \"\\r\" || ch === \"\\n\") {\n\t\t\t\tconst line = lineBuffer.trim();\n\t\t\t\tlineBuffer = \"\";\n\t\t\t\tcursorPos = 0;\n\t\t\t\thistoryIndex = null;\n\t\t\t\thistoryDraft = \"\";\n\t\t\t\tstream.write(\"\\r\\n\");\n\n\t\t\t\tif (line.length > 0) {\n\t\t\t\t\tconst result = await Promise.resolve(\n\t\t\t\t\t\trunCommand(\n\t\t\t\t\t\t\tline,\n\t\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\t\thostname,\n\t\t\t\t\t\t\t\"shell\",\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tshell,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tshellEnv,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\tpushHistory(line);\n\n\t\t\t\t\tif (result.openEditor) {\n\t\t\t\t\t\tawait startNanoEditor(\n\t\t\t\t\t\t\tresult.openEditor.targetPath,\n\t\t\t\t\t\t\tresult.openEditor.initialContent,\n\t\t\t\t\t\t\tresult.openEditor.tempPath,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.openHtop) {\n\t\t\t\t\t\tawait startHtop();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.sudoChallenge) {\n\t\t\t\t\t\tstartSudoPrompt(result.sudoChallenge);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.clearScreen) {\n\t\t\t\t\t\tstream.write(\"\\u001b[2J\\u001b[H\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.stdout) {\n\t\t\t\t\t\tstream.write(`${toTtyLines(result.stdout)}\\r\\n`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.stderr) {\n\t\t\t\t\t\tstream.write(`${toTtyLines(result.stderr)}\\r\\n`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.closeSession) {\n\t\t\t\t\t\tstream.write(\"logout\\r\\n\");\n\t\t\t\t\t\tstream.exit(result.exitCode ?? 0);\n\t\t\t\t\t\tstream.end();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.nextCwd) {\n\t\t\t\t\t\tcwd = result.nextCwd;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.switchUser) {\n\t\t\t\t\t\tauthUser = result.switchUser;\n\t\t\t\t\t\tcwd = result.nextCwd ?? `/home/${authUser}`;\n\t\t\t\t\t\tshell.users.updateSession(sessionId, authUser, remoteAddress);\n\t\t\t\t\t\tlineBuffer = \"\";\n\t\t\t\t\t\tcursorPos = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait shell.vfs.flushMirror();\n\t\t\t\t}\n\n\t\t\t\trenderLine();\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ch === \"\\u007f\" || ch === \"\\b\") {\n\t\t\t\tif (cursorPos > 0) {\n\t\t\t\t\tlineBuffer = `${lineBuffer.slice(0, cursorPos - 1)}${lineBuffer.slice(cursorPos)}`;\n\t\t\t\t\tcursorPos -= 1;\n\t\t\t\t\trenderLine();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tinsertText(ch);\n\t\t}\n\t});\n\n\tstream.on(\"close\", () => {\n\t\tif (nanoSession) {\n\t\t\tnanoSession.process.kill(\"SIGTERM\");\n\t\t\tnanoSession = null;\n\t\t}\n\t});\n}\n\nfunction loadHistory(vfs: VirtualFileSystem): string[] {\n\tconst historyPath = \"/virtual-env-js/.bash_history\";\n\tif (!vfs.exists(historyPath)) {\n\t\tvfs.writeFile(historyPath, \"\");\n\t\treturn [];\n\t}\n\n\tconst raw = vfs.readFile(historyPath);\n\treturn raw\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line.length > 0);\n}\n", "import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport type { ShellStream } from \"../types/streams\";\nimport {\n\tshellQuote,\n\ttype TerminalSize,\n\twithTerminalSize,\n} from \"./shellRuntime\";\n\nfunction spawnScriptProcess(\n\tcommand: string,\n\tterminalSize: TerminalSize,\n\tstream: ShellStream,\n): ChildProcessWithoutNullStreams {\n\tconst formatted = withTerminalSize(command, terminalSize);\n\tconst proc = spawn(\"script\", [\"-qfec\", formatted, \"/dev/null\"], {\n\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\tenv: {\n\t\t\t...process.env,\n\t\t\t// biome-ignore lint/style/useNamingConvention: env variable should be uppercase\n\t\t\tTERM: process.env.TERM ?? \"xterm-256color\",\n\t\t},\n\t});\n\n\tproc.stdout.on(\"data\", (data: Buffer) => {\n\t\tstream.write(data.toString(\"utf8\"));\n\t});\n\n\tproc.stderr.on(\"data\", (data: Buffer) => {\n\t\tstream.write(data.toString(\"utf8\"));\n\t});\n\n\treturn proc;\n}\n\nexport function spawnNanoEditorProcess(\n\ttempPath: string,\n\tterminalSize: TerminalSize,\n\tstream: ShellStream,\n): ChildProcessWithoutNullStreams {\n\treturn spawnScriptProcess(\n\t\t`nano -- ${shellQuote(tempPath)}`,\n\t\tterminalSize,\n\t\tstream,\n\t);\n}\n\nexport function spawnHtopProcess(\n\tpidList: string,\n\tterminalSize: TerminalSize,\n\tstream: ShellStream,\n): ChildProcessWithoutNullStreams {\n\treturn spawnScriptProcess(\n\t\t`htop -p ${shellQuote(pidList)}`,\n\t\tterminalSize,\n\t\tstream,\n\t);\n}\n", "import { readFile } from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nexport interface TerminalSize {\n\tcols: number;\n\trows: number;\n}\n\nexport function shellQuote(value: string): string {\n\treturn `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nexport function toTtyLines(text: string): string {\n\treturn text\n\t\t.replace(/\\r\\n/g, \"\\n\")\n\t\t.replace(/\\r/g, \"\\n\")\n\t\t.replace(/\\n/g, \"\\r\\n\");\n}\n\nexport function withTerminalSize(\n\tcommand: string,\n\tterminalSize: TerminalSize,\n): string {\n\tconst cols =\n\t\tNumber.isFinite(terminalSize.cols) && terminalSize.cols > 0\n\t\t\t? Math.floor(terminalSize.cols)\n\t\t\t: 80;\n\tconst rows =\n\t\tNumber.isFinite(terminalSize.rows) && terminalSize.rows > 0\n\t\t\t? Math.floor(terminalSize.rows)\n\t\t\t: 24;\n\treturn `stty cols ${cols} rows ${rows} 2>/dev/null; ${command}`;\n}\n\nexport function resolvePath(base: string, inputPath: string): string {\n\tif (!inputPath || inputPath.trim() === \"\" || inputPath === \".\") {\n\t\treturn base;\n\t}\n\treturn inputPath.startsWith(\"/\")\n\t\t? path.posix.normalize(inputPath)\n\t\t: path.posix.normalize(path.posix.join(base, inputPath));\n}\n\nexport async function collectChildPids(parentPid: number): Promise<number[]> {\n\ttry {\n\t\tconst childrenRaw = await readFile(\n\t\t\t`/proc/${parentPid}/task/${parentPid}/children`,\n\t\t\t\"utf8\",\n\t\t);\n\t\tconst directChildren = childrenRaw\n\t\t\t.trim()\n\t\t\t.split(/\\s+/)\n\t\t\t.filter(Boolean)\n\t\t\t.map((value) => Number.parseInt(value, 10))\n\t\t\t.filter((pid) => Number.isInteger(pid) && pid > 0);\n\n\t\tconst nested = await Promise.all(\n\t\t\tdirectChildren.map((pid) => collectChildPids(pid)),\n\t\t);\n\t\treturn [...directChildren, ...nested.flat()];\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport async function getVisibleHtopPidList(\n\trootPid = process.pid,\n): Promise<string | null> {\n\tconst descendants = await collectChildPids(rootPid);\n\tconst unique = Array.from(new Set(descendants)).sort((a, b) => a - b);\n\tif (unique.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn unique.join(\",\");\n}\n", "export function buildPrompt(\n\tuser: string,\n\thost: string,\n\tcwdName: string,\n): string {\n\tconst isRoot = user === \"root\";\n\tconst colorUser = isRoot ? \"\\u001b[31;1m\" : \"\\u001b[35;1m\";\n\tconst colorWhite = \"\\u001b[37;1m\";\n\tconst colorBlue = \"\\u001b[34;1m\";\n\tconst colorReset = \"\\u001b[0m\";\n\tconst symbol = isRoot ? \"#\" : \"$\";\n\n\treturn `${colorWhite}[${colorUser}${user}${colorWhite}@${colorBlue}${host}${colorReset} ${cwdName}${colorWhite}]${colorReset}${symbol} `;\n}\n", "import { EventEmitter } from \"node:events\";\nimport { Server as SshServer } from \"ssh2\";\nimport { VirtualShell } from \"../VirtualShell\";\nimport { createPerfLogger, type PerfLogger } from \"../utils/perfLogger\";\nimport { runExec } from \"./exec\";\nimport { loadOrCreateHostKey } from \"./hostKey\";\n\n/**\n * SSH server facade that wires the virtual shell runtime into ssh2 sessions.\n *\n * This class is exported as `VirtualSshServer` for public API compatibility.\n * Create an instance, call {@link SshMimic.start}, and stop it with\n * {@link SshMimic.stop} when your process exits.\n *\n * Features:\n * - Password authentication\n * - Public-key authentication\n * - Per-IP rate limiting / lockout for brute-force protection\n * - Interactive shell sessions\n * - Non-interactive exec sessions\n */\nconst perf: PerfLogger = createPerfLogger(\"SshMimic\");\n\ninterface RateLimitEntry {\n\tattempts: number;\n\tlockedUntil: number;\n}\n\nclass SshMimic extends EventEmitter {\n\tport: number;\n\tserver: SshServer | null;\n\tprivate shell: VirtualShell;\n\n\t/** Max failed auth attempts before an IP is temporarily locked. */\n\tprivate readonly maxAuthAttempts: number;\n\t/** How long (ms) a locked IP must wait before retrying. */\n\tprivate readonly lockoutDurationMs: number;\n\tprivate readonly authAttempts = new Map<string, RateLimitEntry>();\n\n\t/**\n\t * Creates a new SSH mimic server instance.\n\t *\n\t * @param port TCP port to bind on localhost.\n\t * @param hostname Virtual hostname used for the SSH ident and default shell label.\n\t * @param shell Optional preconfigured virtual shell instance to reuse.\n\t * @param maxAuthAttempts Max failed attempts per IP before lockout (default: 5).\n\t * @param lockoutDurationMs Lockout window in ms after exceeding attempts (default: 60 000).\n\t */\n\tconstructor({\n\t\tport,\n\t\thostname = \"typescript-vm\",\n\t\tshell = new VirtualShell(hostname),\n\t\tmaxAuthAttempts = 5,\n\t\tlockoutDurationMs = 60_000,\n\t}: {\n\t\tport: number;\n\t\thostname?: string;\n\t\tshell?: VirtualShell;\n\t\tmaxAuthAttempts?: number;\n\t\tlockoutDurationMs?: number;\n\t}) {\n\t\tsuper();\n\t\tperf.mark(\"constructor\");\n\t\tthis.port = port;\n\t\tthis.server = null;\n\t\tthis.shell = shell;\n\t\tthis.maxAuthAttempts = maxAuthAttempts;\n\t\tthis.lockoutDurationMs = lockoutDurationMs;\n\t}\n\n\t// \u2500\u2500 Rate limiting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\tprivate isLockedOut(ip: string): boolean {\n\t\tconst entry = this.authAttempts.get(ip);\n\t\tif (!entry) return false;\n\t\tif (Date.now() < entry.lockedUntil) return true;\n\t\tif (entry.lockedUntil > 0) {\n\t\t\tthis.authAttempts.delete(ip);\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate recordFailure(ip: string): void {\n\t\tconst entry = this.authAttempts.get(ip) ?? { attempts: 0, lockedUntil: 0 };\n\t\tentry.attempts += 1;\n\t\tif (entry.attempts >= this.maxAuthAttempts) {\n\t\t\tentry.lockedUntil = Date.now() + this.lockoutDurationMs;\n\t\t\tthis.emit(\"auth:lockout\", { ip, until: new Date(entry.lockedUntil) });\n\t\t}\n\t\tthis.authAttempts.set(ip, entry);\n\t}\n\n\tprivate recordSuccess(ip: string): void {\n\t\tthis.authAttempts.delete(ip);\n\t}\n\n\t// \u2500\u2500 Home directory bootstrap \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\tprivate ensureHomeDir(authUser: string): void {\n\t\tconst homePath = `/home/${authUser}`;\n\t\tif (!this.shell.vfs.exists(homePath)) {\n\t\t\tthis.shell.vfs.mkdir(homePath, 0o755);\n\t\t\tthis.shell.vfs.writeFile(\n\t\t\t\t`${homePath}/README.txt`,\n\t\t\t\t`Welcome to ${this.shell.hostname}\\n`,\n\t\t\t);\n\t\t\tvoid this.shell.vfs.flushMirror();\n\t\t}\n\t}\n\n\t// \u2500\u2500 Server lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\t/**\n\t * Starts server and initializes virtual filesystem, users, and handlers.\n\t *\n\t * @returns Promise resolved with bound listening port.\n\t */\n\tpublic async start(): Promise<number> {\n\t\tperf.mark(\"start\");\n\t\tconst shell = this.shell;\n\t\tconst privateKey = loadOrCreateHostKey();\n\n\t\tawait shell.ensureInitialized();\n\n\t\tthis.server = new SshServer(\n\t\t\t{\n\t\t\t\thostKeys: [privateKey],\n\t\t\t\tident: `SSH-2.0-${shell.hostname}`,\n\t\t\t},\n\t\t\t(client) => {\n\t\t\t\tlet authUser = \"root\";\n\t\t\t\tlet remoteAddress = \"unknown\";\n\t\t\t\tlet sessionId: string | null = null;\n\n\t\t\t\tthis.emit(\"client:connect\");\n\n\t\t\t\tclient.on(\"authentication\", (ctx) => {\n\t\t\t\t\tconst candidateUser = ctx.username || \"root\";\n\t\t\t\t\tremoteAddress = (ctx as { ip?: string }).ip ?? remoteAddress;\n\n\t\t\t\t\t// Rate-limit check\n\t\t\t\t\tif (this.isLockedOut(remoteAddress)) {\n\t\t\t\t\t\tthis.emit(\"auth:failure\", {\n\t\t\t\t\t\t\tusername: candidateUser,\n\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\treason: \"lockout\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tctx.reject();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// \u2500\u2500 Password auth \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\t\t\t\t\tif (ctx.method === \"password\") {\n\t\t\t\t\t\tif (!shell.users.hasPassword(candidateUser)) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`User ${candidateUser} has no password set, allowing login without verification`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tauthUser = candidateUser;\n\t\t\t\t\t\t\tsessionId = shell.users.registerSession(\n\t\t\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t).id;\n\t\t\t\t\t\t\tthis.recordSuccess(remoteAddress);\n\t\t\t\t\t\t\tthis.emit(\"auth:success\", { username: authUser, remoteAddress });\n\t\t\t\t\t\t\tthis.ensureHomeDir(authUser);\n\t\t\t\t\t\t\tctx.accept();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!ctx.password ||\n\t\t\t\t\t\t\tctx.password === \"\" ||\n\t\t\t\t\t\t\t!shell.users.verifyPassword(candidateUser, ctx.password)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.recordFailure(remoteAddress);\n\t\t\t\t\t\t\tthis.emit(\"auth:failure\", {\n\t\t\t\t\t\t\t\tusername: candidateUser,\n\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tctx.reject();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tauthUser = candidateUser;\n\t\t\t\t\t\tsessionId = shell.users.registerSession(authUser, remoteAddress).id;\n\t\t\t\t\t\tthis.recordSuccess(remoteAddress);\n\t\t\t\t\t\tthis.emit(\"auth:success\", { username: authUser, remoteAddress });\n\t\t\t\t\t\tthis.ensureHomeDir(authUser);\n\t\t\t\t\t\tctx.accept();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// \u2500\u2500 Public-key auth \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\t\t\t\t\tif (ctx.method === \"publickey\") {\n\t\t\t\t\t\tconst authorizedKeys = shell.users.getAuthorizedKeys(candidateUser);\n\t\t\t\t\t\tif (authorizedKeys.length === 0) {\n\t\t\t\t\t\t\t// No keys configured \u2014 reject cleanly\n\t\t\t\t\t\t\tctx.reject();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst incomingKey = ctx.key;\n\t\t\t\t\t\tconst keyMatches = authorizedKeys.some(\n\t\t\t\t\t\t\t(k) =>\n\t\t\t\t\t\t\t\tk.algo === incomingKey.algo && k.data.equals(incomingKey.data),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!keyMatches) {\n\t\t\t\t\t\t\tthis.recordFailure(remoteAddress);\n\t\t\t\t\t\t\tthis.emit(\"auth:failure\", {\n\t\t\t\t\t\t\t\tusername: candidateUser,\n\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t\tmethod: \"publickey\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tctx.reject();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Key matched \u2014 if this is a signature check step, accept\n\t\t\t\t\t\tif (ctx.signature) {\n\t\t\t\t\t\t\tauthUser = candidateUser;\n\t\t\t\t\t\t\tsessionId = shell.users.registerSession(\n\t\t\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t).id;\n\t\t\t\t\t\t\tthis.recordSuccess(remoteAddress);\n\t\t\t\t\t\t\tthis.emit(\"auth:success\", {\n\t\t\t\t\t\t\t\tusername: authUser,\n\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t\tmethod: \"publickey\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthis.ensureHomeDir(authUser);\n\t\t\t\t\t\t\tctx.accept();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Key exists but no signature yet \u2014 ssh2 will call again with signature\n\t\t\t\t\t\t\tctx.accept();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.reject([\"password\", \"publickey\"]);\n\t\t\t\t});\n\n\t\t\t\tclient.on(\"close\", () => {\n\t\t\t\t\tshell.users.unregisterSession(sessionId);\n\t\t\t\t\tthis.emit(\"client:disconnect\", { user: authUser });\n\t\t\t\t\tsessionId = null;\n\t\t\t\t});\n\n\t\t\t\tclient.on(\"ready\", () => {\n\t\t\t\t\tclient.on(\"session\", (accept) => {\n\t\t\t\t\t\tconst session = accept();\n\t\t\t\t\t\tconst terminalSize = { cols: 80, rows: 24 };\n\n\t\t\t\t\t\tsession.on(\"pty\", (acceptPty, _rejectPty, info) => {\n\t\t\t\t\t\t\tterminalSize.cols = info?.cols ?? terminalSize.cols;\n\t\t\t\t\t\t\tterminalSize.rows = info?.rows ?? terminalSize.rows;\n\t\t\t\t\t\t\tacceptPty();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tsession.on(\n\t\t\t\t\t\t\t\"window-change\",\n\t\t\t\t\t\t\t(_acceptChange, _rejectChange, info) => {\n\t\t\t\t\t\t\t\tterminalSize.cols = info?.cols ?? terminalSize.cols;\n\t\t\t\t\t\t\t\tterminalSize.rows = info?.rows ?? terminalSize.rows;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tsession.on(\"shell\", (acceptShell) => {\n\t\t\t\t\t\t\tconst stream = acceptShell();\n\t\t\t\t\t\t\tshell?.startInteractiveSession(\n\t\t\t\t\t\t\t\tstream,\n\t\t\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t\tterminalSize,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tsession.on(\"exec\", (acceptExec, _rejectExec, info) => {\n\t\t\t\t\t\t\tconst stream = acceptExec();\n\t\t\t\t\t\t\tif (stream) {\n\t\t\t\t\t\t\t\trunExec(\n\t\t\t\t\t\t\t\t\tstream,\n\t\t\t\t\t\t\t\t\tinfo.command.trim(),\n\t\t\t\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\t\t\t\tshell.hostname,\n\t\t\t\t\t\t\t\t\tshell,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\n\t\treturn new Promise<number>((resolve, reject) => {\n\t\t\tthis.server?.once(\"error\", (err: unknown) => reject(err));\n\t\t\tthis.server?.listen(this.port, \"0.0.0.0\", () => {\n\t\t\t\tconsole.log(`SSH Mimic listening on port ${this.port}`);\n\t\t\t\tthis.emit(\"start\", { port: this.port });\n\t\t\t\tresolve(this.port);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Stops server if running.\n\t */\n\tpublic stop(): void {\n\t\tperf.mark(\"stop\");\n\t\tif (this.server) {\n\t\t\tthis.server.close(() => {\n\t\t\t\tconsole.log(\"SSH Mimic stopped\");\n\t\t\t\tthis.emit(\"stop\");\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Manually clears the rate-limit record for an IP address.\n\t * Useful in tests or admin tooling.\n\t */\n\tpublic clearLockout(ip: string): void {\n\t\tthis.authAttempts.delete(ip);\n\t}\n}\n\nexport { SftpMimic } from \"./sftp\";\nexport { SshMimic };\n", "import { makeDefaultEnv, runCommand } from \"../commands\";\nimport type { ExecStream } from \"../types/streams\";\nimport type { VirtualShell } from \"../VirtualShell\";\n\nfunction toTtyLines(text: string): string {\n\treturn text\n\t\t.replace(/\\r\\n/g, \"\\n\")\n\t\t.replace(/\\r/g, \"\\n\")\n\t\t.replace(/\\n/g, \"\\r\\n\");\n}\n\nexport function runExec(\n\tstream: ExecStream,\n\tcmd: string,\n\tauthUser: string,\n\thostname: string,\n\tshell: VirtualShell,\n): void {\n\tPromise.resolve(\n\t\trunCommand(\n\t\t\tcmd,\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\t\"exec\",\n\t\t\t`/home/${authUser}`,\n\t\t\tshell,\n\t\t\tundefined,\n\t\t\tmakeDefaultEnv(authUser, hostname),\n\t\t),\n\t)\n\t\t.then((result) => {\n\t\t\tif (result.stdout) {\n\t\t\t\tstream.write(`${toTtyLines(result.stdout)}\\r\\n`);\n\t\t\t}\n\n\t\t\tif (result.stderr) {\n\t\t\t\tstream.stderr.write(`${toTtyLines(result.stderr)}\\r\\n`);\n\t\t\t}\n\n\t\t\tstream.exit(result.exitCode ?? 0);\n\t\t\tvoid shell.vfs.flushMirror();\n\t\t\tstream.end();\n\t\t})\n\t\t.catch((error) => {\n\t\t\tconsole.error(\"Exec error:\", error);\n\t\t\tstream.stderr.write(`Error: ${String(error)}\\r\\n`);\n\t\t\tstream.exit(1);\n\t\t\tstream.end();\n\t\t});\n}\n", "import { generateKeyPairSync } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\n\nexport function loadOrCreateHostKey(baseDir: string = process.cwd()): string {\n\tconst hostKeyPath = resolve(baseDir, \".ssh-mimic\", \"host_rsa\");\n\n\tif (existsSync(hostKeyPath)) {\n\t\treturn readFileSync(hostKeyPath, \"utf8\");\n\t}\n\n\tconst privateKey = generateKeyPairSync(\"rsa\", {\n\t\tmodulusLength: 2048,\n\t\tprivateKeyEncoding: { type: \"pkcs1\", format: \"pem\" },\n\t\tpublicKeyEncoding: { type: \"pkcs1\", format: \"pem\" },\n\t}).privateKey;\n\n\tmkdirSync(dirname(hostKeyPath), { recursive: true });\n\twriteFileSync(hostKeyPath, privateKey, { mode: 0o600 });\n\treturn privateKey;\n}\n", "/** biome-ignore-all lint/style/useNamingConvention: const as enum */\nimport { EventEmitter } from \"node:events\";\nimport * as path from \"node:path\";\nimport type { AuthenticationType, KeyboardAuthContext } from \"ssh2\";\nimport { Server as SshServer } from \"ssh2\";\nimport type { VfsNodeStats } from \"../types/vfs\";\nimport type { PerfLogger } from \"../utils/perfLogger\";\nimport { createPerfLogger } from \"../utils/perfLogger\";\nimport type VirtualFileSystem from \"../VirtualFileSystem\";\nimport { VirtualShell } from \"../VirtualShell\";\nimport type { VirtualUserManager } from \"../VirtualUserManager\";\nimport { loadOrCreateHostKey } from \"./hostKey\";\n\nconst SFTP_STATUS_CODE = {\n\tOK: 0,\n\tEOF: 1,\n\tNO_SUCH_FILE: 2,\n\tPERMISSION_DENIED: 3,\n\tFAILURE: 4,\n\tBAD_MESSAGE: 5,\n\tNO_CONNECTION: 6,\n\tCONNECTION_LOST: 7,\n\tOP_UNSUPPORTED: 8,\n};\n\nconst OPEN_MODE = {\n\tREAD: 0x00000001,\n\tWRITE: 0x00000002,\n\tAPPEND: 0x00000004,\n\tCREAT: 0x00000008,\n\tTRUNC: 0x00000010,\n\tEXCL: 0x00000020,\n};\n\nconst perf: PerfLogger = createPerfLogger(\"SftpMimic\");\n\ninterface SftpFileHandle {\n\ttype: \"file\";\n\tpath: string;\n\tflags: number;\n\tbuffer: Buffer;\n}\n\ninterface SftpDirHandle {\n\ttype: \"dir\";\n\tpath: string;\n\tentries: string[];\n\tindex: number;\n}\n\ntype SftpHandle = SftpFileHandle | SftpDirHandle;\n\ninterface SftpAttributes {\n\tmode: number;\n\tuid: number;\n\tgid: number;\n\tsize: number;\n\tatime: number | Date;\n\tmtime: number | Date;\n}\n\ninterface SftpServerStream {\n\ton(\n\t\tevent: \"OPEN\",\n\t\tlistener: (reqid: number, filename: string, flags: number) => void,\n\t): this;\n\ton(\n\t\tevent: \"READ\",\n\t\tlistener: (\n\t\t\treqid: number,\n\t\t\thandle: Buffer,\n\t\t\toffset: number,\n\t\t\tlength: number,\n\t\t) => void,\n\t): this;\n\ton(\n\t\tevent: \"WRITE\",\n\t\tlistener: (\n\t\t\treqid: number,\n\t\t\thandle: Buffer,\n\t\t\toffset: number,\n\t\t\tdata: Buffer,\n\t\t) => void,\n\t): this;\n\ton(event: \"FSTAT\", listener: (reqid: number, handle: Buffer) => void): this;\n\ton(event: \"CLOSE\", listener: (reqid: number, handle: Buffer) => void): this;\n\ton(event: \"OPENDIR\", listener: (reqid: number, path: string) => void): this;\n\ton(event: \"READDIR\", listener: (reqid: number, handle: Buffer) => void): this;\n\ton(event: \"STAT\", listener: (reqid: number, path: string) => void): this;\n\ton(event: \"LSTAT\", listener: (reqid: number, path: string) => void): this;\n\ton(\n\t\tevent: \"FSETSTAT\",\n\t\tlistener: (\n\t\t\treqid: number,\n\t\t\thandle: Buffer,\n\t\t\tattrs: Partial<SftpAttributes>,\n\t\t) => void,\n\t): this;\n\ton(\n\t\tevent: \"SETSTAT\",\n\t\tlistener: (\n\t\t\treqid: number,\n\t\t\tpath: string,\n\t\t\tattrs: Partial<SftpAttributes>,\n\t\t) => void,\n\t): this;\n\ton(event: \"REALPATH\", listener: (reqid: number, path: string) => void): this;\n\ton(event: \"MKDIR\", listener: (reqid: number, path: string) => void): this;\n\ton(event: \"RMDIR\", listener: (reqid: number, path: string) => void): this;\n\ton(event: \"REMOVE\", listener: (reqid: number, path: string) => void): this;\n\ton(\n\t\tevent: \"RENAME\",\n\t\tlistener: (reqid: number, oldPath: string, newPath: string) => void,\n\t): this;\n\ton(event: \"READLINK\", listener: (reqid: number) => void): this;\n\ton(event: \"SYMLINK\", listener: (reqid: number) => void): this;\n\ton(event: \"END\", listener: () => void): this;\n\ton(event: \"end\", listener: () => void): this;\n\ton(event: \"error\", listener: (error: Error) => void): this;\n\ton(event: \"close\", listener: () => void): this;\n\tstatus(reqid: number, code: number): void;\n\tattrs(reqid: number, attrs: SftpAttributes): void;\n\thandle(reqid: number, handle: Buffer): void;\n\tdata(reqid: number, data: Buffer): void;\n\tname(\n\t\treqid: number,\n\t\tentries: Array<{\n\t\t\tfilename: string;\n\t\t\tlongname: string;\n\t\t\tattrs: SftpAttributes;\n\t\t}>,\n\t): void;\n}\n\nexport interface SftpMimicOptions {\n\tport: number;\n\thostname?: string;\n\tshell?: VirtualShell;\n\tvfs?: VirtualFileSystem;\n\tusers?: VirtualUserManager;\n}\n\nexport class SftpMimic extends EventEmitter {\n\tport: number;\n\tserver: SshServer | null;\n\tprivate readonly hostname: string;\n\tprivate readonly shell: VirtualShell | null;\n\tprivate readonly vfs: VirtualFileSystem;\n\tprivate readonly users: VirtualUserManager;\n\tprivate nextHandleId = 0;\n\tprivate handles = new Map<string, SftpHandle>();\n\n\tconstructor({\n\t\tport,\n\t\thostname = \"typescript-vm\",\n\t\tshell,\n\t\tvfs,\n\t\tusers,\n\t}: SftpMimicOptions) {\n\t\tsuper();\n\t\tperf.mark(\"constructor\");\n\t\tthis.port = port;\n\t\tthis.server = null;\n\t\tthis.hostname = hostname;\n\t\tthis.shell = null;\n\n\t\tif (shell) {\n\t\t\tthis.vfs = shell.vfs;\n\t\t\tthis.users = shell.users;\n\t\t\tthis.hostname = shell.hostname;\n\t\t\tthis.shell = shell;\n\t\t} else if (vfs && users) {\n\t\t\tthis.vfs = vfs;\n\t\t\tthis.users = users;\n\t\t} else {\n\t\t\tconst defaultShell = new VirtualShell(hostname);\n\t\t\tthis.vfs = defaultShell.vfs;\n\t\t\tthis.users = defaultShell.users;\n\t\t\tthis.shell = defaultShell;\n\t\t}\n\t}\n\n\tprivate getVfs(): VirtualFileSystem {\n\t\treturn this.shell?.vfs ?? this.vfs;\n\t}\n\n\tprivate getUsers(): VirtualUserManager {\n\t\treturn this.shell?.users ?? this.users;\n\t}\n\n\tpublic async start(): Promise<number> {\n\t\tperf.mark(\"start\");\n\t\tconst privateKey = loadOrCreateHostKey();\n\n\t\t// Ensure VirtualShell is fully initialized before accepting connections\n\t\tif (this.shell) {\n\t\t\tawait this.shell.ensureInitialized();\n\t\t} else {\n\t\t\t// If using standalone VFS+Users, initialize users now\n\t\t\tawait this.users.initialize();\n\t\t}\n\n\t\tthis.server = new SshServer(\n\t\t\t{\n\t\t\t\thostKeys: [privateKey],\n\t\t\t\tident: `SSH-2.0-${this.hostname}`,\n\t\t\t},\n\t\t\t(client) => {\n\t\t\t\tconst allowedAuthMethods: AuthenticationType[] = [\n\t\t\t\t\t\"password\",\n\t\t\t\t\t\"keyboard-interactive\",\n\t\t\t\t];\n\t\t\t\tlet authUser = \"root\";\n\t\t\t\tlet sessionId: string | null = null;\n\t\t\t\tlet remoteAddress = \"unknown\";\n\n\t\t\t\tthis.emit(\"client:connect\");\n\n\t\t\t\t// Add error handling for the client\n\t\t\t\tclient.on(\"error\", (error: unknown) => {\n\t\t\t\t\tconsole.error(`[SFTP] Client error:`, error);\n\t\t\t\t});\n\n\t\t\t\tconst acceptSession = (username: string): void => {\n\t\t\t\t\tauthUser = username;\n\t\t\t\t\tsessionId = this.getUsers().registerSession(\n\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t).id;\n\n\t\t\t\t\tconst homeRoot = \"/home\";\n\t\t\t\t\tif (!this.getVfs().exists(homeRoot)) {\n\t\t\t\t\t\tthis.getVfs().mkdir(homeRoot, 0o755);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst homePath = `/home/${authUser}`;\n\t\t\t\t\tif (!this.getVfs().exists(homePath)) {\n\t\t\t\t\t\tthis.getVfs().mkdir(homePath, 0o755);\n\t\t\t\t\t\tthis.getVfs().writeFile(\n\t\t\t\t\t\t\t`${homePath}/README.txt`,\n\t\t\t\t\t\t\t`Welcome to ${this.hostname}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tvoid this.getVfs().flushMirror();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tclient.on(\"authentication\", (ctx) => {\n\t\t\t\t\tconst candidateUser = ctx.username || \"root\";\n\t\t\t\t\tremoteAddress = (ctx as { ip?: string }).ip ?? remoteAddress;\n\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`[SFTP] Auth attempt: user=${candidateUser}, method=${ctx.method}, ip=${remoteAddress}`,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (ctx.method === \"password\") {\n\t\t\t\t\t\t// If no password is set for the user, allow login without verification\n\t\t\t\t\t\tif (!this.getUsers().hasPassword(candidateUser)) {\n\t\t\t\t\t\t\tacceptSession(candidateUser);\n\t\t\t\t\t\t\tthis.emit(\"auth:success\", { username: authUser, remoteAddress });\n\t\t\t\t\t\t\tctx.accept();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!this.getUsers().verifyPassword(candidateUser, ctx.password ?? \"\")\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.emit(\"auth:failure\", {\n\t\t\t\t\t\t\t\tusername: candidateUser,\n\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tctx.reject(allowedAuthMethods);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tacceptSession(candidateUser);\n\t\t\t\t\t\tthis.emit(\"auth:success\", { username: authUser, remoteAddress });\n\t\t\t\t\t\tctx.accept();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctx.method === \"keyboard-interactive\") {\n\t\t\t\t\t\tconst keyboardCtx = ctx as KeyboardAuthContext;\n\t\t\t\t\t\t// If no password is set, accept immediately\n\t\t\t\t\t\tif (!this.getUsers().hasPassword(candidateUser)) {\n\t\t\t\t\t\t\tacceptSession(candidateUser);\n\t\t\t\t\t\t\tthis.emit(\"auth:success\", { username: authUser, remoteAddress });\n\t\t\t\t\t\t\tkeyboardCtx.accept();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tkeyboardCtx.prompt(\n\t\t\t\t\t\t\t[{ prompt: \"Password: \", echo: false }],\n\t\t\t\t\t\t\t(answers) => {\n\t\t\t\t\t\t\t\tconst password = answers[0] ?? \"\";\n\t\t\t\t\t\t\t\tif (!this.getUsers().verifyPassword(candidateUser, password)) {\n\t\t\t\t\t\t\t\t\tthis.emit(\"auth:failure\", {\n\t\t\t\t\t\t\t\t\t\tusername: candidateUser,\n\t\t\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tkeyboardCtx.reject(allowedAuthMethods);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tacceptSession(candidateUser);\n\t\t\t\t\t\t\t\tthis.emit(\"auth:success\", {\n\t\t\t\t\t\t\t\t\tusername: authUser,\n\t\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tkeyboardCtx.accept();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.reject(allowedAuthMethods);\n\t\t\t\t});\n\n\t\t\t\tclient.on(\"close\", () => {\n\t\t\t\t\tthis.getUsers().unregisterSession(sessionId);\n\t\t\t\t\tthis.emit(\"client:disconnect\", { user: authUser });\n\t\t\t\t\tsessionId = null;\n\t\t\t\t});\n\n\t\t\t\tclient.on(\"ready\", () => {\n\t\t\t\t\tclient.on(\"session\", (accept, _reject) => {\n\t\t\t\t\t\tconst session = accept();\n\n\t\t\t\t\t\t// Add error handling for the session\n\t\t\t\t\t\tsession.on(\"error\", (error: unknown) => {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t`[SFTP] Session error for user=${authUser}:`,\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tsession.on(\"sftp\", (acceptSftp) => {\n\t\t\t\t\t\t\tconst sftp = acceptSftp();\n\t\t\t\t\t\t\tthis.attachSftpHandlers(sftp, authUser);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\n\t\treturn new Promise<number>((resolve, reject) => {\n\t\t\tthis.server?.once(\"error\", (err: unknown) => reject(err));\n\t\t\tthis.server?.listen(this.port, \"0.0.0.0\", () => {\n\t\t\t\tconst address = this.server?.address();\n\t\t\t\tconst actualPort =\n\t\t\t\t\taddress && typeof address === \"object\" && \"port\" in address\n\t\t\t\t\t\t? address.port\n\t\t\t\t\t\t: this.port;\n\t\t\t\tconsole.log(`SFTP Mimic listening on port ${actualPort}`);\n\t\t\t\tthis.emit(\"start\", { port: actualPort });\n\t\t\t\tresolve(actualPort as number);\n\t\t\t});\n\t\t});\n\t}\n\n\tpublic stop(): void {\n\t\tperf.mark(\"stop\");\n\t\tif (this.server) {\n\t\t\tthis.server.close(() => {\n\t\t\t\tconsole.log(\"SFTP Mimic stopped\");\n\t\t\t\tthis.emit(\"stop\");\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Resolves SFTP request paths with proper handling of relative paths.\n\t * Relative paths (including \".\") are resolved relative to the user's home directory.\n\t * This is standard SFTP behavior where the \"working directory\" is always the home.\n\t */\n\tprivate resolveRequestPath(requestPath: string, authUser: string): string {\n\t\tconst homePath = `/home/${authUser}`;\n\n\t\t// Empty path or \".\" \u2192 resolve to home directory\n\t\tif (!requestPath || requestPath === \".\") {\n\t\t\treturn homePath;\n\t\t}\n\n\t\t// Relative path (doesn't start with \"/\") \u2192 resolve relative to home\n\t\tif (!requestPath.startsWith(\"/\")) {\n\t\t\tconst joined = path.posix.join(homePath, requestPath);\n\t\t\treturn path.posix.normalize(joined);\n\t\t}\n\n\t\t// Absolute path \u2192 just normalize it\n\t\treturn path.posix.normalize(requestPath);\n\t}\n\t/**\n\t * Verifies that a target path is confined within the user's home directory.\n\t * This implements chroot-like behavior for security.\n\t * @param targetPath - The normalized target path\n\t * @param authUser - The authenticated username\n\t * @returns true if path is within home, false if traversal attempt detected\n\t */\n\tprivate isPathWithinHome(targetPath: string, authUser: string): boolean {\n\t\tconst homePath = `/home/${authUser}`;\n\t\tconst normalized = path.posix.normalize(targetPath);\n\n\t\t// Allow access to home directory itself\n\t\tif (normalized === homePath) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Check if path is within home directory (starts with /home/username/)\n\t\tif (normalized.startsWith(`${homePath}/`)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Reject any attempt to escape home directory\n\t\treturn false;\n\t}\n\n\tprivate createAttrs(node: VfsNodeStats): SftpAttributes {\n\t\tconst permissions = node.mode & 0o777;\n\t\tconst fileType = node.type === \"directory\" ? 0o040000 : 0o100000;\n\n\t\treturn {\n\t\t\tmode: fileType | permissions,\n\t\t\tsize: node.type === \"file\" ? node.size : 0,\n\t\t\tuid: 0,\n\t\t\tgid: 0,\n\t\t\tatime: Math.floor(node.createdAt.getTime() / 1000),\n\t\t\tmtime: Math.floor(node.updatedAt.getTime() / 1000),\n\t\t};\n\t}\n\n\tprivate openHandle(handleValue: SftpHandle): Buffer {\n\t\tconst handleId = ++this.nextHandleId;\n\t\tconst handle = Buffer.alloc(4);\n\t\thandle.writeUInt32BE(handleId, 0);\n\t\tthis.handles.set(handle.toString(\"hex\"), handleValue);\n\t\treturn handle;\n\t}\n\n\tprivate getHandle(handle: Buffer): SftpHandle | undefined {\n\t\treturn this.handles.get(handle.toString(\"hex\")) as SftpHandle | undefined;\n\t}\n\n\tprivate closeHandle(handle: Buffer): void {\n\t\tthis.handles.delete(handle.toString(\"hex\"));\n\t}\n\n\tprivate attachSftpHandlers(sftp: SftpServerStream, authUser: string): void {\n\t\tconst getVfs = () => this.getVfs();\n\t\tconst getUsers = () => this.getUsers();\n\n\t\tsftp.on(\"OPEN\", (reqid: number, filename: string, flags: number) => {\n\t\t\tconst targetPath = this.resolveRequestPath(filename, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst openMode = flags;\n\t\t\tconst _canRead = Boolean(openMode & OPEN_MODE.READ);\n\t\t\tconst _canWrite = Boolean(\n\t\t\t\topenMode & OPEN_MODE.WRITE || openMode & OPEN_MODE.APPEND,\n\t\t\t);\n\t\t\tconst canCreate = Boolean(openMode & OPEN_MODE.CREAT);\n\t\t\tconst shouldTruncate = Boolean(openMode & OPEN_MODE.TRUNC);\n\n\t\t\ttry {\n\t\t\t\tif (!getVfs().exists(targetPath)) {\n\t\t\t\t\tif (!canCreate) {\n\t\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.NO_SUCH_FILE);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tgetVfs().writeFile(targetPath, Buffer.alloc(0));\n\t\t\t\t}\n\n\t\t\t\tconst stats = getVfs().stat(targetPath);\n\t\t\t\tif (stats.type === \"directory\") {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet buffer = Buffer.from(getVfs().readFile(targetPath), \"utf8\");\n\t\t\t\tif (shouldTruncate) {\n\t\t\t\t\tbuffer = Buffer.alloc(0);\n\t\t\t\t}\n\n\t\t\t\tif (openMode & OPEN_MODE.APPEND) {\n\t\t\t\t\tconst handle = this.openHandle({\n\t\t\t\t\t\ttype: \"file\",\n\t\t\t\t\t\tpath: targetPath,\n\t\t\t\t\t\tflags: openMode,\n\t\t\t\t\t\tbuffer,\n\t\t\t\t\t});\n\t\t\t\t\tsftp.handle(reqid, handle);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst handle = this.openHandle({\n\t\t\t\t\ttype: \"file\",\n\t\t\t\t\tpath: targetPath,\n\t\t\t\t\tflags: openMode,\n\t\t\t\t\tbuffer,\n\t\t\t\t});\n\t\t\t\tsftp.handle(reqid, handle);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"SFTP OPEN error:\", error);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\n\t\t\t\"READ\",\n\t\t\t(reqid: number, handle: Buffer, offset: number, length: number) => {\n\t\t\t\tconst entry = this.getHandle(handle);\n\t\t\t\tif (!entry || entry.type !== \"file\") {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (offset >= entry.buffer.length) {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.EOF);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst chunk = entry.buffer.slice(offset, offset + length);\n\t\t\t\tsftp.data(reqid, chunk);\n\t\t\t},\n\t\t);\n\n\t\tsftp.on(\n\t\t\t\"WRITE\",\n\t\t\tasync (reqid: number, handle: Buffer, offset: number, data: Buffer) => {\n\t\t\t\tconst entry = this.getHandle(handle);\n\t\t\t\tif (!entry || entry.type !== \"file\") {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst end = offset + data.length;\n\t\t\t\tif (end > entry.buffer.length) {\n\t\t\t\t\tconst nextBuffer = Buffer.alloc(end);\n\t\t\t\t\tentry.buffer.copy(nextBuffer, 0, 0, entry.buffer.length);\n\t\t\t\t\tentry.buffer = nextBuffer;\n\t\t\t\t}\n\n\t\t\t\tdata.copy(entry.buffer, offset);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t},\n\t\t);\n\n\t\tsftp.on(\"FSTAT\", (reqid: number, handle: Buffer) => {\n\t\t\tconst entry = this.getHandle(handle);\n\t\t\tif (!entry) {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst stats = getVfs().stat(entry.path);\n\t\t\t\tsftp.attrs(reqid, this.createAttrs(stats));\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"CLOSE\", async (reqid: number, handle: Buffer) => {\n\t\t\tconst entry = this.getHandle(handle);\n\t\t\tif (!entry) {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (entry.type === \"file\") {\n\t\t\t\ttry {\n\t\t\t\t\tgetUsers().assertWriteWithinQuota(authUser, entry.path, entry.buffer);\n\t\t\t\t\tgetVfs().writeFile(entry.path, entry.buffer);\n\t\t\t\t\tvoid getVfs().flushMirror();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(\"SFTP CLOSE write error:\", error);\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\tthis.closeHandle(handle);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.closeHandle(handle);\n\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t});\n\n\t\tsftp.on(\"OPENDIR\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst stats = getVfs().stat(targetPath);\n\t\t\t\tif (stats.type !== \"directory\") {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst entries = getVfs().list(targetPath);\n\t\t\t\tconst handle = this.openHandle({\n\t\t\t\t\ttype: \"dir\",\n\t\t\t\t\tpath: targetPath,\n\t\t\t\t\tentries,\n\t\t\t\t\tindex: 0,\n\t\t\t\t});\n\n\t\t\t\tsftp.handle(reqid, handle);\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.NO_SUCH_FILE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"READDIR\", (reqid: number, handle: Buffer) => {\n\t\t\tconst entry = this.getHandle(handle);\n\t\t\tif (!entry || entry.type !== \"dir\") {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (entry.index >= entry.entries.length) {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.EOF);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst filename = entry.entries[entry.index++]!;\n\t\t\tconst filePath = path.posix.join(entry.path, filename);\n\t\t\tconst stats = getVfs().stat(filePath);\n\t\t\tconst attrs = this.createAttrs(stats);\n\t\t\tconst longname = `${stats.type === \"directory\" ? \"d\" : \"-\"}${(stats.mode & 0o777).toString(8)} ${filename}`;\n\t\t\treturn sftp.name(reqid, [{ filename, longname, attrs }]);\n\t\t});\n\n\t\tsftp.on(\"STAT\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst stats = getVfs().stat(targetPath);\n\t\t\t\tsftp.attrs(reqid, this.createAttrs(stats));\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.NO_SUCH_FILE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"LSTAT\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst stats = getVfs().stat(targetPath);\n\t\t\t\tsftp.attrs(reqid, this.createAttrs(stats));\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.NO_SUCH_FILE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\n\t\t\t\"FSETSTAT\",\n\t\t\t(reqid: number, handle: Buffer, attrs: { mode?: number }) => {\n\t\t\t\tconst entry = this.getHandle(handle);\n\t\t\t\tif (!entry) {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tif (attrs.mode !== undefined) {\n\t\t\t\t\t\tgetVfs().chmod(entry.path, attrs.mode);\n\t\t\t\t\t}\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t\t} catch {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tsftp.on(\n\t\t\t\"SETSTAT\",\n\t\t\t(reqid: number, requestPath: string, attrs: { mode?: number }) => {\n\t\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t\t// Security: Confine to home directory\n\t\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t\t);\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tif (attrs.mode !== undefined) {\n\t\t\t\t\t\tgetVfs().chmod(targetPath, attrs.mode);\n\t\t\t\t\t}\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t\t} catch {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tsftp.on(\"REALPATH\", (reqid: number, requestPath: string) => {\n\t\t\tconst normalized = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(normalized, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${normalized}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsftp.name(reqid, [\n\t\t\t\t{\n\t\t\t\t\tfilename: normalized,\n\t\t\t\t\tlongname: normalized,\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\tmode: 0o040755,\n\t\t\t\t\t\tuid: 0,\n\t\t\t\t\t\tgid: 0,\n\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\tatime: 0,\n\t\t\t\t\t\tmtime: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tsftp.on(\"MKDIR\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tgetVfs().mkdir(targetPath, 0o755);\n\t\t\t\tvoid getVfs().flushMirror();\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"RMDIR\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tgetVfs().remove(targetPath, { recursive: false });\n\t\t\t\tvoid getVfs().flushMirror();\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"REMOVE\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tgetVfs().remove(targetPath, { recursive: false });\n\t\t\t\tvoid getVfs().flushMirror();\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"RENAME\", (reqid: number, oldPath: string, newPath: string) => {\n\t\t\tconst fromPath = this.resolveRequestPath(oldPath, authUser);\n\t\t\tconst toPath = this.resolveRequestPath(newPath, authUser);\n\n\t\t\t// Security: Confine both source and destination to home directory\n\t\t\tif (\n\t\t\t\t!this.isPathWithinHome(fromPath, authUser) ||\n\t\t\t\t!this.isPathWithinHome(toPath, authUser)\n\t\t\t) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, from=${fromPath}, to=${toPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tgetVfs().move(fromPath, toPath);\n\t\t\t\tvoid getVfs().flushMirror();\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"READLINK\", (reqid: number) => {\n\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OP_UNSUPPORTED);\n\t\t});\n\n\t\tsftp.on(\"SYMLINK\", (reqid: number) => {\n\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OP_UNSUPPORTED);\n\t\t});\n\n\t\tsftp.on(\"error\", (error: Error) => {\n\t\t\tconsole.error(`[SFTP] Stream error for user=${authUser}:`, error);\n\t\t});\n\n\t\tsftp.on(\"close\", () => {\n\t\t\tconsole.log(`[SFTP] Stream closed for user=${authUser}`);\n\t\t\tthis.handles.clear();\n\t\t});\n\n\t\tsftp.on(\"end\", () => {\n\t\t\tconsole.log(`[SFTP] end event for user=${authUser}`);\n\t\t\tthis.handles.clear();\n\t\t});\n\n\t\tsftp.on(\"END\", () => {\n\t\t\tconsole.log(`[SFTP] END event for user=${authUser}`);\n\t\t\tthis.handles.clear();\n\t\t});\n\t}\n}\n", "import { VirtualShell } from \"./VirtualShell\";\nimport { SshMimic } from \"./SSHMimic/index\";\n\nconst hostname = process.env.SSH_MIMIC_HOSTNAME ?? \"typescript-vm\";\nconst virtualShell = new VirtualShell(hostname, undefined, {\n\tmode: \"fs\",\n\tsnapshotPath: \".vfs\",\n});\n\nvirtualShell.addCommand(\"demo\", [], () => {\n\treturn {\n\t\tstdout: \"This is a demo command. It does nothing useful.\",\n\t\texitCode: 0,\n\t};\n});\n\nnew SshMimic({\n\tport: 2222,\n\thostname,\n\tshell: virtualShell,\n})\n\t.start()\n\t.catch((error: unknown) => {\n\t\tconsole.error(\"Failed to start SSH Mimic:\", error);\n\t\tprocess.exit(1);\n\t});\n\nprocess.on(\"uncaughtException\", (error) => {\n\tconsole.log(\"Oh my god, something terrible happened: \", error);\n});\n\nprocess.on(\"unhandledRejection\", (error, promise) => {\n\tconsole.log(\n\t\t\" Oh Lord! We forgot to handle a promise rejection here: \",\n\t\tpromise,\n\t);\n\tconsole.log(\" The error was: \", error);\n});"],
5
+ "mappings": "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EAC3B,MAAO,CACN,CACC,KAAM,mBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,EACA,CACC,KAAM,sBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,EACA,CAAE,KAAM,4BAA6B,QAAS,EAAG,CAClD,CACD,EACA,CACC,KAAM,kBACN,QAAS,cACT,QAAS,SACT,YAAa,oDACb,UAAW,oCACX,gBAAiB,IACjB,MAAO,CAAC,CAAE,KAAM,iCAAkC,QAAS,EAAG,CAAC,CAChE,EACA,CACC,KAAM,SACN,QAAS,iBACT,QAAS,aACT,YAAa,qDACb,UAAW,6BACX,gBAAiB,MACjB,MAAO,CACN,CACC,KAAM,gBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,EACA,CACC,KAAM,kBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,EACA,CACC,KAAM,+BACN,QAAS;AAAA,CACV,CACD,CACD,EACA,CACC,KAAM,MACN,QAAS,cACT,QAAS,aACT,YAAa,8BACb,UAAW,8BACX,gBAAiB,KACjB,QAAS,CAAC,QAAQ,EAClB,MAAO,CACN,CACC,KAAM,eACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,EACA,CACC,KAAM,eACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,OACN,QAAS,oBACT,QAAS,MACT,YAAa,0DACb,UAAW,0CACX,gBAAiB,IACjB,MAAO,CACN,CACC,KAAM,gBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,OACN,QAAS,cACT,QAAS,MACT,YAAa,+BACb,UAAW,+BACX,gBAAiB,IACjB,MAAO,CACN,CACC,KAAM,gBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,OACN,QAAS,UACT,QAAS,QACT,YAAa,+BACb,UAAW,6BACX,gBAAiB,IACjB,MAAO,CACN,CACC,KAAM,gBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,iBACN,QAAS,oBACT,QAAS,MACT,YAAa,4BACb,UAAW,4BACX,gBAAiB,KACjB,MAAO,CACN,CACC,KAAM,eACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,EACA,CACC,KAAM,sBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,EACA,CACC,KAAM,sBACN,QAAS;AAAA;AAAA,CACV,CACD,CACD,EACA,CACC,KAAM,iBACN,QAAS,oBACT,QAAS,MACT,YAAa,6BACb,UAAW,sBACX,gBAAiB,KACjB,QAAS,CAAC,gBAAgB,EAC1B,MAAO,CACN,CACC,KAAM,iBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,EACA,CACC,KAAM,uBACN,QAAS;AAAA;AAAA;AAAA,CACV,CACD,CACD,EACA,CACC,KAAM,YACN,QAAS,WACT,QAAS,MACT,YAAa,sDACb,UAAW,qBACX,gBAAiB,IACjB,MAAO,CACN,CACC,KAAM,oBACN,QACC;AAAA;AAAA;AAAA;AAAA,EACD,KAAM,GACP,EACA,CACC,KAAM,mBACN,QACC;AAAA;AAAA;AAAA,EACD,KAAM,GACP,EACA,CACC,KAAM,iBACN,QACC;AAAA;AAAA;AAAA;AAAA,EACD,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,eACN,QAAS,eACT,QAAS,MACT,YAAa,kDACb,UAAW,qCACX,gBAAiB,IACjB,MAAO,CACN,CACC,KAAM,gBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,KACN,QAAS,UACT,QAAS,QACT,YAAa,uDACb,UAAW,8BACX,gBAAiB,IACjB,MAAO,CACN,CACC,KAAM,cACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,kBACN,QAAS,OACT,QAAS,QACT,YAAa,iDACb,UAAW,+BACX,gBAAiB,GACjB,QAAS,CAAC,MAAO,MAAO,MAAM,EAC9B,MAAO,CACN,CACC,KAAM,wCACN,QAAS;AAAA,CACV,CACD,CACD,EACA,CACC,KAAM,MACN,QAAS,aACT,QAAS,QACT,YAAa,iBACb,UAAW,iBACX,gBAAiB,MACjB,MAAO,CACN,CACC,KAAM,eACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,EACA,CACC,KAAM,kBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,MACN,QAAS,aACT,QAAS,QACT,YAAa,mBACb,UAAW,mBACX,gBAAiB,KACjB,QAAS,CAAC,KAAK,EACf,MAAO,CACN,CACC,KAAM,eACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,OACN,QAAS,UACT,QAAS,QACT,YAAa,oCACb,UAAW,gBACX,gBAAiB,IACjB,MAAO,CACN,CACC,KAAM,gBACN,QACC;AAAA;AAAA;AAAA,EACD,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,OACN,QAAS,QACT,QAAS,OACT,YAAa,gCACb,UAAW,gBACX,gBAAiB,IACjB,MAAO,CACN,CAAE,KAAM,gBAAiB,QAAS;AAAA;AAAA,EAAyB,KAAM,GAAM,CACxE,CACD,EACA,CACC,KAAM,QACN,QAAS,SACT,QAAS,QACT,YAAa,6BACb,UAAW,6BACX,gBAAiB,IACjB,MAAO,CACN,CACC,KAAM,iBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,QACN,QAAS,UACT,QAAS,MACT,YAAa,wDACb,UAAW,gCACX,gBAAiB,IACjB,MAAO,CACN,CACC,KAAM,iBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,OACN,QAAS,SACT,QAAS,QACT,YAAa,uBACb,UAAW,uBACX,gBAAiB,IACjB,MAAO,CACN,CACC,KAAM,gBACN,QACC;AAAA;AAAA,EACD,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,OACN,QAAS,UACT,QAAS,QACT,YAAa,gDACb,UAAW,4BACX,gBAAiB,IACjB,MAAO,CACN,CACC,KAAM,gBACN,QAAS;AAAA;AAAA,EACT,KAAM,GACP,CACD,CACD,EACA,CACC,KAAM,kBACN,QAAS,WACT,QAAS,OACT,YAAa,yBACb,UAAW,yBACX,gBAAiB,IACjB,MAAO,CACN,CAAE,KAAM,uB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",
6
+ "names": ["require_errors", "__commonJSMin", "exports", "module", "msg", "e", "require_types", "__commonJSMin", "exports", "module", "require_safer", "__commonJSMin", "exports", "module", "buffer", "Buffer", "safer", "key", "Safer", "value", "encodingOrOffset", "length", "size", "fill", "encoding", "buf", "require_reader", "__commonJSMin", "exports", "module", "assert", "Buffer", "ASN1", "errors", "newInvalidAsn1Error", "Reader", "data", "peek", "b", "offset", "lenB", "i", "tag", "seq", "o", "retbuf", "str", "values", "value", "byte", "fb", "require_writer", "__commonJSMin", "exports", "module", "assert", "Buffer", "ASN1", "errors", "newInvalidAsn1Error", "DEFAULT_OPTS", "merge", "from", "to", "keys", "key", "value", "Writer", "options", "b", "i", "tag", "sz", "s", "len", "buf", "strings", "self", "encodeOctet", "bytes", "octet", "tmp", "seq", "start", "shift", "require_ber", "__commonJSMin", "exports", "module", "errors", "types", "Reader", "Writer", "t", "e", "require_lib", "__commonJSMin", "exports", "module", "Ber", "require_nacl_fast", "__commonJSMin", "exports", "module", "nacl", "gf", "init", "i", "r", "randombytes", "_0", "_9", "gf0", "gf1", "_121665", "D", "D2", "X", "Y", "I", "ts64", "x", "h", "l", "vn", "xi", "y", "yi", "n", "d", "crypto_verify_16", "crypto_verify_32", "core_salsa20", "o", "p", "k", "c", "j0", "j1", "j2", "j3", "j4", "j5", "j6", "j7", "j8", "j9", "j10", "j11", "j12", "j13", "j14", "j15", "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "u", "core_hsalsa20", "crypto_core_salsa20", "out", "inp", "crypto_core_hsalsa20", "sigma", "crypto_stream_salsa20_xor", "cpos", "mpos", "b", "z", "crypto_stream_salsa20", "crypto_stream", "s", "sn", "crypto_stream_xor", "poly1305", "key", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "m", "bytes", "hibit", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "h9", "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "mac", "macpos", "g", "mask", "f", "want", "crypto_onetimeauth", "outpos", "crypto_onetimeauth_verify", "hpos", "crypto_secretbox", "crypto_secretbox_open", "set25519", "a", "car25519", "v", "sel25519", "q", "t", "pack25519", "j", "neq25519", "par25519", "unpack25519", "A", "Z", "M", "t8", "t9", "t10", "t11", "t12", "t13", "t14", "t15", "t16", "t17", "t18", "t19", "t20", "t21", "t22", "t23", "t24", "t25", "t26", "t27", "t28", "t29", "t30", "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15", "S", "inv25519", "pow2523", "crypto_scalarmult", "e", "x32", "x16", "crypto_scalarmult_base", "crypto_box_keypair", "crypto_box_beforenm", "crypto_box_afternm", "crypto_box_open_afternm", "crypto_box", "crypto_box_open", "K", "crypto_hashblocks_hl", "hh", "hl", "wh", "wl", "bh0", "bh1", "bh2", "bh3", "bh4", "bh5", "bh6", "bh7", "bl0", "bl1", "bl2", "bl3", "bl4", "bl5", "bl6", "bl7", "th", "tl", "ah0", "ah1", "ah2", "ah3", "ah4", "ah5", "ah6", "ah7", "al0", "al1", "al2", "al3", "al4", "al5", "al6", "al7", "pos", "crypto_hash", "add", "cswap", "pack", "tx", "ty", "zi", "scalarmult", "scalarbase", "crypto_sign_keypair", "pk", "sk", "seeded", "L", "modL", "carry", "reduce", "crypto_sign", "sm", "smlen", "unpackneg", "chk", "num", "den", "den2", "den4", "den6", "crypto_sign_open", "mlen", "crypto_secretbox_KEYBYTES", "crypto_secretbox_NONCEBYTES", "crypto_secretbox_ZEROBYTES", "crypto_secretbox_BOXZEROBYTES", "crypto_scalarmult_BYTES", "crypto_scalarmult_SCALARBYTES", "crypto_box_PUBLICKEYBYTES", "crypto_box_SECRETKEYBYTES", "crypto_box_BEFORENMBYTES", "crypto_box_NONCEBYTES", "crypto_box_ZEROBYTES", "crypto_box_BOXZEROBYTES", "crypto_sign_BYTES", "crypto_sign_PUBLICKEYBYTES", "crypto_sign_SECRETKEYBYTES", "crypto_sign_SEEDBYTES", "crypto_hash_BYTES", "checkLengths", "checkBoxLengths", "checkArrayTypes", "cleanup", "arr", "msg", "nonce", "box", "publicKey", "secretKey", "signedMsg", "tmp", "sig", "seed", "fn", "crypto", "QUOTA", "require_bcrypt_pbkdf", "__commonJSMin", "exports", "module", "crypto_hash_sha512", "BLF_J", "Blowfish", "F", "S", "x8", "i", "x", "t", "stream2word", "data", "databytes", "temp", "key", "keybytes", "d", "k", "d8", "blocks", "BCRYPT_BLOCKS", "BCRYPT_HASHSIZE", "bcrypt_hash", "sha2pass", "sha2salt", "out", "state", "cdata", "ciphertext", "bcrypt_pbkdf", "pass", "passlen", "salt", "saltlen", "keylen", "rounds", "tmpout", "countsalt", "j", "amt", "stride", "dest", "count", "origkeylen", "require_constants", "__commonJSMin", "exports", "module", "crypto", "cpuInfo", "bindingAvailable", "CIPHER_INFO", "MAC_INFO", "eddsaSupported", "key", "data", "sig", "verified", "curve25519Supported", "DEFAULT_KEX", "SUPPORTED_KEX", "DEFAULT_SERVER_HOST_KEY", "SUPPORTED_SERVER_HOST_KEY", "canUseCipher", "ciphers", "name", "DEFAULT_CIPHER", "SUPPORTED_CIPHER", "canUseMAC", "hashes", "DEFAULT_MAC", "SUPPORTED_MAC", "DEFAULT_COMPRESSION", "SUPPORTED_COMPRESSION", "COMPAT", "cur", "val", "obj", "value", "require_utils", "__commonJSMin", "exports", "module", "Ber", "DISCONNECT_REASON", "FastBuffer", "TypedArrayFill", "readUInt32BE", "buf", "offset", "bufferCopy", "src", "dest", "srcStart", "srcEnd", "destStart", "nb", "destLeft", "bufferSlice", "start", "end", "makeBufferParser", "pos", "buffer", "self", "behavior", "n", "len", "list", "maxLen", "makeError", "msg", "level", "fatal", "err", "writeUInt32BE", "value", "utilBufferParser", "protocol", "reason", "left", "sig", "type", "asnWriter", "rNew", "sNew", "r", "s", "signature", "keyType", "asnReader", "rOffset", "sOffset", "newSig", "proto", "packet", "bypass", "require_poly1305", "__commonJSMin", "exports", "module", "createPoly1305", "_scriptDir", "b", "q", "r", "a", "c", "u", "w", "x", "y", "z", "B", "C", "D", "E", "F", "G", "d", "H", "assert", "e", "f", "l", "ba", "I", "J", "noExitRuntime", "K", "L", "M", "N", "ca", "g", "p", "n", "O", "k", "h", "P", "v", "m", "oa", "Q", "A", "t", "aa", "da", "ea", "fa", "ha", "ia", "R", "ja", "ka", "la", "ma", "S", "T", "U", "V", "W", "na", "pa", "qa", "X", "ra", "sa", "Y", "ta", "Z", "require_crypto", "__commonJSMin", "exports", "module", "createCipheriv", "createDecipheriv", "createHmac", "randomFillSync", "timingSafeEqual", "readUInt32BE", "writeUInt32BE", "FastBuffer", "MAX_SEQNO", "EMPTY_BUFFER", "BUF_INT", "DISCARD_CACHE", "MAX_PACKET_SIZE", "binding", "AESGCMCipher", "ChaChaPolyCipher", "GenericCipher", "AESGCMDecipher", "ChaChaPolyDecipher", "GenericDecipher", "CIPHER_STREAM", "CIPHER_INFO", "info", "sslName", "blockLen", "keyLen", "ivLen", "authLen", "discardLen", "flags", "MAC_INFO", "len", "actualLen", "isETM", "NullCipher", "seqno", "onWrite", "payloadLen", "pktLen", "padLen", "packet", "POLY1305_ZEROS", "POLY1305_OUT_COMPUTE", "POLY1305_WASM_MODULE", "POLY1305_RESULT_MALLOC", "poly1305_auth", "ChaChaPolyCipherNative", "config", "enc", "polyKey", "pktLenEnc", "payloadEnc", "mac", "ChaChaPolyCipherBinding", "AESGCMCipherNative", "cipher", "lenData", "encrypted", "final", "tag", "ivIncrement", "AESGCMCipherBinding", "GenericCipherNative", "discard", "lenBytes", "digest", "GenericCipherBinding", "NullDecipher", "onPayload", "data", "p", "dataLen", "nb", "chunk", "payload", "ret", "ChaChaPolyDecipherNative", "dec", "decLenBytes", "ChaChaPolyDecipherBinding", "AESGCMDecipherNative", "intToBytes", "decrypted", "AESGCMDecipherBinding", "GenericDecipherNative", "need", "calculated", "timingSafeEquals", "GenericDecipherBinding", "iv", "n", "a", "b", "createCipher", "outbound", "forceNative", "createDecipher", "inbound", "resolve", "reject", "ex", "require_keyParser", "__commonJSMin", "exports", "module", "createDecipheriv", "createECDH", "createHash", "createHmac", "createSign", "createVerify", "getCiphers", "sign_", "verify_", "supportedOpenSSLCiphers", "Ber", "bcrypt_pbkdf", "CIPHER_INFO", "eddsaSupported", "SUPPORTED_CIPHER", "bufferSlice", "makeBufferParser", "readString", "readUInt32BE", "writeUInt32BE", "SYM_HASH_ALGO", "SYM_PRIV_PEM", "SYM_PUB_PEM", "SYM_PUB_SSH", "SYM_DECRYPTED", "CIPHER_INFO_OPENSSL", "keys", "i", "cipherName", "binaryKeyParser", "makePEM", "type", "data", "formatted", "combineBuffers", "buf1", "buf2", "result", "skipFields", "buf", "nfields", "bufLen", "pos", "left", "len", "genOpenSSLRSAPub", "e", "asnWriter", "genOpenSSHRSAPub", "publicKey", "genOpenSSLRSAPriv", "genRSAASN1Buf", "n", "d", "p", "q", "dmp1", "dmq1", "iqmp", "bigIntFromBuffer", "bigIntToBuffer", "bn", "hex", "sigbit", "bn_d", "genOpenSSLDSAPub", "g", "y", "genOpenSSHDSAPub", "genOpenSSLDSAPriv", "x", "genOpenSSLEdPub", "pub", "genOpenSSHEdPub", "genOpenSSLEdPriv", "priv", "genOpenSSLECDSAPub", "oid", "Q", "genOpenSSHECDSAPub", "curveName", "genOpenSSLECDSAPriv", "genOpenSSLECDSAPubFromPriv", "tempECDH", "BaseKey", "algo", "pem", "ex", "signature", "verifier", "key", "parsed", "parseKey", "OpenSSH_Private", "comment", "privPEM", "pubPEM", "pubSSH", "decrypted", "parseOpenSSHPrivKeys", "nkeys", "check1", "check2", "edpub", "edpriv", "ecpub", "ecpriv", "privComment", "cnt", "regexp", "str", "passphrase", "m", "ret", "magic", "kdfName", "encInfo", "cipherKey", "cipherIV", "kdfOptions", "salt", "rounds", "gen", "keyCount", "pubData", "privBlob", "options", "decipher", "OpenSSH_Old_Private", "headers", "header", "sepIdx", "val", "ivSlice", "reader", "errMsg", "ecSSLName", "ecPriv", "ecOID", "offset", "pubBlob", "PPK_Private", "EMPTY_PASSPHRASE", "PPK_IV", "PPK_PP1", "PPK_PP2", "encrypted", "mac", "typeLen", "cipherNameLen", "commentLen", "pubLen", "privLen", "macData", "OpenSSH_Public", "fullType", "baseType", "parseDER", "RFC4716_Public", "RE_DATA", "RE_HEADER", "RE_HEADER_ENDS", "body", "dataStart", "headerName", "headerValue", "isSupportedKeyType", "isParsedKey", "origBuffer", "require_agent", "__commonJSMin", "exports", "module", "Socket", "Duplex", "resolve", "readFile", "execFile", "spawn", "isParsedKey", "parseKey", "makeBufferParser", "readUInt32BE", "writeUInt32BE", "writeUInt32LE", "once", "cb", "called", "args", "concat", "buf1", "buf2", "combined", "noop", "EMPTY_BUF", "binaryParser", "BaseAgent", "pubKey", "data", "options", "OpenSSHAgent", "socketPath", "sock", "onFail", "err", "stream", "protocol", "AgentProtocol", "keys", "sig", "PageantAgent", "EXEPATH", "ERROR", "destroy", "PageantSocket", "n", "encoding", "newBuffer", "len", "error", "proc", "code", "CygwinAgent", "RE_CYGWIN_SOCK", "triedCygpath", "readCygsocket", "stdout", "stderr", "m", "state", "bc", "isRetrying", "inBuf", "credsBuf", "port", "secret", "secretBuf", "i", "j", "tryConnect", "_onconnect", "_ondata", "WINDOWS_PIPE_REGEX", "createAgent", "path", "processResponses", "ret", "SYM_REQS", "nextResponse", "SYM_RESP", "SYM_TYPE", "SYM_CTX", "AgentInboundRequest", "type", "ctx", "respond", "req", "cleanup", "SYM_BUFFER", "SYM_MODE", "reqs", "SYM_ENDED", "SYM_CLOSED", "onClose", "onEnd", "SYM_MSGLEN", "isClient", "buffer", "bufferLen", "p", "msgType", "numKeys", "comment", "signature", "flagsVal", "flags", "keyLen", "dataLen", "buf", "totalKeysLen", "newKeys", "entry", "sigFormat", "sigFormatLen", "SYM_AGENT", "SYM_AGENT_KEYS", "SYM_AGENT_KEYS_IDX", "SYM_AGENT_CBS", "AgentContext", "agent", "isAgent", "doCbs", "cbs", "key", "val", "require_zlib", "__commonJSMin", "exports", "module", "kMaxLength", "createInflate", "DEFLATE", "INFLATE", "Z_DEFAULT_CHUNK", "Z_DEFAULT_COMPRESSION", "Z_DEFAULT_MEMLEVEL", "Z_DEFAULT_STRATEGY", "Z_DEFAULT_WINDOWBITS", "Z_PARTIAL_FLUSH", "ZlibHandle", "processCallback", "zlibOnError", "message", "errno", "code", "self", "error", "_close", "engine", "Zlib", "mode", "windowBits", "level", "memLevel", "strategy", "dictionary", "chunk", "retChunks", "handle", "availInBefore", "availOutBefore", "inOff", "availOutAfter", "availInAfter", "buffers", "nread", "state", "buffer", "offset", "chunkSize", "inDelta", "have", "out", "output", "i", "p", "buf", "ZlibPacketWriter", "protocol", "payloadSize", "force", "payload", "packet", "PacketWriter", "ZlibPacketReader", "data", "PacketReader", "require_handlers_misc", "__commonJSMin", "exports", "module", "bufferSlice", "bufferParser", "doFatalError", "sigSSHToASN1", "writeUInt32BE", "CHANNEL_OPEN_FAILURE", "COMPAT", "MESSAGE", "TERMINAL_MODE", "parseKey", "TERMINAL_MODE_BY_VALUE", "obj", "key", "value", "self", "payload", "reason", "desc", "lang", "handler", "seqno", "display", "msg", "name", "numExts", "exts", "data", "algs", "user", "service", "method", "methodData", "methodDesc", "isChange", "newPassword", "hasSig", "keyAlgo", "realKeyAlgo", "hashAlgo", "blobEnd", "signature", "sessionID", "blob", "localHostname", "localUsername", "authMethods", "partialSuccess", "prompt", "instructions", "numPrompts", "prompts", "i", "echo", "numResponses", "responses", "response", "wantReply", "bindAddr", "bindPort", "socketPath", "keyRaw", "type", "sender", "window", "packetSize", "channelInfo", "destIP", "destPort", "srcIP", "srcPort", "recipient", "description", "bytesToAdd", "signal", "coreDumped", "num", "errorMessage", "term", "cols", "rows", "width", "height", "modesBinary", "modes", "opcode", "single", "protocol", "cookie", "screen", "require_handlers", "__commonJSMin", "exports", "module", "MESSAGE_HANDLERS", "handlers", "type", "handler", "require_kex", "__commonJSMin", "exports", "module", "createDiffieHellman", "createDiffieHellmanGroup", "createECDH", "createHash", "createPublicKey", "diffieHellman", "generateKeyPairSync", "randomFillSync", "Ber", "COMPAT", "curve25519Supported", "DEFAULT_KEX", "DEFAULT_SERVER_HOST_KEY", "DEFAULT_CIPHER", "DEFAULT_MAC", "DEFAULT_COMPRESSION", "DISCONNECT_REASON", "MESSAGE", "CIPHER_INFO", "createCipher", "createDecipher", "MAC_INFO", "parseDERKey", "bufferFill", "bufferParser", "convertSignature", "doFatalError", "FastBuffer", "sigSSHToASN1", "writeUInt32BE", "PacketReader", "PacketWriter", "ZlibPacketReader", "ZlibPacketWriter", "MESSAGE_HANDLERS", "GEX_MIN_BITS", "GEX_MAX_BITS", "EMPTY_BUFFER", "kexinit", "self", "payload", "entry", "kex", "found", "len", "newKexBuf", "all", "rest", "p", "packet", "handleKexInit", "init", "pos", "firstFollows", "local", "remote", "localKex", "i", "clientList", "serverList", "debug", "remoteExtInfoEnabled", "localSrvHostKey", "localCSCipher", "localSCCipher", "localCSMAC", "localSCMAC", "localCSCompress", "localSCCompress", "onKEXPayload", "createKeyExchange", "convertToMpint", "buf", "idx", "length", "newBuf", "KeyExchange", "negotiated", "protocol", "remoteKexinit", "scOnly", "isServer", "pubKey", "secret", "hash", "hashString", "serverPublicHostKey", "params", "num", "serverPublicKey", "exchangeHash", "hashAlgo", "signature", "sigType", "sigTypeLen", "sigLen", "type", "sigValue", "parsedHostKey", "name", "hostKey", "verified", "trySendNEWKEYS", "hsCipherConfig", "hsWrite", "completeHandshake", "partial", "newSecret", "csCipherInfo", "scCipherInfo", "csIV", "generateKEXVal", "scIV", "csKey", "scKey", "csMacInfo", "csMacKey", "scMacInfo", "scMacKey", "config", "rw", "key", "newKey", "otherPublicKey", "ex", "dhData", "hostPubKey", "sig", "hostPubKeyType", "checked", "ret", "permitted", "Curve25519Exchange", "hashName", "args", "asnWriter", "ECDHExchange", "curveName", "DHGroupExchange", "dhEstimate", "prime", "generator", "gen", "pubkey", "DHExchange", "groupName", "kexType", "KexInit", "KEX_PROPERTY_NAMES", "obj", "lists", "totalSize", "prop", "base", "val", "desc", "parent", "allPos", "data", "offset", "src", "LEN", "sessionID", "char", "digest", "chunk", "extended", "state", "neg", "csCipher", "scCipher", "bits", "require_package", "__commonJSMin", "exports", "module", "require_Protocol", "__commonJSMin", "exports", "module", "inspect", "bindingAvailable", "NullCipher", "NullDecipher", "COMPAT_CHECKS", "DISCONNECT_REASON", "eddsaSupported", "MESSAGE", "SIGNALS", "TERMINAL_MODE", "DEFAULT_KEXINIT_CLIENT", "DEFAULT_KEXINIT_SERVER", "KexInit", "kexinit", "onKEXPayload", "parseKey", "MESSAGE_HANDLERS", "bufferCopy", "bufferFill", "bufferSlice", "convertSignature", "sendPacket", "writeUInt32BE", "PacketReader", "PacketWriter", "ZlibPacketReader", "ZlibPacketWriter", "MODULE_VER", "VALID_DISCONNECT_REASONS", "IDENT_RAW", "IDENT", "MAX_LINE_LEN", "MAX_LINES", "PING_PAYLOAD", "NO_TERMINAL_MODES_BUFFER", "noop", "Protocol", "config", "onWrite", "data", "onError", "err", "debug", "msg", "onHeader", "args", "onPacket", "onHandshakeComplete", "firstHandshake", "oldQueue", "i", "finalized", "packet", "sendExtInfo", "messageHandlers", "onPayload", "greeting", "offer", "parseHeader", "sentIdent", "fullIdent", "reason", "chunk", "len", "p", "end", "chan", "amount", "isBuffer", "dataLen", "type", "remote", "local", "initWindow", "maxPacket", "desc", "descLen", "name", "nameLen", "username", "password", "newPassword", "userLen", "passLen", "newPassLen", "pubKey", "keyAlgo", "cbSign", "keyType", "algoLen", "pubKeyLen", "sessionID", "sesLen", "payloadLen", "signature", "sigLen", "hostname", "userlocal", "hostnameLen", "userlocalLen", "reqDataLen", "responses", "responsesTotalLen", "responseLens", "bindAddr", "bindPort", "wantReply", "addrLen", "socketPath", "socketPathLen", "cfg", "srcLen", "dstLen", "pathLen", "rows", "cols", "height", "width", "term", "modes", "modesToBytes", "termLen", "modesLen", "cmd", "isBuf", "cmdLen", "signal", "origSignal", "signalLen", "key", "val", "keyLen", "valLen", "protocol", "cookie", "isBufProto", "protoLen", "isBufCookie", "cookieLen", "keys", "keysTotal", "publicKeys", "publicKey", "buf", "svcName", "svcNameLen", "banner", "bannerLen", "boundAddrLen", "remoteAddrLen", "status", "coreDumped", "msgLen", "authMethods", "isPartial", "methods", "methodsLen", "keyAlgoLen", "prompt", "promptLen", "instructions", "prompts", "promptsLen", "instrLen", "RE_IDENT", "chunkOffset", "op", "start", "needNL", "lineLen", "lines", "ch", "full", "identRaw", "m", "header", "getCompatFlags", "parsePacket", "payload", "handler", "software", "flags", "rule", "bytes", "b", "opcode", "proto", "serverSigAlgs", "algsLen", "require_node_fs_compat", "__commonJSMin", "exports", "assert", "inspect", "addNumericalSeparator", "val", "res", "i", "start", "oneOf", "expected", "thing", "len", "ERR_INTERNAL_ASSERTION", "message", "suffix", "MAX_32BIT_INT", "MAX_32BIT_BIGINT", "ERR_OUT_OF_RANGE", "str", "range", "input", "replaceDefaultBoolean", "msg", "received", "ERR_INVALID_ARG_TYPE", "_ERR_INVALID_ARG_TYPE", "name", "actual", "determiner", "type", "value", "require_SFTP", "__commonJSMin", "exports", "module", "EventEmitter", "fs", "constants", "ReadableStream", "WritableStream", "inherits", "isDate", "FastBuffer", "bufferCopy", "bufferSlice", "makeBufferParser", "writeUInt32BE", "ATTR", "ATTRS_BUF", "STATUS_CODE", "VALID_STATUS_CODES", "STATUS_CODE_STR", "REQUEST", "RESPONSE", "OPEN_MODE", "PKT_RW_OVERHEAD", "MAX_REQID", "CLIENT_VERSION_BUFFER", "SERVER_VERSION_BUFFER", "RE_OPENSSH", "OPENSSH_MAX_PKT_LEN", "bufferParser", "fakeStderr", "data", "noop", "SFTP", "client", "chanInfo", "cfg", "remoteIdentRaw", "cleanupRequests", "p", "nb", "doFatalSFTPError", "max", "type", "payload", "handler", "SERVER_HANDLERS", "CLIENT_HANDLERS", "sendOrBuffer", "path", "options", "ReadStream", "WriteStream", "flags_", "attrs", "cb", "flags", "stringToFlags", "attrsFlags", "attrsLen", "attrsToBytes", "pathLen", "buf", "reqid", "isBuffered", "handle", "handleLen", "off", "len", "position", "read_", "maxDataLen", "overflow", "origPosition", "out", "i", "err", "isSent", "how", "remotePath", "localPath", "opts", "fastXfer", "callback_", "callback", "encoding", "size", "buffer", "buffers", "pos", "bytesRead", "flag", "read", "afterRead", "er", "nbytes", "eof", "close", "handle_", "tryStat", "st", "er_", "st_", "openErr", "writeAll", "filename", "fnameLen", "oldPath", "newPath", "oldLen", "newLen", "where", "doFilter", "entries", "e", "reread", "list", "atime", "mtime", "toUnixTimestamp", "uid", "gid", "mode", "names", "targetPath", "linkPath", "linkLen", "targetLen", "ext", "which", "status", "srcHandle", "srcOffset", "dstHandle", "dstOffset", "username", "usernameLen", "uids", "gids", "val", "code", "message", "msgLen", "isBuffer", "isUTF8", "dataLen", "count", "namesLen", "nameAttrs", "name", "longname", "bytes", "attr", "tryCreateBuffer", "ex", "self", "req_", "req", "src", "dst", "srcPath", "dstPath", "concurrency", "chunkSize", "onstep", "fileSize", "modeNum", "fsize", "pdst", "total", "hadError", "readbuf", "bufsize", "onerror", "left", "cbfinal", "sourceHandle", "err_", "attrs_", "destHandle", "tryAgain", "startReads", "onread", "dstpos", "datapos", "origChunkLen", "writeCb", "singleRead", "chunk", "makeCb", "psrc", "reads", "sftp", "offset", "length", "writeErr", "written", "Stats", "initial", "time", "stringFlagMap", "str", "flagsToString", "stringFlagMapKeys", "key", "readAttrs", "biOpt", "extended", "ret", "tryWritePayload", "outgoing", "drainBuffer", "actualLen", "msg", "noDebug", "keys", "reqs", "requestLimits", "extensions", "version", "extName", "extData", "limits", "reqID", "errorCode", "errorMsg", "jsonMsg", "stats", "usernameCount", "usernames", "groupnameCount", "groupnames", "pflags", "handled", "ERR_INVALID_ARG_TYPE", "ERR_OUT_OF_RANGE", "validateNumber", "kMinPoolSpace", "pool", "poolFragments", "allocNewPool", "poolSize", "checkPosition", "roundUpToMultipleOf8", "thisPool", "toRead", "start", "b", "alignedEnd", "alignedStart", "closeStream", "stream", "onclose", "writesLeft", "onwrite", "require_Channel", "__commonJSMin", "exports", "module", "DuplexStream", "ReadableStream", "WritableStream", "STDERR", "bufferSlice", "PACKET_SIZE", "MAX_WINDOW", "WINDOW_THRESHOLD", "ClientStderr", "channel", "streamOpts", "n", "windowAdjust", "ServerStderr", "data", "encoding", "cb", "protocol", "outgoing", "packetSize", "id", "window", "len", "p", "sliceLen", "Channel", "client", "info", "opts", "server", "onFinish", "onEnd", "rows", "cols", "height", "width", "signalName", "statusOrSignal", "coreDumped", "msg", "self", "amt", "require_utils", "__commonJSMin", "exports", "module", "SFTP", "MAX_CHANNEL", "onChannelOpenFailure", "self", "recipient", "info", "cb", "err", "onCHANNEL_CLOSE", "channel", "dead", "readState", "writeState", "chanCallbacks", "i", "doClose", "exit", "errReadState", "ChannelManager", "client", "val", "id", "channels", "chanIDs", "isRegExp", "toString", "generateAlgorithmList", "algoList", "defaultList", "supportedList", "keys", "list", "key", "j", "append", "k", "algo", "prepend", "search", "idx", "stream", "require_client", "__commonJSMin", "exports", "module", "createHash", "getHashes", "randomFillSync", "Socket", "dnsLookup", "EventEmitter", "HASHES", "COMPAT", "STDERR", "CHANNEL_OPEN_FAILURE", "DEFAULT_CIPHER", "DEFAULT_COMPRESSION", "DEFAULT_KEX", "DEFAULT_MAC", "DEFAULT_SERVER_HOST_KEY", "DISCONNECT_REASON", "DISCONNECT_REASON_BY_VALUE", "SUPPORTED_CIPHER", "SUPPORTED_COMPRESSION", "SUPPORTED_KEX", "SUPPORTED_MAC", "SUPPORTED_SERVER_HOST_KEY", "cryptoInit", "Protocol", "parseKey", "SFTP", "bufferCopy", "makeBufferParser", "makeError", "readUInt32BE", "sigSSHToASN1", "writeUInt32BE", "AgentContext", "createAgent", "isAgent", "Channel", "MAX_WINDOW", "PACKET_SIZE", "windowAdjust", "WINDOW_THRESHOLD", "ChannelManager", "generateAlgorithmList", "isWritable", "onChannelOpenFailure", "onCHANNEL_CLOSE", "bufferParser", "sigParser", "RE_OPENSSH", "noop", "err", "Client", "cfg", "algorithms", "allOfferDefaults", "authHandler", "debug", "callbacks", "privateKey", "hostVerifier", "hashCb", "hashAlgo", "key", "verify", "ret", "sock", "ready", "sawHeader", "DEBUG_HANDLER", "p", "display", "msg", "serverSigAlgs", "proto", "data", "header", "negotiated", "reason", "desc", "name", "tryNextAuth", "exts", "ext", "resetKA", "authMethods", "partialSuccess", "curAuth", "oldKeyAlgo", "keyAlgo", "buf", "cb", "signature", "pos", "tryNextAgentKey", "curPartial", "curAuthsLeft", "prompt", "newPassword", "opts", "signed", "instructions", "prompts", "answers", "wantReply", "hostKeysProve", "keys", "info", "onCHANNEL_OPEN", "channel", "isSFTP", "chanInfo", "instance", "recipient", "description", "type", "amount", "exit", "kainterval", "kacountmax", "kacount", "katimer", "sendKA", "onDone", "called", "wasConnected", "onConnect", "ex", "callbacks_", "i", "authsAllowed", "makeSimpleAuthHandler", "hasSentAuth", "doNextAuth", "nextAuth", "skipAuth", "username", "args", "password", "localHostname", "localUsername", "agent", "getKeyAlgos", "auth", "startTimeout", "host", "forceIPv4", "forceIPv6", "doConnect", "address", "family", "error", "cmd", "extraOpts", "openChannel", "chan", "todo", "reqCb", "reqAgentFwd", "reqEnv", "reqPty", "reqX11", "reqExec", "wndopts", "reqShell", "reqSubsystem", "stream", "bindAddr", "bindPort", "had_err", "realPort", "srcIP", "srcPort", "dstIP", "dstPort", "socketPath", "env", "sftp", "reqSubsystemCb", "sftp_", "removeListeners", "onReady", "onError", "onExit", "code", "signal", "noDelay", "self", "initWindow", "maxPacket", "wrapper", "localChan", "screen", "randomCookie", "rows", "cols", "width", "height", "term", "modes", "val", "accept", "reject", "reserveChannel", "upstream", "buffer", "authList", "a", "authsLeft", "client", "keys_", "parsed", "keyIdx", "keyPublic", "sigEntry", "value", "algo", "sessionID", "verifyData", "require_http_agents", "__commonJSMin", "exports", "HttpAgent", "HttpsAgent", "tlsConnect", "Client", "ctor", "SSHAgent", "connectCfg", "agentOptions", "options", "cb", "srcIP", "srcPort", "dstIP", "dstPort", "client", "triedForward", "err", "stream", "decorateStream", "noop", "wrapped", "onClose", "called", "require_server", "__commonJSMin", "exports", "module", "netServer", "EventEmitter", "listenerCount", "CHANNEL_OPEN_FAILURE", "DEFAULT_CIPHER", "DEFAULT_COMPRESSION", "DEFAULT_KEX", "DEFAULT_MAC", "DEFAULT_SERVER_HOST_KEY", "DISCONNECT_REASON", "DISCONNECT_REASON_BY_VALUE", "SUPPORTED_CIPHER", "SUPPORTED_COMPRESSION", "SUPPORTED_KEX", "SUPPORTED_MAC", "SUPPORTED_SERVER_HOST_KEY", "cryptoInit", "KexInit", "parseKey", "Protocol", "SFTP", "writeUInt32BE", "Channel", "MAX_WINDOW", "PACKET_SIZE", "windowAdjust", "WINDOW_THRESHOLD", "ChannelManager", "generateAlgorithmList", "isWritable", "onChannelOpenFailure", "onCHANNEL_CLOSE", "MAX_PENDING_AUTHS", "AuthContext", "protocol", "username", "service", "method", "cb", "allowed", "methodsLeft", "isPartial", "KeyboardAuthContext", "submethods", "responses", "callback", "prompts", "title", "instructions", "PKAuthContext", "pkInfo", "HostbasedAuthContext", "PwdAuthContext", "password", "prompt", "Session", "client", "info", "localChan", "Server", "cfg", "listener", "hostKeys", "hostKeyAlgoOrder", "hostKeys_", "cfgAlgos", "hostKeyAlgos", "i", "privateKey", "sha1Pos", "sha256Pos", "sha512Pos", "compareNumbers", "pos", "type", "algorithms", "origDebug", "ident", "offer", "socket", "debug", "debugPrefix", "msg", "Client", "err", "args", "server", "srvCfg", "exchanges", "acceptedAuthSvc", "pendingAuths", "authCtx", "kaTimer", "onPacket", "unsentGlobalRequestsReplies", "onClientPreHeaderError", "DEBUG_HANDLER", "p", "display", "kaIntvl", "kaCountMax", "kaCurCount", "onClose", "proto", "data", "header", "negotiated", "reason", "desc", "reasonCode", "replied", "accept", "reject", "reserveChannel", "instance", "chanInfo", "stream", "channel", "recipient", "description", "amount", "wantReply", "session", "useSFTP", "methodData", "ctx", "onAuthDecide", "name", "reply", "setReply", "buf", "sendReplies", "chosenPort", "bufPort", "ex", "originAddr", "originPort", "openChannel", "boundAddr", "boundPort", "remoteAddr", "remotePort", "socketPath", "error", "noDelay", "self", "opts", "initWindow", "maxPacket", "wrapper", "a", "b", "require_keygen", "__commonJSMin", "exports", "module", "createCipheriv", "generateKeyPair_", "generateKeyPairSync_", "getCurves", "randomBytes", "Ber", "bcrypt_pbkdf", "CIPHER_INFO", "SALT_LEN", "DEFAULT_ROUNDS", "curves", "ciphers", "makeArgs", "type", "opts", "publicKeyEncoding", "privateKeyEncoding", "modulusLength", "namedCurve", "parseDERs", "keyType", "pub", "priv", "reader", "n", "e", "d", "p", "q", "iqmp", "keyName", "privBuf", "pos", "pubBuf", "pubBin", "i", "curveOID", "sshCurveName", "privBin", "convertKeys", "format", "encrypted", "comment", "passphrase", "cipher", "rounds", "gen", "salt", "kdfOptions", "privateB64", "publicB64", "cipherName", "kdfName", "blockLen", "parsed", "checkInt", "commentBin", "privBlobLen", "padding", "privBlob", "extra", "options", "magicBytes", "b64", "formatted", "noop", "cb", "args", "err", "ret", "ex", "require_lib", "__commonJSMin", "exports", "module", "AgentProtocol", "BaseAgent", "createAgent", "CygwinAgent", "OpenSSHAgent", "PageantAgent", "HTTPAgent", "HTTPSAgent", "parseKey", "flagsToString", "OPEN_MODE", "STATUS_CODE", "stringToFlags", "import_node_events", "adduserCommand", "authUser", "shell", "args", "username", "password", "toFlagList", "flags", "matchFlagToken", "token", "flag", "prefix", "collectPositionals", "args", "options", "boolFlags", "valueFlags", "positionals", "passthrough", "index", "arg", "consumed", "matched", "match", "ifFlag", "allFlags", "getFlag", "next", "getArg", "parseArgs", "flagsWithValues", "inlineFlag", "aliasCommand", "args", "env", "k", "v", "lines", "arg", "eq", "val", "name", "unaliasCommand", "ifFlag", "path", "PROTECTED_PREFIXES", "resolvePath", "cwd", "inputPath", "isProtectedPath", "targetPath", "normalized", "PROTECTED_PREFIXES", "prefix", "assertPathAccess", "authUser", "operation", "stripUrlFilename", "url", "lastPart", "levenshtein", "a", "b", "dp", "i", "j", "cost", "resolveReadablePath", "vfs", "cwd", "inputPath", "exactPath", "resolvePath", "parent", "fileName", "siblings", "caseInsensitive", "name", "near", "joinListWithType", "items", "statAt", "childPath", "getPackageManager", "shell", "aptCommand", "args", "shell", "authUser", "pm", "getPackageManager", "sub", "rest", "quiet", "ifFlag", "purge", "pkgs", "a", "output", "exitCode", "term", "results", "p", "name", "info", "pkgList", "aptCacheCommand", "pkgName", "def", "inst", "awkCommand", "args", "stdin", "sep", "getFlag", "prog", "a", "printMatch", "fields", "f", "line", "parts", "n", "base64Command", "args", "stdin", "decode", "ifFlag", "input", "catCommand", "authUser", "shell", "cwd", "args", "stdin", "numberAll", "ifFlag", "numberNonBlank", "fileArgs", "a", "parts", "fileArg", "target", "resolveReadablePath", "assertPathAccess", "combined", "lineNum", "line", "cdCommand", "authUser", "shell", "cwd", "args", "mode", "target", "resolvePath", "assertPathAccess", "applySymbolicMode", "existing", "modeStr", "pattern", "parts", "mode", "part", "m", "who", "op", "perms", "targets", "bits", "t", "p", "bit", "mask", "a", "b", "chmodCommand", "authUser", "shell", "cwd", "args", "modeArg", "fileArg", "filePath", "resolvePath", "assertPathAccess", "octal", "result", "err", "clearCommand", "cpCommand", "authUser", "shell", "cwd", "args", "recursive", "ifFlag", "positionals", "a", "srcArg", "destArg", "srcPath", "resolvePath", "destPath", "assertPathAccess", "copyDir", "from", "to", "entry", "fromEntry", "toEntry", "content", "finalDest", "err", "curlCommand", "authUser", "cwd", "args", "shell", "flagsWithValues", "positionals", "parseArgs", "ifFlag", "url", "outputPath", "method", "postData", "headerRaw", "silent", "headOnly", "followRedirects", "verbose", "extraHeaders", "idx", "finalMethod", "fetchOpts", "stderrLines", "response", "err", "lines", "k", "v", "body", "target", "resolvePath", "assertPathAccess", "cutCommand", "args", "stdin", "delim", "getFlag", "cols", "f", "a", "b", "line", "parts", "selected", "col", "i", "dateCommand", "args", "now", "fmt", "declareCommand", "args", "env", "integer", "ifFlag", "_readonly", "_export_", "k", "v", "assignments", "token", "eq", "name", "val", "n", "deluserCommand", "authUser", "args", "shell", "username", "dfCommand", "shell", "used", "total", "avail", "pct", "hdr", "row", "diffCommand", "shell", "cwd", "args", "f1", "f2", "p1", "resolvePath", "p2", "b", "out", "max", "i", "la", "lb", "dpkgCommand", "args", "authUser", "shell", "pm", "getPackageManager", "listFlag", "ifFlag", "statusFlag", "listFilesFlag", "removeFlag", "purgeFlag", "positionals", "parseArgs", "pkgList", "header", "rows", "p", "name", "ver", "arch", "desc", "pkgName", "info", "installed", "output", "exitCode", "dpkgQueryCommand", "showFlag", "pattern", "filtered", "duCommand", "shell", "cwd", "args", "human", "ifFlag", "summary", "target", "a", "p", "resolvePath", "fmt", "b", "lines", "walk", "dir", "rel", "total", "e", "full", "r", "st", "evalArith", "expr", "env", "substituted", "_", "name", "val", "result", "outsideSingleQuotes", "input", "replacer", "parts", "i", "sqIdx", "closeIdx", "expandSync", "lastExit", "home", "homePath", "chunk", "s", "pre", "post", "def", "alt", "expandAsync", "runCmd", "inSingle", "ch", "depth", "j", "sub", "out", "expandEscapes", "text", "_", "oct", "echoCommand", "args", "stdin", "env", "flags", "positionals", "parseArgs", "noNewline", "escapes", "rawText", "expanded", "expandSync", "envCommand", "env", "authUser", "vars", "k", "v", "exitCommand", "args", "exportCommand", "args", "env", "k", "v", "arg", "eq", "name", "value", "findCommand", "authUser", "shell", "cwd", "args", "namePattern", "getFlag", "typeFilter", "rootArg", "a", "rootPath", "resolvePath", "assertPathAccess", "err", "nameRegex", "results", "walk", "currentPath", "display", "stat", "matchesType", "matchesName", "entry", "full", "disp", "os", "freeCommand", "args", "human", "ifFlag", "mb", "gb", "osTotalB", "osFreeB", "usedB", "sharedB", "buffersB", "availableB", "swapB", "fmt", "bytes", "header", "memRow", "swapRow", "grepCommand", "authUser", "shell", "cwd", "args", "stdin", "flags", "positionals", "parseArgs", "caseInsensitive", "invertMatch", "showLineNumbers", "recursive", "pattern", "files", "regex", "regexFlags", "matchLines", "content", "prefix", "lines", "out", "i", "line", "matches", "lineLabel", "readPaths", "base", "paths", "walk", "dir", "entry", "full", "results", "resolvedPaths", "f", "target", "resolvePath", "p", "file", "filePath", "assertPathAccess", "groupsCommand", "authUser", "shell", "args", "target", "gzipCommand", "shell", "cwd", "args", "file", "p", "resolvePath", "gunzipCommand", "headCommand", "authUser", "shell", "cwd", "args", "stdin", "nArg", "getFlag", "n", "positionals", "a", "take", "content", "results", "file", "filePath", "resolvePath", "assertPathAccess", "CATEGORY_ORDER", "CATEGORY_LABELS", "BOLD", "RESET", "CYAN", "YLW", "DIM", "GREEN", "pad", "s", "n", "formatCmdLine", "mod", "aliases", "renderFull", "modules", "grouped", "cat", "lines", "cats", "c", "mods", "sorted", "a", "b", "total", "renderDetail", "p", "catLabel", "createHelpCommand", "_getNames", "args", "getCommandModulesPublic", "target", "m", "historyCommand", "args", "shell", "histPath", "lines", "nArg", "n", "slice", "offset", "line", "i", "hostnameCommand", "hostname", "htopCommand", "mode", "idCommand", "authUser", "shell", "args", "target", "uid", "gid", "groups", "killCommand", "args", "a", "lnCommand", "authUser", "shell", "cwd", "args", "symbolic", "ifFlag", "positionals", "a", "targetArg", "linkArg", "linkPath", "resolvePath", "targetPath", "assertPathAccess", "srcPath", "content", "err", "formatPermissions", "mode", "isDirectory", "fileType", "permissions", "bit", "symbol", "formatDate", "date", "lsCommand", "authUser", "shell", "cwd", "args", "longFormat", "ifFlag", "showHidden", "targetArg", "getArg", "target", "resolvePath", "assertPathAccess", "items", "name", "childPath", "stat", "size", "joinListWithType", "p", "lsbReleaseCommand", "args", "shell", "osName", "codename", "version", "content", "line", "all", "ifFlag", "showId", "showDesc", "showRelease", "showCodename", "lines", "MAN_PAGES", "manCommand", "args", "shell", "name", "manPath", "page", "mkdirCommand", "authUser", "shell", "cwd", "args", "index", "dir", "getArg", "target", "resolvePath", "assertPathAccess", "mvCommand", "authUser", "shell", "cwd", "args", "positionals", "a", "srcArg", "destArg", "srcPath", "resolvePath", "destPath", "assertPathAccess", "finalDest", "err", "path", "nanoCommand", "authUser", "shell", "cwd", "args", "fileArg", "targetPath", "resolvePath", "assertPathAccess", "initialContent", "safeName", "tempPath", "import_node_fs", "os", "path", "formatUptime", "seconds", "totalMinutes", "days", "hours", "minutes", "parts", "colorBlock", "code", "buildColorBars", "normal", "bright", "colorizeLogoLine", "line", "index", "total", "start", "end", "ratio", "r", "g", "b", "colorizeDetailLine", "colonIndex", "applyHorizontalGradient", "title", "value", "text", "ansiRegex", "cleaned", "result", "i", "toMiB", "bytes", "readOsPrettyName", "data", "readFirstLine", "filePath", "resolveHostLabel", "fallback", "vendor", "product", "countDpkgPackages", "candidates", "countSnapPackages", "dirPath", "entry", "resolvePackagesLabel", "dpkgCount", "snapCount", "resolveCpuLabel", "cpus", "first", "ghz", "resolveShellLabel", "shell", "resolveDefaults", "info", "totalMem", "freeMem", "usedMem", "shellProps", "processUptime", "buildNeofetchOutput", "fields", "uptime", "colorBars", "distroLogo", "details", "width", "lines", "rawLeft", "right", "left", "coloredRight", "_globalEnv", "getAllEnvVars", "authUser", "_globalEnv", "setCommand", "args", "env", "k", "v", "arg", "eq", "neofetchCommand", "args", "authUser", "hostname", "shell", "env", "getAllEnvVars", "ifFlag", "buildNeofetchOutput", "import_node_vm", "VIRTUAL_VERSION", "VIRTUAL_VERSIONS", "makeContext", "outputLines", "stderrLines", "fakeProcess", "s", "code", "ExitSignal", "fakeConsole", "a", "formatValue", "v", "fakeRequire", "mod", "parts", "p", "b", "d", "id", "vm", "k", "val", "runJs", "ctx", "exitCode", "result", "err", "runJsFile", "trimmed", "nodeCommand", "args", "shell", "cwd", "ifFlag", "eIdx", "expr", "stdout", "stderr", "pIdx", "file", "filePath", "resolvePath", "NPM_VERSION", "NODE_VERSION", "npmCommand", "args", "shell", "ifFlag", "sub", "npxCommand", "passwdCommand", "authUser", "args", "shell", "username", "password", "pingCommand", "args", "flagsWithValues", "positionals", "parseArgs", "host", "countArg", "count", "lines", "i", "ms", "renderPrintf", "fmt", "args", "argIdx", "out", "i", "j", "spec", "arg", "printfCommand", "psCommand", "authUser", "shell", "args", "sessions", "showUser", "ifFlag", "showAll", "rows", "pid", "s", "user", "mem", "vsz", "rss", "pwdCommand", "cwd", "VERSION", "VERSION_INFO", "NONE", "pyDict", "entries", "pyRange", "start", "stop", "step", "isPyDict", "v", "isPyRange", "isPyFunc", "isPyClass", "isPyInstance", "isPyNone", "pyRepr", "k", "val", "pyStr", "pyBool", "pyRangeLength", "r", "n", "pyRangeItems", "items", "i", "pyIter", "PyError", "pyTypeName", "type", "message", "ReturnSignal", "value", "BreakSignal", "ContinueSignal", "ExitSignal", "code", "makeRootScope", "cwd", "scope", "osModule", "makeOsModule", "path", "os", "makeSysModule", "makeMathModule", "makeJsonModule", "makeReModule", "MODULE_FACTORIES", "Interpreter", "s", "args", "depth", "cur", "inStr", "strChar", "ch", "expr", "fMatch", "result", "_", "inner", "bMatch", "compMatch", "itemExpr", "varName", "iterExpr", "condExpr", "iterable", "item", "inner2", "a", "parts", "dict", "entry", "colonIdx", "notMatch", "binaryOps", "ops", "bracketStart", "obj", "key", "callMatch", "name", "argsStr", "callArgs", "dotResult", "objExpr", "attr", "callPart", "argsInner", "part", "open", "close", "attrMatch", "op", "before", "after", "left", "right", "leftExpr", "rightExpr", "l", "arr", "container", "p", "idx", "_scope", "method", "w", "f", "c", "b", "d", "mathFns", "fn", "opts", "indent", "callScope", "fmt", "spec", "base", "iters", "len", "it", "acc", "sortArg1", "keyFn", "ka", "kb", "h", "e", "cls", "inst", "lines", "startIdx", "raw", "bodyLines", "line", "baseIndent", "block", "retMatch", "raiseMatch", "ex", "assertMatch", "delMatch", "importMatch", "modName", "alias", "factory", "mod", "fromMatch", "imports", "defMatch", "fnName", "paramsStr", "params", "body", "classMatch", "className", "basesStr", "bases", "j", "mMatch", "mName", "mParams", "mBody", "cond", "_skip", "bk", "el", "elt", "elifMatch", "eBody", "sl", "sb", "forMatch", "target", "elseBody", "afterIdx", "broken", "targets", "t", "whileMatch", "iterations", "tryBody", "exceptClauses", "finallyBody", "excMatch", "excName", "excAlias", "excBody", "_caughtErr", "handled", "clause", "withMatch", "augMatch", "rhsExpr", "lhs", "rhs", "subAssignMatch", "valExpr", "attrAssignMatch", "dotIdx", "multiAssignMatch", "values", "assignMatch", "python3Command", "shell", "ifFlag", "VERSION", "cIdx", "normalised", "interp", "stdout", "stderr", "exitCode", "file", "filePath", "resolvePath", "readCommand", "args", "stdin", "env", "_promptIdx", "varNames", "i", "input", "line", "ifFlag", "m", "parts", "rmCommand", "authUser", "shell", "cwd", "args", "recursive", "ifFlag", "targets", "index", "target", "getArg", "resolvedTarget", "resolvePath", "assertPathAccess", "sedCommand", "authUser", "shell", "cwd", "args", "stdin", "inPlace", "ifFlag", "expr", "getFlag", "a", "fileArg", "content", "p", "resolvePath", "sMatch", "from", "to", "flags", "regexFlags", "regex", "result", "executeStatements", "statements", "authUser", "hostname", "mode", "cwd", "shell", "env", "last", "i", "stmt", "executePipeline", "op", "pipeline", "shellEnv", "executeSingleCommandWithRedirections", "executePipelineChain", "cmd", "stdin", "inputPath", "resolvePath", "result", "runCommandDirect", "outputPath", "output", "existing", "commands", "currentOutput", "exitCode", "parseScript", "rawInput", "trimmed", "parseStatements", "parseStatements", "input", "segments", "splitByLogicalOps", "statements", "seg", "stmt", "parsePipeline", "current", "depth", "inQ", "qChar", "i", "flush", "op", "ch", "ch2", "splitByPipe", "parseCommandWithRedirections", "tokens", "tail", "token", "parts", "tokenizeCommand", "cmdParts", "inputFile", "outputFile", "appendOutput", "part", "next", "tokenizeCommand", "input", "tokens", "current", "inQ", "qChar", "ch", "next", "makeDefaultEnv", "authUser", "hostname", "resolveVfsBinary", "name", "env", "shell", "st", "pathDirs", "dir", "full", "runCommandDirect", "args", "mode", "cwd", "stdin", "aliasVal", "runCommand", "mod", "resolveModule", "vfsBinary", "stubContent", "builtinMatch", "builtinMod", "shMod", "error", "rawInput", "trimmed", "shellEnv", "rawFirstWord", "aliasExpanded", "script", "parseScript", "executeStatements", "expanded", "expandAsync", "sub", "r", "parts", "commandName", "builtinName", "expandVars", "line", "env", "lastExit", "ctx", "expandAsync", "sub", "runCommand", "r", "parseBlocks", "lines", "blocks", "i", "cond", "thenLines", "elifBlocks", "elseLines", "section", "elifCond", "m", "body", "l", "evalCondition", "expanded", "testMatch", "expr", "fTest", "flag", "arg", "p", "resolvePath", "cmpMatch", "a", "op", "b", "numMatch", "na", "nb", "runBlocks", "lastResult", "output", "block", "assignRe", "tokens", "t", "tok", "ran", "elif", "items", "item", "iterations", "shCommand", "args", "shell", "cwd", "ifFlag", "script", "fileArg", "shiftCommand", "args", "env", "n", "argv", "shifted", "trapCommand", "action", "signals", "sig", "returnCommand", "code", "sleepCommand", "args", "secs", "r", "sortCommand", "authUser", "shell", "cwd", "args", "stdin", "reverse", "ifFlag", "numeric", "unique", "files", "a", "sorted", "f", "assertPathAccess", "resolvePath", "b", "result", "sourceCommand", "args", "authUser", "hostname", "cwd", "shell", "env", "fileArg", "filePath", "resolvePath", "content", "lastExitCode", "line", "l", "result", "runCommand", "suCommand", "authUser", "shell", "args", "users", "targetUser", "getArg", "parseSudoArgs", "args", "flags", "flagsWithValues", "positionals", "parseArgs", "loginShell", "targetUser", "commandLine", "sudoCommand", "authUser", "hostname", "mode", "cwd", "shell", "effectiveUser", "prompt", "runCommand", "tailCommand", "authUser", "shell", "cwd", "args", "stdin", "nArg", "getFlag", "n", "positionals", "a", "take", "content", "lines", "results", "file", "filePath", "resolvePath", "assertPathAccess", "tarCommand", "authUser", "shell", "cwd", "args", "create", "ifFlag", "extract", "list", "fFlag", "a", "archiveName", "archivePath", "resolvePath", "fileArgs", "entries", "f", "p", "walk", "dir", "prefix", "e", "full", "rel", "name", "content", "teeCommand", "authUser", "shell", "cwd", "args", "stdin", "append", "ifFlag", "files", "a", "input", "f", "p", "resolvePath", "existing", "evalTest", "tokens", "shell", "cwd", "andIdx", "orIdx", "flag", "operand", "path", "p", "left", "op", "right", "leftN", "rightN", "testCommand", "args", "touchCommand", "authUser", "shell", "cwd", "args", "file", "target", "resolvePath", "assertPathAccess", "trCommand", "args", "stdin", "del", "ifFlag", "positionals", "set1", "set2", "input", "c", "i", "treeCommand", "authUser", "shell", "cwd", "args", "target", "resolvePath", "getArg", "assertPathAccess", "trueCommand", "falseCommand", "typeCommand", "args", "shell", "env", "pathDirs", "lines", "exitCode", "name", "resolveModule", "found", "dir", "full", "unameCommand", "shell", "args", "all", "ifFlag", "sysname", "release", "machine", "hostname", "uniqCommand", "args", "stdin", "count", "ifFlag", "dupOnly", "uniqOnly", "lines", "out", "i", "j", "n", "line", "unsetCommand", "args", "env", "name", "uptimeCommand", "args", "shell", "pretty", "ifFlag", "since", "uptimeSec", "days", "hours", "mins", "parts", "timeStr", "uptimeStr", "sessions", "load", "wcCommand", "authUser", "shell", "cwd", "args", "stdin", "lines", "ifFlag", "words", "bytes", "showAll", "positionals", "a", "count", "content", "label", "l", "w", "c", "parts", "results", "file", "filePath", "resolvePath", "assertPathAccess", "wgetCommand", "authUser", "cwd", "args", "shell", "flagsWithValues", "positionals", "parseArgs", "ifFlag", "url", "outputArg", "dirPrefix", "quiet", "filename", "stripUrlFilename", "targetPath", "resolvePath", "assertPathAccess", "stderrLines", "response", "err", "msg", "body", "ct", "whichCommand", "args", "shell", "env", "pathDirs", "lines", "anyMissing", "name", "found", "dir", "full", "formatLoginDate", "date", "weekday", "month", "day", "hh", "mm", "ss", "year", "whoCommand", "shell", "session", "loginAt", "displayDate", "formatLoginDate", "whoamiCommand", "authUser", "xargsCommand", "authUser", "hostname", "mode", "cwd", "args", "stdin", "shell", "env", "baseCmd", "extraArgs", "items", "fullCmd", "runCommand", "BASE_COMMANDS", "pwdCommand", "cdCommand", "lsCommand", "treeCommand", "catCommand", "touchCommand", "rmCommand", "mkdirCommand", "cpCommand", "mvCommand", "lnCommand", "chmodCommand", "findCommand", "grepCommand", "sedCommand", "awkCommand", "sortCommand", "uniqCommand", "wcCommand", "headCommand", "tailCommand", "cutCommand", "trCommand", "teeCommand", "xargsCommand", "diffCommand", "tarCommand", "gzipCommand", "gunzipCommand", "base64Command", "whoamiCommand", "whoCommand", "hostnameCommand", "idCommand", "groupsCommand", "unameCommand", "psCommand", "killCommand", "dfCommand", "duCommand", "dateCommand", "sleepCommand", "pingCommand", "echoCommand", "envCommand", "exportCommand", "setCommand", "unsetCommand", "shCommand", "clearCommand", "exitCommand", "nanoCommand", "htopCommand", "curlCommand", "wgetCommand", "adduserCommand", "passwdCommand", "deluserCommand", "sudoCommand", "suCommand", "neofetchCommand", "aptCommand", "aptCacheCommand", "dpkgCommand", "dpkgQueryCommand", "whichCommand", "typeCommand", "manCommand", "aliasCommand", "unaliasCommand", "testCommand", "sourceCommand", "historyCommand", "printfCommand", "readCommand", "declareCommand", "shiftCommand", "trapCommand", "returnCommand", "trueCommand", "falseCommand", "npmCommand", "npxCommand", "nodeCommand", "python3Command", "uptimeCommand", "freeCommand", "lsbReleaseCommand", "customCommands", "commandRegistry", "cachedCommandNames", "helpCommand", "createHelpCommand", "getCommandModules", "cmd", "buildCache", "mod", "alias", "registerCommand", "module", "normalized", "a", "n", "createCustomCommand", "name", "params", "run", "getCommandNames", "getCommandModulesPublic", "resolveModule", "os", "ensureDir", "vfs", "path", "mode", "ensureFile", "content", "bootstrapEtc", "hostname", "props", "syncEtcPasswd", "users", "userList", "passwdLines", "uid", "u", "groupLines", "shadowLines", "ttyToPid", "tty", "match", "writeProcPid", "pid", "username", "_tty", "cmdline", "startedAt", "env", "dir", "uptimeSec", "k", "v", "refreshProc", "shellStartTime", "sessions", "totalMemKb", "freeMemKb", "availMemKb", "cpus", "cpuLines", "i", "c", "mhz", "load", "numProcs", "activeSessions", "session", "selfPid", "selfSrc", "entry", "srcPath", "dstPath", "bootstrapSys", "bootstrapDev", "bootstrapUsr", "builtins", "bin", "bootstrapVar", "bootstrapBin", "bootstrapTmp", "bootstrapRoot", "bootstrapMisc", "bootstrapLinuxRootfs", "isTruthyEnv", "value", "nowMs", "isPerfLoggingEnabled", "createPerfLogger", "scope", "enabled", "startedAt", "mark", "label", "elapsedMs", "import_node_events", "fsSync", "path", "import_node_zlib", "MAGIC", "VERSION", "TYPE_FILE", "TYPE_DIR", "Encoder", "buf", "n", "b", "s", "encoded", "bytes", "encodeNode", "enc", "node", "f", "d", "children", "child", "encodeVfs", "root", "Decoder", "v", "len", "decodeNode", "dec", "type", "name", "mode", "createdAt", "updatedAt", "compressed", "content", "count", "i", "decodeVfs", "isBinarySnapshot", "path", "normalizePath", "rawPath", "normalized", "splitPath", "normalizedPath", "getNode", "root", "targetPath", "parts", "current", "part", "next", "getParentDirectory", "createIfMissing", "createPath", "parentPath", "name", "parentNode", "VirtualFileSystem", "_VirtualFileSystem", "options", "name", "mode", "now", "content", "compressed", "targetPath", "normalized", "normalizePath", "parts", "current", "builtPath", "part", "child", "raw", "isBinarySnapshot", "decodeVfs", "snapshot", "err", "dir", "binary", "encodeVfs", "existing", "getNode", "parent", "getParentDirectory", "p", "rawContent", "shouldCompress", "storedContent", "f", "node", "d", "dirPath", "label", "lines", "entries", "isLast", "connector", "nextPrefix", "sub", "l", "total", "linkPath", "normalizedLink", "normalizedTarget", "symNode", "maxDepth", "depth", "target", "fromPath", "toPath", "fromNormalized", "toNormalized", "destParent", "destName", "srcParent", "srcName", "children", "file", "vfs", "snap", "VirtualFileSystem_default", "PACKAGE_REGISTRY", "vfs", "VirtualPackageManager", "users", "status", "blocks", "block", "fields", "name", "pkg", "result", "line", "idx", "msg", "existing", "action", "pkgs", "ts", "entry", "p", "a", "b", "names", "opts", "lines", "toInstall", "notFound", "resolve", "seen", "def", "dep", "n", "totalKb", "acc", "f", "dir", "now", "toRemove", "filePath", "term", "t", "inst", "import_node_crypto", "import_node_events", "path", "resolveFastPasswordHash", "configured", "perf", "createPerfLogger", "VirtualUserManager", "_VirtualUserManager", "vfs", "autoSudoForNewUsers", "changed", "username", "maxBytes", "homePath", "targetPath", "nextContent", "quota", "normalizedPath", "normalizeVfsPath", "currentUsage", "existingSize", "existing", "incomingSize", "projectedUsage", "password", "record", "remoteAddress", "session", "sessionId", "left", "right", "raw", "line", "trimmed", "parts", "salt", "passwordHash", "value", "bytes", "authContent", "sudoersContent", "quotasContent", "content", "mode", "cacheKey", "cached", "algo", "data", "keys", "normalized", "import_promises", "path", "import_node_child_process", "import_promises", "path", "shellQuote", "value", "toTtyLines", "text", "withTerminalSize", "command", "terminalSize", "cols", "rows", "resolvePath", "base", "inputPath", "collectChildPids", "parentPid", "directChildren", "pid", "nested", "getVisibleHtopPidList", "rootPid", "descendants", "unique", "a", "b", "spawnScriptProcess", "command", "terminalSize", "stream", "formatted", "withTerminalSize", "proc", "data", "spawnNanoEditorProcess", "tempPath", "shellQuote", "spawnHtopProcess", "pidList", "buildPrompt", "user", "host", "cwdName", "isRoot", "colorUser", "colorWhite", "colorBlue", "colorReset", "startShell", "properties", "stream", "authUser", "hostname", "sessionId", "remoteAddress", "terminalSize", "shell", "lineBuffer", "cursorPos", "history", "loadHistory", "historyIndex", "historyDraft", "cwd", "shellEnv", "makeDefaultEnv", "nanoSession", "pendingSudo", "buildCurrentPrompt", "homePath", "cwdLabel", "buildPrompt", "commandNames", "getCommandNames", "bashrcPath", "bashrc", "line", "l", "runCommand", "renderLine", "prompt", "moveLeft", "clearCurrentLine", "startSudoPrompt", "challenge", "finishSudoPrompt", "success", "runCwd", "result", "startNanoEditor", "startHtop", "toTtyLines", "finishNanoEditor", "activeSession", "updatedContent", "targetPath", "initialContent", "tempPath", "editor", "spawnNanoEditorProcess", "error", "pidList", "getVisibleHtopPidList", "monitor", "spawnHtopProcess", "applyHistoryLine", "nextLine", "insertText", "text", "getTokenRange", "cursor", "start", "end", "listPathCompletions", "prefix", "slashIndex", "dirPart", "namePart", "basePath", "resolvePath", "entry", "fullPath", "suffix", "handleTabCompletion", "token", "commandCandidates", "name", "pathCandidates", "candidates", "completed", "pushHistory", "cmd", "data", "readLastLogin", "lastlogPath", "writeLastLogin", "nowIso", "dir", "renderLoginBanner", "last", "when", "displayed", "formatLoginDate", "chunk", "input", "i", "ch", "password", "valid", "next", "third", "fourth", "vfs", "historyPath", "defaultShellProperties", "perf", "createPerfLogger", "resolveAutoSudoForNewUsers", "configured", "VirtualShell", "hostname", "properties", "vfsOptions", "VirtualFileSystem_default", "VirtualUserManager", "VirtualPackageManager", "vfs", "users", "pm", "shellProps", "shellHostname", "startTime", "bootstrapLinuxRootfs", "name", "params", "callback", "normalized", "registerCommand", "createCustomCommand", "rawInput", "authUser", "cwd", "runCommand", "stream", "sessionId", "remoteAddress", "terminalSize", "startShell", "refreshProc", "syncEtcPasswd", "targetPath", "content", "import_node_events", "import_ssh2", "toTtyLines", "text", "runExec", "stream", "cmd", "authUser", "hostname", "shell", "runCommand", "makeDefaultEnv", "result", "error", "import_node_crypto", "import_node_fs", "import_node_path", "loadOrCreateHostKey", "baseDir", "hostKeyPath", "privateKey", "import_ssh2", "perf", "createPerfLogger", "perf", "createPerfLogger", "SshMimic", "port", "hostname", "shell", "VirtualShell", "maxAuthAttempts", "lockoutDurationMs", "ip", "entry", "authUser", "homePath", "privateKey", "loadOrCreateHostKey", "SshServer", "client", "remoteAddress", "sessionId", "ctx", "candidateUser", "authorizedKeys", "incomingKey", "k", "accept", "session", "terminalSize", "acceptPty", "_rejectPty", "info", "_acceptChange", "_rejectChange", "acceptShell", "stream", "acceptExec", "_rejectExec", "runExec", "resolve", "reject", "err", "hostname", "virtualShell", "VirtualShell", "SshMimic", "error", "promise"]
7
+ }