@poe-platform/safe-bash 0.1.817 → 0.1.818

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 (439) hide show
  1. package/dist/image-ast/index.js +2 -2
  2. package/dist/mp4-ast/index.d.ts +2 -1
  3. package/dist/mp4-ast/mp4-metadata-source.d.ts +10 -0
  4. package/dist/mp4-ast/mp4-packets-source.d.ts +8 -1
  5. package/dist/mp4-ast/types.d.ts +21 -3
  6. package/dist/pdf-ast/ast.d.ts +2 -0
  7. package/dist/pdf-ast/content/evaluator.d.ts +7 -0
  8. package/dist/pdf-ast/content/retained-evaluator.d.ts +2 -2
  9. package/dist/pdf-ast/content/retained-page.d.ts +2 -2
  10. package/dist/pdf-ast/extract/html-text-stream.d.ts +14 -0
  11. package/dist/pdf-ast/extract/logical-text-stream.d.ts +14 -0
  12. package/dist/pdf-ast/extract/raw-text-index.d.ts +18 -4
  13. package/dist/pdf-ast/extract/retained-color.d.ts +6 -6
  14. package/dist/pdf-ast/extract/retained-decoded-image.d.ts +2 -2
  15. package/dist/pdf-ast/extract/stored-text-glyphs.d.ts +8 -0
  16. package/dist/pdf-ast/fonts/retained.d.ts +2 -2
  17. package/dist/pdf-ast/image.d.ts +2 -0
  18. package/dist/pdf-ast/image.js +19 -0
  19. package/dist/pdf-ast/index.d.ts +3 -0
  20. package/dist/pdf-ast/index.js +264 -66852
  21. package/dist/pdf-ast/render/postscript.d.ts +6 -0
  22. package/dist/pdf-ast/render/raster.d.ts +21 -1
  23. package/dist/pdf-ast/retained-document.d.ts +16 -95
  24. package/dist/pdf-ast/retained-reader.d.ts +109 -0
  25. package/dist/safe-bash/command-chunks/biff-AYJZR2YV-JPESBEOO.js +5741 -0
  26. package/dist/safe-bash/command-chunks/{chunk-SL4LD25A.js → chunk-232N24HE.js} +9 -9
  27. package/dist/safe-bash/command-chunks/{chunk-ALD53QFL.js → chunk-2C4QMQQD.js} +42 -12
  28. package/dist/safe-bash/command-chunks/{chunk-3PM46VWH.js → chunk-2FEMMALH.js} +4 -4
  29. package/dist/safe-bash/command-chunks/{chunk-QDV2NIFR.js → chunk-2TMTGVJR.js} +1 -1
  30. package/dist/safe-bash/command-chunks/{chunk-ARE267HR.js → chunk-2WTDP3TP.js} +5 -5
  31. package/dist/safe-bash/command-chunks/{chunk-FSG6UC2N.js → chunk-2XR7B6DY.js} +420 -167
  32. package/dist/safe-bash/command-chunks/{chunk-EY3UE26F.js → chunk-2YC6MWQB.js} +1 -1
  33. package/dist/safe-bash/command-chunks/{chunk-UPWLHHZ2.js → chunk-37KBCKDF.js} +13 -13
  34. package/dist/safe-bash/command-chunks/{chunk-DOVWHVHI.js → chunk-3B6554G6.js} +5 -5
  35. package/dist/safe-bash/command-chunks/{chunk-FB2WPI3M.js → chunk-3ZGO24WG.js} +1 -1
  36. package/dist/safe-bash/command-chunks/{chunk-GR4ONCQ5.js → chunk-424NYO35.js} +7 -7
  37. package/dist/safe-bash/command-chunks/{chunk-MQE77MEQ.js → chunk-45GTHPL5.js} +3 -3
  38. package/dist/safe-bash/command-chunks/{chunk-AF2IO57Q.js → chunk-4OHTYYNU.js} +8 -136
  39. package/dist/safe-bash/command-chunks/{chunk-ICJH6A73.js → chunk-4PMMJ45F.js} +3 -3
  40. package/dist/safe-bash/command-chunks/{chunk-57PK2QFX.js → chunk-4SFX6YGC.js} +6 -6
  41. package/dist/safe-bash/command-chunks/{chunk-G3LUT475.js → chunk-4WHTTCKY.js} +6 -6
  42. package/dist/safe-bash/command-chunks/{chunk-UYZ6EFZE.js → chunk-4Z7PBIMP.js} +6 -6
  43. package/dist/safe-bash/command-chunks/{chunk-A4P37F3P.js → chunk-57SKL76U.js} +3 -3
  44. package/dist/safe-bash/command-chunks/{chunk-J6FNSVHT.js → chunk-5GP4A3TD.js} +5 -5
  45. package/dist/safe-bash/command-chunks/{chunk-OFONWWEZ.js → chunk-5IHJWBDR.js} +2 -2
  46. package/dist/safe-bash/command-chunks/{chunk-A2L3U7DW.js → chunk-5OS4Q3AX.js} +4 -4
  47. package/dist/safe-bash/command-chunks/{chunk-FUYZUETI.js → chunk-5PMLTSQ5.js} +2 -2
  48. package/dist/safe-bash/command-chunks/{chunk-TXU7MMHN.js → chunk-5RDS6CNQ.js} +13 -13
  49. package/dist/safe-bash/command-chunks/{chunk-FR63MJSO.js → chunk-5UGQGB5Y.js} +7 -7
  50. package/dist/safe-bash/command-chunks/{chunk-UKAGRRLZ.js → chunk-5VY5O37W.js} +1 -1
  51. package/dist/safe-bash/command-chunks/chunk-5WS6DXYE.js +68444 -0
  52. package/dist/safe-bash/command-chunks/{chunk-2ALHVXEM.js → chunk-6EK76ERE.js} +2 -2
  53. package/dist/safe-bash/command-chunks/{chunk-4772DJKS.js → chunk-6GCK2KSL.js} +61 -26
  54. package/dist/safe-bash/command-chunks/{chunk-T5OQ53XS.js → chunk-6IID5HTY.js} +1 -1
  55. package/dist/safe-bash/command-chunks/{chunk-EZDWPTYB.js → chunk-6LOAJOWK.js} +13 -13
  56. package/dist/safe-bash/command-chunks/{chunk-WMBELKPP.js → chunk-6PE2L522.js} +6 -6
  57. package/dist/safe-bash/command-chunks/{chunk-ZAYTFXUX.js → chunk-73KY3MZ3.js} +4 -4
  58. package/dist/safe-bash/command-chunks/{chunk-BOVDUJ3A.js → chunk-77WBFVZQ.js} +7 -7
  59. package/dist/safe-bash/command-chunks/{chunk-3DWFXESW.js → chunk-7GJJDM2F.js} +2 -2
  60. package/dist/safe-bash/command-chunks/{chunk-WIW3KDBS.js → chunk-7NFICYRU.js} +2 -2
  61. package/dist/safe-bash/command-chunks/{chunk-35DU6I2M.js → chunk-7ZEGARPB.js} +5 -5
  62. package/dist/safe-bash/command-chunks/{chunk-A5SPMSKD.js → chunk-A32PUWYE.js} +2 -2
  63. package/dist/safe-bash/command-chunks/{chunk-KYIGYYEY.js → chunk-A32ZROH5.js} +3 -3
  64. package/dist/safe-bash/command-chunks/{chunk-IOXMGD2H.js → chunk-ADVQZLLE.js} +2 -2
  65. package/dist/safe-bash/command-chunks/{chunk-CGJ7GMHO.js → chunk-AEZU6NZE.js} +2 -2
  66. package/dist/safe-bash/command-chunks/{chunk-KDDXLHN7.js → chunk-ATHU53C2.js} +3 -3
  67. package/dist/safe-bash/command-chunks/{chunk-R7LF4XQV.js → chunk-B6T2526I.js} +2 -2
  68. package/dist/safe-bash/command-chunks/{chunk-PPN53PX3.js → chunk-BB7HBO56.js} +2 -2
  69. package/dist/safe-bash/command-chunks/{chunk-ZM7HMBAJ.js → chunk-BDGNKRY4.js} +7 -7
  70. package/dist/safe-bash/command-chunks/{chunk-VMZIAFVJ.js → chunk-BFRSYJUC.js} +8 -8
  71. package/dist/safe-bash/command-chunks/{chunk-X42MJT2J.js → chunk-BJL7AGA5.js} +1 -1
  72. package/dist/safe-bash/command-chunks/{chunk-VZTVR3JI.js → chunk-C2QUG7IP.js} +3 -3
  73. package/dist/safe-bash/command-chunks/{chunk-IVKAFEPO.js → chunk-C34RLMAC.js} +9 -9
  74. package/dist/safe-bash/command-chunks/{chunk-5O45KGW5.js → chunk-C5VUJOUQ.js} +1 -1
  75. package/dist/safe-bash/command-chunks/{chunk-LQDANF2B.js → chunk-CCNOZKAK.js} +8 -8
  76. package/dist/safe-bash/command-chunks/{chunk-FEBTT5NH.js → chunk-CEHICGP6.js} +2 -2
  77. package/dist/safe-bash/command-chunks/{chunk-SICTBSLW.js → chunk-CODJMTSA.js} +6 -6
  78. package/dist/safe-bash/command-chunks/{chunk-LJ3UYESS.js → chunk-CP5EO5TT.js} +1 -1
  79. package/dist/safe-bash/command-chunks/{chunk-45DKGZYO.js → chunk-CSS5KXQC.js} +329 -152
  80. package/dist/safe-bash/command-chunks/{chunk-6RLWPB44.js → chunk-CZSLXQU2.js} +1 -1
  81. package/dist/safe-bash/command-chunks/{chunk-3ZWFE4CK.js → chunk-D2ZT2UUT.js} +3 -3
  82. package/dist/safe-bash/command-chunks/{chunk-WH624PKJ.js → chunk-D5XSGHXN.js} +2 -2
  83. package/dist/safe-bash/command-chunks/{chunk-NDALIHKK.js → chunk-D7UFAIBS.js} +18 -18
  84. package/dist/safe-bash/command-chunks/{chunk-ISFGPCED.js → chunk-DCKAY6HV.js} +6 -6
  85. package/dist/safe-bash/command-chunks/{chunk-LNAZ3E4Q.js → chunk-DGCJVZW6.js} +1 -1
  86. package/dist/safe-bash/command-chunks/{chunk-LFSWLJPR.js → chunk-DJB5RB6U.js} +288 -32
  87. package/dist/safe-bash/command-chunks/{chunk-FGHSE3RZ.js → chunk-DZ4ELL34.js} +1 -1
  88. package/dist/safe-bash/command-chunks/{chunk-LQX7RAF7.js → chunk-EBKKYRQJ.js} +5 -5
  89. package/dist/safe-bash/command-chunks/{chunk-QNETPOMH.js → chunk-EDBNI7WE.js} +14 -14
  90. package/dist/safe-bash/command-chunks/{chunk-5GDF5FAS.js → chunk-EEJ3YXVO.js} +1 -1
  91. package/dist/safe-bash/command-chunks/{chunk-RTHYAGKI.js → chunk-ETN25WCR.js} +2 -2
  92. package/dist/safe-bash/command-chunks/{chunk-ET6LMDEX.js → chunk-EV3DPRWE.js} +9 -9
  93. package/dist/safe-bash/command-chunks/{chunk-3MUFXGA2.js → chunk-F2JUB7JI.js} +1 -1
  94. package/dist/safe-bash/command-chunks/{chunk-345YBIHP.js → chunk-F42WV2YO.js} +19 -19
  95. package/dist/safe-bash/command-chunks/{chunk-FTZFCMVI.js → chunk-FAVWWMFW.js} +12 -12
  96. package/dist/safe-bash/command-chunks/{chunk-XBWD6SI3.js → chunk-FDRE535F.js} +16 -16
  97. package/dist/safe-bash/command-chunks/{chunk-WMV5224N.js → chunk-FILE5PBI.js} +3 -3
  98. package/dist/safe-bash/command-chunks/{chunk-XPQUUFQD.js → chunk-FPOM47UA.js} +2 -2
  99. package/dist/safe-bash/command-chunks/{chunk-QMBMZSJF.js → chunk-FQ2WRT4Q.js} +3 -3
  100. package/dist/safe-bash/command-chunks/{chunk-H56BSMFQ.js → chunk-FVAFISPY.js} +4 -4
  101. package/dist/safe-bash/command-chunks/{chunk-2QZUAZTH.js → chunk-GIQUIF6E.js} +1 -1
  102. package/dist/safe-bash/command-chunks/{chunk-2TWXRJPB.js → chunk-GNORF6RY.js} +13 -13
  103. package/dist/safe-bash/command-chunks/{chunk-ABL2DPJI.js → chunk-GPLN6JV2.js} +12 -12
  104. package/dist/safe-bash/command-chunks/{chunk-DZOKH5BL.js → chunk-GQ7BD75U.js} +3 -3
  105. package/dist/safe-bash/command-chunks/{chunk-N4HWOLGZ.js → chunk-GY2C555A.js} +2 -2
  106. package/dist/safe-bash/command-chunks/{chunk-N32AP43V.js → chunk-GZNX5SS4.js} +7 -7
  107. package/dist/safe-bash/command-chunks/{chunk-YPG55QTP.js → chunk-HCJWEB6P.js} +1 -1
  108. package/dist/safe-bash/command-chunks/{chunk-4ABR3KGK.js → chunk-HNY7LZ5P.js} +3 -3
  109. package/dist/safe-bash/command-chunks/{chunk-P462JTNT.js → chunk-HOBXZX23.js} +5 -5
  110. package/dist/safe-bash/command-chunks/{chunk-5KZMR6AJ.js → chunk-HW3IOXT6.js} +6 -6
  111. package/dist/safe-bash/command-chunks/{chunk-3VGQTLO6.js → chunk-HX7QQNWS.js} +4 -4
  112. package/dist/safe-bash/command-chunks/{chunk-TXWDR2P4.js → chunk-IBT3OWXB.js} +1 -1
  113. package/dist/safe-bash/command-chunks/{chunk-OHEZQ4QA.js → chunk-IFBLXBBM.js} +9 -9
  114. package/dist/safe-bash/command-chunks/{chunk-HOJ7WDTS.js → chunk-IJZUUXLL.js} +3 -3
  115. package/dist/safe-bash/command-chunks/{chunk-BZRWZ6GO.js → chunk-IKU7ZBF3.js} +2 -2
  116. package/dist/safe-bash/command-chunks/{chunk-CKIXC7AO.js → chunk-IPKYPADE.js} +3 -3
  117. package/dist/safe-bash/command-chunks/{chunk-IWVANZWH.js → chunk-JLPBGKVC.js} +3 -3
  118. package/dist/safe-bash/command-chunks/{chunk-6M3JTPKE.js → chunk-JNRX5EFF.js} +5 -5
  119. package/dist/safe-bash/command-chunks/{chunk-5YL453ZF.js → chunk-JSX5CFZY.js} +36 -36
  120. package/dist/safe-bash/command-chunks/{chunk-V6JPIZUW.js → chunk-JT656DKZ.js} +7 -7
  121. package/dist/safe-bash/command-chunks/{chunk-DM5WURQL.js → chunk-JY2T3KV2.js} +2 -2
  122. package/dist/safe-bash/command-chunks/{chunk-IZ3SD5S2.js → chunk-K2NV6H7E.js} +4 -4
  123. package/dist/safe-bash/command-chunks/{chunk-62RG3GHF.js → chunk-K6E56LND.js} +6 -6
  124. package/dist/safe-bash/command-chunks/{chunk-FLSXHLJG.js → chunk-KADQKXZE.js} +9 -9
  125. package/dist/safe-bash/command-chunks/{chunk-URQSUMMJ.js → chunk-KFFV7HBL.js} +4 -4
  126. package/dist/safe-bash/command-chunks/{chunk-ONQP4FNV.js → chunk-KZICRCQ7.js} +1 -1
  127. package/dist/safe-bash/command-chunks/{chunk-N35IJXBK.js → chunk-L6X4EEN6.js} +9 -9
  128. package/dist/safe-bash/command-chunks/{chunk-SHLT5R64.js → chunk-LF7YJ5VQ.js} +9 -9
  129. package/dist/safe-bash/command-chunks/{chunk-GMBUOYTN.js → chunk-LNHTLWIL.js} +4 -4
  130. package/dist/safe-bash/command-chunks/{chunk-A6OTPNNI.js → chunk-LPKMNCC5.js} +3 -3
  131. package/dist/safe-bash/command-chunks/{chunk-MUTARE5I.js → chunk-LSKA4IR4.js} +6 -6
  132. package/dist/safe-bash/command-chunks/{chunk-N3ZH4YYH.js → chunk-LTWX23FS.js} +3 -3
  133. package/dist/safe-bash/command-chunks/{chunk-JA36YOZI.js → chunk-LUJUYUOG.js} +1 -1
  134. package/dist/safe-bash/command-chunks/{chunk-4X2MPZXW.js → chunk-M42GCI5F.js} +2 -2
  135. package/dist/safe-bash/command-chunks/{chunk-AYQPJQJR.js → chunk-M5BFAMXD.js} +6 -6
  136. package/dist/safe-bash/command-chunks/{chunk-OFDJJRAD.js → chunk-M7DZ7COK.js} +9 -9
  137. package/dist/safe-bash/command-chunks/{chunk-E64ZI2YB.js → chunk-MMSKDYK6.js} +224 -115
  138. package/dist/safe-bash/command-chunks/{chunk-NKK76B4V.js → chunk-MN7EEK6Y.js} +8 -8
  139. package/dist/safe-bash/command-chunks/{chunk-OBIXFO25.js → chunk-MOJQT6RW.js} +8 -8
  140. package/dist/safe-bash/command-chunks/{chunk-HOKPYTHQ.js → chunk-MPRUGL4W.js} +2 -2
  141. package/dist/safe-bash/command-chunks/{chunk-CORUUCS2.js → chunk-MRBX4KEP.js} +3 -3
  142. package/dist/safe-bash/command-chunks/chunk-MTWFSBNG.js +137 -0
  143. package/dist/safe-bash/command-chunks/{chunk-RRAQII52.js → chunk-MURNTGDL.js} +5 -5
  144. package/dist/safe-bash/command-chunks/{chunk-KDBU5Q2N.js → chunk-MWVELMXZ.js} +6 -6
  145. package/dist/safe-bash/command-chunks/{chunk-PRO7JOIH.js → chunk-N3MAYM6Y.js} +8 -8
  146. package/dist/safe-bash/command-chunks/{chunk-E22EAYJN.js → chunk-NFWLZDMY.js} +177 -34
  147. package/dist/safe-bash/command-chunks/{chunk-GAROGIVU.js → chunk-NP2QXF2X.js} +1 -1
  148. package/dist/safe-bash/command-chunks/{chunk-SNA2LVBX.js → chunk-NPVOYY2A.js} +1 -1
  149. package/dist/safe-bash/command-chunks/{chunk-ENMJHB2C.js → chunk-NTXRKJPZ.js} +3 -3
  150. package/dist/safe-bash/command-chunks/{chunk-3K5CVXUV.js → chunk-NZF56C25.js} +10 -10
  151. package/dist/safe-bash/command-chunks/{chunk-5MNQTHED.js → chunk-OA4MEWTN.js} +4 -4
  152. package/dist/safe-bash/command-chunks/{chunk-SWIF6BBY.js → chunk-OL75SBZL.js} +5 -5
  153. package/dist/safe-bash/command-chunks/{chunk-LT2YCGC5.js → chunk-OVQSILY3.js} +5 -5
  154. package/dist/safe-bash/command-chunks/{chunk-WDVPHDBH.js → chunk-P57V45F2.js} +2 -2
  155. package/dist/safe-bash/command-chunks/{chunk-OWCBX5M2.js → chunk-PAY4ULWY.js} +1 -1
  156. package/dist/safe-bash/command-chunks/{chunk-CHZE6FNT.js → chunk-PFUZPAXQ.js} +2 -2
  157. package/dist/safe-bash/command-chunks/{chunk-NLCUQD7Y.js → chunk-PX6E5MHY.js} +9 -9
  158. package/dist/safe-bash/command-chunks/{chunk-POGVOCOB.js → chunk-QCN7MRRU.js} +8 -8
  159. package/dist/safe-bash/command-chunks/{chunk-ZZERSKAR.js → chunk-QLE6JUR7.js} +5 -5
  160. package/dist/safe-bash/command-chunks/{chunk-LZY46GYY.js → chunk-QMWBKR4C.js} +5 -5
  161. package/dist/safe-bash/command-chunks/{chunk-BIJW6QWB.js → chunk-QNLX3CZH.js} +13 -13
  162. package/dist/safe-bash/command-chunks/{chunk-MDFNUNK5.js → chunk-QWX5IERU.js} +6 -6
  163. package/dist/safe-bash/command-chunks/{chunk-WOL3LBXE.js → chunk-R2N3E267.js} +1 -1
  164. package/dist/safe-bash/command-chunks/{chunk-ZNCPIZCN.js → chunk-R6X63VAO.js} +1 -1
  165. package/dist/safe-bash/command-chunks/{chunk-FGARVKAX.js → chunk-RNIFPFGC.js} +13 -11
  166. package/dist/safe-bash/command-chunks/{chunk-OIHQXURE.js → chunk-ROE6KD4C.js} +1 -1
  167. package/dist/safe-bash/command-chunks/{chunk-BKK4MS3V.js → chunk-RR6XG2I6.js} +1 -1
  168. package/dist/safe-bash/command-chunks/{chunk-ZHHALBM7.js → chunk-RYOHOS2I.js} +4 -4
  169. package/dist/safe-bash/command-chunks/{chunk-U42WHQRH.js → chunk-TTTNFKT6.js} +5 -5
  170. package/dist/safe-bash/command-chunks/{chunk-EWC56JNI.js → chunk-TTVJJZOM.js} +5 -5
  171. package/dist/safe-bash/command-chunks/{chunk-TY7JXEWI.js → chunk-UBX5I5HY.js} +11 -11
  172. package/dist/safe-bash/command-chunks/{chunk-QOKFSYD5.js → chunk-UE34SQET.js} +9 -9
  173. package/dist/safe-bash/command-chunks/{chunk-DXOXUKQB.js → chunk-UH4CQIU3.js} +4 -4
  174. package/dist/safe-bash/command-chunks/{chunk-VNNNVT4C.js → chunk-UZZ2WJQV.js} +4 -4
  175. package/dist/safe-bash/command-chunks/{chunk-QNX5LZBK.js → chunk-V6NZVM7C.js} +7 -7
  176. package/dist/safe-bash/command-chunks/{chunk-KLAC2MIZ.js → chunk-VEZULAIA.js} +6 -6
  177. package/dist/safe-bash/command-chunks/{chunk-OCV5ZU35.js → chunk-VSTAHYCV.js} +3 -3
  178. package/dist/safe-bash/command-chunks/{chunk-UFLMOU3B.js → chunk-VUJCVXD4.js} +1 -1
  179. package/dist/safe-bash/command-chunks/{chunk-5V7WIQ2D.js → chunk-VW67MA53.js} +3 -3
  180. package/dist/safe-bash/command-chunks/{chunk-2IMIKROX.js → chunk-WI5NEHPD.js} +2 -2
  181. package/dist/safe-bash/command-chunks/{chunk-SBXS4S6Y.js → chunk-WJSU2UVG.js} +2 -2
  182. package/dist/safe-bash/command-chunks/{chunk-VVWHFNHD.js → chunk-WPEIOUJN.js} +415 -25
  183. package/dist/safe-bash/command-chunks/{chunk-YKODRSGT.js → chunk-WRCYZJNO.js} +1 -1
  184. package/dist/safe-bash/command-chunks/{chunk-TID5TSQW.js → chunk-WRJV7OVO.js} +1 -1
  185. package/dist/safe-bash/command-chunks/{chunk-T4SEQU66.js → chunk-X4TWJNW7.js} +3 -3
  186. package/dist/safe-bash/command-chunks/{chunk-CKA7ZROU.js → chunk-X6KFCAWZ.js} +7 -7
  187. package/dist/safe-bash/command-chunks/{chunk-ROQ3VNVX.js → chunk-X6KO7D6R.js} +8 -8
  188. package/dist/safe-bash/command-chunks/{chunk-S5ER73EA.js → chunk-XB5ZZHFD.js} +3 -3
  189. package/dist/safe-bash/command-chunks/{chunk-FHQOFEQK.js → chunk-XLFOLLUZ.js} +8 -8
  190. package/dist/safe-bash/command-chunks/{chunk-UJYXSLM6.js → chunk-XLPEPCQC.js} +2 -2
  191. package/dist/safe-bash/command-chunks/{chunk-UT5X6QRU.js → chunk-XQFEP43Y.js} +5 -5
  192. package/dist/safe-bash/command-chunks/chunk-Y7XL6CWB.js +771 -0
  193. package/dist/safe-bash/command-chunks/{chunk-RVWIEXR7.js → chunk-YKEMSPJZ.js} +4 -4
  194. package/dist/safe-bash/command-chunks/{chunk-ERWIJYCS.js → chunk-YN3OEJAZ.js} +7 -7
  195. package/dist/safe-bash/command-chunks/{chunk-6YF2QADH.js → chunk-YOYK2I4N.js} +2 -2
  196. package/dist/safe-bash/command-chunks/{chunk-26JE5JEB.js → chunk-YS5ZKMRJ.js} +4 -4
  197. package/dist/safe-bash/command-chunks/{chunk-LMLBQSAM.js → chunk-YW7WU7W2.js} +5 -5
  198. package/dist/safe-bash/command-chunks/{chunk-YXR4JE4U.js → chunk-Z33YS3DW.js} +3 -3
  199. package/dist/safe-bash/command-chunks/{chunk-T2FRXSQT.js → chunk-ZBXUAM34.js} +2 -2
  200. package/dist/safe-bash/command-chunks/{chunk-VVV45NLY.js → chunk-ZJUU5IAS.js} +1 -1
  201. package/dist/safe-bash/command-chunks/{chunk-7OCTMVYJ.js → chunk-ZNABMTV3.js} +1 -1
  202. package/dist/safe-bash/command-chunks/{chunk-6JGICYHP.js → chunk-ZSF2T5D4.js} +1 -1
  203. package/dist/safe-bash/command-chunks/{command-engine-2QXVRRH3.js → command-engine-PFYHL7GS.js} +10 -4
  204. package/dist/safe-bash/command-chunks/{engine-T4GP6QOK-ECFKMR5V.js → engine-5AVSKFBI-D7Q5VPUN.js} +1 -1
  205. package/dist/safe-bash/command-chunks/model-store-IIWQHSEZ.js +54 -0
  206. package/dist/safe-bash-command-awk/awk-inspection.js +2 -2
  207. package/dist/safe-bash-command-awk/awk.js +5 -5
  208. package/dist/safe-bash-command-awk/index.js +5 -5
  209. package/dist/safe-bash-command-cp/index.js +4 -4
  210. package/dist/safe-bash-command-diff/diff.js +2 -2
  211. package/dist/safe-bash-command-diff/index.js +2 -2
  212. package/dist/safe-bash-command-ffmpeg/index.js +1 -1
  213. package/dist/safe-bash-command-ffprobe/index.js +2 -2
  214. package/dist/safe-bash-command-ffprobe/media.js +2 -2
  215. package/dist/safe-bash-command-node/commands/node/browser.js +6 -6
  216. package/dist/safe-bash-command-node/commands/node/default-runtime.js +6 -6
  217. package/dist/safe-bash-command-node/commands/node/filesystem.js +2 -2
  218. package/dist/safe-bash-command-node/commands/node/safejs.js +6 -6
  219. package/dist/safe-bash-command-node/commands/node/timers.js +2 -2
  220. package/dist/safe-bash-command-patch/index.js +3 -3
  221. package/dist/safe-bash-command-patch/patch-formats.js +2 -2
  222. package/dist/safe-bash-command-patch/patch.js +3 -3
  223. package/dist/safe-bash-command-patch/unified.js +1 -1
  224. package/dist/safe-bash-command-pdftoppm/index.js +89 -124
  225. package/dist/safe-bash-command-pdftotext/index.d.ts +1 -1
  226. package/dist/safe-bash-command-pdftotext/index.js +538 -379
  227. package/dist/safe-bash-command-playwright-cli/index.js +19 -19
  228. package/dist/safe-bash-command-playwright-cli/playwright/abilities.js +6 -6
  229. package/dist/safe-bash-command-playwright-cli/playwright/adapter.js +3 -3
  230. package/dist/safe-bash-command-playwright-cli/playwright/controller.js +13 -13
  231. package/dist/safe-bash-command-playwright-cli/playwright/index.js +19 -19
  232. package/dist/safe-bash-command-playwright-cli/playwright/native-storage-replacement.js +2 -2
  233. package/dist/safe-bash-command-playwright-cli/playwright/open-options.js +2 -2
  234. package/dist/safe-bash-command-playwright-cli/playwright/profile.js +5 -5
  235. package/dist/safe-bash-command-playwright-cli/playwright/standard-capabilities.js +4 -4
  236. package/dist/safe-bash-command-playwright-cli/playwright/storage-capabilities.js +3 -3
  237. package/dist/safe-bash-command-pptx/engine.js +1 -1
  238. package/dist/safe-bash-command-python/executor.js +10 -10
  239. package/dist/safe-bash-command-python/index.js +10 -10
  240. package/dist/safe-bash-command-python/jspi.js +2 -2
  241. package/dist/safe-bash-command-safejs/index.js +2 -2
  242. package/dist/safe-bash-command-safejs/runtime.js +2 -2
  243. package/dist/safe-bash-command-ssconvert/index.js +13 -13
  244. package/dist/safe-bash-command-unzip/index.js +4 -4
  245. package/dist/safe-bash-docx-engine/ancillary-resources.js +10 -10
  246. package/dist/safe-bash-docx-engine/batch-operations.js +67 -67
  247. package/dist/safe-bash-docx-engine/batch-result-schema.js +79 -79
  248. package/dist/safe-bash-docx-engine/batch.js +78 -78
  249. package/dist/safe-bash-docx-engine/bookmarks.js +18 -18
  250. package/dist/safe-bash-docx-engine/charts.js +11 -11
  251. package/dist/safe-bash-docx-engine/command-option-rules.js +6 -6
  252. package/dist/safe-bash-docx-engine/command-properties.js +3 -3
  253. package/dist/safe-bash-docx-engine/comments.js +26 -26
  254. package/dist/safe-bash-docx-engine/control-bindings.js +21 -21
  255. package/dist/safe-bash-docx-engine/control-repeat.js +21 -21
  256. package/dist/safe-bash-docx-engine/controls.js +19 -19
  257. package/dist/safe-bash-docx-engine/create.js +11 -11
  258. package/dist/safe-bash-docx-engine/diagrams.js +11 -11
  259. package/dist/safe-bash-docx-engine/diff.js +13 -13
  260. package/dist/safe-bash-docx-engine/document-properties.js +16 -16
  261. package/dist/safe-bash-docx-engine/equations.js +17 -17
  262. package/dist/safe-bash-docx-engine/extract.js +14 -14
  263. package/dist/safe-bash-docx-engine/fields.js +23 -23
  264. package/dist/safe-bash-docx-engine/font-inventory.js +18 -18
  265. package/dist/safe-bash-docx-engine/font-resources.js +6 -6
  266. package/dist/safe-bash-docx-engine/image-batch-operations.js +14 -14
  267. package/dist/safe-bash-docx-engine/image-insertion.js +21 -21
  268. package/dist/safe-bash-docx-engine/image-layout.js +19 -19
  269. package/dist/safe-bash-docx-engine/image-replacement.js +22 -22
  270. package/dist/safe-bash-docx-engine/images.js +19 -19
  271. package/dist/safe-bash-docx-engine/index.js +111 -111
  272. package/dist/safe-bash-docx-engine/inspection.js +20 -20
  273. package/dist/safe-bash-docx-engine/invocation.js +9 -9
  274. package/dist/safe-bash-docx-engine/io.js +9 -9
  275. package/dist/safe-bash-docx-engine/links.js +21 -21
  276. package/dist/safe-bash-docx-engine/lists.js +20 -20
  277. package/dist/safe-bash-docx-engine/locations.js +15 -15
  278. package/dist/safe-bash-docx-engine/notes.js +22 -22
  279. package/dist/safe-bash-docx-engine/objects.js +19 -19
  280. package/dist/safe-bash-docx-engine/operation-json-schema.js +3 -3
  281. package/dist/safe-bash-docx-engine/operation-schema.js +2 -2
  282. package/dist/safe-bash-docx-engine/pack.js +14 -14
  283. package/dist/safe-bash-docx-engine/package-view-batch-operations.js +22 -22
  284. package/dist/safe-bash-docx-engine/pandoc-adapter.js +29 -29
  285. package/dist/safe-bash-docx-engine/paragraph-edit.js +25 -25
  286. package/dist/safe-bash-docx-engine/part-provider.js +3 -3
  287. package/dist/safe-bash-docx-engine/property-values.js +3 -3
  288. package/dist/safe-bash-docx-engine/publication.js +9 -9
  289. package/dist/safe-bash-docx-engine/removal.js +21 -21
  290. package/dist/safe-bash-docx-engine/revision-decisions.js +22 -22
  291. package/dist/safe-bash-docx-engine/revision-edit.js +20 -20
  292. package/dist/safe-bash-docx-engine/revisions.js +18 -18
  293. package/dist/safe-bash-docx-engine/run-format.js +20 -20
  294. package/dist/safe-bash-docx-engine/sanitize.js +34 -34
  295. package/dist/safe-bash-docx-engine/sections.js +19 -19
  296. package/dist/safe-bash-docx-engine/settings.js +11 -11
  297. package/dist/safe-bash-docx-engine/shape-edit.js +21 -21
  298. package/dist/safe-bash-docx-engine/signatures.js +15 -15
  299. package/dist/safe-bash-docx-engine/stories.js +22 -22
  300. package/dist/safe-bash-docx-engine/structure-model-batch-operations.js +38 -38
  301. package/dist/safe-bash-docx-engine/style-model-batch-operations.js +27 -27
  302. package/dist/safe-bash-docx-engine/style-model-result-schema.js +44 -44
  303. package/dist/safe-bash-docx-engine/styles.js +18 -18
  304. package/dist/safe-bash-docx-engine/table-edit.js +27 -27
  305. package/dist/safe-bash-docx-engine/table-read.js +16 -16
  306. package/dist/safe-bash-docx-engine/template.js +22 -22
  307. package/dist/safe-bash-docx-engine/text-replace.js +20 -20
  308. package/dist/safe-bash-docx-engine/text-resource-read.js +16 -16
  309. package/dist/safe-bash-docx-engine/text.js +16 -16
  310. package/dist/safe-bash-docx-engine/validation.js +7 -7
  311. package/dist/safe-bash-docx-engine/xml-parts.js +22 -22
  312. package/dist/safe-bash-network-engine/index.js +4 -4
  313. package/dist/safe-bash-network-engine/transfer.js +12 -12
  314. package/dist/safe-bash-presentation-engine/accessibility.js +15 -15
  315. package/dist/safe-bash-presentation-engine/animation-editing.js +5 -5
  316. package/dist/safe-bash-presentation-engine/animations.js +5 -5
  317. package/dist/safe-bash-presentation-engine/backgrounds.js +6 -6
  318. package/dist/safe-bash-presentation-engine/chart-editing.js +18 -18
  319. package/dist/safe-bash-presentation-engine/chart-object-operations.js +12 -12
  320. package/dist/safe-bash-presentation-engine/charts.js +15 -15
  321. package/dist/safe-bash-presentation-engine/command-placeholder.js +39 -38
  322. package/dist/safe-bash-presentation-engine/comments.js +6 -6
  323. package/dist/safe-bash-presentation-engine/connector-operations.js +16 -16
  324. package/dist/safe-bash-presentation-engine/connectors.js +13 -13
  325. package/dist/safe-bash-presentation-engine/diff.js +21 -20
  326. package/dist/safe-bash-presentation-engine/drawing-format.js +7 -7
  327. package/dist/safe-bash-presentation-engine/drawing-operations.js +15 -15
  328. package/dist/safe-bash-presentation-engine/drawing-schema.js +8 -8
  329. package/dist/safe-bash-presentation-engine/equations.js +6 -6
  330. package/dist/safe-bash-presentation-engine/fields.js +6 -6
  331. package/dist/safe-bash-presentation-engine/image-extraction.js +7 -7
  332. package/dist/safe-bash-presentation-engine/image-formatting.js +16 -16
  333. package/dist/safe-bash-presentation-engine/image-insertion.js +6 -6
  334. package/dist/safe-bash-presentation-engine/image-replacement.js +7 -7
  335. package/dist/safe-bash-presentation-engine/images.js +6 -6
  336. package/dist/safe-bash-presentation-engine/index.js +96 -95
  337. package/dist/safe-bash-presentation-engine/layouts.js +5 -5
  338. package/dist/safe-bash-presentation-engine/links.js +5 -5
  339. package/dist/safe-bash-presentation-engine/masters.js +4 -4
  340. package/dist/safe-bash-presentation-engine/media-editing.js +10 -10
  341. package/dist/safe-bash-presentation-engine/media-extraction.js +6 -6
  342. package/dist/safe-bash-presentation-engine/media.js +5 -5
  343. package/dist/safe-bash-presentation-engine/memberships.d.ts +1 -0
  344. package/dist/safe-bash-presentation-engine/memberships.js +12 -6
  345. package/dist/safe-bash-presentation-engine/notes.js +6 -6
  346. package/dist/safe-bash-presentation-engine/ole-insertion.js +6 -6
  347. package/dist/safe-bash-presentation-engine/opaque-objects.js +2 -2
  348. package/dist/safe-bash-presentation-engine/package-tools.js +6 -6
  349. package/dist/safe-bash-presentation-engine/presentation-model.js +38 -37
  350. package/dist/safe-bash-presentation-engine/presentation-settings.d.ts +1 -0
  351. package/dist/safe-bash-presentation-engine/presentation-settings.js +12 -5
  352. package/dist/safe-bash-presentation-engine/properties.js +7 -6
  353. package/dist/safe-bash-presentation-engine/retained-inspection.js +3 -3
  354. package/dist/safe-bash-presentation-engine/retained-memberships.d.ts +25 -0
  355. package/dist/safe-bash-presentation-engine/retained-presentation-settings.d.ts +25 -0
  356. package/dist/safe-bash-presentation-engine/retained-text.d.ts +24 -4
  357. package/dist/safe-bash-presentation-engine/retained-text.js +17 -15
  358. package/dist/safe-bash-presentation-engine/sanitize.js +8 -7
  359. package/dist/safe-bash-presentation-engine/selectors.js +2 -2
  360. package/dist/safe-bash-presentation-engine/shape-groups.js +15 -15
  361. package/dist/safe-bash-presentation-engine/shape-operations.js +14 -14
  362. package/dist/safe-bash-presentation-engine/shape-path-operations.js +16 -16
  363. package/dist/safe-bash-presentation-engine/shape-paths.js +5 -5
  364. package/dist/safe-bash-presentation-engine/shape-selection.js +15 -15
  365. package/dist/safe-bash-presentation-engine/shape-transforms.js +5 -5
  366. package/dist/safe-bash-presentation-engine/shapes.js +11 -11
  367. package/dist/safe-bash-presentation-engine/slide-copy.js +7 -5
  368. package/dist/safe-bash-presentation-engine/slide-import.js +6 -6
  369. package/dist/safe-bash-presentation-engine/slide-merge-split.js +8 -8
  370. package/dist/safe-bash-presentation-engine/slide-model.js +24 -24
  371. package/dist/safe-bash-presentation-engine/slide-removal.js +7 -7
  372. package/dist/safe-bash-presentation-engine/slide-transfer-budget.js +2 -2
  373. package/dist/safe-bash-presentation-engine/slides.js +5 -5
  374. package/dist/safe-bash-presentation-engine/table-operations.js +17 -17
  375. package/dist/safe-bash-presentation-engine/table-spans.js +16 -16
  376. package/dist/safe-bash-presentation-engine/tables.js +15 -15
  377. package/dist/safe-bash-presentation-engine/tags.js +6 -6
  378. package/dist/safe-bash-presentation-engine/template-bindings.js +16 -16
  379. package/dist/safe-bash-presentation-engine/template-repeat.js +24 -22
  380. package/dist/safe-bash-presentation-engine/text-fitting.js +11 -11
  381. package/dist/safe-bash-presentation-engine/text-frames.js +11 -11
  382. package/dist/safe-bash-presentation-engine/text-paragraphs.js +11 -11
  383. package/dist/safe-bash-presentation-engine/text-reading.js +3 -3
  384. package/dist/safe-bash-presentation-engine/text-replacement.js +6 -6
  385. package/dist/safe-bash-presentation-engine/text-runs.js +8 -8
  386. package/dist/safe-bash-presentation-engine/themes.js +5 -5
  387. package/dist/safe-bash-presentation-engine/transitions.js +5 -5
  388. package/dist/safe-bash-presentation-engine/validation.js +2 -2
  389. package/dist/safe-bash-presentation-engine/xml-parts.js +5 -5
  390. package/dist/safe-bash-xml-engine/document.js +2 -2
  391. package/dist/safe-bash-xml-engine/index.js +2 -2
  392. package/dist/safe-bash-xml-engine/recovery.d.ts +6 -2
  393. package/dist/safe-bash-xml-engine/stored-document.d.ts +2 -1
  394. package/dist/safe-bash-xml-engine/stored-document.js +1 -1
  395. package/dist/safe-bash-xml-engine/{stored-namespaces.d.ts → stored-map.d.ts} +6 -6
  396. package/dist/safe-bash-zip-engine/index.js +3 -3
  397. package/dist/safe-bash-zip-engine/zip/repair.js +3 -3
  398. package/dist/safe-bash-zip-engine/zip/sfx.js +3 -3
  399. package/dist/safe-bash-zip-engine/zip-format.js +3 -3
  400. package/dist/spreadsheet-engine/formatting/cell-text.js +1 -1
  401. package/dist/spreadsheet-engine/{rendering/print → formatting}/general-number.js +3 -3
  402. package/dist/spreadsheet-engine/formulas/functions/python-printf.js +9 -7
  403. package/dist/spreadsheet-engine/solver/program.js +3 -2
  404. package/dist/spreadsheet-engine/solver/run.js +8 -2
  405. package/dist/spreadsheet-engine/solver/sensitivity.d.ts +4 -2
  406. package/dist/spreadsheet-engine/solver/sensitivity.js +80 -42
  407. package/dist/spreadsheet-format-xls/biff-properties-merge.d.ts +2 -1
  408. package/dist/spreadsheet-format-xls/biff-properties-merge.js +35 -29
  409. package/dist/spreadsheet-format-xls/biff-properties-write.js +16 -7
  410. package/dist/spreadsheet-format-xls/biff-property-names.d.ts +3 -0
  411. package/dist/spreadsheet-format-xls/biff-property-names.js +44 -1
  412. package/dist/spreadsheet-format-xls/biff-property-observations.d.ts +33 -0
  413. package/dist/spreadsheet-format-xls/biff-property-observations.js +160 -0
  414. package/package.json +6 -4
  415. package/third-party/pdf-ast/THIRD_PARTY_NOTICES.md +15 -0
  416. package/third-party/pdf-ast/licenses/PYTHON-PSF.txt +254 -0
  417. package/third-party/pdf-ast/licenses/V8-BSD.txt +61 -0
  418. package/dist/safe-bash/command-chunks/biff-KLS4T7FP-UO3CXFFF.js +0 -5581
  419. package/dist/safe-bash/command-chunks/chunk-6EZWG56T.js +0 -455
  420. package/dist/safe-bash/command-chunks/model-store-I7YAWL5V.js +0 -54
  421. package/dist/safe-bash/command-chunks/{chunk-SRXARACJ.js → chunk-3TP4SSPS.js} +3 -3
  422. package/dist/safe-bash/command-chunks/{chunk-NCNHJRIY.js → chunk-3W3HLPCX.js} +3 -3
  423. package/dist/safe-bash/command-chunks/{chunk-P4OWVKMD.js → chunk-BQXKO3X7.js} +3 -3
  424. package/dist/safe-bash/command-chunks/{chunk-OCOJMKDP.js → chunk-CVMHDJ7J.js} +3 -3
  425. package/dist/safe-bash/command-chunks/{chunk-AV6N7DDA.js → chunk-DDYPQAXN.js} +3 -3
  426. package/dist/safe-bash/command-chunks/{chunk-FEKECRJP.js → chunk-EBTKM7KX.js} +3 -3
  427. package/dist/safe-bash/command-chunks/{chunk-WVD5WZXD.js → chunk-FPNUGKCX.js} +3 -3
  428. package/dist/safe-bash/command-chunks/{chunk-6W4RMBFH.js → chunk-N6VNHC3B.js} +3 -3
  429. package/dist/safe-bash/command-chunks/{chunk-M3OXQXCU.js → chunk-NBRXQUK7.js} +3 -3
  430. package/dist/safe-bash/command-chunks/{chunk-LECGQSQW.js → chunk-SF56V6QK.js} +3 -3
  431. package/dist/safe-bash/command-chunks/{chunk-2ANW3FXH.js → chunk-U33GIOUY.js} +3 -3
  432. package/dist/safe-bash/command-chunks/{chunk-5QXRIZSS.js → chunk-V3NKL42J.js} +3 -3
  433. package/dist/safe-bash/command-chunks/{chunk-OEKLEUUW.js → chunk-YZE7BKHC.js} +3 -3
  434. package/dist/safe-bash/command-chunks/{chunk-WXW665TV.js → chunk-ZSHXZ3XG.js} +6 -6
  435. package/dist/safe-bash/command-chunks/{dif-BXKPQOCO-4KB3RC6G.js → dif-BXKPQOCO-FVJYYGYB.js} +4 -4
  436. package/dist/safe-bash/command-chunks/{pln-DFS7VLVS-OVOBS4QX.js → pln-DFS7VLVS-JATX6FS7.js} +3 -3
  437. package/dist/safe-bash/command-chunks/{psion-YBI6JEQI-GY4S6ZLC.js → psion-YBI6JEQI-6OMC2PGC.js} +3 -3
  438. package/dist/safe-bash/command-chunks/{sylk-25D7TL2Y-RU6ANKGT.js → sylk-25D7TL2Y-NJKBZZTF.js} +4 -4
  439. /package/dist/spreadsheet-engine/{rendering/print → formatting}/general-number.d.ts +0 -0
@@ -1,3 +1,5 @@
1
+ import { BiffPropertyNames } from './biff-property-names.js';
2
+ import { BiffOriginalProperties } from './biff-property-observations.js';
1
3
  import { BiffMutablePropertyValues } from './biff-property-values.js';
2
4
  import { createBiffPropertyNameEncoder } from "./biff-property-name.js";
3
5
  import { readBiffPropertyText } from "./biff-property-text.js";
@@ -8,10 +10,9 @@ import { Binary, invalidBiff } from "./biff-binary.js";
8
10
  import { biffPropertyFields, biffPropertyFormats, readBiffProperties } from "./biff-properties.js";
9
11
  import { propertyRange, readPropertySectionRanges, withPropertyValueRanges } from "./biff-property-range.js";
10
12
  /** Rebuild offsets around original opaque spans. Never transcode their codepage. */
11
- export async function mergeBiffProperties(book, streams, handled, context, charge, allocate, staged) {
13
+ export async function mergeBiffProperties(book, streams, handled, context, charge, allocate, staged, preserved) {
12
14
  const canonical = (name) => ["\u0005SummaryInformation", "\u0005DocumentSummaryInformation"].find(target => target.toUpperCase() === name.toUpperCase());
13
15
  const snapshots = new Map(), duplicates = new Set();
14
- const preserved = new Set();
15
16
  let nodes = 0, textBytes = 0;
16
17
  const admit = (amount) => {
17
18
  charge(amount);
@@ -85,7 +86,7 @@ export async function mergeBiffProperties(book, streams, handled, context, charg
85
86
  for (const name of duplicates)
86
87
  snapshots.delete(name);
87
88
  if (!snapshots.size)
88
- return preserved;
89
+ return;
89
90
  const parse = async (input) => {
90
91
  const file = propertyRange(input, context), sections = [];
91
92
  for await (const section of readPropertySectionRanges(file, admit, charge, context)) {
@@ -117,12 +118,22 @@ export async function mergeBiffProperties(book, streams, handled, context, charg
117
118
  }
118
119
  return new Binary(bytes);
119
120
  };
120
- const original = new Map(), pending = new Map();
121
- const identity = (property) => `${property.stream}:${property.section}:${property.id}`;
121
+ const same = (a, b) => {
122
+ if (!Array.isArray(a) || !Array.isArray(b))
123
+ return Object.is(a, b);
124
+ charge(a.length + b.length);
125
+ return a.length === b.length && a.every((value, i) => Object.is(value, b[i]));
126
+ };
127
+ const original = new BiffOriginalProperties(context, charge), pending = new Map();
128
+ temporarySources.push(original);
122
129
  const readContext = { ...context, limits: { ...context.limits, inputBytes: context.limits.outputBytes } };
123
130
  // Reuse scalar decoding, but do not create another retained hexadecimal copy.
124
- await readBiffProperties(new Map([...snapshots].map(([name, value]) => [name, value.bytes])), readContext, accountText, charge, undefined, property => { admit(1); original.set(identity(property), property); }, false);
125
- await readBiffProperties(streams, readContext, accountText, charge, undefined, property => { admit(1); pending.set(property.key, property); }, false);
131
+ await readBiffProperties(new Map([...snapshots].map(([name, value]) => [name, value.bytes])), readContext, accountText, charge, undefined, async (property) => {
132
+ admit(1);
133
+ const { stream, section, id, key } = property;
134
+ await original.add({ stream, section, id, key, unchanged: same(property.value, book.properties?.[key]) });
135
+ }, false);
136
+ await readBiffProperties(streams, readContext, accountText, charge, undefined, property => { admit(1); const { stream, section, id, key } = property; pending.set(key, { stream, section, id, key }); }, false);
126
137
  const chunks = async function* (source) {
127
138
  for (let at = 0; at < source.size;) {
128
139
  const bytes = await source.read(at, source.size - at);
@@ -232,48 +243,43 @@ export async function mergeBiffProperties(book, streams, handled, context, charg
232
243
  view.setUint16(8 + i * 2, value.charCodeAt(i), true);
233
244
  return propertyRange(bytes, context);
234
245
  };
235
- const same = (a, b) => {
236
- if (!Array.isArray(a) || !Array.isArray(b))
237
- return Object.is(a, b);
238
- charge(a.length + b.length);
239
- return a.length === b.length && a.every((value, i) => Object.is(value, b[i]));
240
- };
241
246
  for (const [name, snapshot] of snapshots) {
242
- const seen = new Set();
243
- function* modeled() {
247
+ const seen = new BiffPropertyNames(context, charge);
248
+ temporarySources.push(seen);
249
+ async function* modeled() {
244
250
  if (snapshot.modeled) {
245
251
  yield* snapshot.modeled;
246
252
  return;
247
253
  }
248
254
  // SummaryInformation is read first. A legacy document-only snapshot lacks
249
255
  // that earlier stream's ownership decisions: infer only unchanged values.
250
- for (const property of original.values()) {
256
+ for await (const property of original.values()) {
251
257
  charge(1);
252
258
  if (property.stream !== name)
253
259
  continue;
254
260
  if (name === "\u0005SummaryInformation" || snapshots.has("\u0005SummaryInformation") ||
255
- Object.hasOwn(book.properties ?? {}, property.key) && same(property.value, book.properties?.[property.key])) {
261
+ Object.hasOwn(book.properties ?? {}, property.key) && property.unchanged) {
256
262
  admit(1);
257
263
  yield [property.section, property.id, property.key];
258
264
  }
259
265
  }
260
266
  }
261
- for (const entry of modeled()) {
267
+ for await (const entry of modeled()) {
262
268
  admit(1);
263
269
  if (!Array.isArray(entry) || entry.length !== 3 || typeof entry[0] !== "number" || typeof entry[1] !== "number" || typeof entry[2] !== "string")
264
270
  invalidBiff("invalid retained property identity");
265
271
  const [offset, id, key] = entry;
266
- const property = original.get(identity({ stream: name, section: offset, id }));
267
- if (!property || property.key !== key || seen.has(key))
272
+ const property = await original.get(name, offset, id);
273
+ if (!property || property.key !== key || await seen.has(key))
268
274
  invalidBiff("invalid retained property identity");
269
- seen.add(key);
275
+ await seen.add(key);
270
276
  charge(old.get(name).length);
271
277
  const section = old.get(name).find(section => section.offset === offset);
272
- const value = book.properties?.[key], replacement = pending.get(key);
278
+ const replacement = pending.get(key);
273
279
  if (!Object.hasOwn(book.properties ?? {}, key))
274
280
  await remove(section, id);
275
- else if (same(property.value, value)) {
276
- preserved.add(key);
281
+ else if (property.unchanged) {
282
+ await preserved?.add(key);
277
283
  if (replacement)
278
284
  await take(replacement);
279
285
  }
@@ -451,13 +457,14 @@ export async function mergeBiffProperties(book, streams, handled, context, charg
451
457
  if (snapshot)
452
458
  handled.add(snapshot.record);
453
459
  }
454
- const exposed = new Set();
455
- await readBiffProperties(staged?.sources ?? streams, readContext, accountText, charge, undefined, property => {
460
+ const exposed = new BiffPropertyNames(context, charge);
461
+ temporarySources.push(exposed);
462
+ await readBiffProperties(staged?.sources ?? streams, readContext, accountText, charge, undefined, async (property) => {
456
463
  admit(1);
457
464
  if (!Object.hasOwn(book.properties ?? {}, property.key))
458
- exposed.add(property.key);
465
+ await exposed.add(property.key);
459
466
  }, false);
460
- for (const key of exposed)
467
+ for await (const key of exposed.values())
461
468
  await warn(key, "opaque property exposes a field absent from the model");
462
469
  }
463
470
  catch (error) {
@@ -470,5 +477,4 @@ export async function mergeBiffProperties(book, streams, handled, context, charg
470
477
  throw error;
471
478
  }
472
479
  await closeTemporary();
473
- return preserved;
474
480
  }
@@ -1,3 +1,4 @@
1
+ import { BiffPropertyNames } from "./biff-property-names.js";
1
2
  import { propertyChunks, stagePropertyBytes } from "./biff-property-bytes.js";
2
3
  import { SsconvertError } from "../spreadsheet-engine/contracts.js";
3
4
  import { biffPropertyFields, biffPropertyFormats, isBiffKeywordSpace } from "./biff-properties.js";
@@ -6,7 +7,7 @@ const fieldByName = new Map([...biffPropertyFields].flatMap(([guid, fields]) =>
6
7
  const maximumFileTime = 0xffffffffffffffffn;
7
8
  /** Only discard a generic loss report when every XML field has been handled.
8
9
  * Keep the original record on the caller's workbook, including unknown content. */
9
- function handledPropertyRecord(record, keys, charge) {
10
+ function handledPropertyRecord(record, properties, charge) {
10
11
  if (record.disposition !== "retained" || record.source !== "Gnumeric_XmlIO:sax" || record.kind !== "document-meta")
11
12
  return false;
12
13
  const office = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", meta = "urn:oasis:names:tc:opendocument:xmlns:meta:1.0";
@@ -85,7 +86,7 @@ function handledPropertyRecord(record, keys, charge) {
85
86
  return false;
86
87
  }
87
88
  const keyword = field.namespace === meta && field.name === "keyword";
88
- if (key === undefined || !keys.has(key) || seen.has(key) && !(keyword && seen.get(key)))
89
+ if (key === undefined || !Object.prototype.propertyIsEnumerable.call(properties ?? {}, key) || seen.has(key) && !(keyword && seen.get(key)))
89
90
  return false;
90
91
  seen.set(key, keyword);
91
92
  }
@@ -141,7 +142,6 @@ function durationTicks(text) {
141
142
  }
142
143
  export async function writeBiffProperties(book, context, staged = false) {
143
144
  const planned = new Map(), sections = new Map();
144
- const handledKeys = new Set();
145
145
  const unsupportedKeys = [];
146
146
  let work = 0, textBytes = 0, nodes = 0, payloadBytes = 0;
147
147
  const charge = (amount) => {
@@ -275,7 +275,6 @@ export async function writeBiffProperties(book, context, staged = false) {
275
275
  if (++nodes > (context.limits.workbookNodes ?? context.limits.outputBytes))
276
276
  throw new SsconvertError("resource-limit", "ssconvert BIFF property node limit exceeded");
277
277
  const field = fieldByName.get(key);
278
- handledKeys.add(key);
279
278
  let source = book.properties[key];
280
279
  if (key === "dc:keywords" && Array.isArray(source)) {
281
280
  charge(source.length);
@@ -318,7 +317,7 @@ export async function writeBiffProperties(book, context, staged = false) {
318
317
  const handledMetadata = new Set();
319
318
  for (const record of book.unsupportedRecords ?? []) {
320
319
  charge(1);
321
- if (handledPropertyRecord(record, handledKeys, charge))
320
+ if (handledPropertyRecord(record, book.properties, charge))
322
321
  handledMetadata.add(record);
323
322
  }
324
323
  if (names.length) {
@@ -399,6 +398,7 @@ export async function writeBiffProperties(book, context, staged = false) {
399
398
  const snapshots = (book.unsupportedRecords ?? []).some(record => record.source === "biff" && record.kind === "ole-properties" && record.disposition === "retained");
400
399
  const streams = new Map(), inputs = [];
401
400
  const sources = new Map();
401
+ let preserved;
402
402
  const close = async () => {
403
403
  const errors = [];
404
404
  for (const source of [...sources.values(), ...inputs])
@@ -408,6 +408,12 @@ export async function writeBiffProperties(book, context, staged = false) {
408
408
  catch (error) {
409
409
  errors.push(error);
410
410
  }
411
+ try {
412
+ await preserved?.close();
413
+ }
414
+ catch (error) {
415
+ errors.push(error);
416
+ }
411
417
  if (errors.length === 1)
412
418
  throw errors[0];
413
419
  if (errors.length)
@@ -431,10 +437,13 @@ export async function writeBiffProperties(book, context, staged = false) {
431
437
  streams.set(name, bytes);
432
438
  }
433
439
  }
434
- const preserved = await mergeBiffProperties(book, streams, handledMetadata, context, charge, allocate, staged ? { sources, reserve } : undefined);
440
+ if (snapshots && unsupportedKeys.length)
441
+ preserved = new BiffPropertyNames(context, charge);
442
+ await mergeBiffProperties(book, streams, handledMetadata, context, charge, allocate, staged ? { sources, reserve } : undefined, preserved);
435
443
  for (const key of unsupportedKeys)
436
- if (!preserved.has(key))
444
+ if (!await preserved?.has(key))
437
445
  await context.diagnostic?.({ code: "biff-loss-warning", severity: "warning", message: `Unsupported Excel BIFF document property: ${key}` });
446
+ await preserved?.close();
438
447
  if (!staged)
439
448
  return { streams, handledMetadata, async close() { } };
440
449
  for (const [name, value] of snapshots ? streams : planned)
@@ -8,6 +8,8 @@ export declare class BiffPropertyNames {
8
8
  private readonly index;
9
9
  private readonly fallback;
10
10
  private initialized;
11
+ private first;
12
+ private last;
11
13
  private pending;
12
14
  private closed;
13
15
  private closing;
@@ -20,5 +22,6 @@ export declare class BiffPropertyNames {
20
22
  private contains;
21
23
  has(name: string): Promise<boolean>;
22
24
  add(name: string): Promise<void>;
25
+ values(): AsyncIterable<string>;
23
26
  close(): Promise<void>;
24
27
  }
@@ -10,6 +10,8 @@ export class BiffPropertyNames {
10
10
  index;
11
11
  fallback;
12
12
  initialized = false;
13
+ first = 0;
14
+ last = 0;
13
15
  pending = Promise.resolve();
14
16
  closed = false;
15
17
  closing;
@@ -145,7 +147,7 @@ export class BiffPropertyNames {
145
147
  finally {
146
148
  buffer.fill(0);
147
149
  }
148
- const record = new Uint8Array(24), descriptor = new DataView(record.buffer);
150
+ const record = new Uint8Array(32), descriptor = new DataView(record.buffer);
149
151
  descriptor.setFloat64(0, Number(head ?? 0n), true);
150
152
  descriptor.setFloat64(8, name.length, true);
151
153
  descriptor.setFloat64(16, start, true);
@@ -158,6 +160,47 @@ export class BiffPropertyNames {
158
160
  }
159
161
  await this.index.set(key, BigInt(position));
160
162
  this.check();
163
+ if (this.last) {
164
+ const link = new Uint8Array(8);
165
+ new DataView(link.buffer).setFloat64(0, position, true);
166
+ try {
167
+ await this.io(() => this.storage.write(this.last + 24, link));
168
+ }
169
+ finally {
170
+ link.fill(0);
171
+ }
172
+ }
173
+ else
174
+ this.first = position;
175
+ this.last = position;
176
+ }
177
+ async *values() {
178
+ this.check();
179
+ if (this.fallback) {
180
+ for (const name of this.fallback) {
181
+ this.check();
182
+ yield name;
183
+ }
184
+ return;
185
+ }
186
+ let position = this.first;
187
+ while (position) {
188
+ const record = new DataView((await this.read(position, 32)).buffer);
189
+ const length = record.getFloat64(8, true), start = record.getFloat64(16, true);
190
+ position = record.getFloat64(24, true);
191
+ this.charge(length + 1);
192
+ let name = '';
193
+ for (let at = 0; at < length;) {
194
+ const count = Math.min(8192, length - at), bytes = await this.read(start + at * 2, count * 2);
195
+ const view = new DataView(bytes.buffer), units = new Uint16Array(count);
196
+ for (let i = 0; i < count; i++)
197
+ units[i] = view.getUint16(i * 2, true);
198
+ name += String.fromCharCode(...units);
199
+ at += count;
200
+ }
201
+ yield name;
202
+ }
203
+ this.check();
161
204
  }
162
205
  close() {
163
206
  this.closed = true;
@@ -0,0 +1,33 @@
1
+ import { type CapabilityContext } from "../spreadsheet-engine/contracts.js";
2
+ export interface BiffOriginalProperty {
3
+ stream: string;
4
+ section: number;
5
+ id: number;
6
+ key: string;
7
+ unchanged: boolean;
8
+ }
9
+ /** Original identities are immutable and arrive once, in import order. Keep only
10
+ * the comparison result, never decoded property values, in caller-backed records. */
11
+ export declare class BiffOriginalProperties {
12
+ private readonly context;
13
+ private readonly charge;
14
+ private readonly storage;
15
+ private readonly indexes;
16
+ private readonly fallback;
17
+ private first;
18
+ private last;
19
+ private pending;
20
+ private closed;
21
+ private closing;
22
+ constructor(context: CapabilityContext, charge: (amount: number) => void);
23
+ private check;
24
+ private allocate;
25
+ private io;
26
+ private read;
27
+ private write;
28
+ add(property: BiffOriginalProperty): Promise<void>;
29
+ private decode;
30
+ get(stream: string, section: number, id: number): Promise<BiffOriginalProperty | undefined>;
31
+ values(): AsyncIterable<BiffOriginalProperty>;
32
+ close(): Promise<void>;
33
+ }
@@ -0,0 +1,160 @@
1
+ import { IntegerTable } from "@poe-platform/safe-fs/storage";
2
+ import { SsconvertError } from "../spreadsheet-engine/contracts.js";
3
+ const streams = ['\u0005SummaryInformation', '\u0005DocumentSummaryInformation'];
4
+ /** Original identities are immutable and arrive once, in import order. Keep only
5
+ * the comparison result, never decoded property values, in caller-backed records. */
6
+ export class BiffOriginalProperties {
7
+ context;
8
+ charge;
9
+ storage;
10
+ indexes;
11
+ fallback;
12
+ first = 0;
13
+ last = 0;
14
+ pending = Promise.resolve();
15
+ closed = false;
16
+ closing;
17
+ constructor(context, charge) {
18
+ this.context = context;
19
+ this.charge = charge;
20
+ this.storage = context.createWorkingStorage?.();
21
+ if (this.storage) {
22
+ const backing = { allocate: (length) => this.allocate(length),
23
+ read: (at, length) => this.read(at, length), write: (at, bytes) => this.write(at, bytes) };
24
+ this.indexes = streams.map(() => new IntegerTable(backing, 64));
25
+ }
26
+ else
27
+ this.fallback = new Map();
28
+ context.own(() => this.close());
29
+ }
30
+ check() {
31
+ this.context.signal.throwIfAborted();
32
+ if (this.closed)
33
+ throw new SsconvertError('invalid-request', 'BIFF original properties are closed');
34
+ }
35
+ allocate(length) { this.check(); const position = this.storage.allocate(length); this.check(); return position; }
36
+ io(action) {
37
+ const result = this.pending.then(async () => { this.check(); const value = await action(); this.check(); return value; });
38
+ this.pending = result.then(() => undefined, () => undefined);
39
+ return result;
40
+ }
41
+ read(at, length) {
42
+ return this.io(async () => {
43
+ const bytes = await this.storage.read(at, length);
44
+ if (bytes.length !== length)
45
+ throw new SsconvertError('io', 'Truncated BIFF original property index');
46
+ return new Uint8Array(bytes);
47
+ });
48
+ }
49
+ async write(at, bytes) {
50
+ const owned = new Uint8Array(bytes);
51
+ try {
52
+ await this.io(() => this.storage.write(at, owned));
53
+ }
54
+ finally {
55
+ owned.fill(0);
56
+ }
57
+ }
58
+ async add(property) {
59
+ this.check();
60
+ this.charge(1 + property.key.length);
61
+ const stream = streams.indexOf(property.stream);
62
+ if (stream < 0 || !Number.isInteger(property.section) || property.section < 0 || property.section > 0xffffffff ||
63
+ !Number.isInteger(property.id) || property.id < 0 || property.id > 0xffffffff)
64
+ throw new SsconvertError('invalid-request', 'Invalid BIFF original property identity');
65
+ if (this.fallback) {
66
+ const key = `${property.stream}:${property.section}:${property.id}`;
67
+ if (this.fallback.has(key))
68
+ throw new SsconvertError('invalid-request', 'Duplicate BIFF original property identity');
69
+ this.fallback.set(key, { ...property });
70
+ return;
71
+ }
72
+ if (!this.first)
73
+ this.allocate(8);
74
+ const key = BigInt(property.section) << 32n | BigInt(property.id), index = this.indexes[stream];
75
+ if (await index.get(key) !== undefined)
76
+ throw new SsconvertError('invalid-request', 'Duplicate BIFF original property identity');
77
+ this.check();
78
+ const start = this.allocate(property.key.length * 2), buffer = new Uint8Array(Math.min(16384, property.key.length * 2)), view = new DataView(buffer.buffer);
79
+ try {
80
+ for (let at = 0; at < property.key.length;) {
81
+ const count = Math.min(buffer.length / 2, property.key.length - at);
82
+ for (let i = 0; i < count; i++)
83
+ view.setUint16(i * 2, property.key.charCodeAt(at + i), true);
84
+ await this.write(start + at * 2, buffer.subarray(0, count * 2));
85
+ at += count;
86
+ }
87
+ }
88
+ finally {
89
+ buffer.fill(0);
90
+ }
91
+ const bytes = new Uint8Array(32), record = new DataView(bytes.buffer);
92
+ record.setUint32(8, property.section, true);
93
+ record.setUint32(12, property.id, true);
94
+ record.setFloat64(16, start, true);
95
+ record.setUint32(24, property.key.length, true);
96
+ record.setUint8(28, stream);
97
+ record.setUint8(29, property.unchanged ? 1 : 0);
98
+ const position = this.allocate(bytes.length);
99
+ await this.write(position, bytes);
100
+ if (this.last) {
101
+ record.setFloat64(0, position, true);
102
+ await this.write(this.last, bytes.subarray(0, 8));
103
+ }
104
+ else
105
+ this.first = position;
106
+ this.last = position;
107
+ await index.set(key, BigInt(position));
108
+ this.check();
109
+ }
110
+ async decode(record) {
111
+ const length = record.getUint32(24, true), start = record.getFloat64(16, true);
112
+ this.charge(length + 1);
113
+ let key = '';
114
+ for (let at = 0; at < length;) {
115
+ const count = Math.min(8192, length - at), bytes = await this.read(start + at * 2, count * 2), view = new DataView(bytes.buffer);
116
+ const units = new Uint16Array(count);
117
+ for (let i = 0; i < count; i++)
118
+ units[i] = view.getUint16(i * 2, true);
119
+ key += String.fromCharCode(...units);
120
+ at += count;
121
+ }
122
+ return { stream: streams[record.getUint8(28)], section: record.getUint32(8, true), id: record.getUint32(12, true), key, unchanged: record.getUint8(29) !== 0 };
123
+ }
124
+ async get(stream, section, id) {
125
+ this.check();
126
+ this.charge(1);
127
+ if (!Number.isInteger(section) || section < 0 || section > 0xffffffff || !Number.isInteger(id) || id < 0 || id > 0xffffffff)
128
+ return undefined;
129
+ if (this.fallback)
130
+ return this.fallback.get(`${stream}:${section}:${id}`);
131
+ const index = this.indexes[streams.indexOf(stream)];
132
+ if (!index)
133
+ return undefined;
134
+ const position = await index.get(BigInt(section) << 32n | BigInt(id));
135
+ this.check();
136
+ return position === undefined ? undefined : this.decode(new DataView((await this.read(Number(position), 32)).buffer));
137
+ }
138
+ async *values() {
139
+ this.check();
140
+ if (this.fallback) {
141
+ for (const property of this.fallback.values()) {
142
+ this.check();
143
+ yield property;
144
+ }
145
+ return;
146
+ }
147
+ let position = this.first;
148
+ while (position) {
149
+ const record = new DataView((await this.read(position, 32)).buffer);
150
+ position = record.getFloat64(0, true);
151
+ yield await this.decode(record);
152
+ }
153
+ this.check();
154
+ }
155
+ close() {
156
+ this.closed = true;
157
+ this.fallback?.clear();
158
+ return this.closing ??= this.pending.then(async () => { await this.storage?.close(); });
159
+ }
160
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poe-platform/safe-bash",
3
- "version": "0.1.817",
3
+ "version": "0.1.818",
4
4
  "description": "Extensible virtual shell with pluggable filesystems and streaming commands",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1407,14 +1407,14 @@
1407
1407
  "access": "public"
1408
1408
  },
1409
1409
  "dependencies": {
1410
- "@poe-platform/safe-fs": "0.1.817",
1410
+ "@poe-platform/safe-fs": "0.1.818",
1411
1411
  "pdf-lib": "1.17.1",
1412
1412
  "@types/node": "^25.2.2",
1413
1413
  "@formatjs/intl-numberformat": "9.4.0",
1414
1414
  "@petamoriken/float16": "^3.9.3",
1415
1415
  "@noble/hashes": "2.4.0",
1416
- "@noble/ciphers": "2.4.0",
1417
1416
  "pako": "3.0.1",
1417
+ "@noble/ciphers": "2.4.0",
1418
1418
  "@kayahr/text-encoding": "^2.2.0",
1419
1419
  "@sqlite.org/sqlite-wasm": "3.50.4-build1",
1420
1420
  "parse5": "7.3.0",
@@ -1556,6 +1556,7 @@
1556
1556
  "./dist/office-package/zip-source.js",
1557
1557
  "./dist/office-package/zip-write-storage.js",
1558
1558
  "./dist/office-package/zip.js",
1559
+ "./dist/pdf-ast/image.js",
1559
1560
  "./dist/pdf-ast/index.js",
1560
1561
  "./dist/pdf-ast/vendor/pdfjs-fonts.mjs",
1561
1562
  "./dist/safe-bash-base-encoding-engine/base.js",
@@ -2600,6 +2601,7 @@
2600
2601
  "./dist/spreadsheet-engine/engine.js",
2601
2602
  "./dist/spreadsheet-engine/formatting.js",
2602
2603
  "./dist/spreadsheet-engine/formatting/cell-text.js",
2604
+ "./dist/spreadsheet-engine/formatting/general-number.js",
2603
2605
  "./dist/spreadsheet-engine/formatting/locale.js",
2604
2606
  "./dist/spreadsheet-engine/formatting/number-format.js",
2605
2607
  "./dist/spreadsheet-engine/formatting/numeric.js",
@@ -2742,7 +2744,6 @@
2742
2744
  "./dist/spreadsheet-engine/rendering/print/font-normalization.js",
2743
2745
  "./dist/spreadsheet-engine/rendering/print/font-shaping.js",
2744
2746
  "./dist/spreadsheet-engine/rendering/print/formula-text.js",
2745
- "./dist/spreadsheet-engine/rendering/print/general-number.js",
2746
2747
  "./dist/spreadsheet-engine/rendering/print/harfbuzz/data.js",
2747
2748
  "./dist/spreadsheet-engine/rendering/print/header-footer.js",
2748
2749
  "./dist/spreadsheet-engine/rendering/print/hyphen-scripts.js",
@@ -2844,6 +2845,7 @@
2844
2845
  "./dist/spreadsheet-format-xls/biff-property-index.js",
2845
2846
  "./dist/spreadsheet-format-xls/biff-property-name.js",
2846
2847
  "./dist/spreadsheet-format-xls/biff-property-names.js",
2848
+ "./dist/spreadsheet-format-xls/biff-property-observations.js",
2847
2849
  "./dist/spreadsheet-format-xls/biff-property-range.js",
2848
2850
  "./dist/spreadsheet-format-xls/biff-property-text.js",
2849
2851
  "./dist/spreadsheet-format-xls/biff-property-transcode.js",
@@ -601,3 +601,18 @@ uses the converted structure directly. Type1 parsing admits lexer token growth,
601
601
  decryption buffers, CID glyph/offset tables, fallback glyph copies, and every
602
602
  recursive charstring conversion before allocation. Skipped comments do not
603
603
  reserve token-sized buffers.
604
+
605
+ # Python / V8 stable sorting
606
+
607
+ `src/extract/text-sort.ts` adapts the TimSort implementation in V8
608
+ 14.6.202.34 (`third_party/v8/builtins/array-sort.tq`), derived from Python.
609
+ Copyright (c) 2001–2018 Python Software Foundation; all rights reserved.
610
+ V8 contributions are copyright the V8 project authors. See
611
+ `licenses/PYTHON-PSF.txt` and `licenses/V8-BSD.txt` for the respective terms.
612
+
613
+ The adaptation replaces resident work and temporary arrays with resumable
614
+ record-read, record-write and comparison requests. Scalar run state and the
615
+ comparison decisions are retained; allocation, I/O and cancellation belong to
616
+ the driver.
617
+
618
+ Source: https://github.com/v8/v8/blob/14.6.202.34/third_party/v8/builtins/array-sort.tq