ziya 0.1.48__py3-none-any.whl → 0.1.49__py3-none-any.whl

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.

Potentially problematic release.


This version of ziya might be problematic. Click here for more details.

Files changed (1263) hide show
  1. app/agents/agent.py +326 -64
  2. app/agents/prompts.py +44 -18
  3. app/main.py +3 -11
  4. app/server.py +205 -16
  5. app/utils/code_util.py +1090 -255
  6. app/utils/file_cache.py +180 -0
  7. app/utils/file_state_manager.py +204 -0
  8. app/utils/file_utils.py +34 -0
  9. app/utils/logging_utils.py +19 -7
  10. pyproject.toml +7 -7
  11. templates/asset-manifest.json +1236 -6
  12. templates/index.html +1 -1
  13. templates/static/css/14386.485ec235.chunk.css +2 -0
  14. templates/static/css/14386.485ec235.chunk.css.map +1 -0
  15. templates/static/css/18884.afc680c7.chunk.css +2 -0
  16. templates/static/css/18884.afc680c7.chunk.css.map +1 -0
  17. templates/static/css/40036.f1973587.chunk.css +2 -0
  18. templates/static/css/40036.f1973587.chunk.css.map +1 -0
  19. templates/static/css/71078.afc680c7.chunk.css +2 -0
  20. templates/static/css/71078.afc680c7.chunk.css.map +1 -0
  21. templates/static/css/99948.485ec235.chunk.css +2 -0
  22. templates/static/css/99948.485ec235.chunk.css.map +1 -0
  23. templates/static/css/{main.f447c982.css → main.87f30840.css} +3 -3
  24. templates/static/css/main.87f30840.css.map +1 -0
  25. templates/static/js/14386.977217e3.chunk.js +2 -0
  26. templates/static/js/14386.977217e3.chunk.js.map +1 -0
  27. templates/static/js/23416.c33f07ab.chunk.js +3 -0
  28. templates/static/js/23416.c33f07ab.chunk.js.LICENSE.txt +14 -0
  29. templates/static/js/23416.c33f07ab.chunk.js.map +1 -0
  30. templates/static/js/35112.d7a417f9.chunk.js +2 -0
  31. templates/static/js/35112.d7a417f9.chunk.js.map +1 -0
  32. templates/static/js/3799.fedb612f.chunk.js +2 -0
  33. templates/static/js/3799.fedb612f.chunk.js.map +1 -0
  34. templates/static/js/40036.b241027e.chunk.js +2 -0
  35. templates/static/js/40036.b241027e.chunk.js.map +1 -0
  36. templates/static/js/42046.98dd49b5.chunk.js +2 -0
  37. templates/static/js/42046.98dd49b5.chunk.js.map +1 -0
  38. templates/static/js/46907.4a730107.chunk.js +2 -0
  39. templates/static/js/46907.4a730107.chunk.js.map +1 -0
  40. templates/static/js/53653.56c7ad1f.chunk.js +3 -0
  41. templates/static/js/53653.56c7ad1f.chunk.js.LICENSE.txt +11 -0
  42. templates/static/js/53653.56c7ad1f.chunk.js.map +1 -0
  43. templates/static/js/64754.cf383335.chunk.js +2 -0
  44. templates/static/js/64754.cf383335.chunk.js.map +1 -0
  45. templates/static/js/71078.a4da4bc6.chunk.js +2 -0
  46. templates/static/js/71078.a4da4bc6.chunk.js.map +1 -0
  47. templates/static/js/79218.4f700779.chunk.js +3 -0
  48. templates/static/js/79218.4f700779.chunk.js.LICENSE.txt +8 -0
  49. templates/static/js/79218.4f700779.chunk.js.map +1 -0
  50. templates/static/js/88261.33450351.chunk.js +3 -0
  51. templates/static/js/88261.33450351.chunk.js.LICENSE.txt +1 -0
  52. templates/static/js/88261.33450351.chunk.js.map +1 -0
  53. templates/static/js/96603.863a8f96.chunk.js +2 -0
  54. templates/static/js/96603.863a8f96.chunk.js.map +1 -0
  55. templates/static/js/97902.75670155.chunk.js +3 -0
  56. templates/static/js/97902.75670155.chunk.js.LICENSE.txt +3 -0
  57. templates/static/js/97902.75670155.chunk.js.map +1 -0
  58. templates/static/js/99948.37907198.chunk.js +2 -0
  59. templates/static/js/99948.37907198.chunk.js.map +1 -0
  60. templates/static/js/main.ee8b3c96.js +3 -0
  61. templates/static/js/main.ee8b3c96.js.LICENSE.txt +121 -0
  62. templates/static/js/main.ee8b3c96.js.map +1 -0
  63. templates/static/js/prism-lang.prism-abap-min.f6d3b9da.chunk.js +2 -0
  64. templates/static/js/prism-lang.prism-abap-min.f6d3b9da.chunk.js.map +1 -0
  65. templates/static/js/prism-lang.prism-abap.e39ba0c4.chunk.js +2 -0
  66. templates/static/js/prism-lang.prism-abap.e39ba0c4.chunk.js.map +1 -0
  67. templates/static/js/prism-lang.prism-abnf-min.be45e0bb.chunk.js +2 -0
  68. templates/static/js/prism-lang.prism-abnf-min.be45e0bb.chunk.js.map +1 -0
  69. templates/static/js/prism-lang.prism-abnf.a30eb087.chunk.js +2 -0
  70. templates/static/js/prism-lang.prism-abnf.a30eb087.chunk.js.map +1 -0
  71. templates/static/js/prism-lang.prism-actionscript-min.2646eea4.chunk.js +2 -0
  72. templates/static/js/prism-lang.prism-actionscript-min.2646eea4.chunk.js.map +1 -0
  73. templates/static/js/prism-lang.prism-actionscript.a5543070.chunk.js +2 -0
  74. templates/static/js/prism-lang.prism-actionscript.a5543070.chunk.js.map +1 -0
  75. templates/static/js/prism-lang.prism-ada-min.83858f38.chunk.js +2 -0
  76. templates/static/js/prism-lang.prism-ada-min.83858f38.chunk.js.map +1 -0
  77. templates/static/js/prism-lang.prism-ada.a177152a.chunk.js +2 -0
  78. templates/static/js/prism-lang.prism-ada.a177152a.chunk.js.map +1 -0
  79. templates/static/js/prism-lang.prism-agda-min.ced2fa9c.chunk.js +2 -0
  80. templates/static/js/prism-lang.prism-agda-min.ced2fa9c.chunk.js.map +1 -0
  81. templates/static/js/prism-lang.prism-agda.89472d62.chunk.js +2 -0
  82. templates/static/js/prism-lang.prism-agda.89472d62.chunk.js.map +1 -0
  83. templates/static/js/prism-lang.prism-al-min.b3d74ecd.chunk.js +2 -0
  84. templates/static/js/prism-lang.prism-al-min.b3d74ecd.chunk.js.map +1 -0
  85. templates/static/js/prism-lang.prism-al.e313cf4c.chunk.js +2 -0
  86. templates/static/js/prism-lang.prism-al.e313cf4c.chunk.js.map +1 -0
  87. templates/static/js/prism-lang.prism-antlr4-min.e10940a9.chunk.js +2 -0
  88. templates/static/js/prism-lang.prism-antlr4-min.e10940a9.chunk.js.map +1 -0
  89. templates/static/js/prism-lang.prism-antlr4.9e943719.chunk.js +2 -0
  90. templates/static/js/prism-lang.prism-antlr4.9e943719.chunk.js.map +1 -0
  91. templates/static/js/prism-lang.prism-apacheconf-min.19c2f6b6.chunk.js +2 -0
  92. templates/static/js/prism-lang.prism-apacheconf-min.19c2f6b6.chunk.js.map +1 -0
  93. templates/static/js/prism-lang.prism-apacheconf.64bfa640.chunk.js +2 -0
  94. templates/static/js/prism-lang.prism-apacheconf.64bfa640.chunk.js.map +1 -0
  95. templates/static/js/prism-lang.prism-apex-min.a8abc6f3.chunk.js +2 -0
  96. templates/static/js/prism-lang.prism-apex-min.a8abc6f3.chunk.js.map +1 -0
  97. templates/static/js/prism-lang.prism-apex.085d7c1c.chunk.js +2 -0
  98. templates/static/js/prism-lang.prism-apex.085d7c1c.chunk.js.map +1 -0
  99. templates/static/js/prism-lang.prism-apl-min.93215e18.chunk.js +2 -0
  100. templates/static/js/prism-lang.prism-apl-min.93215e18.chunk.js.map +1 -0
  101. templates/static/js/prism-lang.prism-apl.e528a12f.chunk.js +2 -0
  102. templates/static/js/prism-lang.prism-apl.e528a12f.chunk.js.map +1 -0
  103. templates/static/js/prism-lang.prism-applescript-min.5be9040c.chunk.js +2 -0
  104. templates/static/js/prism-lang.prism-applescript-min.5be9040c.chunk.js.map +1 -0
  105. templates/static/js/prism-lang.prism-applescript.e8d14c94.chunk.js +2 -0
  106. templates/static/js/prism-lang.prism-applescript.e8d14c94.chunk.js.map +1 -0
  107. templates/static/js/prism-lang.prism-aql-min.13e86cf9.chunk.js +2 -0
  108. templates/static/js/prism-lang.prism-aql-min.13e86cf9.chunk.js.map +1 -0
  109. templates/static/js/prism-lang.prism-aql.fd2231eb.chunk.js +2 -0
  110. templates/static/js/prism-lang.prism-aql.fd2231eb.chunk.js.map +1 -0
  111. templates/static/js/prism-lang.prism-arduino-min.c47a6232.chunk.js +2 -0
  112. templates/static/js/prism-lang.prism-arduino-min.c47a6232.chunk.js.map +1 -0
  113. templates/static/js/prism-lang.prism-arduino.1164efcc.chunk.js +2 -0
  114. templates/static/js/prism-lang.prism-arduino.1164efcc.chunk.js.map +1 -0
  115. templates/static/js/prism-lang.prism-arff-min.4c56a19f.chunk.js +2 -0
  116. templates/static/js/prism-lang.prism-arff-min.4c56a19f.chunk.js.map +1 -0
  117. templates/static/js/prism-lang.prism-arff.4ebfcacb.chunk.js +2 -0
  118. templates/static/js/prism-lang.prism-arff.4ebfcacb.chunk.js.map +1 -0
  119. templates/static/js/prism-lang.prism-armasm-min.12fb172d.chunk.js +2 -0
  120. templates/static/js/prism-lang.prism-armasm-min.12fb172d.chunk.js.map +1 -0
  121. templates/static/js/prism-lang.prism-armasm.ea580233.chunk.js +2 -0
  122. templates/static/js/prism-lang.prism-armasm.ea580233.chunk.js.map +1 -0
  123. templates/static/js/prism-lang.prism-arturo-min.45067586.chunk.js +2 -0
  124. templates/static/js/prism-lang.prism-arturo-min.45067586.chunk.js.map +1 -0
  125. templates/static/js/prism-lang.prism-arturo.09387589.chunk.js +2 -0
  126. templates/static/js/prism-lang.prism-arturo.09387589.chunk.js.map +1 -0
  127. templates/static/js/prism-lang.prism-asciidoc-min.54fdb298.chunk.js +2 -0
  128. templates/static/js/prism-lang.prism-asciidoc-min.54fdb298.chunk.js.map +1 -0
  129. templates/static/js/prism-lang.prism-asciidoc.ade35498.chunk.js +2 -0
  130. templates/static/js/prism-lang.prism-asciidoc.ade35498.chunk.js.map +1 -0
  131. templates/static/js/prism-lang.prism-asm6502-min.05003efc.chunk.js +2 -0
  132. templates/static/js/prism-lang.prism-asm6502-min.05003efc.chunk.js.map +1 -0
  133. templates/static/js/prism-lang.prism-asm6502.cf8397ef.chunk.js +2 -0
  134. templates/static/js/prism-lang.prism-asm6502.cf8397ef.chunk.js.map +1 -0
  135. templates/static/js/prism-lang.prism-asmatmel-min.1034d5fa.chunk.js +2 -0
  136. templates/static/js/prism-lang.prism-asmatmel-min.1034d5fa.chunk.js.map +1 -0
  137. templates/static/js/prism-lang.prism-asmatmel.c83259cf.chunk.js +2 -0
  138. templates/static/js/prism-lang.prism-asmatmel.c83259cf.chunk.js.map +1 -0
  139. templates/static/js/prism-lang.prism-aspnet-min.f8ee6969.chunk.js +2 -0
  140. templates/static/js/prism-lang.prism-aspnet-min.f8ee6969.chunk.js.map +1 -0
  141. templates/static/js/prism-lang.prism-aspnet.2de5abc4.chunk.js +2 -0
  142. templates/static/js/prism-lang.prism-aspnet.2de5abc4.chunk.js.map +1 -0
  143. templates/static/js/prism-lang.prism-autohotkey-min.0ec6c7db.chunk.js +2 -0
  144. templates/static/js/prism-lang.prism-autohotkey-min.0ec6c7db.chunk.js.map +1 -0
  145. templates/static/js/prism-lang.prism-autohotkey.ef0bead7.chunk.js +2 -0
  146. templates/static/js/prism-lang.prism-autohotkey.ef0bead7.chunk.js.map +1 -0
  147. templates/static/js/prism-lang.prism-autoit-min.3272cce9.chunk.js +2 -0
  148. templates/static/js/prism-lang.prism-autoit-min.3272cce9.chunk.js.map +1 -0
  149. templates/static/js/prism-lang.prism-autoit.8eaf4e34.chunk.js +2 -0
  150. templates/static/js/prism-lang.prism-autoit.8eaf4e34.chunk.js.map +1 -0
  151. templates/static/js/prism-lang.prism-avisynth-min.830802b8.chunk.js +2 -0
  152. templates/static/js/prism-lang.prism-avisynth-min.830802b8.chunk.js.map +1 -0
  153. templates/static/js/prism-lang.prism-avisynth.4b1f7b5a.chunk.js +2 -0
  154. templates/static/js/prism-lang.prism-avisynth.4b1f7b5a.chunk.js.map +1 -0
  155. templates/static/js/prism-lang.prism-avro-idl-min.21c25e52.chunk.js +2 -0
  156. templates/static/js/prism-lang.prism-avro-idl-min.21c25e52.chunk.js.map +1 -0
  157. templates/static/js/prism-lang.prism-avro-idl.be76da0f.chunk.js +2 -0
  158. templates/static/js/prism-lang.prism-avro-idl.be76da0f.chunk.js.map +1 -0
  159. templates/static/js/prism-lang.prism-awk-min.2dc8f888.chunk.js +2 -0
  160. templates/static/js/prism-lang.prism-awk-min.2dc8f888.chunk.js.map +1 -0
  161. templates/static/js/prism-lang.prism-awk.6cc5619b.chunk.js +2 -0
  162. templates/static/js/prism-lang.prism-awk.6cc5619b.chunk.js.map +1 -0
  163. templates/static/js/prism-lang.prism-bash-min.93d917c0.chunk.js +2 -0
  164. templates/static/js/prism-lang.prism-bash-min.93d917c0.chunk.js.map +1 -0
  165. templates/static/js/prism-lang.prism-bash.22f04791.chunk.js +2 -0
  166. templates/static/js/prism-lang.prism-bash.22f04791.chunk.js.map +1 -0
  167. templates/static/js/prism-lang.prism-basic-min.b74dcdce.chunk.js +2 -0
  168. templates/static/js/prism-lang.prism-basic-min.b74dcdce.chunk.js.map +1 -0
  169. templates/static/js/prism-lang.prism-basic.252e7c5e.chunk.js +2 -0
  170. templates/static/js/prism-lang.prism-basic.252e7c5e.chunk.js.map +1 -0
  171. templates/static/js/prism-lang.prism-batch-min.49f824e1.chunk.js +2 -0
  172. templates/static/js/prism-lang.prism-batch-min.49f824e1.chunk.js.map +1 -0
  173. templates/static/js/prism-lang.prism-batch.861d6904.chunk.js +2 -0
  174. templates/static/js/prism-lang.prism-batch.861d6904.chunk.js.map +1 -0
  175. templates/static/js/prism-lang.prism-bbcode-min.dc82ccb4.chunk.js +2 -0
  176. templates/static/js/prism-lang.prism-bbcode-min.dc82ccb4.chunk.js.map +1 -0
  177. templates/static/js/prism-lang.prism-bbcode.788ac57c.chunk.js +2 -0
  178. templates/static/js/prism-lang.prism-bbcode.788ac57c.chunk.js.map +1 -0
  179. templates/static/js/prism-lang.prism-bbj-min.3bd7aa0c.chunk.js +2 -0
  180. templates/static/js/prism-lang.prism-bbj-min.3bd7aa0c.chunk.js.map +1 -0
  181. templates/static/js/prism-lang.prism-bbj.0d6e0829.chunk.js +2 -0
  182. templates/static/js/prism-lang.prism-bbj.0d6e0829.chunk.js.map +1 -0
  183. templates/static/js/prism-lang.prism-bicep-min.d41caf79.chunk.js +2 -0
  184. templates/static/js/prism-lang.prism-bicep-min.d41caf79.chunk.js.map +1 -0
  185. templates/static/js/prism-lang.prism-bicep.e539462e.chunk.js +2 -0
  186. templates/static/js/prism-lang.prism-bicep.e539462e.chunk.js.map +1 -0
  187. templates/static/js/prism-lang.prism-birb-min.c7505d66.chunk.js +2 -0
  188. templates/static/js/prism-lang.prism-birb-min.c7505d66.chunk.js.map +1 -0
  189. templates/static/js/prism-lang.prism-birb.dd2e4fbe.chunk.js +2 -0
  190. templates/static/js/prism-lang.prism-birb.dd2e4fbe.chunk.js.map +1 -0
  191. templates/static/js/prism-lang.prism-bison-min.d6195df9.chunk.js +2 -0
  192. templates/static/js/prism-lang.prism-bison-min.d6195df9.chunk.js.map +1 -0
  193. templates/static/js/prism-lang.prism-bison.e88e738b.chunk.js +2 -0
  194. templates/static/js/prism-lang.prism-bison.e88e738b.chunk.js.map +1 -0
  195. templates/static/js/prism-lang.prism-bnf-min.c0a250e5.chunk.js +2 -0
  196. templates/static/js/prism-lang.prism-bnf-min.c0a250e5.chunk.js.map +1 -0
  197. templates/static/js/prism-lang.prism-bnf.c90e48bd.chunk.js +2 -0
  198. templates/static/js/prism-lang.prism-bnf.c90e48bd.chunk.js.map +1 -0
  199. templates/static/js/prism-lang.prism-bqn-min.515efd48.chunk.js +2 -0
  200. templates/static/js/prism-lang.prism-bqn-min.515efd48.chunk.js.map +1 -0
  201. templates/static/js/prism-lang.prism-bqn.82147115.chunk.js +2 -0
  202. templates/static/js/prism-lang.prism-bqn.82147115.chunk.js.map +1 -0
  203. templates/static/js/prism-lang.prism-brainfuck-min.cb567b27.chunk.js +2 -0
  204. templates/static/js/prism-lang.prism-brainfuck-min.cb567b27.chunk.js.map +1 -0
  205. templates/static/js/prism-lang.prism-brainfuck.d06a4876.chunk.js +2 -0
  206. templates/static/js/prism-lang.prism-brainfuck.d06a4876.chunk.js.map +1 -0
  207. templates/static/js/prism-lang.prism-brightscript-min.cc9ff383.chunk.js +2 -0
  208. templates/static/js/prism-lang.prism-brightscript-min.cc9ff383.chunk.js.map +1 -0
  209. templates/static/js/prism-lang.prism-brightscript.886c8b0e.chunk.js +2 -0
  210. templates/static/js/prism-lang.prism-brightscript.886c8b0e.chunk.js.map +1 -0
  211. templates/static/js/prism-lang.prism-bro-min.a7705ef5.chunk.js +2 -0
  212. templates/static/js/prism-lang.prism-bro-min.a7705ef5.chunk.js.map +1 -0
  213. templates/static/js/prism-lang.prism-bro.bb844ef6.chunk.js +2 -0
  214. templates/static/js/prism-lang.prism-bro.bb844ef6.chunk.js.map +1 -0
  215. templates/static/js/prism-lang.prism-bsl-min.c05607fa.chunk.js +2 -0
  216. templates/static/js/prism-lang.prism-bsl-min.c05607fa.chunk.js.map +1 -0
  217. templates/static/js/prism-lang.prism-bsl.cb0d8b8e.chunk.js +2 -0
  218. templates/static/js/prism-lang.prism-bsl.cb0d8b8e.chunk.js.map +1 -0
  219. templates/static/js/prism-lang.prism-c-min.ff401bb0.chunk.js +2 -0
  220. templates/static/js/prism-lang.prism-c-min.ff401bb0.chunk.js.map +1 -0
  221. templates/static/js/prism-lang.prism-c.2a99d5a7.chunk.js +2 -0
  222. templates/static/js/prism-lang.prism-c.2a99d5a7.chunk.js.map +1 -0
  223. templates/static/js/prism-lang.prism-cfscript-min.689b87bc.chunk.js +2 -0
  224. templates/static/js/prism-lang.prism-cfscript-min.689b87bc.chunk.js.map +1 -0
  225. templates/static/js/prism-lang.prism-cfscript.d4479056.chunk.js +2 -0
  226. templates/static/js/prism-lang.prism-cfscript.d4479056.chunk.js.map +1 -0
  227. templates/static/js/prism-lang.prism-chaiscript-min.d2509267.chunk.js +2 -0
  228. templates/static/js/prism-lang.prism-chaiscript-min.d2509267.chunk.js.map +1 -0
  229. templates/static/js/prism-lang.prism-chaiscript.05ad9b29.chunk.js +2 -0
  230. templates/static/js/prism-lang.prism-chaiscript.05ad9b29.chunk.js.map +1 -0
  231. templates/static/js/prism-lang.prism-cil-min.ccfb903b.chunk.js +2 -0
  232. templates/static/js/prism-lang.prism-cil-min.ccfb903b.chunk.js.map +1 -0
  233. templates/static/js/prism-lang.prism-cil.dc934ae3.chunk.js +2 -0
  234. templates/static/js/prism-lang.prism-cil.dc934ae3.chunk.js.map +1 -0
  235. templates/static/js/prism-lang.prism-cilkc-min.3cba448d.chunk.js +2 -0
  236. templates/static/js/prism-lang.prism-cilkc-min.3cba448d.chunk.js.map +1 -0
  237. templates/static/js/prism-lang.prism-cilkc.1d201a62.chunk.js +2 -0
  238. templates/static/js/prism-lang.prism-cilkc.1d201a62.chunk.js.map +1 -0
  239. templates/static/js/prism-lang.prism-cilkcpp-min.e365877d.chunk.js +2 -0
  240. templates/static/js/prism-lang.prism-cilkcpp-min.e365877d.chunk.js.map +1 -0
  241. templates/static/js/prism-lang.prism-cilkcpp.2845fa02.chunk.js +2 -0
  242. templates/static/js/prism-lang.prism-cilkcpp.2845fa02.chunk.js.map +1 -0
  243. templates/static/js/prism-lang.prism-clike-min.fd4fad58.chunk.js +2 -0
  244. templates/static/js/prism-lang.prism-clike-min.fd4fad58.chunk.js.map +1 -0
  245. templates/static/js/prism-lang.prism-clike.2e23872e.chunk.js +2 -0
  246. templates/static/js/prism-lang.prism-clike.2e23872e.chunk.js.map +1 -0
  247. templates/static/js/prism-lang.prism-clojure-min.63ea9802.chunk.js +2 -0
  248. templates/static/js/prism-lang.prism-clojure-min.63ea9802.chunk.js.map +1 -0
  249. templates/static/js/prism-lang.prism-clojure.68bf9e7b.chunk.js +2 -0
  250. templates/static/js/prism-lang.prism-clojure.68bf9e7b.chunk.js.map +1 -0
  251. templates/static/js/prism-lang.prism-cmake-min.38c99576.chunk.js +2 -0
  252. templates/static/js/prism-lang.prism-cmake-min.38c99576.chunk.js.map +1 -0
  253. templates/static/js/prism-lang.prism-cmake.7f3bcf4e.chunk.js +2 -0
  254. templates/static/js/prism-lang.prism-cmake.7f3bcf4e.chunk.js.map +1 -0
  255. templates/static/js/prism-lang.prism-cobol-min.d6b81edd.chunk.js +2 -0
  256. templates/static/js/prism-lang.prism-cobol-min.d6b81edd.chunk.js.map +1 -0
  257. templates/static/js/prism-lang.prism-cobol.8721387e.chunk.js +2 -0
  258. templates/static/js/prism-lang.prism-cobol.8721387e.chunk.js.map +1 -0
  259. templates/static/js/prism-lang.prism-coffeescript-min.947a236c.chunk.js +2 -0
  260. templates/static/js/prism-lang.prism-coffeescript-min.947a236c.chunk.js.map +1 -0
  261. templates/static/js/prism-lang.prism-coffeescript.b2f63762.chunk.js +2 -0
  262. templates/static/js/prism-lang.prism-coffeescript.b2f63762.chunk.js.map +1 -0
  263. templates/static/js/prism-lang.prism-concurnas-min.9c863189.chunk.js +2 -0
  264. templates/static/js/prism-lang.prism-concurnas-min.9c863189.chunk.js.map +1 -0
  265. templates/static/js/prism-lang.prism-concurnas.7ba94772.chunk.js +2 -0
  266. templates/static/js/prism-lang.prism-concurnas.7ba94772.chunk.js.map +1 -0
  267. templates/static/js/prism-lang.prism-cooklang-min.d5431edc.chunk.js +2 -0
  268. templates/static/js/prism-lang.prism-cooklang-min.d5431edc.chunk.js.map +1 -0
  269. templates/static/js/prism-lang.prism-cooklang.d7e57149.chunk.js +2 -0
  270. templates/static/js/prism-lang.prism-cooklang.d7e57149.chunk.js.map +1 -0
  271. templates/static/js/prism-lang.prism-coq-min.54aea999.chunk.js +2 -0
  272. templates/static/js/prism-lang.prism-coq-min.54aea999.chunk.js.map +1 -0
  273. templates/static/js/prism-lang.prism-coq.516120ff.chunk.js +2 -0
  274. templates/static/js/prism-lang.prism-coq.516120ff.chunk.js.map +1 -0
  275. templates/static/js/prism-lang.prism-core-min.d629bc31.chunk.js +2 -0
  276. templates/static/js/prism-lang.prism-core-min.d629bc31.chunk.js.map +1 -0
  277. templates/static/js/prism-lang.prism-cpp-min.f901498f.chunk.js +2 -0
  278. templates/static/js/prism-lang.prism-cpp-min.f901498f.chunk.js.map +1 -0
  279. templates/static/js/prism-lang.prism-cpp.e242b3db.chunk.js +2 -0
  280. templates/static/js/prism-lang.prism-cpp.e242b3db.chunk.js.map +1 -0
  281. templates/static/js/prism-lang.prism-crystal-min.7aa72335.chunk.js +2 -0
  282. templates/static/js/prism-lang.prism-crystal-min.7aa72335.chunk.js.map +1 -0
  283. templates/static/js/prism-lang.prism-crystal.07beea27.chunk.js +2 -0
  284. templates/static/js/prism-lang.prism-crystal.07beea27.chunk.js.map +1 -0
  285. templates/static/js/prism-lang.prism-csharp-min.94fc9a8a.chunk.js +2 -0
  286. templates/static/js/prism-lang.prism-csharp-min.94fc9a8a.chunk.js.map +1 -0
  287. templates/static/js/prism-lang.prism-csharp.b22340e8.chunk.js +2 -0
  288. templates/static/js/prism-lang.prism-csharp.b22340e8.chunk.js.map +1 -0
  289. templates/static/js/prism-lang.prism-cshtml-min.17ef6b0e.chunk.js +2 -0
  290. templates/static/js/prism-lang.prism-cshtml-min.17ef6b0e.chunk.js.map +1 -0
  291. templates/static/js/prism-lang.prism-cshtml.2ebe3316.chunk.js +2 -0
  292. templates/static/js/prism-lang.prism-cshtml.2ebe3316.chunk.js.map +1 -0
  293. templates/static/js/prism-lang.prism-csp-min.a3dc0b52.chunk.js +2 -0
  294. templates/static/js/prism-lang.prism-csp-min.a3dc0b52.chunk.js.map +1 -0
  295. templates/static/js/prism-lang.prism-csp.feee146b.chunk.js +2 -0
  296. templates/static/js/prism-lang.prism-csp.feee146b.chunk.js.map +1 -0
  297. templates/static/js/prism-lang.prism-css-extras-min.57821a36.chunk.js +2 -0
  298. templates/static/js/prism-lang.prism-css-extras-min.57821a36.chunk.js.map +1 -0
  299. templates/static/js/prism-lang.prism-css-extras.47c3b0b5.chunk.js +2 -0
  300. templates/static/js/prism-lang.prism-css-extras.47c3b0b5.chunk.js.map +1 -0
  301. templates/static/js/prism-lang.prism-css-min.759304dd.chunk.js +2 -0
  302. templates/static/js/prism-lang.prism-css-min.759304dd.chunk.js.map +1 -0
  303. templates/static/js/prism-lang.prism-css.921fab65.chunk.js +2 -0
  304. templates/static/js/prism-lang.prism-css.921fab65.chunk.js.map +1 -0
  305. templates/static/js/prism-lang.prism-csv-min.9f92b0a3.chunk.js +2 -0
  306. templates/static/js/prism-lang.prism-csv-min.9f92b0a3.chunk.js.map +1 -0
  307. templates/static/js/prism-lang.prism-csv.106521a9.chunk.js +2 -0
  308. templates/static/js/prism-lang.prism-csv.106521a9.chunk.js.map +1 -0
  309. templates/static/js/prism-lang.prism-cue-min.8c80801e.chunk.js +2 -0
  310. templates/static/js/prism-lang.prism-cue-min.8c80801e.chunk.js.map +1 -0
  311. templates/static/js/prism-lang.prism-cue.10f4a797.chunk.js +2 -0
  312. templates/static/js/prism-lang.prism-cue.10f4a797.chunk.js.map +1 -0
  313. templates/static/js/prism-lang.prism-cypher-min.38cb7c95.chunk.js +2 -0
  314. templates/static/js/prism-lang.prism-cypher-min.38cb7c95.chunk.js.map +1 -0
  315. templates/static/js/prism-lang.prism-cypher.ac1bc1d8.chunk.js +2 -0
  316. templates/static/js/prism-lang.prism-cypher.ac1bc1d8.chunk.js.map +1 -0
  317. templates/static/js/prism-lang.prism-d-min.b9dd31c7.chunk.js +2 -0
  318. templates/static/js/prism-lang.prism-d-min.b9dd31c7.chunk.js.map +1 -0
  319. templates/static/js/prism-lang.prism-d.b6bad9a8.chunk.js +2 -0
  320. templates/static/js/prism-lang.prism-d.b6bad9a8.chunk.js.map +1 -0
  321. templates/static/js/prism-lang.prism-dart-min.18bf8b60.chunk.js +2 -0
  322. templates/static/js/prism-lang.prism-dart-min.18bf8b60.chunk.js.map +1 -0
  323. templates/static/js/prism-lang.prism-dart.c740bbcd.chunk.js +2 -0
  324. templates/static/js/prism-lang.prism-dart.c740bbcd.chunk.js.map +1 -0
  325. templates/static/js/prism-lang.prism-dataweave-min.e192996e.chunk.js +2 -0
  326. templates/static/js/prism-lang.prism-dataweave-min.e192996e.chunk.js.map +1 -0
  327. templates/static/js/prism-lang.prism-dataweave.57a80476.chunk.js +2 -0
  328. templates/static/js/prism-lang.prism-dataweave.57a80476.chunk.js.map +1 -0
  329. templates/static/js/prism-lang.prism-dax-min.bc545e08.chunk.js +2 -0
  330. templates/static/js/prism-lang.prism-dax-min.bc545e08.chunk.js.map +1 -0
  331. templates/static/js/prism-lang.prism-dax.567edeb8.chunk.js +2 -0
  332. templates/static/js/prism-lang.prism-dax.567edeb8.chunk.js.map +1 -0
  333. templates/static/js/prism-lang.prism-dhall-min.72020560.chunk.js +2 -0
  334. templates/static/js/prism-lang.prism-dhall-min.72020560.chunk.js.map +1 -0
  335. templates/static/js/prism-lang.prism-dhall.f88692ff.chunk.js +2 -0
  336. templates/static/js/prism-lang.prism-dhall.f88692ff.chunk.js.map +1 -0
  337. templates/static/js/prism-lang.prism-diff-min.950c35a3.chunk.js +2 -0
  338. templates/static/js/prism-lang.prism-diff-min.950c35a3.chunk.js.map +1 -0
  339. templates/static/js/prism-lang.prism-diff.0c15ea49.chunk.js +2 -0
  340. templates/static/js/prism-lang.prism-diff.0c15ea49.chunk.js.map +1 -0
  341. templates/static/js/prism-lang.prism-django-min.f5b598ee.chunk.js +2 -0
  342. templates/static/js/prism-lang.prism-django-min.f5b598ee.chunk.js.map +1 -0
  343. templates/static/js/prism-lang.prism-django.27744486.chunk.js +2 -0
  344. templates/static/js/prism-lang.prism-django.27744486.chunk.js.map +1 -0
  345. templates/static/js/prism-lang.prism-dns-zone-file-min.3ae5b817.chunk.js +2 -0
  346. templates/static/js/prism-lang.prism-dns-zone-file-min.3ae5b817.chunk.js.map +1 -0
  347. templates/static/js/prism-lang.prism-dns-zone-file.a0c6af49.chunk.js +2 -0
  348. templates/static/js/prism-lang.prism-dns-zone-file.a0c6af49.chunk.js.map +1 -0
  349. templates/static/js/prism-lang.prism-docker-min.2c6fc93a.chunk.js +2 -0
  350. templates/static/js/prism-lang.prism-docker-min.2c6fc93a.chunk.js.map +1 -0
  351. templates/static/js/prism-lang.prism-docker.ba6b7215.chunk.js +2 -0
  352. templates/static/js/prism-lang.prism-docker.ba6b7215.chunk.js.map +1 -0
  353. templates/static/js/prism-lang.prism-dot-min.d41aabc3.chunk.js +2 -0
  354. templates/static/js/prism-lang.prism-dot-min.d41aabc3.chunk.js.map +1 -0
  355. templates/static/js/prism-lang.prism-dot.fe036884.chunk.js +2 -0
  356. templates/static/js/prism-lang.prism-dot.fe036884.chunk.js.map +1 -0
  357. templates/static/js/prism-lang.prism-ebnf-min.8d6d151d.chunk.js +2 -0
  358. templates/static/js/prism-lang.prism-ebnf-min.8d6d151d.chunk.js.map +1 -0
  359. templates/static/js/prism-lang.prism-ebnf.aa81548c.chunk.js +2 -0
  360. templates/static/js/prism-lang.prism-ebnf.aa81548c.chunk.js.map +1 -0
  361. templates/static/js/prism-lang.prism-editorconfig-min.36c897da.chunk.js +2 -0
  362. templates/static/js/prism-lang.prism-editorconfig-min.36c897da.chunk.js.map +1 -0
  363. templates/static/js/prism-lang.prism-editorconfig.51543530.chunk.js +2 -0
  364. templates/static/js/prism-lang.prism-editorconfig.51543530.chunk.js.map +1 -0
  365. templates/static/js/prism-lang.prism-eiffel-min.e20a8530.chunk.js +2 -0
  366. templates/static/js/prism-lang.prism-eiffel-min.e20a8530.chunk.js.map +1 -0
  367. templates/static/js/prism-lang.prism-eiffel.41eb5d28.chunk.js +2 -0
  368. templates/static/js/prism-lang.prism-eiffel.41eb5d28.chunk.js.map +1 -0
  369. templates/static/js/prism-lang.prism-ejs-min.155459ca.chunk.js +2 -0
  370. templates/static/js/prism-lang.prism-ejs-min.155459ca.chunk.js.map +1 -0
  371. templates/static/js/prism-lang.prism-ejs.11379371.chunk.js +2 -0
  372. templates/static/js/prism-lang.prism-ejs.11379371.chunk.js.map +1 -0
  373. templates/static/js/prism-lang.prism-elixir-min.6f047337.chunk.js +2 -0
  374. templates/static/js/prism-lang.prism-elixir-min.6f047337.chunk.js.map +1 -0
  375. templates/static/js/prism-lang.prism-elixir.0d23e23e.chunk.js +2 -0
  376. templates/static/js/prism-lang.prism-elixir.0d23e23e.chunk.js.map +1 -0
  377. templates/static/js/prism-lang.prism-elm-min.274929c3.chunk.js +2 -0
  378. templates/static/js/prism-lang.prism-elm-min.274929c3.chunk.js.map +1 -0
  379. templates/static/js/prism-lang.prism-elm.cf68a4c0.chunk.js +2 -0
  380. templates/static/js/prism-lang.prism-elm.cf68a4c0.chunk.js.map +1 -0
  381. templates/static/js/prism-lang.prism-erb-min.bb7efbf0.chunk.js +2 -0
  382. templates/static/js/prism-lang.prism-erb-min.bb7efbf0.chunk.js.map +1 -0
  383. templates/static/js/prism-lang.prism-erb.e9fd8406.chunk.js +2 -0
  384. templates/static/js/prism-lang.prism-erb.e9fd8406.chunk.js.map +1 -0
  385. templates/static/js/prism-lang.prism-erlang-min.3913fe3d.chunk.js +2 -0
  386. templates/static/js/prism-lang.prism-erlang-min.3913fe3d.chunk.js.map +1 -0
  387. templates/static/js/prism-lang.prism-erlang.58222cdb.chunk.js +2 -0
  388. templates/static/js/prism-lang.prism-erlang.58222cdb.chunk.js.map +1 -0
  389. templates/static/js/prism-lang.prism-etlua-min.02b18aa7.chunk.js +2 -0
  390. templates/static/js/prism-lang.prism-etlua-min.02b18aa7.chunk.js.map +1 -0
  391. templates/static/js/prism-lang.prism-etlua.db223dd2.chunk.js +2 -0
  392. templates/static/js/prism-lang.prism-etlua.db223dd2.chunk.js.map +1 -0
  393. templates/static/js/prism-lang.prism-excel-formula-min.b28db6c2.chunk.js +2 -0
  394. templates/static/js/prism-lang.prism-excel-formula-min.b28db6c2.chunk.js.map +1 -0
  395. templates/static/js/prism-lang.prism-excel-formula.72545e03.chunk.js +2 -0
  396. templates/static/js/prism-lang.prism-excel-formula.72545e03.chunk.js.map +1 -0
  397. templates/static/js/prism-lang.prism-factor-min.756d979b.chunk.js +2 -0
  398. templates/static/js/prism-lang.prism-factor-min.756d979b.chunk.js.map +1 -0
  399. templates/static/js/prism-lang.prism-factor.ed942522.chunk.js +2 -0
  400. templates/static/js/prism-lang.prism-factor.ed942522.chunk.js.map +1 -0
  401. templates/static/js/prism-lang.prism-false-min.0974a341.chunk.js +2 -0
  402. templates/static/js/prism-lang.prism-false-min.0974a341.chunk.js.map +1 -0
  403. templates/static/js/prism-lang.prism-false.3c1d28a5.chunk.js +2 -0
  404. templates/static/js/prism-lang.prism-false.3c1d28a5.chunk.js.map +1 -0
  405. templates/static/js/prism-lang.prism-firestore-security-rules-min.f94f4b97.chunk.js +2 -0
  406. templates/static/js/prism-lang.prism-firestore-security-rules-min.f94f4b97.chunk.js.map +1 -0
  407. templates/static/js/prism-lang.prism-firestore-security-rules.bb6f749f.chunk.js +2 -0
  408. templates/static/js/prism-lang.prism-firestore-security-rules.bb6f749f.chunk.js.map +1 -0
  409. templates/static/js/prism-lang.prism-flow-min.263e730d.chunk.js +2 -0
  410. templates/static/js/prism-lang.prism-flow-min.263e730d.chunk.js.map +1 -0
  411. templates/static/js/prism-lang.prism-flow.43fdcbd4.chunk.js +2 -0
  412. templates/static/js/prism-lang.prism-flow.43fdcbd4.chunk.js.map +1 -0
  413. templates/static/js/prism-lang.prism-fortran-min.c8a28aa9.chunk.js +2 -0
  414. templates/static/js/prism-lang.prism-fortran-min.c8a28aa9.chunk.js.map +1 -0
  415. templates/static/js/prism-lang.prism-fortran.3f5d2665.chunk.js +2 -0
  416. templates/static/js/prism-lang.prism-fortran.3f5d2665.chunk.js.map +1 -0
  417. templates/static/js/prism-lang.prism-fsharp-min.1bf286d0.chunk.js +2 -0
  418. templates/static/js/prism-lang.prism-fsharp-min.1bf286d0.chunk.js.map +1 -0
  419. templates/static/js/prism-lang.prism-fsharp.27f46321.chunk.js +2 -0
  420. templates/static/js/prism-lang.prism-fsharp.27f46321.chunk.js.map +1 -0
  421. templates/static/js/prism-lang.prism-ftl-min.47ac2ebf.chunk.js +2 -0
  422. templates/static/js/prism-lang.prism-ftl-min.47ac2ebf.chunk.js.map +1 -0
  423. templates/static/js/prism-lang.prism-ftl.c725f271.chunk.js +2 -0
  424. templates/static/js/prism-lang.prism-ftl.c725f271.chunk.js.map +1 -0
  425. templates/static/js/prism-lang.prism-gap-min.6948cc68.chunk.js +2 -0
  426. templates/static/js/prism-lang.prism-gap-min.6948cc68.chunk.js.map +1 -0
  427. templates/static/js/prism-lang.prism-gap.1da8e392.chunk.js +2 -0
  428. templates/static/js/prism-lang.prism-gap.1da8e392.chunk.js.map +1 -0
  429. templates/static/js/prism-lang.prism-gcode-min.e8d37109.chunk.js +2 -0
  430. templates/static/js/prism-lang.prism-gcode-min.e8d37109.chunk.js.map +1 -0
  431. templates/static/js/prism-lang.prism-gcode.58450e81.chunk.js +2 -0
  432. templates/static/js/prism-lang.prism-gcode.58450e81.chunk.js.map +1 -0
  433. templates/static/js/prism-lang.prism-gdscript-min.0fe5ef79.chunk.js +2 -0
  434. templates/static/js/prism-lang.prism-gdscript-min.0fe5ef79.chunk.js.map +1 -0
  435. templates/static/js/prism-lang.prism-gdscript.644e2a66.chunk.js +2 -0
  436. templates/static/js/prism-lang.prism-gdscript.644e2a66.chunk.js.map +1 -0
  437. templates/static/js/prism-lang.prism-gedcom-min.efa74e49.chunk.js +2 -0
  438. templates/static/js/prism-lang.prism-gedcom-min.efa74e49.chunk.js.map +1 -0
  439. templates/static/js/prism-lang.prism-gedcom.1a6d0df2.chunk.js +2 -0
  440. templates/static/js/prism-lang.prism-gedcom.1a6d0df2.chunk.js.map +1 -0
  441. templates/static/js/prism-lang.prism-gettext-min.676210f9.chunk.js +2 -0
  442. templates/static/js/prism-lang.prism-gettext-min.676210f9.chunk.js.map +1 -0
  443. templates/static/js/prism-lang.prism-gettext.ba3b0a34.chunk.js +2 -0
  444. templates/static/js/prism-lang.prism-gettext.ba3b0a34.chunk.js.map +1 -0
  445. templates/static/js/prism-lang.prism-gherkin-min.18833e5c.chunk.js +2 -0
  446. templates/static/js/prism-lang.prism-gherkin-min.18833e5c.chunk.js.map +1 -0
  447. templates/static/js/prism-lang.prism-gherkin.c6a2dec9.chunk.js +2 -0
  448. templates/static/js/prism-lang.prism-gherkin.c6a2dec9.chunk.js.map +1 -0
  449. templates/static/js/prism-lang.prism-git-min.39b09969.chunk.js +2 -0
  450. templates/static/js/prism-lang.prism-git-min.39b09969.chunk.js.map +1 -0
  451. templates/static/js/prism-lang.prism-git.ce336a64.chunk.js +2 -0
  452. templates/static/js/prism-lang.prism-git.ce336a64.chunk.js.map +1 -0
  453. templates/static/js/prism-lang.prism-glsl-min.60e79472.chunk.js +2 -0
  454. templates/static/js/prism-lang.prism-glsl-min.60e79472.chunk.js.map +1 -0
  455. templates/static/js/prism-lang.prism-glsl.5d9e40cc.chunk.js +2 -0
  456. templates/static/js/prism-lang.prism-glsl.5d9e40cc.chunk.js.map +1 -0
  457. templates/static/js/prism-lang.prism-gml-min.2dd32b15.chunk.js +2 -0
  458. templates/static/js/prism-lang.prism-gml-min.2dd32b15.chunk.js.map +1 -0
  459. templates/static/js/prism-lang.prism-gml.512211eb.chunk.js +2 -0
  460. templates/static/js/prism-lang.prism-gml.512211eb.chunk.js.map +1 -0
  461. templates/static/js/prism-lang.prism-gn-min.b6e9994f.chunk.js +2 -0
  462. templates/static/js/prism-lang.prism-gn-min.b6e9994f.chunk.js.map +1 -0
  463. templates/static/js/prism-lang.prism-gn.3dddbe9c.chunk.js +2 -0
  464. templates/static/js/prism-lang.prism-gn.3dddbe9c.chunk.js.map +1 -0
  465. templates/static/js/prism-lang.prism-go-min.c572edba.chunk.js +2 -0
  466. templates/static/js/prism-lang.prism-go-min.c572edba.chunk.js.map +1 -0
  467. templates/static/js/prism-lang.prism-go-module-min.fe059f76.chunk.js +2 -0
  468. templates/static/js/prism-lang.prism-go-module-min.fe059f76.chunk.js.map +1 -0
  469. templates/static/js/prism-lang.prism-go-module.f2c35343.chunk.js +2 -0
  470. templates/static/js/prism-lang.prism-go-module.f2c35343.chunk.js.map +1 -0
  471. templates/static/js/prism-lang.prism-go.f71d0910.chunk.js +2 -0
  472. templates/static/js/prism-lang.prism-go.f71d0910.chunk.js.map +1 -0
  473. templates/static/js/prism-lang.prism-gradle-min.fdb17762.chunk.js +2 -0
  474. templates/static/js/prism-lang.prism-gradle-min.fdb17762.chunk.js.map +1 -0
  475. templates/static/js/prism-lang.prism-gradle.b65d2340.chunk.js +2 -0
  476. templates/static/js/prism-lang.prism-gradle.b65d2340.chunk.js.map +1 -0
  477. templates/static/js/prism-lang.prism-graphql-min.c49f3590.chunk.js +2 -0
  478. templates/static/js/prism-lang.prism-graphql-min.c49f3590.chunk.js.map +1 -0
  479. templates/static/js/prism-lang.prism-graphql.8d6cb858.chunk.js +2 -0
  480. templates/static/js/prism-lang.prism-graphql.8d6cb858.chunk.js.map +1 -0
  481. templates/static/js/prism-lang.prism-groovy-min.e6308daa.chunk.js +2 -0
  482. templates/static/js/prism-lang.prism-groovy-min.e6308daa.chunk.js.map +1 -0
  483. templates/static/js/prism-lang.prism-groovy.cbf3df06.chunk.js +2 -0
  484. templates/static/js/prism-lang.prism-groovy.cbf3df06.chunk.js.map +1 -0
  485. templates/static/js/prism-lang.prism-haml-min.2e211fa2.chunk.js +2 -0
  486. templates/static/js/prism-lang.prism-haml-min.2e211fa2.chunk.js.map +1 -0
  487. templates/static/js/prism-lang.prism-haml.b79fa76b.chunk.js +2 -0
  488. templates/static/js/prism-lang.prism-haml.b79fa76b.chunk.js.map +1 -0
  489. templates/static/js/prism-lang.prism-handlebars-min.5fda0071.chunk.js +2 -0
  490. templates/static/js/prism-lang.prism-handlebars-min.5fda0071.chunk.js.map +1 -0
  491. templates/static/js/prism-lang.prism-handlebars.15a03269.chunk.js +2 -0
  492. templates/static/js/prism-lang.prism-handlebars.15a03269.chunk.js.map +1 -0
  493. templates/static/js/prism-lang.prism-haskell-min.743195c8.chunk.js +2 -0
  494. templates/static/js/prism-lang.prism-haskell-min.743195c8.chunk.js.map +1 -0
  495. templates/static/js/prism-lang.prism-haskell.27832c7c.chunk.js +2 -0
  496. templates/static/js/prism-lang.prism-haskell.27832c7c.chunk.js.map +1 -0
  497. templates/static/js/prism-lang.prism-haxe-min.aeba83e1.chunk.js +2 -0
  498. templates/static/js/prism-lang.prism-haxe-min.aeba83e1.chunk.js.map +1 -0
  499. templates/static/js/prism-lang.prism-haxe.764896bd.chunk.js +2 -0
  500. templates/static/js/prism-lang.prism-haxe.764896bd.chunk.js.map +1 -0
  501. templates/static/js/prism-lang.prism-hcl-min.b1c65ad8.chunk.js +2 -0
  502. templates/static/js/prism-lang.prism-hcl-min.b1c65ad8.chunk.js.map +1 -0
  503. templates/static/js/prism-lang.prism-hcl.15f30dc5.chunk.js +2 -0
  504. templates/static/js/prism-lang.prism-hcl.15f30dc5.chunk.js.map +1 -0
  505. templates/static/js/prism-lang.prism-hlsl-min.fc91ad33.chunk.js +2 -0
  506. templates/static/js/prism-lang.prism-hlsl-min.fc91ad33.chunk.js.map +1 -0
  507. templates/static/js/prism-lang.prism-hlsl.37c8e85f.chunk.js +2 -0
  508. templates/static/js/prism-lang.prism-hlsl.37c8e85f.chunk.js.map +1 -0
  509. templates/static/js/prism-lang.prism-hoon-min.51ebff9c.chunk.js +2 -0
  510. templates/static/js/prism-lang.prism-hoon-min.51ebff9c.chunk.js.map +1 -0
  511. templates/static/js/prism-lang.prism-hoon.31ca42d7.chunk.js +2 -0
  512. templates/static/js/prism-lang.prism-hoon.31ca42d7.chunk.js.map +1 -0
  513. templates/static/js/prism-lang.prism-hpkp-min.b458562b.chunk.js +2 -0
  514. templates/static/js/prism-lang.prism-hpkp-min.b458562b.chunk.js.map +1 -0
  515. templates/static/js/prism-lang.prism-hpkp.75f17b69.chunk.js +2 -0
  516. templates/static/js/prism-lang.prism-hpkp.75f17b69.chunk.js.map +1 -0
  517. templates/static/js/prism-lang.prism-hsts-min.2ae1e1de.chunk.js +2 -0
  518. templates/static/js/prism-lang.prism-hsts-min.2ae1e1de.chunk.js.map +1 -0
  519. templates/static/js/prism-lang.prism-hsts.ad2de606.chunk.js +2 -0
  520. templates/static/js/prism-lang.prism-hsts.ad2de606.chunk.js.map +1 -0
  521. templates/static/js/prism-lang.prism-http-min.ad650fea.chunk.js +2 -0
  522. templates/static/js/prism-lang.prism-http-min.ad650fea.chunk.js.map +1 -0
  523. templates/static/js/prism-lang.prism-http.83c7381a.chunk.js +2 -0
  524. templates/static/js/prism-lang.prism-http.83c7381a.chunk.js.map +1 -0
  525. templates/static/js/prism-lang.prism-ichigojam-min.70a16b18.chunk.js +2 -0
  526. templates/static/js/prism-lang.prism-ichigojam-min.70a16b18.chunk.js.map +1 -0
  527. templates/static/js/prism-lang.prism-ichigojam.ced37238.chunk.js +2 -0
  528. templates/static/js/prism-lang.prism-ichigojam.ced37238.chunk.js.map +1 -0
  529. templates/static/js/prism-lang.prism-icon-min.6390fa1b.chunk.js +2 -0
  530. templates/static/js/prism-lang.prism-icon-min.6390fa1b.chunk.js.map +1 -0
  531. templates/static/js/prism-lang.prism-icon.1c95fe9a.chunk.js +2 -0
  532. templates/static/js/prism-lang.prism-icon.1c95fe9a.chunk.js.map +1 -0
  533. templates/static/js/prism-lang.prism-icu-message-format-min.c143e2dd.chunk.js +2 -0
  534. templates/static/js/prism-lang.prism-icu-message-format-min.c143e2dd.chunk.js.map +1 -0
  535. templates/static/js/prism-lang.prism-icu-message-format.c107a4ad.chunk.js +2 -0
  536. templates/static/js/prism-lang.prism-icu-message-format.c107a4ad.chunk.js.map +1 -0
  537. templates/static/js/prism-lang.prism-idris-min.37660abf.chunk.js +2 -0
  538. templates/static/js/prism-lang.prism-idris-min.37660abf.chunk.js.map +1 -0
  539. templates/static/js/prism-lang.prism-idris.f4b09da2.chunk.js +2 -0
  540. templates/static/js/prism-lang.prism-idris.f4b09da2.chunk.js.map +1 -0
  541. templates/static/js/prism-lang.prism-iecst-min.812d4a74.chunk.js +2 -0
  542. templates/static/js/prism-lang.prism-iecst-min.812d4a74.chunk.js.map +1 -0
  543. templates/static/js/prism-lang.prism-iecst.f9989790.chunk.js +2 -0
  544. templates/static/js/prism-lang.prism-iecst.f9989790.chunk.js.map +1 -0
  545. templates/static/js/prism-lang.prism-ignore-min.d3a41156.chunk.js +2 -0
  546. templates/static/js/prism-lang.prism-ignore-min.d3a41156.chunk.js.map +1 -0
  547. templates/static/js/prism-lang.prism-ignore.335a137b.chunk.js +2 -0
  548. templates/static/js/prism-lang.prism-ignore.335a137b.chunk.js.map +1 -0
  549. templates/static/js/prism-lang.prism-inform7-min.599a543f.chunk.js +2 -0
  550. templates/static/js/prism-lang.prism-inform7-min.599a543f.chunk.js.map +1 -0
  551. templates/static/js/prism-lang.prism-inform7.f94b6e9c.chunk.js +2 -0
  552. templates/static/js/prism-lang.prism-inform7.f94b6e9c.chunk.js.map +1 -0
  553. templates/static/js/prism-lang.prism-ini-min.0bd38edd.chunk.js +2 -0
  554. templates/static/js/prism-lang.prism-ini-min.0bd38edd.chunk.js.map +1 -0
  555. templates/static/js/prism-lang.prism-ini.327bf041.chunk.js +2 -0
  556. templates/static/js/prism-lang.prism-ini.327bf041.chunk.js.map +1 -0
  557. templates/static/js/prism-lang.prism-io-min.b0704eb9.chunk.js +2 -0
  558. templates/static/js/prism-lang.prism-io-min.b0704eb9.chunk.js.map +1 -0
  559. templates/static/js/prism-lang.prism-io.94ea7141.chunk.js +2 -0
  560. templates/static/js/prism-lang.prism-io.94ea7141.chunk.js.map +1 -0
  561. templates/static/js/prism-lang.prism-j-min.7824ee6a.chunk.js +2 -0
  562. templates/static/js/prism-lang.prism-j-min.7824ee6a.chunk.js.map +1 -0
  563. templates/static/js/prism-lang.prism-j.28358225.chunk.js +2 -0
  564. templates/static/js/prism-lang.prism-j.28358225.chunk.js.map +1 -0
  565. templates/static/js/prism-lang.prism-java-min.746794b9.chunk.js +2 -0
  566. templates/static/js/prism-lang.prism-java-min.746794b9.chunk.js.map +1 -0
  567. templates/static/js/prism-lang.prism-java.afc042e4.chunk.js +2 -0
  568. templates/static/js/prism-lang.prism-java.afc042e4.chunk.js.map +1 -0
  569. templates/static/js/prism-lang.prism-javadoc-min.8d401352.chunk.js +2 -0
  570. templates/static/js/prism-lang.prism-javadoc-min.8d401352.chunk.js.map +1 -0
  571. templates/static/js/prism-lang.prism-javadoc.20844397.chunk.js +2 -0
  572. templates/static/js/prism-lang.prism-javadoc.20844397.chunk.js.map +1 -0
  573. templates/static/js/prism-lang.prism-javadoclike-min.6231c7c7.chunk.js +2 -0
  574. templates/static/js/prism-lang.prism-javadoclike-min.6231c7c7.chunk.js.map +1 -0
  575. templates/static/js/prism-lang.prism-javadoclike.46523b97.chunk.js +2 -0
  576. templates/static/js/prism-lang.prism-javadoclike.46523b97.chunk.js.map +1 -0
  577. templates/static/js/prism-lang.prism-javascript-min.da684c96.chunk.js +2 -0
  578. templates/static/js/prism-lang.prism-javascript-min.da684c96.chunk.js.map +1 -0
  579. templates/static/js/prism-lang.prism-javascript.067de2d5.chunk.js +2 -0
  580. templates/static/js/prism-lang.prism-javascript.067de2d5.chunk.js.map +1 -0
  581. templates/static/js/prism-lang.prism-javastacktrace-min.e193df83.chunk.js +2 -0
  582. templates/static/js/prism-lang.prism-javastacktrace-min.e193df83.chunk.js.map +1 -0
  583. templates/static/js/prism-lang.prism-javastacktrace.71bc6414.chunk.js +2 -0
  584. templates/static/js/prism-lang.prism-javastacktrace.71bc6414.chunk.js.map +1 -0
  585. templates/static/js/prism-lang.prism-jexl-min.fe2ad901.chunk.js +2 -0
  586. templates/static/js/prism-lang.prism-jexl-min.fe2ad901.chunk.js.map +1 -0
  587. templates/static/js/prism-lang.prism-jexl.789932eb.chunk.js +2 -0
  588. templates/static/js/prism-lang.prism-jexl.789932eb.chunk.js.map +1 -0
  589. templates/static/js/prism-lang.prism-jolie-min.f3166ea4.chunk.js +2 -0
  590. templates/static/js/prism-lang.prism-jolie-min.f3166ea4.chunk.js.map +1 -0
  591. templates/static/js/prism-lang.prism-jolie.c2c35e8d.chunk.js +2 -0
  592. templates/static/js/prism-lang.prism-jolie.c2c35e8d.chunk.js.map +1 -0
  593. templates/static/js/prism-lang.prism-jq-min.7ee05fa6.chunk.js +2 -0
  594. templates/static/js/prism-lang.prism-jq-min.7ee05fa6.chunk.js.map +1 -0
  595. templates/static/js/prism-lang.prism-jq.66e92f60.chunk.js +2 -0
  596. templates/static/js/prism-lang.prism-jq.66e92f60.chunk.js.map +1 -0
  597. templates/static/js/prism-lang.prism-js-extras-min.914370ee.chunk.js +2 -0
  598. templates/static/js/prism-lang.prism-js-extras-min.914370ee.chunk.js.map +1 -0
  599. templates/static/js/prism-lang.prism-js-extras.0d324e5e.chunk.js +2 -0
  600. templates/static/js/prism-lang.prism-js-extras.0d324e5e.chunk.js.map +1 -0
  601. templates/static/js/prism-lang.prism-js-templates-min.25bd69c7.chunk.js +2 -0
  602. templates/static/js/prism-lang.prism-js-templates-min.25bd69c7.chunk.js.map +1 -0
  603. templates/static/js/prism-lang.prism-js-templates.7df73cbc.chunk.js +2 -0
  604. templates/static/js/prism-lang.prism-js-templates.7df73cbc.chunk.js.map +1 -0
  605. templates/static/js/prism-lang.prism-jsdoc-min.b5c1a957.chunk.js +2 -0
  606. templates/static/js/prism-lang.prism-jsdoc-min.b5c1a957.chunk.js.map +1 -0
  607. templates/static/js/prism-lang.prism-jsdoc.b9878b49.chunk.js +2 -0
  608. templates/static/js/prism-lang.prism-jsdoc.b9878b49.chunk.js.map +1 -0
  609. templates/static/js/prism-lang.prism-json-min.eb7ed7e5.chunk.js +2 -0
  610. templates/static/js/prism-lang.prism-json-min.eb7ed7e5.chunk.js.map +1 -0
  611. templates/static/js/prism-lang.prism-json.66c7b006.chunk.js +2 -0
  612. templates/static/js/prism-lang.prism-json.66c7b006.chunk.js.map +1 -0
  613. templates/static/js/prism-lang.prism-json5-min.5aa59492.chunk.js +2 -0
  614. templates/static/js/prism-lang.prism-json5-min.5aa59492.chunk.js.map +1 -0
  615. templates/static/js/prism-lang.prism-json5.8a3d3c6a.chunk.js +2 -0
  616. templates/static/js/prism-lang.prism-json5.8a3d3c6a.chunk.js.map +1 -0
  617. templates/static/js/prism-lang.prism-jsonp-min.0b247549.chunk.js +2 -0
  618. templates/static/js/prism-lang.prism-jsonp-min.0b247549.chunk.js.map +1 -0
  619. templates/static/js/prism-lang.prism-jsonp.f17fc6cc.chunk.js +2 -0
  620. templates/static/js/prism-lang.prism-jsonp.f17fc6cc.chunk.js.map +1 -0
  621. templates/static/js/prism-lang.prism-jsstacktrace-min.e2b92805.chunk.js +2 -0
  622. templates/static/js/prism-lang.prism-jsstacktrace-min.e2b92805.chunk.js.map +1 -0
  623. templates/static/js/prism-lang.prism-jsstacktrace.6c5f50f4.chunk.js +2 -0
  624. templates/static/js/prism-lang.prism-jsstacktrace.6c5f50f4.chunk.js.map +1 -0
  625. templates/static/js/prism-lang.prism-jsx-min.6a0b1bba.chunk.js +2 -0
  626. templates/static/js/prism-lang.prism-jsx-min.6a0b1bba.chunk.js.map +1 -0
  627. templates/static/js/prism-lang.prism-jsx.24c9a5ea.chunk.js +2 -0
  628. templates/static/js/prism-lang.prism-jsx.24c9a5ea.chunk.js.map +1 -0
  629. templates/static/js/prism-lang.prism-julia-min.14a95223.chunk.js +2 -0
  630. templates/static/js/prism-lang.prism-julia-min.14a95223.chunk.js.map +1 -0
  631. templates/static/js/prism-lang.prism-julia.752566b7.chunk.js +2 -0
  632. templates/static/js/prism-lang.prism-julia.752566b7.chunk.js.map +1 -0
  633. templates/static/js/prism-lang.prism-keepalived-min.e9b783c8.chunk.js +2 -0
  634. templates/static/js/prism-lang.prism-keepalived-min.e9b783c8.chunk.js.map +1 -0
  635. templates/static/js/prism-lang.prism-keepalived.869caf58.chunk.js +2 -0
  636. templates/static/js/prism-lang.prism-keepalived.869caf58.chunk.js.map +1 -0
  637. templates/static/js/prism-lang.prism-keyman-min.1be52fc9.chunk.js +2 -0
  638. templates/static/js/prism-lang.prism-keyman-min.1be52fc9.chunk.js.map +1 -0
  639. templates/static/js/prism-lang.prism-keyman.f973c00f.chunk.js +2 -0
  640. templates/static/js/prism-lang.prism-keyman.f973c00f.chunk.js.map +1 -0
  641. templates/static/js/prism-lang.prism-kotlin-min.7fbecdf6.chunk.js +2 -0
  642. templates/static/js/prism-lang.prism-kotlin-min.7fbecdf6.chunk.js.map +1 -0
  643. templates/static/js/prism-lang.prism-kotlin.cb0aa18e.chunk.js +2 -0
  644. templates/static/js/prism-lang.prism-kotlin.cb0aa18e.chunk.js.map +1 -0
  645. templates/static/js/prism-lang.prism-kumir-min.8671853f.chunk.js +2 -0
  646. templates/static/js/prism-lang.prism-kumir-min.8671853f.chunk.js.map +1 -0
  647. templates/static/js/prism-lang.prism-kumir.caf4815a.chunk.js +2 -0
  648. templates/static/js/prism-lang.prism-kumir.caf4815a.chunk.js.map +1 -0
  649. templates/static/js/prism-lang.prism-kusto-min.440692b6.chunk.js +2 -0
  650. templates/static/js/prism-lang.prism-kusto-min.440692b6.chunk.js.map +1 -0
  651. templates/static/js/prism-lang.prism-kusto.16750127.chunk.js +2 -0
  652. templates/static/js/prism-lang.prism-kusto.16750127.chunk.js.map +1 -0
  653. templates/static/js/prism-lang.prism-latex-min.231e73c9.chunk.js +2 -0
  654. templates/static/js/prism-lang.prism-latex-min.231e73c9.chunk.js.map +1 -0
  655. templates/static/js/prism-lang.prism-latex.a52b5582.chunk.js +2 -0
  656. templates/static/js/prism-lang.prism-latex.a52b5582.chunk.js.map +1 -0
  657. templates/static/js/prism-lang.prism-latte-min.045104dd.chunk.js +2 -0
  658. templates/static/js/prism-lang.prism-latte-min.045104dd.chunk.js.map +1 -0
  659. templates/static/js/prism-lang.prism-latte.80c8e304.chunk.js +2 -0
  660. templates/static/js/prism-lang.prism-latte.80c8e304.chunk.js.map +1 -0
  661. templates/static/js/prism-lang.prism-less-min.a5e2284b.chunk.js +2 -0
  662. templates/static/js/prism-lang.prism-less-min.a5e2284b.chunk.js.map +1 -0
  663. templates/static/js/prism-lang.prism-less.48f5f982.chunk.js +2 -0
  664. templates/static/js/prism-lang.prism-less.48f5f982.chunk.js.map +1 -0
  665. templates/static/js/prism-lang.prism-lilypond-min.f5dcfab7.chunk.js +2 -0
  666. templates/static/js/prism-lang.prism-lilypond-min.f5dcfab7.chunk.js.map +1 -0
  667. templates/static/js/prism-lang.prism-lilypond.3a28a8d8.chunk.js +2 -0
  668. templates/static/js/prism-lang.prism-lilypond.3a28a8d8.chunk.js.map +1 -0
  669. templates/static/js/prism-lang.prism-linker-script-min.9abfeaf9.chunk.js +2 -0
  670. templates/static/js/prism-lang.prism-linker-script-min.9abfeaf9.chunk.js.map +1 -0
  671. templates/static/js/prism-lang.prism-linker-script.e55ecfeb.chunk.js +2 -0
  672. templates/static/js/prism-lang.prism-linker-script.e55ecfeb.chunk.js.map +1 -0
  673. templates/static/js/prism-lang.prism-liquid-min.3413cae5.chunk.js +2 -0
  674. templates/static/js/prism-lang.prism-liquid-min.3413cae5.chunk.js.map +1 -0
  675. templates/static/js/prism-lang.prism-liquid.41e5e081.chunk.js +2 -0
  676. templates/static/js/prism-lang.prism-liquid.41e5e081.chunk.js.map +1 -0
  677. templates/static/js/prism-lang.prism-lisp-min.62a51474.chunk.js +2 -0
  678. templates/static/js/prism-lang.prism-lisp-min.62a51474.chunk.js.map +1 -0
  679. templates/static/js/prism-lang.prism-lisp.fd93779f.chunk.js +2 -0
  680. templates/static/js/prism-lang.prism-lisp.fd93779f.chunk.js.map +1 -0
  681. templates/static/js/prism-lang.prism-livescript-min.43325730.chunk.js +2 -0
  682. templates/static/js/prism-lang.prism-livescript-min.43325730.chunk.js.map +1 -0
  683. templates/static/js/prism-lang.prism-livescript.13577a29.chunk.js +2 -0
  684. templates/static/js/prism-lang.prism-livescript.13577a29.chunk.js.map +1 -0
  685. templates/static/js/prism-lang.prism-llvm-min.b421daf5.chunk.js +2 -0
  686. templates/static/js/prism-lang.prism-llvm-min.b421daf5.chunk.js.map +1 -0
  687. templates/static/js/prism-lang.prism-llvm.4e0ee5cb.chunk.js +2 -0
  688. templates/static/js/prism-lang.prism-llvm.4e0ee5cb.chunk.js.map +1 -0
  689. templates/static/js/prism-lang.prism-log-min.f7eac1f6.chunk.js +2 -0
  690. templates/static/js/prism-lang.prism-log-min.f7eac1f6.chunk.js.map +1 -0
  691. templates/static/js/prism-lang.prism-log.2f9f930e.chunk.js +2 -0
  692. templates/static/js/prism-lang.prism-log.2f9f930e.chunk.js.map +1 -0
  693. templates/static/js/prism-lang.prism-lolcode-min.e4aae47f.chunk.js +2 -0
  694. templates/static/js/prism-lang.prism-lolcode-min.e4aae47f.chunk.js.map +1 -0
  695. templates/static/js/prism-lang.prism-lolcode.e3df3c09.chunk.js +2 -0
  696. templates/static/js/prism-lang.prism-lolcode.e3df3c09.chunk.js.map +1 -0
  697. templates/static/js/prism-lang.prism-lua-min.48df0f01.chunk.js +2 -0
  698. templates/static/js/prism-lang.prism-lua-min.48df0f01.chunk.js.map +1 -0
  699. templates/static/js/prism-lang.prism-lua.d1797f23.chunk.js +2 -0
  700. templates/static/js/prism-lang.prism-lua.d1797f23.chunk.js.map +1 -0
  701. templates/static/js/prism-lang.prism-magma-min.f6d85152.chunk.js +2 -0
  702. templates/static/js/prism-lang.prism-magma-min.f6d85152.chunk.js.map +1 -0
  703. templates/static/js/prism-lang.prism-magma.9ebba92b.chunk.js +2 -0
  704. templates/static/js/prism-lang.prism-magma.9ebba92b.chunk.js.map +1 -0
  705. templates/static/js/prism-lang.prism-makefile-min.bb1b1c1b.chunk.js +2 -0
  706. templates/static/js/prism-lang.prism-makefile-min.bb1b1c1b.chunk.js.map +1 -0
  707. templates/static/js/prism-lang.prism-makefile.e9e524b0.chunk.js +2 -0
  708. templates/static/js/prism-lang.prism-makefile.e9e524b0.chunk.js.map +1 -0
  709. templates/static/js/prism-lang.prism-markdown-min.da04eca2.chunk.js +2 -0
  710. templates/static/js/prism-lang.prism-markdown-min.da04eca2.chunk.js.map +1 -0
  711. templates/static/js/prism-lang.prism-markdown.4ff5b11c.chunk.js +2 -0
  712. templates/static/js/prism-lang.prism-markdown.4ff5b11c.chunk.js.map +1 -0
  713. templates/static/js/prism-lang.prism-markup-min.707fa0d3.chunk.js +2 -0
  714. templates/static/js/prism-lang.prism-markup-min.707fa0d3.chunk.js.map +1 -0
  715. templates/static/js/prism-lang.prism-markup-templating-min.2e1499ac.chunk.js +2 -0
  716. templates/static/js/prism-lang.prism-markup-templating-min.2e1499ac.chunk.js.map +1 -0
  717. templates/static/js/prism-lang.prism-markup-templating.ad9c4fa4.chunk.js +2 -0
  718. templates/static/js/prism-lang.prism-markup-templating.ad9c4fa4.chunk.js.map +1 -0
  719. templates/static/js/prism-lang.prism-markup.bb17b142.chunk.js +2 -0
  720. templates/static/js/prism-lang.prism-markup.bb17b142.chunk.js.map +1 -0
  721. templates/static/js/prism-lang.prism-mata-min.1ce39616.chunk.js +2 -0
  722. templates/static/js/prism-lang.prism-mata-min.1ce39616.chunk.js.map +1 -0
  723. templates/static/js/prism-lang.prism-mata.c45e1c73.chunk.js +2 -0
  724. templates/static/js/prism-lang.prism-mata.c45e1c73.chunk.js.map +1 -0
  725. templates/static/js/prism-lang.prism-matlab-min.5d79975c.chunk.js +2 -0
  726. templates/static/js/prism-lang.prism-matlab-min.5d79975c.chunk.js.map +1 -0
  727. templates/static/js/prism-lang.prism-matlab.abe963df.chunk.js +2 -0
  728. templates/static/js/prism-lang.prism-matlab.abe963df.chunk.js.map +1 -0
  729. templates/static/js/prism-lang.prism-maxscript-min.056931c5.chunk.js +2 -0
  730. templates/static/js/prism-lang.prism-maxscript-min.056931c5.chunk.js.map +1 -0
  731. templates/static/js/prism-lang.prism-maxscript.04352a9d.chunk.js +2 -0
  732. templates/static/js/prism-lang.prism-maxscript.04352a9d.chunk.js.map +1 -0
  733. templates/static/js/prism-lang.prism-mel-min.77b1563b.chunk.js +2 -0
  734. templates/static/js/prism-lang.prism-mel-min.77b1563b.chunk.js.map +1 -0
  735. templates/static/js/prism-lang.prism-mel.a7c2161e.chunk.js +2 -0
  736. templates/static/js/prism-lang.prism-mel.a7c2161e.chunk.js.map +1 -0
  737. templates/static/js/prism-lang.prism-mermaid-min.235ac98f.chunk.js +2 -0
  738. templates/static/js/prism-lang.prism-mermaid-min.235ac98f.chunk.js.map +1 -0
  739. templates/static/js/prism-lang.prism-mermaid.ae6cf068.chunk.js +2 -0
  740. templates/static/js/prism-lang.prism-mermaid.ae6cf068.chunk.js.map +1 -0
  741. templates/static/js/prism-lang.prism-metafont-min.18572292.chunk.js +2 -0
  742. templates/static/js/prism-lang.prism-metafont-min.18572292.chunk.js.map +1 -0
  743. templates/static/js/prism-lang.prism-metafont.28e7e134.chunk.js +2 -0
  744. templates/static/js/prism-lang.prism-metafont.28e7e134.chunk.js.map +1 -0
  745. templates/static/js/prism-lang.prism-mizar-min.3520146c.chunk.js +2 -0
  746. templates/static/js/prism-lang.prism-mizar-min.3520146c.chunk.js.map +1 -0
  747. templates/static/js/prism-lang.prism-mizar.7bbde71b.chunk.js +2 -0
  748. templates/static/js/prism-lang.prism-mizar.7bbde71b.chunk.js.map +1 -0
  749. templates/static/js/prism-lang.prism-mongodb-min.1ebea930.chunk.js +2 -0
  750. templates/static/js/prism-lang.prism-mongodb-min.1ebea930.chunk.js.map +1 -0
  751. templates/static/js/prism-lang.prism-mongodb.42c6759b.chunk.js +2 -0
  752. templates/static/js/prism-lang.prism-mongodb.42c6759b.chunk.js.map +1 -0
  753. templates/static/js/prism-lang.prism-monkey-min.c587dd2b.chunk.js +2 -0
  754. templates/static/js/prism-lang.prism-monkey-min.c587dd2b.chunk.js.map +1 -0
  755. templates/static/js/prism-lang.prism-monkey.09e7fd9e.chunk.js +2 -0
  756. templates/static/js/prism-lang.prism-monkey.09e7fd9e.chunk.js.map +1 -0
  757. templates/static/js/prism-lang.prism-moonscript-min.ef5cd0fe.chunk.js +2 -0
  758. templates/static/js/prism-lang.prism-moonscript-min.ef5cd0fe.chunk.js.map +1 -0
  759. templates/static/js/prism-lang.prism-moonscript.08bf2206.chunk.js +2 -0
  760. templates/static/js/prism-lang.prism-moonscript.08bf2206.chunk.js.map +1 -0
  761. templates/static/js/prism-lang.prism-n1ql-min.87bdcc49.chunk.js +2 -0
  762. templates/static/js/prism-lang.prism-n1ql-min.87bdcc49.chunk.js.map +1 -0
  763. templates/static/js/prism-lang.prism-n1ql.98760078.chunk.js +2 -0
  764. templates/static/js/prism-lang.prism-n1ql.98760078.chunk.js.map +1 -0
  765. templates/static/js/prism-lang.prism-n4js-min.6fbcedef.chunk.js +2 -0
  766. templates/static/js/prism-lang.prism-n4js-min.6fbcedef.chunk.js.map +1 -0
  767. templates/static/js/prism-lang.prism-n4js.5370b944.chunk.js +2 -0
  768. templates/static/js/prism-lang.prism-n4js.5370b944.chunk.js.map +1 -0
  769. templates/static/js/prism-lang.prism-nand2tetris-hdl-min.bc9e8cc4.chunk.js +2 -0
  770. templates/static/js/prism-lang.prism-nand2tetris-hdl-min.bc9e8cc4.chunk.js.map +1 -0
  771. templates/static/js/prism-lang.prism-nand2tetris-hdl.3ec27498.chunk.js +2 -0
  772. templates/static/js/prism-lang.prism-nand2tetris-hdl.3ec27498.chunk.js.map +1 -0
  773. templates/static/js/prism-lang.prism-naniscript-min.2a4d2e26.chunk.js +2 -0
  774. templates/static/js/prism-lang.prism-naniscript-min.2a4d2e26.chunk.js.map +1 -0
  775. templates/static/js/prism-lang.prism-naniscript.bb16b5f3.chunk.js +2 -0
  776. templates/static/js/prism-lang.prism-naniscript.bb16b5f3.chunk.js.map +1 -0
  777. templates/static/js/prism-lang.prism-nasm-min.bbea424d.chunk.js +2 -0
  778. templates/static/js/prism-lang.prism-nasm-min.bbea424d.chunk.js.map +1 -0
  779. templates/static/js/prism-lang.prism-nasm.0934991e.chunk.js +2 -0
  780. templates/static/js/prism-lang.prism-nasm.0934991e.chunk.js.map +1 -0
  781. templates/static/js/prism-lang.prism-neon-min.f1103bd5.chunk.js +2 -0
  782. templates/static/js/prism-lang.prism-neon-min.f1103bd5.chunk.js.map +1 -0
  783. templates/static/js/prism-lang.prism-neon.6f17d108.chunk.js +2 -0
  784. templates/static/js/prism-lang.prism-neon.6f17d108.chunk.js.map +1 -0
  785. templates/static/js/prism-lang.prism-nevod-min.aa57eaa6.chunk.js +2 -0
  786. templates/static/js/prism-lang.prism-nevod-min.aa57eaa6.chunk.js.map +1 -0
  787. templates/static/js/prism-lang.prism-nevod.7e9eea02.chunk.js +2 -0
  788. templates/static/js/prism-lang.prism-nevod.7e9eea02.chunk.js.map +1 -0
  789. templates/static/js/prism-lang.prism-nginx-min.c78d1167.chunk.js +2 -0
  790. templates/static/js/prism-lang.prism-nginx-min.c78d1167.chunk.js.map +1 -0
  791. templates/static/js/prism-lang.prism-nginx.3084a116.chunk.js +2 -0
  792. templates/static/js/prism-lang.prism-nginx.3084a116.chunk.js.map +1 -0
  793. templates/static/js/prism-lang.prism-nim-min.041a46d6.chunk.js +2 -0
  794. templates/static/js/prism-lang.prism-nim-min.041a46d6.chunk.js.map +1 -0
  795. templates/static/js/prism-lang.prism-nim.83667ea3.chunk.js +2 -0
  796. templates/static/js/prism-lang.prism-nim.83667ea3.chunk.js.map +1 -0
  797. templates/static/js/prism-lang.prism-nix-min.2711e56c.chunk.js +2 -0
  798. templates/static/js/prism-lang.prism-nix-min.2711e56c.chunk.js.map +1 -0
  799. templates/static/js/prism-lang.prism-nix.0095737c.chunk.js +2 -0
  800. templates/static/js/prism-lang.prism-nix.0095737c.chunk.js.map +1 -0
  801. templates/static/js/prism-lang.prism-nsis-min.409b04bb.chunk.js +2 -0
  802. templates/static/js/prism-lang.prism-nsis-min.409b04bb.chunk.js.map +1 -0
  803. templates/static/js/prism-lang.prism-nsis.7b3a8423.chunk.js +2 -0
  804. templates/static/js/prism-lang.prism-nsis.7b3a8423.chunk.js.map +1 -0
  805. templates/static/js/prism-lang.prism-objectivec-min.73ff0bfc.chunk.js +2 -0
  806. templates/static/js/prism-lang.prism-objectivec-min.73ff0bfc.chunk.js.map +1 -0
  807. templates/static/js/prism-lang.prism-objectivec.212fdc6f.chunk.js +2 -0
  808. templates/static/js/prism-lang.prism-objectivec.212fdc6f.chunk.js.map +1 -0
  809. templates/static/js/prism-lang.prism-ocaml-min.5fe31bd0.chunk.js +2 -0
  810. templates/static/js/prism-lang.prism-ocaml-min.5fe31bd0.chunk.js.map +1 -0
  811. templates/static/js/prism-lang.prism-ocaml.7e69c02f.chunk.js +2 -0
  812. templates/static/js/prism-lang.prism-ocaml.7e69c02f.chunk.js.map +1 -0
  813. templates/static/js/prism-lang.prism-odin-min.434dfea9.chunk.js +2 -0
  814. templates/static/js/prism-lang.prism-odin-min.434dfea9.chunk.js.map +1 -0
  815. templates/static/js/prism-lang.prism-odin.95d25af4.chunk.js +2 -0
  816. templates/static/js/prism-lang.prism-odin.95d25af4.chunk.js.map +1 -0
  817. templates/static/js/prism-lang.prism-opencl-min.1a1d1e75.chunk.js +2 -0
  818. templates/static/js/prism-lang.prism-opencl-min.1a1d1e75.chunk.js.map +1 -0
  819. templates/static/js/prism-lang.prism-opencl.75bd9d1c.chunk.js +2 -0
  820. templates/static/js/prism-lang.prism-opencl.75bd9d1c.chunk.js.map +1 -0
  821. templates/static/js/prism-lang.prism-openqasm-min.58400273.chunk.js +2 -0
  822. templates/static/js/prism-lang.prism-openqasm-min.58400273.chunk.js.map +1 -0
  823. templates/static/js/prism-lang.prism-openqasm.33fc71f4.chunk.js +2 -0
  824. templates/static/js/prism-lang.prism-openqasm.33fc71f4.chunk.js.map +1 -0
  825. templates/static/js/prism-lang.prism-oz-min.62eb2f85.chunk.js +2 -0
  826. templates/static/js/prism-lang.prism-oz-min.62eb2f85.chunk.js.map +1 -0
  827. templates/static/js/prism-lang.prism-oz.b01a4b07.chunk.js +2 -0
  828. templates/static/js/prism-lang.prism-oz.b01a4b07.chunk.js.map +1 -0
  829. templates/static/js/prism-lang.prism-parigp-min.9f8edd2b.chunk.js +2 -0
  830. templates/static/js/prism-lang.prism-parigp-min.9f8edd2b.chunk.js.map +1 -0
  831. templates/static/js/prism-lang.prism-parigp.8613be48.chunk.js +2 -0
  832. templates/static/js/prism-lang.prism-parigp.8613be48.chunk.js.map +1 -0
  833. templates/static/js/prism-lang.prism-parser-min.a03633dc.chunk.js +2 -0
  834. templates/static/js/prism-lang.prism-parser-min.a03633dc.chunk.js.map +1 -0
  835. templates/static/js/prism-lang.prism-parser.be152df5.chunk.js +2 -0
  836. templates/static/js/prism-lang.prism-parser.be152df5.chunk.js.map +1 -0
  837. templates/static/js/prism-lang.prism-pascal-min.18294099.chunk.js +2 -0
  838. templates/static/js/prism-lang.prism-pascal-min.18294099.chunk.js.map +1 -0
  839. templates/static/js/prism-lang.prism-pascal.0f0ea939.chunk.js +2 -0
  840. templates/static/js/prism-lang.prism-pascal.0f0ea939.chunk.js.map +1 -0
  841. templates/static/js/prism-lang.prism-pascaligo-min.890b2126.chunk.js +2 -0
  842. templates/static/js/prism-lang.prism-pascaligo-min.890b2126.chunk.js.map +1 -0
  843. templates/static/js/prism-lang.prism-pascaligo.d6799c75.chunk.js +2 -0
  844. templates/static/js/prism-lang.prism-pascaligo.d6799c75.chunk.js.map +1 -0
  845. templates/static/js/prism-lang.prism-pcaxis-min.335cfdb6.chunk.js +2 -0
  846. templates/static/js/prism-lang.prism-pcaxis-min.335cfdb6.chunk.js.map +1 -0
  847. templates/static/js/prism-lang.prism-pcaxis.c29cac71.chunk.js +2 -0
  848. templates/static/js/prism-lang.prism-pcaxis.c29cac71.chunk.js.map +1 -0
  849. templates/static/js/prism-lang.prism-peoplecode-min.4639e347.chunk.js +2 -0
  850. templates/static/js/prism-lang.prism-peoplecode-min.4639e347.chunk.js.map +1 -0
  851. templates/static/js/prism-lang.prism-peoplecode.0f4f4265.chunk.js +2 -0
  852. templates/static/js/prism-lang.prism-peoplecode.0f4f4265.chunk.js.map +1 -0
  853. templates/static/js/prism-lang.prism-perl-min.1f6104eb.chunk.js +2 -0
  854. templates/static/js/prism-lang.prism-perl-min.1f6104eb.chunk.js.map +1 -0
  855. templates/static/js/prism-lang.prism-perl.74c2be3b.chunk.js +2 -0
  856. templates/static/js/prism-lang.prism-perl.74c2be3b.chunk.js.map +1 -0
  857. templates/static/js/prism-lang.prism-php-extras-min.cf65cb04.chunk.js +2 -0
  858. templates/static/js/prism-lang.prism-php-extras-min.cf65cb04.chunk.js.map +1 -0
  859. templates/static/js/prism-lang.prism-php-extras.2737d254.chunk.js +2 -0
  860. templates/static/js/prism-lang.prism-php-extras.2737d254.chunk.js.map +1 -0
  861. templates/static/js/prism-lang.prism-php-min.8f54fe81.chunk.js +2 -0
  862. templates/static/js/prism-lang.prism-php-min.8f54fe81.chunk.js.map +1 -0
  863. templates/static/js/prism-lang.prism-php.1eec6e9f.chunk.js +2 -0
  864. templates/static/js/prism-lang.prism-php.1eec6e9f.chunk.js.map +1 -0
  865. templates/static/js/prism-lang.prism-phpdoc-min.6067ec7a.chunk.js +2 -0
  866. templates/static/js/prism-lang.prism-phpdoc-min.6067ec7a.chunk.js.map +1 -0
  867. templates/static/js/prism-lang.prism-phpdoc.2870f158.chunk.js +2 -0
  868. templates/static/js/prism-lang.prism-phpdoc.2870f158.chunk.js.map +1 -0
  869. templates/static/js/prism-lang.prism-plant-uml-min.d86737b0.chunk.js +2 -0
  870. templates/static/js/prism-lang.prism-plant-uml-min.d86737b0.chunk.js.map +1 -0
  871. templates/static/js/prism-lang.prism-plant-uml.ef75482b.chunk.js +2 -0
  872. templates/static/js/prism-lang.prism-plant-uml.ef75482b.chunk.js.map +1 -0
  873. templates/static/js/prism-lang.prism-plsql-min.a0dd122e.chunk.js +2 -0
  874. templates/static/js/prism-lang.prism-plsql-min.a0dd122e.chunk.js.map +1 -0
  875. templates/static/js/prism-lang.prism-plsql.da10fc6d.chunk.js +2 -0
  876. templates/static/js/prism-lang.prism-plsql.da10fc6d.chunk.js.map +1 -0
  877. templates/static/js/prism-lang.prism-powerquery-min.bc2067ab.chunk.js +2 -0
  878. templates/static/js/prism-lang.prism-powerquery-min.bc2067ab.chunk.js.map +1 -0
  879. templates/static/js/prism-lang.prism-powerquery.c60f7c38.chunk.js +2 -0
  880. templates/static/js/prism-lang.prism-powerquery.c60f7c38.chunk.js.map +1 -0
  881. templates/static/js/prism-lang.prism-powershell-min.b0265d38.chunk.js +2 -0
  882. templates/static/js/prism-lang.prism-powershell-min.b0265d38.chunk.js.map +1 -0
  883. templates/static/js/prism-lang.prism-powershell.1445cd48.chunk.js +2 -0
  884. templates/static/js/prism-lang.prism-powershell.1445cd48.chunk.js.map +1 -0
  885. templates/static/js/prism-lang.prism-processing-min.bc2540c3.chunk.js +2 -0
  886. templates/static/js/prism-lang.prism-processing-min.bc2540c3.chunk.js.map +1 -0
  887. templates/static/js/prism-lang.prism-processing.035ea667.chunk.js +2 -0
  888. templates/static/js/prism-lang.prism-processing.035ea667.chunk.js.map +1 -0
  889. templates/static/js/prism-lang.prism-prolog-min.fb4b9a79.chunk.js +2 -0
  890. templates/static/js/prism-lang.prism-prolog-min.fb4b9a79.chunk.js.map +1 -0
  891. templates/static/js/prism-lang.prism-prolog.bb2c5272.chunk.js +2 -0
  892. templates/static/js/prism-lang.prism-prolog.bb2c5272.chunk.js.map +1 -0
  893. templates/static/js/prism-lang.prism-promql-min.9646da0a.chunk.js +2 -0
  894. templates/static/js/prism-lang.prism-promql-min.9646da0a.chunk.js.map +1 -0
  895. templates/static/js/prism-lang.prism-promql.abf08253.chunk.js +2 -0
  896. templates/static/js/prism-lang.prism-promql.abf08253.chunk.js.map +1 -0
  897. templates/static/js/prism-lang.prism-properties-min.fee5d65f.chunk.js +2 -0
  898. templates/static/js/prism-lang.prism-properties-min.fee5d65f.chunk.js.map +1 -0
  899. templates/static/js/prism-lang.prism-properties.010918af.chunk.js +2 -0
  900. templates/static/js/prism-lang.prism-properties.010918af.chunk.js.map +1 -0
  901. templates/static/js/prism-lang.prism-protobuf-min.63e69574.chunk.js +2 -0
  902. templates/static/js/prism-lang.prism-protobuf-min.63e69574.chunk.js.map +1 -0
  903. templates/static/js/prism-lang.prism-protobuf.19123c74.chunk.js +2 -0
  904. templates/static/js/prism-lang.prism-protobuf.19123c74.chunk.js.map +1 -0
  905. templates/static/js/prism-lang.prism-psl-min.a244c98d.chunk.js +2 -0
  906. templates/static/js/prism-lang.prism-psl-min.a244c98d.chunk.js.map +1 -0
  907. templates/static/js/prism-lang.prism-psl.cb00a93f.chunk.js +2 -0
  908. templates/static/js/prism-lang.prism-psl.cb00a93f.chunk.js.map +1 -0
  909. templates/static/js/prism-lang.prism-pug-min.f5d4aa1a.chunk.js +2 -0
  910. templates/static/js/prism-lang.prism-pug-min.f5d4aa1a.chunk.js.map +1 -0
  911. templates/static/js/prism-lang.prism-pug.6b10387c.chunk.js +2 -0
  912. templates/static/js/prism-lang.prism-pug.6b10387c.chunk.js.map +1 -0
  913. templates/static/js/prism-lang.prism-puppet-min.4c1f6aa7.chunk.js +2 -0
  914. templates/static/js/prism-lang.prism-puppet-min.4c1f6aa7.chunk.js.map +1 -0
  915. templates/static/js/prism-lang.prism-puppet.ef52ad7c.chunk.js +2 -0
  916. templates/static/js/prism-lang.prism-puppet.ef52ad7c.chunk.js.map +1 -0
  917. templates/static/js/prism-lang.prism-pure-min.857be82f.chunk.js +2 -0
  918. templates/static/js/prism-lang.prism-pure-min.857be82f.chunk.js.map +1 -0
  919. templates/static/js/prism-lang.prism-pure.0c7d2a18.chunk.js +2 -0
  920. templates/static/js/prism-lang.prism-pure.0c7d2a18.chunk.js.map +1 -0
  921. templates/static/js/prism-lang.prism-purebasic-min.8c10b08d.chunk.js +2 -0
  922. templates/static/js/prism-lang.prism-purebasic-min.8c10b08d.chunk.js.map +1 -0
  923. templates/static/js/prism-lang.prism-purebasic.4c787c6b.chunk.js +2 -0
  924. templates/static/js/prism-lang.prism-purebasic.4c787c6b.chunk.js.map +1 -0
  925. templates/static/js/prism-lang.prism-purescript-min.8066c6b1.chunk.js +2 -0
  926. templates/static/js/prism-lang.prism-purescript-min.8066c6b1.chunk.js.map +1 -0
  927. templates/static/js/prism-lang.prism-purescript.f9970c7d.chunk.js +2 -0
  928. templates/static/js/prism-lang.prism-purescript.f9970c7d.chunk.js.map +1 -0
  929. templates/static/js/prism-lang.prism-python-min.0bc604c2.chunk.js +2 -0
  930. templates/static/js/prism-lang.prism-python-min.0bc604c2.chunk.js.map +1 -0
  931. templates/static/js/prism-lang.prism-python.4b6baa55.chunk.js +2 -0
  932. templates/static/js/prism-lang.prism-python.4b6baa55.chunk.js.map +1 -0
  933. templates/static/js/prism-lang.prism-q-min.b7182dfa.chunk.js +2 -0
  934. templates/static/js/prism-lang.prism-q-min.b7182dfa.chunk.js.map +1 -0
  935. templates/static/js/prism-lang.prism-q.ded7eb21.chunk.js +2 -0
  936. templates/static/js/prism-lang.prism-q.ded7eb21.chunk.js.map +1 -0
  937. templates/static/js/prism-lang.prism-qml-min.4749a93a.chunk.js +2 -0
  938. templates/static/js/prism-lang.prism-qml-min.4749a93a.chunk.js.map +1 -0
  939. templates/static/js/prism-lang.prism-qml.78184977.chunk.js +2 -0
  940. templates/static/js/prism-lang.prism-qml.78184977.chunk.js.map +1 -0
  941. templates/static/js/prism-lang.prism-qore-min.cb501642.chunk.js +2 -0
  942. templates/static/js/prism-lang.prism-qore-min.cb501642.chunk.js.map +1 -0
  943. templates/static/js/prism-lang.prism-qore.33cad9ac.chunk.js +2 -0
  944. templates/static/js/prism-lang.prism-qore.33cad9ac.chunk.js.map +1 -0
  945. templates/static/js/prism-lang.prism-qsharp-min.1c8c9a02.chunk.js +2 -0
  946. templates/static/js/prism-lang.prism-qsharp-min.1c8c9a02.chunk.js.map +1 -0
  947. templates/static/js/prism-lang.prism-qsharp.4cac4916.chunk.js +2 -0
  948. templates/static/js/prism-lang.prism-qsharp.4cac4916.chunk.js.map +1 -0
  949. templates/static/js/prism-lang.prism-r-min.9d91dbd3.chunk.js +2 -0
  950. templates/static/js/prism-lang.prism-r-min.9d91dbd3.chunk.js.map +1 -0
  951. templates/static/js/prism-lang.prism-r.12a023c7.chunk.js +2 -0
  952. templates/static/js/prism-lang.prism-r.12a023c7.chunk.js.map +1 -0
  953. templates/static/js/prism-lang.prism-racket-min.6ee79af0.chunk.js +2 -0
  954. templates/static/js/prism-lang.prism-racket-min.6ee79af0.chunk.js.map +1 -0
  955. templates/static/js/prism-lang.prism-racket.7a2b727e.chunk.js +2 -0
  956. templates/static/js/prism-lang.prism-racket.7a2b727e.chunk.js.map +1 -0
  957. templates/static/js/prism-lang.prism-reason-min.81717e7e.chunk.js +2 -0
  958. templates/static/js/prism-lang.prism-reason-min.81717e7e.chunk.js.map +1 -0
  959. templates/static/js/prism-lang.prism-reason.787eefa0.chunk.js +2 -0
  960. templates/static/js/prism-lang.prism-reason.787eefa0.chunk.js.map +1 -0
  961. templates/static/js/prism-lang.prism-regex-min.29bf020d.chunk.js +2 -0
  962. templates/static/js/prism-lang.prism-regex-min.29bf020d.chunk.js.map +1 -0
  963. templates/static/js/prism-lang.prism-regex.3972ce06.chunk.js +2 -0
  964. templates/static/js/prism-lang.prism-regex.3972ce06.chunk.js.map +1 -0
  965. templates/static/js/prism-lang.prism-rego-min.433e558e.chunk.js +2 -0
  966. templates/static/js/prism-lang.prism-rego-min.433e558e.chunk.js.map +1 -0
  967. templates/static/js/prism-lang.prism-rego.156e3dcb.chunk.js +2 -0
  968. templates/static/js/prism-lang.prism-rego.156e3dcb.chunk.js.map +1 -0
  969. templates/static/js/prism-lang.prism-renpy-min.af09fc83.chunk.js +2 -0
  970. templates/static/js/prism-lang.prism-renpy-min.af09fc83.chunk.js.map +1 -0
  971. templates/static/js/prism-lang.prism-renpy.4b4780a8.chunk.js +2 -0
  972. templates/static/js/prism-lang.prism-renpy.4b4780a8.chunk.js.map +1 -0
  973. templates/static/js/prism-lang.prism-rescript-min.8693c431.chunk.js +2 -0
  974. templates/static/js/prism-lang.prism-rescript-min.8693c431.chunk.js.map +1 -0
  975. templates/static/js/prism-lang.prism-rescript.3f8d2e5e.chunk.js +2 -0
  976. templates/static/js/prism-lang.prism-rescript.3f8d2e5e.chunk.js.map +1 -0
  977. templates/static/js/prism-lang.prism-rest-min.2f6e679c.chunk.js +2 -0
  978. templates/static/js/prism-lang.prism-rest-min.2f6e679c.chunk.js.map +1 -0
  979. templates/static/js/prism-lang.prism-rest.891635c9.chunk.js +2 -0
  980. templates/static/js/prism-lang.prism-rest.891635c9.chunk.js.map +1 -0
  981. templates/static/js/prism-lang.prism-rip-min.7f699925.chunk.js +2 -0
  982. templates/static/js/prism-lang.prism-rip-min.7f699925.chunk.js.map +1 -0
  983. templates/static/js/prism-lang.prism-rip.eebb0be0.chunk.js +2 -0
  984. templates/static/js/prism-lang.prism-rip.eebb0be0.chunk.js.map +1 -0
  985. templates/static/js/prism-lang.prism-roboconf-min.02a1c9e6.chunk.js +2 -0
  986. templates/static/js/prism-lang.prism-roboconf-min.02a1c9e6.chunk.js.map +1 -0
  987. templates/static/js/prism-lang.prism-roboconf.1976c61e.chunk.js +2 -0
  988. templates/static/js/prism-lang.prism-roboconf.1976c61e.chunk.js.map +1 -0
  989. templates/static/js/prism-lang.prism-robotframework-min.74691ea5.chunk.js +2 -0
  990. templates/static/js/prism-lang.prism-robotframework-min.74691ea5.chunk.js.map +1 -0
  991. templates/static/js/prism-lang.prism-robotframework.ea8dd129.chunk.js +2 -0
  992. templates/static/js/prism-lang.prism-robotframework.ea8dd129.chunk.js.map +1 -0
  993. templates/static/js/prism-lang.prism-ruby-min.bd383425.chunk.js +2 -0
  994. templates/static/js/prism-lang.prism-ruby-min.bd383425.chunk.js.map +1 -0
  995. templates/static/js/prism-lang.prism-ruby.2256a65b.chunk.js +2 -0
  996. templates/static/js/prism-lang.prism-ruby.2256a65b.chunk.js.map +1 -0
  997. templates/static/js/prism-lang.prism-rust-min.29d74468.chunk.js +2 -0
  998. templates/static/js/prism-lang.prism-rust-min.29d74468.chunk.js.map +1 -0
  999. templates/static/js/prism-lang.prism-rust.86773fa4.chunk.js +2 -0
  1000. templates/static/js/prism-lang.prism-rust.86773fa4.chunk.js.map +1 -0
  1001. templates/static/js/prism-lang.prism-sas-min.4ce37728.chunk.js +2 -0
  1002. templates/static/js/prism-lang.prism-sas-min.4ce37728.chunk.js.map +1 -0
  1003. templates/static/js/prism-lang.prism-sas.b299dd1c.chunk.js +2 -0
  1004. templates/static/js/prism-lang.prism-sas.b299dd1c.chunk.js.map +1 -0
  1005. templates/static/js/prism-lang.prism-sass-min.950a53c0.chunk.js +2 -0
  1006. templates/static/js/prism-lang.prism-sass-min.950a53c0.chunk.js.map +1 -0
  1007. templates/static/js/prism-lang.prism-sass.a0b28a01.chunk.js +2 -0
  1008. templates/static/js/prism-lang.prism-sass.a0b28a01.chunk.js.map +1 -0
  1009. templates/static/js/prism-lang.prism-scala-min.5db3b94b.chunk.js +2 -0
  1010. templates/static/js/prism-lang.prism-scala-min.5db3b94b.chunk.js.map +1 -0
  1011. templates/static/js/prism-lang.prism-scala.4ba1ea05.chunk.js +2 -0
  1012. templates/static/js/prism-lang.prism-scala.4ba1ea05.chunk.js.map +1 -0
  1013. templates/static/js/prism-lang.prism-scheme-min.f38c116e.chunk.js +2 -0
  1014. templates/static/js/prism-lang.prism-scheme-min.f38c116e.chunk.js.map +1 -0
  1015. templates/static/js/prism-lang.prism-scheme.ab33d3fb.chunk.js +2 -0
  1016. templates/static/js/prism-lang.prism-scheme.ab33d3fb.chunk.js.map +1 -0
  1017. templates/static/js/prism-lang.prism-scss-min.c2c60ea7.chunk.js +2 -0
  1018. templates/static/js/prism-lang.prism-scss-min.c2c60ea7.chunk.js.map +1 -0
  1019. templates/static/js/prism-lang.prism-scss.65f18dd0.chunk.js +2 -0
  1020. templates/static/js/prism-lang.prism-scss.65f18dd0.chunk.js.map +1 -0
  1021. templates/static/js/prism-lang.prism-shell-session-min.7ec9e8fe.chunk.js +2 -0
  1022. templates/static/js/prism-lang.prism-shell-session-min.7ec9e8fe.chunk.js.map +1 -0
  1023. templates/static/js/prism-lang.prism-shell-session.ab189baf.chunk.js +2 -0
  1024. templates/static/js/prism-lang.prism-shell-session.ab189baf.chunk.js.map +1 -0
  1025. templates/static/js/prism-lang.prism-smali-min.19745053.chunk.js +2 -0
  1026. templates/static/js/prism-lang.prism-smali-min.19745053.chunk.js.map +1 -0
  1027. templates/static/js/prism-lang.prism-smali.bc175747.chunk.js +2 -0
  1028. templates/static/js/prism-lang.prism-smali.bc175747.chunk.js.map +1 -0
  1029. templates/static/js/prism-lang.prism-smalltalk-min.1d36db97.chunk.js +2 -0
  1030. templates/static/js/prism-lang.prism-smalltalk-min.1d36db97.chunk.js.map +1 -0
  1031. templates/static/js/prism-lang.prism-smalltalk.b6059f66.chunk.js +2 -0
  1032. templates/static/js/prism-lang.prism-smalltalk.b6059f66.chunk.js.map +1 -0
  1033. templates/static/js/prism-lang.prism-smarty-min.4d531407.chunk.js +2 -0
  1034. templates/static/js/prism-lang.prism-smarty-min.4d531407.chunk.js.map +1 -0
  1035. templates/static/js/prism-lang.prism-smarty.72e1bd5f.chunk.js +2 -0
  1036. templates/static/js/prism-lang.prism-smarty.72e1bd5f.chunk.js.map +1 -0
  1037. templates/static/js/prism-lang.prism-sml-min.6460ab86.chunk.js +2 -0
  1038. templates/static/js/prism-lang.prism-sml-min.6460ab86.chunk.js.map +1 -0
  1039. templates/static/js/prism-lang.prism-sml.4e29415d.chunk.js +2 -0
  1040. templates/static/js/prism-lang.prism-sml.4e29415d.chunk.js.map +1 -0
  1041. templates/static/js/prism-lang.prism-solidity-min.93b00ca4.chunk.js +2 -0
  1042. templates/static/js/prism-lang.prism-solidity-min.93b00ca4.chunk.js.map +1 -0
  1043. templates/static/js/prism-lang.prism-solidity.59878700.chunk.js +2 -0
  1044. templates/static/js/prism-lang.prism-solidity.59878700.chunk.js.map +1 -0
  1045. templates/static/js/prism-lang.prism-solution-file-min.058a407f.chunk.js +2 -0
  1046. templates/static/js/prism-lang.prism-solution-file-min.058a407f.chunk.js.map +1 -0
  1047. templates/static/js/prism-lang.prism-solution-file.b2d426a5.chunk.js +2 -0
  1048. templates/static/js/prism-lang.prism-solution-file.b2d426a5.chunk.js.map +1 -0
  1049. templates/static/js/prism-lang.prism-soy-min.286b0cde.chunk.js +2 -0
  1050. templates/static/js/prism-lang.prism-soy-min.286b0cde.chunk.js.map +1 -0
  1051. templates/static/js/prism-lang.prism-soy.cbf1f08c.chunk.js +2 -0
  1052. templates/static/js/prism-lang.prism-soy.cbf1f08c.chunk.js.map +1 -0
  1053. templates/static/js/prism-lang.prism-sparql-min.2e21b2fe.chunk.js +2 -0
  1054. templates/static/js/prism-lang.prism-sparql-min.2e21b2fe.chunk.js.map +1 -0
  1055. templates/static/js/prism-lang.prism-sparql.b924db23.chunk.js +2 -0
  1056. templates/static/js/prism-lang.prism-sparql.b924db23.chunk.js.map +1 -0
  1057. templates/static/js/prism-lang.prism-splunk-spl-min.422a38fe.chunk.js +2 -0
  1058. templates/static/js/prism-lang.prism-splunk-spl-min.422a38fe.chunk.js.map +1 -0
  1059. templates/static/js/prism-lang.prism-splunk-spl.13446336.chunk.js +2 -0
  1060. templates/static/js/prism-lang.prism-splunk-spl.13446336.chunk.js.map +1 -0
  1061. templates/static/js/prism-lang.prism-sqf-min.fa379436.chunk.js +2 -0
  1062. templates/static/js/prism-lang.prism-sqf-min.fa379436.chunk.js.map +1 -0
  1063. templates/static/js/prism-lang.prism-sqf.b9d387a5.chunk.js +2 -0
  1064. templates/static/js/prism-lang.prism-sqf.b9d387a5.chunk.js.map +1 -0
  1065. templates/static/js/prism-lang.prism-sql-min.318853bb.chunk.js +2 -0
  1066. templates/static/js/prism-lang.prism-sql-min.318853bb.chunk.js.map +1 -0
  1067. templates/static/js/prism-lang.prism-sql.e6625625.chunk.js +2 -0
  1068. templates/static/js/prism-lang.prism-sql.e6625625.chunk.js.map +1 -0
  1069. templates/static/js/prism-lang.prism-squirrel-min.5736a54d.chunk.js +2 -0
  1070. templates/static/js/prism-lang.prism-squirrel-min.5736a54d.chunk.js.map +1 -0
  1071. templates/static/js/prism-lang.prism-squirrel.15a6c5b8.chunk.js +2 -0
  1072. templates/static/js/prism-lang.prism-squirrel.15a6c5b8.chunk.js.map +1 -0
  1073. templates/static/js/prism-lang.prism-stan-min.ee4e1c95.chunk.js +2 -0
  1074. templates/static/js/prism-lang.prism-stan-min.ee4e1c95.chunk.js.map +1 -0
  1075. templates/static/js/prism-lang.prism-stan.8f0f2f32.chunk.js +2 -0
  1076. templates/static/js/prism-lang.prism-stan.8f0f2f32.chunk.js.map +1 -0
  1077. templates/static/js/prism-lang.prism-stata-min.c5321f2e.chunk.js +2 -0
  1078. templates/static/js/prism-lang.prism-stata-min.c5321f2e.chunk.js.map +1 -0
  1079. templates/static/js/prism-lang.prism-stata.2c5c7170.chunk.js +2 -0
  1080. templates/static/js/prism-lang.prism-stata.2c5c7170.chunk.js.map +1 -0
  1081. templates/static/js/prism-lang.prism-stylus-min.f39a3f28.chunk.js +2 -0
  1082. templates/static/js/prism-lang.prism-stylus-min.f39a3f28.chunk.js.map +1 -0
  1083. templates/static/js/prism-lang.prism-stylus.c05f795f.chunk.js +2 -0
  1084. templates/static/js/prism-lang.prism-stylus.c05f795f.chunk.js.map +1 -0
  1085. templates/static/js/prism-lang.prism-supercollider-min.d88afae3.chunk.js +2 -0
  1086. templates/static/js/prism-lang.prism-supercollider-min.d88afae3.chunk.js.map +1 -0
  1087. templates/static/js/prism-lang.prism-supercollider.568ec355.chunk.js +2 -0
  1088. templates/static/js/prism-lang.prism-supercollider.568ec355.chunk.js.map +1 -0
  1089. templates/static/js/prism-lang.prism-swift-min.ff9ad682.chunk.js +2 -0
  1090. templates/static/js/prism-lang.prism-swift-min.ff9ad682.chunk.js.map +1 -0
  1091. templates/static/js/prism-lang.prism-swift.dd8516d2.chunk.js +2 -0
  1092. templates/static/js/prism-lang.prism-swift.dd8516d2.chunk.js.map +1 -0
  1093. templates/static/js/prism-lang.prism-systemd-min.fbc68512.chunk.js +2 -0
  1094. templates/static/js/prism-lang.prism-systemd-min.fbc68512.chunk.js.map +1 -0
  1095. templates/static/js/prism-lang.prism-systemd.55e07172.chunk.js +2 -0
  1096. templates/static/js/prism-lang.prism-systemd.55e07172.chunk.js.map +1 -0
  1097. templates/static/js/prism-lang.prism-t4-cs-min.042974dd.chunk.js +2 -0
  1098. templates/static/js/prism-lang.prism-t4-cs-min.042974dd.chunk.js.map +1 -0
  1099. templates/static/js/prism-lang.prism-t4-cs.62d00e56.chunk.js +2 -0
  1100. templates/static/js/prism-lang.prism-t4-cs.62d00e56.chunk.js.map +1 -0
  1101. templates/static/js/prism-lang.prism-t4-templating-min.7cd1a4f8.chunk.js +2 -0
  1102. templates/static/js/prism-lang.prism-t4-templating-min.7cd1a4f8.chunk.js.map +1 -0
  1103. templates/static/js/prism-lang.prism-t4-templating.f15a41b1.chunk.js +2 -0
  1104. templates/static/js/prism-lang.prism-t4-templating.f15a41b1.chunk.js.map +1 -0
  1105. templates/static/js/prism-lang.prism-t4-vb-min.7c9fbd5c.chunk.js +2 -0
  1106. templates/static/js/prism-lang.prism-t4-vb-min.7c9fbd5c.chunk.js.map +1 -0
  1107. templates/static/js/prism-lang.prism-t4-vb.c2b3c9cc.chunk.js +2 -0
  1108. templates/static/js/prism-lang.prism-t4-vb.c2b3c9cc.chunk.js.map +1 -0
  1109. templates/static/js/prism-lang.prism-tap-min.7e0fffd9.chunk.js +2 -0
  1110. templates/static/js/prism-lang.prism-tap-min.7e0fffd9.chunk.js.map +1 -0
  1111. templates/static/js/prism-lang.prism-tap.68d719c2.chunk.js +2 -0
  1112. templates/static/js/prism-lang.prism-tap.68d719c2.chunk.js.map +1 -0
  1113. templates/static/js/prism-lang.prism-tcl-min.5247eae9.chunk.js +2 -0
  1114. templates/static/js/prism-lang.prism-tcl-min.5247eae9.chunk.js.map +1 -0
  1115. templates/static/js/prism-lang.prism-tcl.dba56ac3.chunk.js +2 -0
  1116. templates/static/js/prism-lang.prism-tcl.dba56ac3.chunk.js.map +1 -0
  1117. templates/static/js/prism-lang.prism-textile-min.fd44c489.chunk.js +2 -0
  1118. templates/static/js/prism-lang.prism-textile-min.fd44c489.chunk.js.map +1 -0
  1119. templates/static/js/prism-lang.prism-textile.d66eff02.chunk.js +2 -0
  1120. templates/static/js/prism-lang.prism-textile.d66eff02.chunk.js.map +1 -0
  1121. templates/static/js/prism-lang.prism-toml-min.3b693bc2.chunk.js +2 -0
  1122. templates/static/js/prism-lang.prism-toml-min.3b693bc2.chunk.js.map +1 -0
  1123. templates/static/js/prism-lang.prism-toml.8106d51f.chunk.js +2 -0
  1124. templates/static/js/prism-lang.prism-toml.8106d51f.chunk.js.map +1 -0
  1125. templates/static/js/prism-lang.prism-tremor-min.40b6b460.chunk.js +2 -0
  1126. templates/static/js/prism-lang.prism-tremor-min.40b6b460.chunk.js.map +1 -0
  1127. templates/static/js/prism-lang.prism-tremor.c54737d1.chunk.js +2 -0
  1128. templates/static/js/prism-lang.prism-tremor.c54737d1.chunk.js.map +1 -0
  1129. templates/static/js/prism-lang.prism-tsx-min.df8f5052.chunk.js +2 -0
  1130. templates/static/js/prism-lang.prism-tsx-min.df8f5052.chunk.js.map +1 -0
  1131. templates/static/js/prism-lang.prism-tsx.4bc64bfd.chunk.js +2 -0
  1132. templates/static/js/prism-lang.prism-tsx.4bc64bfd.chunk.js.map +1 -0
  1133. templates/static/js/prism-lang.prism-tt2-min.652a9b04.chunk.js +2 -0
  1134. templates/static/js/prism-lang.prism-tt2-min.652a9b04.chunk.js.map +1 -0
  1135. templates/static/js/prism-lang.prism-tt2.688b595a.chunk.js +2 -0
  1136. templates/static/js/prism-lang.prism-tt2.688b595a.chunk.js.map +1 -0
  1137. templates/static/js/prism-lang.prism-turtle-min.0689dfc6.chunk.js +2 -0
  1138. templates/static/js/prism-lang.prism-turtle-min.0689dfc6.chunk.js.map +1 -0
  1139. templates/static/js/prism-lang.prism-turtle.169ad2e1.chunk.js +2 -0
  1140. templates/static/js/prism-lang.prism-turtle.169ad2e1.chunk.js.map +1 -0
  1141. templates/static/js/prism-lang.prism-twig-min.d801c19d.chunk.js +2 -0
  1142. templates/static/js/prism-lang.prism-twig-min.d801c19d.chunk.js.map +1 -0
  1143. templates/static/js/prism-lang.prism-twig.70bb63f3.chunk.js +2 -0
  1144. templates/static/js/prism-lang.prism-twig.70bb63f3.chunk.js.map +1 -0
  1145. templates/static/js/prism-lang.prism-typescript-min.22b7217d.chunk.js +2 -0
  1146. templates/static/js/prism-lang.prism-typescript-min.22b7217d.chunk.js.map +1 -0
  1147. templates/static/js/prism-lang.prism-typescript.b960b87f.chunk.js +2 -0
  1148. templates/static/js/prism-lang.prism-typescript.b960b87f.chunk.js.map +1 -0
  1149. templates/static/js/prism-lang.prism-typoscript-min.19ba7aab.chunk.js +2 -0
  1150. templates/static/js/prism-lang.prism-typoscript-min.19ba7aab.chunk.js.map +1 -0
  1151. templates/static/js/prism-lang.prism-typoscript.b47cbfeb.chunk.js +2 -0
  1152. templates/static/js/prism-lang.prism-typoscript.b47cbfeb.chunk.js.map +1 -0
  1153. templates/static/js/prism-lang.prism-unrealscript-min.0063b0fd.chunk.js +2 -0
  1154. templates/static/js/prism-lang.prism-unrealscript-min.0063b0fd.chunk.js.map +1 -0
  1155. templates/static/js/prism-lang.prism-unrealscript.9f97da34.chunk.js +2 -0
  1156. templates/static/js/prism-lang.prism-unrealscript.9f97da34.chunk.js.map +1 -0
  1157. templates/static/js/prism-lang.prism-uorazor-min.d2dc8f62.chunk.js +2 -0
  1158. templates/static/js/prism-lang.prism-uorazor-min.d2dc8f62.chunk.js.map +1 -0
  1159. templates/static/js/prism-lang.prism-uorazor.141f2dbe.chunk.js +2 -0
  1160. templates/static/js/prism-lang.prism-uorazor.141f2dbe.chunk.js.map +1 -0
  1161. templates/static/js/prism-lang.prism-uri-min.91b7fb32.chunk.js +2 -0
  1162. templates/static/js/prism-lang.prism-uri-min.91b7fb32.chunk.js.map +1 -0
  1163. templates/static/js/prism-lang.prism-uri.ffb09261.chunk.js +2 -0
  1164. templates/static/js/prism-lang.prism-uri.ffb09261.chunk.js.map +1 -0
  1165. templates/static/js/prism-lang.prism-v-min.e795fc52.chunk.js +2 -0
  1166. templates/static/js/prism-lang.prism-v-min.e795fc52.chunk.js.map +1 -0
  1167. templates/static/js/prism-lang.prism-v.56e172c6.chunk.js +2 -0
  1168. templates/static/js/prism-lang.prism-v.56e172c6.chunk.js.map +1 -0
  1169. templates/static/js/prism-lang.prism-vala-min.adf10709.chunk.js +2 -0
  1170. templates/static/js/prism-lang.prism-vala-min.adf10709.chunk.js.map +1 -0
  1171. templates/static/js/prism-lang.prism-vala.89ed1c33.chunk.js +2 -0
  1172. templates/static/js/prism-lang.prism-vala.89ed1c33.chunk.js.map +1 -0
  1173. templates/static/js/prism-lang.prism-vbnet-min.c05eb1c4.chunk.js +2 -0
  1174. templates/static/js/prism-lang.prism-vbnet-min.c05eb1c4.chunk.js.map +1 -0
  1175. templates/static/js/prism-lang.prism-vbnet.0ae31e08.chunk.js +2 -0
  1176. templates/static/js/prism-lang.prism-vbnet.0ae31e08.chunk.js.map +1 -0
  1177. templates/static/js/prism-lang.prism-velocity-min.8f5479af.chunk.js +2 -0
  1178. templates/static/js/prism-lang.prism-velocity-min.8f5479af.chunk.js.map +1 -0
  1179. templates/static/js/prism-lang.prism-velocity.17a11a92.chunk.js +2 -0
  1180. templates/static/js/prism-lang.prism-velocity.17a11a92.chunk.js.map +1 -0
  1181. templates/static/js/prism-lang.prism-verilog-min.7361f391.chunk.js +2 -0
  1182. templates/static/js/prism-lang.prism-verilog-min.7361f391.chunk.js.map +1 -0
  1183. templates/static/js/prism-lang.prism-verilog.384c7842.chunk.js +2 -0
  1184. templates/static/js/prism-lang.prism-verilog.384c7842.chunk.js.map +1 -0
  1185. templates/static/js/prism-lang.prism-vhdl-min.777ce3d9.chunk.js +2 -0
  1186. templates/static/js/prism-lang.prism-vhdl-min.777ce3d9.chunk.js.map +1 -0
  1187. templates/static/js/prism-lang.prism-vhdl.c34a850e.chunk.js +2 -0
  1188. templates/static/js/prism-lang.prism-vhdl.c34a850e.chunk.js.map +1 -0
  1189. templates/static/js/prism-lang.prism-vim-min.d755e765.chunk.js +2 -0
  1190. templates/static/js/prism-lang.prism-vim-min.d755e765.chunk.js.map +1 -0
  1191. templates/static/js/prism-lang.prism-vim.0053bf55.chunk.js +2 -0
  1192. templates/static/js/prism-lang.prism-vim.0053bf55.chunk.js.map +1 -0
  1193. templates/static/js/prism-lang.prism-visual-basic-min.ef8bda02.chunk.js +2 -0
  1194. templates/static/js/prism-lang.prism-visual-basic-min.ef8bda02.chunk.js.map +1 -0
  1195. templates/static/js/prism-lang.prism-visual-basic.d8bbd4c0.chunk.js +2 -0
  1196. templates/static/js/prism-lang.prism-visual-basic.d8bbd4c0.chunk.js.map +1 -0
  1197. templates/static/js/prism-lang.prism-warpscript-min.a8a0c273.chunk.js +2 -0
  1198. templates/static/js/prism-lang.prism-warpscript-min.a8a0c273.chunk.js.map +1 -0
  1199. templates/static/js/prism-lang.prism-warpscript.501297a4.chunk.js +2 -0
  1200. templates/static/js/prism-lang.prism-warpscript.501297a4.chunk.js.map +1 -0
  1201. templates/static/js/prism-lang.prism-wasm-min.220de8e9.chunk.js +2 -0
  1202. templates/static/js/prism-lang.prism-wasm-min.220de8e9.chunk.js.map +1 -0
  1203. templates/static/js/prism-lang.prism-wasm.b9dc0162.chunk.js +2 -0
  1204. templates/static/js/prism-lang.prism-wasm.b9dc0162.chunk.js.map +1 -0
  1205. templates/static/js/prism-lang.prism-web-idl-min.56af0018.chunk.js +2 -0
  1206. templates/static/js/prism-lang.prism-web-idl-min.56af0018.chunk.js.map +1 -0
  1207. templates/static/js/prism-lang.prism-web-idl.5b1b4d69.chunk.js +2 -0
  1208. templates/static/js/prism-lang.prism-web-idl.5b1b4d69.chunk.js.map +1 -0
  1209. templates/static/js/prism-lang.prism-wgsl-min.6c0a8576.chunk.js +2 -0
  1210. templates/static/js/prism-lang.prism-wgsl-min.6c0a8576.chunk.js.map +1 -0
  1211. templates/static/js/prism-lang.prism-wgsl.aec58ed4.chunk.js +2 -0
  1212. templates/static/js/prism-lang.prism-wgsl.aec58ed4.chunk.js.map +1 -0
  1213. templates/static/js/prism-lang.prism-wiki-min.6b9cf9ef.chunk.js +2 -0
  1214. templates/static/js/prism-lang.prism-wiki-min.6b9cf9ef.chunk.js.map +1 -0
  1215. templates/static/js/prism-lang.prism-wiki.aa2a3b55.chunk.js +2 -0
  1216. templates/static/js/prism-lang.prism-wiki.aa2a3b55.chunk.js.map +1 -0
  1217. templates/static/js/prism-lang.prism-wolfram-min.56285306.chunk.js +2 -0
  1218. templates/static/js/prism-lang.prism-wolfram-min.56285306.chunk.js.map +1 -0
  1219. templates/static/js/prism-lang.prism-wolfram.17e0a73d.chunk.js +2 -0
  1220. templates/static/js/prism-lang.prism-wolfram.17e0a73d.chunk.js.map +1 -0
  1221. templates/static/js/prism-lang.prism-wren-min.4ec162a7.chunk.js +2 -0
  1222. templates/static/js/prism-lang.prism-wren-min.4ec162a7.chunk.js.map +1 -0
  1223. templates/static/js/prism-lang.prism-wren.1315d3b1.chunk.js +2 -0
  1224. templates/static/js/prism-lang.prism-wren.1315d3b1.chunk.js.map +1 -0
  1225. templates/static/js/prism-lang.prism-xeora-min.8bce37c4.chunk.js +2 -0
  1226. templates/static/js/prism-lang.prism-xeora-min.8bce37c4.chunk.js.map +1 -0
  1227. templates/static/js/prism-lang.prism-xeora.9e8becc8.chunk.js +2 -0
  1228. templates/static/js/prism-lang.prism-xeora.9e8becc8.chunk.js.map +1 -0
  1229. templates/static/js/prism-lang.prism-xml-doc-min.10302a21.chunk.js +2 -0
  1230. templates/static/js/prism-lang.prism-xml-doc-min.10302a21.chunk.js.map +1 -0
  1231. templates/static/js/prism-lang.prism-xml-doc.aec98047.chunk.js +2 -0
  1232. templates/static/js/prism-lang.prism-xml-doc.aec98047.chunk.js.map +1 -0
  1233. templates/static/js/prism-lang.prism-xojo-min.8037f23f.chunk.js +2 -0
  1234. templates/static/js/prism-lang.prism-xojo-min.8037f23f.chunk.js.map +1 -0
  1235. templates/static/js/prism-lang.prism-xojo.7e297a7d.chunk.js +2 -0
  1236. templates/static/js/prism-lang.prism-xojo.7e297a7d.chunk.js.map +1 -0
  1237. templates/static/js/prism-lang.prism-xquery-min.87645abe.chunk.js +2 -0
  1238. templates/static/js/prism-lang.prism-xquery-min.87645abe.chunk.js.map +1 -0
  1239. templates/static/js/prism-lang.prism-xquery.eb87b7ac.chunk.js +2 -0
  1240. templates/static/js/prism-lang.prism-xquery.eb87b7ac.chunk.js.map +1 -0
  1241. templates/static/js/prism-lang.prism-yaml-min.0c8d7aa1.chunk.js +2 -0
  1242. templates/static/js/prism-lang.prism-yaml-min.0c8d7aa1.chunk.js.map +1 -0
  1243. templates/static/js/prism-lang.prism-yaml.9492abe7.chunk.js +2 -0
  1244. templates/static/js/prism-lang.prism-yaml.9492abe7.chunk.js.map +1 -0
  1245. templates/static/js/prism-lang.prism-yang-min.69aeb249.chunk.js +2 -0
  1246. templates/static/js/prism-lang.prism-yang-min.69aeb249.chunk.js.map +1 -0
  1247. templates/static/js/prism-lang.prism-yang.abdc0f44.chunk.js +2 -0
  1248. templates/static/js/prism-lang.prism-yang.abdc0f44.chunk.js.map +1 -0
  1249. templates/static/js/prism-lang.prism-zig-min.752935a4.chunk.js +2 -0
  1250. templates/static/js/prism-lang.prism-zig-min.752935a4.chunk.js.map +1 -0
  1251. templates/static/js/prism-lang.prism-zig.7d37c247.chunk.js +2 -0
  1252. templates/static/js/prism-lang.prism-zig.7d37c247.chunk.js.map +1 -0
  1253. {ziya-0.1.48.dist-info → ziya-0.1.49.dist-info}/METADATA +9 -8
  1254. ziya-0.1.49.dist-info/RECORD +1276 -0
  1255. app/utils/llm_constants.py +0 -34
  1256. templates/static/css/main.f447c982.css.map +0 -1
  1257. templates/static/js/main.cb581e8d.js +0 -3
  1258. templates/static/js/main.cb581e8d.js.LICENSE.txt +0 -129
  1259. templates/static/js/main.cb581e8d.js.map +0 -1
  1260. ziya-0.1.48.dist-info/RECORD +0 -39
  1261. {ziya-0.1.48.dist-info → ziya-0.1.49.dist-info}/LICENSE +0 -0
  1262. {ziya-0.1.48.dist-info → ziya-0.1.49.dist-info}/WHEEL +0 -0
  1263. {ziya-0.1.48.dist-info → ziya-0.1.49.dist-info}/entry_points.txt +0 -0
app/utils/code_util.py CHANGED
@@ -1,310 +1,1145 @@
1
1
  import os
2
2
  import subprocess
3
- from app.utils.logging_utils import logger
3
+ import json
4
+ from io import StringIO
4
5
  import time
6
+ from typing import Dict, Optional, Union, List, Tuple, Any
7
+ import whatthepatch
5
8
  import re
9
+ from app.utils.logging_utils import logger
10
+ import difflib
11
+
12
+ MIN_CONFIDENCE = 0.75 # what confidence level we cut off forced diff apply after fuzzy match
6
13
 
7
- HUNK_HEADER_REGEX = re.compile(r'^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@')
14
+ class PatchApplicationError(Exception):
15
+ """Custom exception for patch application failures"""
16
+ def __init__(self, message: str, details: Dict):
17
+ super().__init__(message)
18
+ self.details = details
8
19
 
9
- def use_git_to_apply_code_diff(git_diff: str):
20
+ def clean_input_diff(diff_content: str) -> str:
10
21
  """
11
- Apply a git diff to the user's codebase.
22
+ Initial cleanup of diff content before parsing, with strict hunk enforcement:
23
+ - Once we've read old_count '-' lines and new_count '+' lines, we end the hunk
24
+ and ignore extra '-'/'+' lines until the next hunk or file header.
25
+ - Preserves original logic for skipping content after triple backticks, decoding '\\n', etc.
26
+
27
+ This typically resolves leftover lines in:
28
+ - 'function_collision' (extra blank line at end)
29
+ - 'single_line_replace' (keeping the old line)
30
+
31
+ Because once we’ve consumed the declared minus/plus lines, further minus/plus lines
32
+ can't sneak into the final patch.
33
+ """
34
+
35
+ logger.debug(diff_content)
36
+
37
+ result_lines = []
38
+
39
+ # Remove any content after triple backticks
40
+ if '```' in diff_content:
41
+ diff_content = diff_content.split('```')[0]
42
+
43
+ # Split into lines for processing
44
+ lines = diff_content.splitlines()
45
+
46
+ # Track the current file and hunk state
47
+ current_file = None
48
+ in_hunk = False
49
+ skip_until_next_file = False
50
+
51
+ # For the strict hunk approach
52
+ old_count = 0
53
+ new_count = 0
54
+ minus_seen = 0
55
+ plus_seen = 0
56
+
57
+ def reset_hunk_state():
58
+ nonlocal in_hunk, old_count, new_count, minus_seen, plus_seen
59
+ in_hunk = False
60
+ old_count = 0
61
+ new_count = 0
62
+ minus_seen = 0
63
+ plus_seen = 0
64
+
65
+ import re
66
+
67
+ for line in lines:
68
+ # Reset skip flag on new file header
69
+ if line.startswith('diff --git'):
70
+ skip_until_next_file = False
71
+ current_file = None
72
+ reset_hunk_state()
73
+ result_lines.append(line)
74
+ continue
75
+
76
+ # Track file paths
77
+ if line.startswith('--- '):
78
+ parts = line.split(' ', 1)
79
+ if len(parts) > 1:
80
+ current_file = parts[1]
81
+ else:
82
+ current_file = None
83
+ result_lines.append(line)
84
+ continue
85
+
86
+ if line.startswith('+++ '):
87
+ result_lines.append(line)
88
+ continue
89
+
90
+ # Hunk header
91
+ if line.startswith('@@'):
92
+ # Close out any prior hunk
93
+ reset_hunk_state()
94
+ in_hunk = True
95
+ skip_until_next_file = False
96
+
97
+ result_lines.append(line) # Keep the hunk header
98
+
99
+ # Parse the line to find old_count/new_count
100
+ match = re.match(r'^@@ -\d+(?:,(\d+))? \+\d+(?:,(\d+))? @@', line)
101
+ if match:
102
+ old_count = int(match.group(2)) if match.group(2) else 1
103
+ new_count = int(match.group(2)) if match.group(2) else 1
104
+ continue
105
+
106
+ if skip_until_next_file:
107
+ # We skip lines until next file/hunk
108
+ continue
109
+
110
+ # If we're inside a hunk, apply the strict approach
111
+ if in_hunk:
112
+ # Check if we've already read all minus and plus lines
113
+ done_minus = (minus_seen >= old_count)
114
+ done_plus = (plus_seen >= new_count)
115
+
116
+ if line.startswith('-'):
117
+ if not done_minus:
118
+ minus_seen += 1
119
+ result_lines.append(line)
120
+ else:
121
+ # We have enough minus lines => ignore it
122
+ logger.debug(f"[clean_input_diff] ignoring extra '-' line: {line.rstrip()}")
123
+ continue
12
124
 
13
- This function takes a git diff as a string and applies it to the user's codebase
14
- specified by the ZIYA_USER_CODEBASE_DIR environment variable. It creates a temporary
15
- file with the diff content and uses the 'git apply' command to apply the changes.
125
+ if line.startswith('+'):
126
+ if not done_plus:
127
+ plus_seen += 1
128
+ result_lines.append(line)
129
+ else:
130
+ # We have enough plus lines => ignore it
131
+ logger.debug(f"[clean_input_diff] ignoring extra '+' line: {line.rstrip()}")
132
+ continue
16
133
 
17
- Args:
18
- git_diff (str): A string containing the git diff to be applied.
134
+ if line.startswith(' '):
135
+ # context lines are always okay
136
+ result_lines.append(line)
137
+ continue
19
138
 
20
- Note:
21
- This function assumes that the git command-line tool is available in the system path.
22
- It uses the --ignore-whitespace and --ignore-space-change options with 'git apply'
23
- to handle potential whitespace issues.
139
+ # If we get here and it's not -, +, or space => presumably hunk is done
140
+ reset_hunk_state()
141
+ result_lines.append(line)
142
+ continue
143
+
144
+ # If not in a hunk, just pass the line along
145
+ result_lines.append(line)
146
+
147
+ # End of loop
148
+ return '\n'.join(result_lines)
149
+
150
+
151
+ def normalize_diff(diff_content: str) -> str:
152
+ """
153
+ Normalize a diff using whatthepatch for proper parsing and reconstruction.
154
+ Handles incomplete hunks, context issues, and line count mismatches.
24
155
  """
156
+ logger.debug("Normalizing diff with whatthepatch")
157
+ try:
158
+ # Extract headers and hunk headers from original diff
159
+ diff_lines = diff_content.splitlines()
160
+ result = []
161
+ i = 0
162
+ while i < len(diff_lines):
163
+ line = diff_lines[i]
164
+ if line.startswith(('diff --git', 'index', '--- ', '+++ ')):
165
+ result.append(line)
166
+ elif line.startswith('@@'):
167
+ result.append(line)
168
+ i += 1
169
+ lines_seen = 0
170
+ while i < len(diff_lines) and diff_lines[i].startswith((' ', '+', '-')):
171
+ result.append(diff_lines[i])
172
+ i += 1
173
+ continue
174
+ i += 1
25
175
 
26
- user_codebase_dir = os.environ.get("ZIYA_USER_CODEBASE_DIR")
27
- if not user_codebase_dir:
28
- raise ValueError("ZIYA_USER_CODEBASE_DIR environment variable is not set")
176
+ return '\n'.join(result) + '\n'
177
+ except Exception as e:
178
+ logger.error(f"Error normalizing diff: {str(e)}")
179
+ return diff_content
180
+
181
+ def is_new_file_creation(diff_lines: List[str]) -> bool:
182
+ """Determine if a diff represents a new file creation."""
183
+ if not diff_lines:
184
+ return False
29
185
 
30
- # Create a temporary file with the diff content and a timestamp
31
- timestamp = int(time.time() * 1000) # Get current timestamp in milliseconds
32
- temp_file = os.path.join(user_codebase_dir, f'temp_{timestamp}.diff')
186
+ logger.debug(f"Analyzing diff lines for new file creation ({len(diff_lines)} lines):")
187
+ for i, line in enumerate(diff_lines[:10]):
188
+ logger.debug(f"Line {i}: {line[:100]}") # Log first 100 chars of each line
33
189
 
34
- with open(temp_file, 'w', newline='\n') as f:
35
- f.write(git_diff)
36
- # need to add a newline at the end of the file of git apply will fail
37
- f.write("\n")
38
- logger.info(f"Created temporary diff file: {temp_file}")
190
+ # Look for any indication this is a new file
191
+ for i, line in enumerate(diff_lines[:10]):
192
+ # Case 1: Standard git diff new file
193
+ if line.startswith('@@ -0,0'):
194
+ logger.debug("Detected new file from zero hunk marker")
195
+ return True
196
+
197
+ # Case 2: Empty source file indicator
198
+ if line == '--- /dev/null':
199
+ logger.debug("Detected new file from /dev/null source")
200
+ return True
201
+
202
+ # Case 3: New file mode
203
+ if 'new file mode' in line:
204
+ logger.debug("Detected new file from mode marker")
205
+ return True
39
206
 
207
+ logger.debug("No new file indicators found")
208
+ return False
209
+ def create_new_file(git_diff: str, base_dir: str) -> None:
210
+ """Create a new file from a git diff."""
211
+ logger.info(f"Processing new file diff with length: {len(git_diff)} bytes")
212
+
40
213
  try:
41
- # Apply the changes using git apply
42
- cmd = ['git', 'apply', '--verbose', '--ignore-whitespace', '--ignore-space-change', temp_file]
43
- logger.info(f"Executing command: {' '.join(cmd)}")
44
- result = subprocess.run(cmd, capture_output=True, text=True, cwd=user_codebase_dir, check=True)
214
+ # Parse the diff content
215
+ diff_lines = git_diff.splitlines()
45
216
 
46
- logger.info(f"Git apply stdout: {result.stdout}")
47
- logger.error(f"Git apply stderr: {result.stderr}")
48
- logger.info(f"Git apply return code: {result.returncode}")
217
+ # Find the file path line
218
+ file_path = None
219
+ for line in diff_lines:
220
+ if line.startswith('diff --git'):
221
+ file_path = line.split(' b/')[-1]
222
+ break
223
+ # Extract the file path from the diff --git line
224
+ full_path = os.path.join(base_dir, file_path)
49
225
 
226
+ # Create directory if it doesn't exist
227
+ os.makedirs(os.path.dirname(full_path), exist_ok=True)
228
+
229
+ # Extract the content (everything after the @@ line)
230
+ content_lines = []
231
+
232
+ in_content = False
233
+ for line in diff_lines:
234
+ if in_content and line.startswith('+'):
235
+ content_lines.append(line[1:])
236
+ elif line.startswith('@@'):
237
+ in_content = True
238
+ # Write the content
239
+ content = '\n'.join(content_lines)
240
+ with open(full_path, 'w', encoding='utf-8') as f:
241
+ f.write(content)
242
+ if not content.endswith('\n'):
243
+ f.write('\n')
244
+ logger.info(f"Successfully created new file: {file_path}")
50
245
  except Exception as e:
51
- logger.error(f"Error applying changes: {str(e)}", exc_info=True)
246
+ logger.error(f"Error creating new file: {str(e)}, diff content: {git_diff[:200]}")
52
247
  raise
53
- finally:
54
- os.remove(temp_file)
248
+
249
+ def inspect_line_content(file_path: str, line_number: int, context: int = 5) -> Dict[str, Any]:
250
+ """Inspect the content around a specific line number."""
251
+ try:
252
+ with open(file_path, 'r') as f:
253
+ lines = f.readlines()
254
+
255
+ start = max(0, line_number - context - 1)
256
+ end = min(len(lines), line_number + context)
257
+
258
+ return {
259
+ 'lines': {
260
+ i+1: {
261
+ 'content': lines[i],
262
+ 'hex': ' '.join(f'{ord(c):02x}' for c in lines[i])
263
+ }
264
+ for i in range(start, end)
265
+ },
266
+ 'line_endings': {
267
+ 'total_lines': len(lines),
268
+ 'endings': {
269
+ 'CRLF': sum(1 for line in lines if line.endswith('\r\n')),
270
+ 'LF': sum(1 for line in lines if line.endswith('\n') and not line.endswith('\r\n')),
271
+ 'CR': sum(1 for line in lines if line.endswith('\r') and not line.endswith('\r\n')),
272
+ 'none': sum(1 for line in lines if not line.endswith('\n') and not line.endswith('\r'))
273
+ }
274
+ }
275
+ }
276
+ except Exception as e:
277
+ logger.error(f"Error inspecting line content: {e}")
278
+ return {'error': str(e)}
279
+
280
+ def analyze_diff_failure(diff: str, file_path: str, error_output: str) -> Dict[str, Any]:
281
+ """Analyze why a diff failed to apply and provide diagnostic information."""
282
+ try:
283
+ # Remove line number if present in file_path
284
+ clean_path = file_path.split(':')[0] if file_path else None
285
+ file_content = open(clean_path, 'r').read() if clean_path else ""
286
+
287
+ # Parse with unidiff for better analysis
288
+ try:
289
+ patch_analysis = {
290
+ 'files': 0,
291
+ 'hunks': 0,
292
+ 'additions': 0,
293
+ 'deletions': 0
294
+ }
295
+ except Exception as e:
296
+ patch_analysis = {'parse_error': str(e)}
297
+
298
+ # Extract context from error
299
+ context_lines = []
300
+ if 'while searching for:' in error_output:
301
+ context_section = error_output.split('while searching for:')[1]
302
+ context_section = context_section.split('error:')[0] if 'error:' in context_section else context_section
303
+ context_lines = [line.strip() for line in context_section.splitlines() if line.strip()]
304
+
305
+ analysis = {
306
+ 'patch_analysis': patch_analysis,
307
+ 'context_lines': context_lines,
308
+ 'file_state': {
309
+ 'exists': os.path.exists(clean_path),
310
+ 'size': os.path.getsize(clean_path) if os.path.exists(clean_path) else None,
311
+ 'line_count': len(file_content.splitlines()) if file_content else 0
312
+ },
313
+ 'error_details': error_output
314
+ }
315
+
316
+ if context_lines:
317
+ # Try to locate context in file
318
+ file_lines = file_content.splitlines()
319
+ for i in range(len(file_lines)):
320
+ if i + len(context_lines) <= len(file_lines):
321
+ if all(file_lines[i+j].strip() == context_lines[j].strip()
322
+ for j in range(len(context_lines))):
323
+ analysis['context_found'] = {
324
+ 'line_number': i + 1,
325
+ 'surrounding_lines': file_lines[max(0, i-2):i+len(context_lines)+2]
326
+ }
327
+ break
328
+
329
+ return analysis
330
+
331
+ except Exception as e:
332
+ logger.error(f"Error analyzing diff: {str(e)}")
333
+ return {'error': str(e)}
334
+
335
+ def fix_hunk_context(lines: List[str]) -> List[str]:
336
+ """
337
+ Fix hunk headers to match actual content.
338
+ Returns corrected lines.
339
+ """
340
+ result = []
341
+ i = 0
342
+ while i < len(lines):
343
+ line = lines[i]
344
+ if not line.startswith('@@'):
345
+ result.append(line)
346
+ i += 1
347
+ continue
348
+ # Found a hunk header
349
+ match = re.match(r'^@@ -(\d+),(\d+) \+(\d+),(\d+) @@', line)
350
+ if not match:
351
+ result.append(line)
352
+ i += 1
353
+ continue
354
+ # Count actual lines in the hunk
355
+ old_count = 0
356
+ new_count = 0
357
+ hunk_lines = []
358
+ i += 1
359
+ while i < len(lines) and not lines[i].startswith('@@'):
360
+ if lines[i].startswith('-'):
361
+ old_count += 1
362
+ elif lines[i].startswith('+'):
363
+ new_count += 1
364
+ elif lines[i].startswith(' '):
365
+ old_count += 1
366
+ new_count += 1
367
+ hunk_lines.append(lines[i])
368
+ i += 1
369
+ # Add corrected hunk header and lines
370
+ result.append(f'@@ -{match.group(1)},{old_count} +{match.group(3)},{new_count} @@')
371
+ result.extend(hunk_lines)
372
+ return result
373
+
374
+ def normalize_whitespace_in_diff(diff_lines: List[str]) -> List[str]:
375
+ """
376
+ Normalize both leading and trailing whitespace in diff content while preserving
377
+ essential indentation. Returns cleaned lines.
378
+ """
379
+ result = []
380
+ i = 0
381
+ while i < len(diff_lines):
382
+ line = diff_lines[i]
383
+ # Keep all header lines
384
+ if line.startswith(('diff --git', 'index', '---', '+++', '@@')):
385
+ result.append(line)
386
+ i += 1
387
+ continue
388
+ # For content lines, normalize whitespace while preserving indentation
389
+ if line.startswith(('+', '-', ' ')):
390
+ prefix = line[0] # Save the diff marker (+, -, or space)
391
+ content = line[1:] # Get the actual content
392
+
393
+ # Normalize the content while preserving essential indentation
394
+ normalized = content.rstrip() # Remove trailing whitespace
395
+ if normalized:
396
+ # Count leading spaces for indentation
397
+ indent = len(content) - len(content.lstrip())
398
+ # Reconstruct the line with normalized whitespace
399
+ result.append(f"{prefix}{' ' * indent}{normalized.lstrip()}")
400
+ i += 1
401
+ return result
55
402
 
56
403
  def correct_git_diff(git_diff: str, original_file_path: str) -> str:
57
404
  """
58
- Corrects the hunk headers in a git diff string by recalculating the line counts and
59
- adjusting the starting line numbers in the new file, considering the cumulative effect of
60
- previous hunks.
61
-
62
- The function assumes that the `start_line_old` values in the hunk headers are correct,
63
- but the line counts and `start_line_new` may be incorrect due to manual edits or errors.
64
-
65
- Parameters:
66
- git_diff (str): The git diff string to be corrected. It may contain multiple hunks
67
- original_file_path (str): Path to the original file to calculate correct start_line_old
68
- and incorrect hunk headers.
69
-
70
- Returns:
71
- str: The git diff string with corrected hunk headers.
72
-
73
- The function works by parsing the diff, recalculating the line counts for each hunk,
74
- adjusting the `start_line_new` values based on the cumulative changes from previous hunks,
75
- and reconstructing the diff with corrected hunk headers.
76
-
77
- Notes:
78
- - The diff is expected to be in unified diff format.
79
- - Lines starting with '+++', '---', or other file headers are not treated as additions or deletions.
80
- - Context lines are lines that do not start with '+', '-', or '@@'.
81
- - All lines in the hunk (including empty lines) are considered in the counts.
82
-
83
- """
84
- # Split the diff into lines
85
- lines = git_diff.split('\n')
86
- is_new_file = False
87
- # Check if this is a new file creation
88
- if lines and lines[0].startswith('diff --git a/dev/null'):
89
- is_new_file = True
90
- # Check if 'new file mode 100644' is present in the first few lines
91
- has_file_mode = any('new file mode 100' in line for line in lines[:3])
92
- if not has_file_mode:
93
- # Insert the missing line after the first line
94
- mode_line = 'new file mode 100644'
95
- lines.insert(1, mode_line)
96
- logger.info(f"Added missing '{mode_line}' to new file diff")
97
-
98
- original_content = []
99
-
100
- if not is_new_file:
405
+ Correct a git diff using unidiff for parsing and validation.
406
+ Maintains compatibility with existing function signature.
407
+ """
408
+ logger.info(f"Processing diff for {original_file_path}")
409
+
410
+ try:
411
+
412
+ # Clean up the diff content first
413
+ cleaned_diff = clean_input_diff(git_diff)
414
+
415
+ # Extract headers from original diff
416
+ diff_lines = git_diff.splitlines()
417
+ headers = []
418
+ for line in diff_lines:
419
+ if line.startswith(('diff --git', 'index', '--- ', '+++ ')):
420
+ headers.append(line)
421
+ elif line.startswith('@@'):
422
+ break
423
+
424
+ # Check for new file creation
425
+ if is_new_file_creation(diff_lines):
426
+ logger.info(f"Detected new file creation for {original_file_path}")
427
+ return cleaned_diff
428
+
429
+ # Modify hunk headers to be more lenient about line counts
430
+ lines = cleaned_diff.splitlines()
431
+ modified_lines = fix_hunk_context(lines)
432
+
433
+ logger.info(f"Normalizing diff with whatthepatch")
101
434
  try:
102
- with open(original_file_path, 'r') as f:
103
- original_content = f.read().splitlines()
104
- except FileNotFoundError:
105
- error_msg = (
106
- f"File {original_file_path} not found and diff does not indicate new file creation. "
107
- )
108
- raise FileNotFoundError(error_msg)
435
+ # Parse and normalize with whatthepatch
436
+ try:
437
+ parsed_patches = list(whatthepatch.parse_patch(cleaned_diff))
438
+ except ValueError as e:
439
+ logger.warning(f"whatthepatch parsing error: {str(e)}")
440
+ return cleaned_diff
441
+
442
+ if not parsed_patches:
443
+ logger.warning("No valid patches found in diff")
444
+ return cleaned_diff
445
+
446
+ # Reconstruct normalized diff
447
+ result = headers # start with original headers
448
+
449
+ # Extract original hunks
450
+ original_hunks = []
451
+ current_hunk = []
452
+ for line in cleaned_diff.splitlines():
453
+ if line.startswith('@@'):
454
+ if current_hunk:
455
+ original_hunks.append(current_hunk)
456
+ current_hunk = [line]
457
+ elif current_hunk and line.startswith(('+', '-', ' ')):
458
+ current_hunk.append(line)
459
+ if current_hunk:
460
+ original_hunks.append(current_hunk)
461
+ # Process each hunk while preserving structure
462
+ for hunk in original_hunks:
463
+ hunk_header = hunk[0]
464
+ match = re.match(r'^@@ -(\d+),\d+ \+(\d+),\d+ @@', hunk_header)
465
+ if not match:
466
+ continue
467
+ old_start = int(match.group(1))
468
+ new_start = int(match.group(2))
469
+ # Count actual changes in this hunk
470
+ old_count = sum(1 for line in hunk[1:] if line.startswith(' ') or line.startswith('-'))
471
+ new_count = sum(1 for line in hunk[1:] if line.startswith(' ') or line.startswith('+'))
472
+ # Output corrected hunk
473
+ result.append(f"@@ -{old_start},{old_count} +{new_start},{new_count} @@")
474
+ result.extend(hunk[1:])
475
+ normalized_diff = '\n'.join(result) + '\n'
476
+ logger.info(f"Successfully normalized diff")
477
+ return normalized_diff
109
478
 
110
- corrected_lines = []
111
- line_index = 0
479
+ except Exception as e:
480
+ logger.error(f"Error normalizing diff: {str(e)}")
481
+ raise
482
+
483
+ except Exception as e:
484
+ logger.error(f"Error correcting diff: {str(e)}")
485
+ raise
112
486
 
113
- # Keep track of the cumulative line number adjustments
114
- cumulative_line_offset = 0
487
+ def apply_system_patch(diff_content: str, target_dir: str) -> bool:
488
+ """
489
+ Apply patch using system patch command.
490
+ Returns True if successful, False otherwise.
491
+ """
492
+ logger.info("Attempting to apply with system patch command...")
493
+ try:
494
+ # Debug: Log the exact content we're sending to patch
495
+ logger.info("Patch input content:")
496
+ logger.info(diff_content)
497
+ # Ensure we have string input and encode it just once
498
+ if isinstance(diff_content, bytes):
499
+ diff_content = diff_content.decode('utf-8')
500
+ result = subprocess.run(
501
+ ['patch', '-p1', '--forward', '--ignore-whitespace', '--verbose'],
502
+ input=diff_content,
503
+ cwd=target_dir,
504
+ capture_output=True,
505
+ text=True,
506
+ timeout=10
507
+ )
115
508
 
509
+ logger.debug(f"Patch command output: stdout={result.stdout}, stderr={result.stderr}")
116
510
 
117
- while line_index < len(lines):
118
- line = lines[line_index]
119
- hunk_match = HUNK_HEADER_REGEX.match(line)
511
+ # If any hunks were successfully applied, we need to modify the diff
512
+ if result and 'Hunk #1 succeeded' in result.stderr:
513
+ logger.debug("Some hunks succeeded, extracting remaining hunks")
514
+ git_diff = extract_remaining_hunks(git_diff, patch_result.stderr)
515
+ logger.info(f"Patch stdout: {result.stdout}")
516
+ logger.info(f"Patch stderr: {result.stderr}")
517
+ success = result.returncode == 0
518
+ logger.info(f"Patch {'succeeded' if success else 'failed'} with return code {result.returncode}")
519
+ return success, result
520
+ except Exception as e:
521
+ logger.error(f"System patch error output: {str(e)}")
522
+ logger.error(f"System patch failed: {str(e)}")
523
+ return False
120
524
 
121
- if hunk_match:
122
- # Process the hunk
123
- corrected_hunk_header, hunk_lines, line_index, line_offset = _process_hunk_with_original_content(
124
- lines, line_index, cumulative_line_offset, original_content
125
- )
525
+ def validate_and_fix_diff(diff_content: str) -> str:
526
+ """
527
+ Validate diff format and ensure it has all required components.
528
+ Fixes common issues with LLM-generated diffs.
529
+ """
530
+ logger.info("Validating and fixing diff format")
126
531
 
127
- # Update cumulative_line_offset
128
- cumulative_line_offset += line_offset
532
+ # Split into lines while preserving empty lines
533
+ lines = diff_content.splitlines(True)
534
+ result = []
535
+ in_hunk = False
129
536
 
130
- # Append corrected hunk header and hunk lines
131
- corrected_lines.append(corrected_hunk_header)
132
- corrected_lines.extend(hunk_lines)
133
- else:
134
- # For non-hunk header lines, just append them
135
- corrected_lines.append(line)
136
- line_index += 1
137
-
138
- # Join the corrected lines back into a string
139
- corrected_diff = '\n'.join(corrected_lines)
140
- return corrected_diff
141
-
142
- def _find_correct_old_start_line(original_content: list, hunk_lines: list) -> int:
143
- """
144
- Finds the correct starting line number in the original file by matching context and deleted lines.
145
-
146
- Parameters:
147
- original_content (list): List of lines from the original file
148
- hunk_lines (list): List of lines in the current hunk
149
-
150
- Returns:
151
- int: The correct 1-based line number where the hunk should start in the original file
152
-
153
- The function works by:
154
- 1. Extracting context and deleted lines from the hunk (ignoring added lines)
155
- 2. Creating a pattern from these lines
156
- 3. Finding where this pattern matches in the original file
157
- 4. Converting the matching position to a 1-based line number
158
- """
159
- # Extract context and deleted lines from the hunk
160
- if not original_content:
161
- # Creating a new file, should start with @@ -0,0 +1,N @@
162
- return 0
163
-
164
- if len(hunk_lines) < 3:
165
- error_msg = (
166
- f"Invalid git diff format: Expected at least 2 lines in the hunk, but got {len(hunk_lines)} lines.\n"
167
- + "Hunk content:\n{}".format('\n'.join(hunk_lines)))
168
- logger.error(error_msg)
169
- raise RuntimeError("Invalid git diff format.")
170
-
171
- context_and_deleted = []
172
- for line in hunk_lines:
173
- if line.startswith(' ') or line.startswith('-'):
174
- # Remove the prefix character
175
- context_and_deleted.append(line[1:])
176
-
177
- if not context_and_deleted:
178
- error_msg = (
179
- "Invalid git diff format: No context or deleted lines found in the hunk.\n"
180
- "Each hunk must contain at least one context line (starting with space) "
181
- "or deleted line (starting with '-').\n"
182
- "Hunk content:\n{}".format('\n'.join(hunk_lines)))
183
- raise RuntimeError(error_msg)
184
-
185
- # Search for the pattern in the original file
186
- pattern_length = len(context_and_deleted)
187
- for i in range(len(original_content) - pattern_length + 1):
188
- matches = True
189
- for j in range(pattern_length):
190
- if j >= len(context_and_deleted):
191
- break
192
- if i + j >= len(original_content) or original_content[i + j] != context_and_deleted[j]:
193
- matches = False
194
- break
195
- if matches:
196
- # Found the correct position git diff start with 1.
197
- return i + 1
537
+ for i, line in enumerate(lines):
538
+ # Preserve all header lines exactly
539
+ if line.startswith(('diff --git', '--- ', '+++ ')):
540
+ result.append(line)
541
+ continue
198
542
 
199
- joined_context_and_deleted = '\n'.join(context_and_deleted)
200
- error_msg = (
201
- "Failed to locate the hunk position in the original file.\n"
202
- "This usually happens when the context lines in the diff don't match the original file content.\n"
203
- f"Context and deleted lines being searched:\n{joined_context_and_deleted}\n"
204
- "Please ensure the diff is generated against the correct version of the file."
205
- )
206
- logger.error(error_msg)
207
- raise RuntimeError(error_msg)
543
+ # Handle hunk headers
544
+ if line.startswith('@@'):
545
+ in_hunk = True
546
+ result.append(line)
547
+ continue
208
548
 
209
- def _process_hunk_with_original_content(lines: list, start_index: int, cumulative_line_offset: int, original_content: list):
549
+ # Handle hunk content
550
+ if in_hunk:
551
+ if not line.startswith((' ', '+', '-', '\n')):
552
+ # End of hunk reached
553
+ in_hunk = False
554
+ if not line.endswith('\n'):
555
+ result.append('\n') # Ensure proper line ending
556
+ else:
557
+ result.append(line)
558
+ continue
559
+
560
+ # Add any non-hunk lines
561
+ if not in_hunk:
562
+ result.append(line)
563
+
564
+ # Ensure the diff ends with a newline
565
+ if result and not result[-1].endswith('\n'):
566
+ result.append('\n')
567
+
568
+ return ''.join(result)
569
+
570
+ def prepare_unified_diff(diff_content: str) -> str:
571
+ """
572
+ Convert a git diff to a simple unified diff format that the patch command expects.
210
573
  """
211
- Processes a single hunk starting at start_index in lines, recalculates the line counts,
212
- and returns the corrected hunk header, hunk lines, and the updated index after the hunk.
574
+ logger.info("Preparing unified diff")
575
+ result = []
576
+ lines = diff_content.splitlines()
577
+
578
+ # Find the actual file paths
579
+ i = 0
580
+ in_hunk = False
581
+ while i < len(lines):
582
+ line = lines[i]
583
+
584
+ # Keep header lines exactly as they are
585
+ if line.startswith(('diff --git', 'index')):
586
+ result.append(line)
587
+ i += 1
588
+ continue
589
+
590
+ # File paths
591
+ if line.startswith('--- '):
592
+ result.append(line)
593
+ i += 1
594
+ continue
595
+ if line.startswith('+++ '):
596
+ result.append(line)
597
+ i += 1
598
+ continue
599
+
600
+ # Hunk header
601
+ if line.startswith('@@ '):
602
+ in_hunk = True
603
+ result.append(line)
604
+ i += 1
605
+ continue
606
+
607
+ # Hunk content
608
+ if in_hunk:
609
+ if line.startswith((' ', '+', '-')):
610
+ result.append(line)
611
+ elif not line.strip(): # Empty line within hunk
612
+ result.append(' ' + line) # Add context marker for empty lines
613
+ else:
614
+ in_hunk = False # End of hunk reached
615
+ i += 1
616
+ continue
617
+
618
+ i += 1
213
619
 
214
- Parameters:
215
- lines (list): The list of lines from the diff.
216
- start_index (int): The index in lines where the hunk header is located.
217
- cumulative_line_offset (int): The cumulative line offset from previous hunks.
218
- original_content (list): List of lines from the original file.
620
+ # Ensure exactly one newline at the end
621
+ while result and not result[-1].strip():
622
+ result.pop()
623
+ result.append('') # Add single newline at end
219
624
 
220
- Returns:
221
- tuple:
222
- - corrected_hunk_header (str): The corrected hunk header.
223
- - hunk_lines (list): The list of lines in the hunk (excluding the hunk header).
224
- - end_index (int): The index in lines after the hunk.
225
- - line_offset (int): The line offset caused by this hunk (to adjust future hunks).
625
+ return '\n'.join(result)
226
626
 
227
- The function reads the hunk lines, counts the number of lines in the original and new files,
228
- and adjusts the starting line number in the new file based on cumulative changes.
627
+
628
+ def remove_reject_file_if_exists(file_path: str):
629
+ """
630
+ Remove .rej file if it exists, to clean up after partial patch attempts.
631
+ """
632
+ rej_file = file_path + '.rej'
633
+ if os.path.exists(rej_file):
634
+ try:
635
+ os.remove(rej_file)
636
+ logger.info(f"Removed reject file: {rej_file}")
637
+ except OSError as e:
638
+ logger.warning(f"Could not remove reject file {rej_file}: {e}")
639
+
640
+ class PatchApplicationError(Exception):
641
+ pass
642
+
643
+ def apply_diff_with_difflib(file_path: str, diff_content: str) -> None:
644
+ """
645
+ Forced-hybrid approach that also throws PatchApplicationError if we cannot
646
+ match a chunk with at least minimal confidence or if the minus lines do not match
647
+ in strict mode. No silent fails.
648
+
649
+ 1) Read 'file_path' lines.
650
+ 2) parse hunks with parse_unified_diff_exact_plus(diff_content, file_path)
651
+ 3) For each hunk, do Phase A or Phase B, forcibly remove old_count lines.
652
+ 4) If we can't match, raise PatchApplicationError.
653
+ 5) Write result back to 'file_path'.
654
+ """
655
+
656
+ # 1) read the original lines
657
+ try:
658
+ with open(file_path, 'r', encoding='utf-8') as f:
659
+ original_lines = f.readlines()
660
+ except FileNotFoundError:
661
+ original_lines = []
662
+
663
+ # 2) apply forced-hybrid logic with error throwing
664
+ final_lines = apply_diff_with_difflib_hybrid_forced(file_path, diff_content, original_lines)
665
+
666
+ # 3) write result
667
+ with open(file_path, 'w', encoding='utf-8') as f:
668
+ f.writelines(final_lines)
669
+
670
+ logger.info(f"Successfully applied forced-hybrid diff (with exceptions on mismatch) to {file_path}.")
671
+
672
+
673
+ def apply_diff_with_difflib_hybrid_forced(file_path: str, diff_content: str, original_lines: list[str]) -> list[str]:
674
+ # parse hunks
675
+ hunks = parse_unified_diff_exact_plus(diff_content, file_path)
676
+ stripped_original = [ln.rstrip('\n') for ln in original_lines]
677
+
678
+ offset = 0
679
+ for hunk_idx, h in enumerate(hunks, start=1):
680
+ old_start = h['old_start']
681
+ old_count = h['old_count']
682
+ new_lines = h['new_lines']
683
+ old_block = h['old_block']
684
+
685
+ logger.debug(f"\n--- Hunk #{hunk_idx} => -{old_start},{old_count} +{h['new_start']},{h['new_count']}, new_lines={len(new_lines)}")
686
+
687
+ # Phase A: strict check
688
+ remove_pos = (old_start - 1) + offset
689
+ remove_pos = clamp(remove_pos, 0, len(stripped_original))
690
+ strict_ok = False
691
+
692
+ # see if we have enough lines
693
+ if remove_pos + old_count <= len(stripped_original):
694
+ file_slice = stripped_original[remove_pos : remove_pos + old_count]
695
+ # Compare to the first old_count lines from old_block
696
+ if len(old_block) >= old_count:
697
+ old_block_minus = old_block[:old_count] # The lines we think are removed
698
+ if file_slice == old_block_minus:
699
+ strict_ok = True
700
+ logger.debug(f"Hunk #{hunk_idx}: strict match at pos={remove_pos}")
701
+ else:
702
+ logger.debug(f"Hunk #{hunk_idx}: strict match failed at pos={remove_pos}")
703
+ else:
704
+ logger.debug(f"Hunk #{hunk_idx}: old_block is smaller than old_count => strict match not possible")
705
+
706
+ if not strict_ok:
707
+ # Phase B: fuzzy
708
+ logger.debug(f"Hunk #{hunk_idx}: Attempting fuzzy near line {remove_pos}")
709
+ best_pos, best_ratio = find_best_chunk_position(stripped_original, old_block, remove_pos)
710
+ if best_ratio < MIN_CONFIDENCE:
711
+ # Raise error if ratio is too low
712
+ msg = (f"Hunk #{hunk_idx} => low confidence match (ratio={best_ratio:.2f}) near {remove_pos}, "
713
+ f"can't safely apply chunk. Failing.")
714
+ logger.error(msg)
715
+ raise PatchApplicationError(msg)
716
+ logger.debug(f"Hunk #{hunk_idx}: fuzzy best pos={best_pos}, ratio={best_ratio:.2f}")
717
+ remove_pos = best_pos
718
+
719
+ # forcibly remove old_count lines at remove_pos
720
+ remove_pos = clamp(remove_pos, 0, len(stripped_original))
721
+ end_remove = remove_pos + old_count
722
+ total_lines = len(stripped_original)
723
+ if end_remove > total_lines:
724
+ # Adjust old_count if we're near the end of file
725
+ old_count = total_lines - remove_pos
726
+ msg = (f"Hunk #{hunk_idx} => not enough lines to remove. "
727
+ f"Wanted to remove {old_count} at pos={remove_pos}, but file len={len(stripped_original)}. Failing.")
728
+ logger.error(msg)
729
+ raise PatchApplicationError(msg)
730
+
731
+ logger.debug(f"Hunk #{hunk_idx}: Removing lines {remove_pos}:{end_remove} from file")
732
+ for i in range(remove_pos, end_remove):
733
+ logger.debug(f" - {stripped_original[i]!r}")
734
+ del stripped_original[remove_pos:end_remove]
735
+
736
+ # Insert new_lines
737
+ logger.debug(f"Hunk #{hunk_idx}: Inserting {len(new_lines)} lines at pos={remove_pos}")
738
+ for i, ln in enumerate(new_lines):
739
+ logger.debug(f" + {ln!r}")
740
+ stripped_original.insert(remove_pos + i, ln)
741
+
742
+ net_change = len(new_lines) - old_count
743
+ offset += net_change
744
+
745
+ # done all hunks
746
+ final_lines = [ln + '\n' for ln in stripped_original]
747
+ return final_lines
748
+
749
+ def strip_leading_dotslash(rel_path: str) -> str:
750
+ """
751
+ Remove leading '../' or './' segments from the relative path
752
+ so it matches patch lines that are always 'frontend/...', not '../frontend/...'.
753
+ """
754
+ import re
755
+ # Repeatedly strip leading '../' or './'
756
+ pattern = re.compile(r'^\.\.?/')
757
+ while pattern.match(rel_path):
758
+ rel_path = rel_path[rel_path.index('/')+1:]
759
+ return rel_path
760
+
761
+ def parse_unified_diff_exact_plus(diff_content: str, target_file: str) -> list[dict]:
762
+ """
763
+ Same logic: we gather old_block and new_lines. If we can't parse anything, we return an empty list.
764
+ The calling code might handle that or raise an error if no hunks are found.
229
765
  """
766
+ import re
767
+ lines = diff_content.splitlines()
768
+ hunks = []
769
+ current_hunk = None
770
+ in_hunk = False
771
+ skip_file = True
772
+
773
+ # fixme: import ziya project directory if specified on invocation cli
774
+ rel_path = os.path.relpath(target_file, os.getcwd())
775
+ rel_path = strip_leading_dotslash(rel_path)
776
+
777
+ def close_hunk():
778
+ nonlocal current_hunk, in_hunk
779
+ if current_hunk:
780
+ hunks.append(current_hunk)
781
+ current_hunk = None
782
+ in_hunk = False
783
+
784
+ i = 0
785
+ while i < len(lines):
786
+ line = lines[i]
787
+ logger.debug(f"parse_unified_diff_exact_plus => line[{i}]: {line!r}")
788
+
789
+ if line.startswith('diff --git'):
790
+ i += 1
791
+ continue
230
792
 
231
- line_index = start_index
793
+ if line.startswith(('--- ', '+++ ')):
794
+ i += 1
795
+ continue
232
796
 
233
- # Initialize counts for recalculation
234
- actual_count_old = 0
235
- actual_count_new = 0
797
+ if line.startswith('@@ '):
798
+ close_hunk()
799
+ match = re.match(r'^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@.*$', line)
800
+ if match:
801
+ old_start = int(match.group(1))
802
+ # Validate line numbers
803
+ if old_start < 1:
804
+ logger.warning(f"Invalid hunk header - old_start ({old_start}) < 1")
805
+ old_start = 1
806
+
807
+ # Use default of 1 for count if not specified
808
+ old_count = int(match.group(2)) if match.group(2) else 1
809
+
810
+ new_start = int(match.group(3))
811
+ new_count = int(match.group(4)) if match.group(4) else 1
812
+ current_hunk = {
813
+ 'old_start': old_start,
814
+ 'old_count': old_count,
815
+ 'new_start': new_start,
816
+ 'new_count': new_count,
817
+ 'old_block': [],
818
+ 'new_lines': []
819
+ }
820
+ in_hunk = True
821
+ hunks.append(current_hunk)
822
+ i += 1
823
+ continue
236
824
 
237
- # Move to the next line after the hunk header
238
- line_index += 1
825
+ if in_hunk and current_hunk:
826
+ if line.startswith('-'):
827
+ text = line[1:].rstrip('\n')
828
+ current_hunk['old_block'].append(text)
829
+ elif line.startswith('+'):
830
+ text = line[1:].rstrip('\n')
831
+ current_hunk['new_lines'].append(text)
832
+ else:
833
+ # context => belongs to both old_block & new_lines
834
+ text = line[1:].rstrip('\n') if line.startswith(' ') else line.rstrip('\n')
835
+ current_hunk['old_block'].append(text)
836
+ current_hunk['new_lines'].append(text)
837
+ i += 1
239
838
 
240
- hunk_lines = []
839
+ close_hunk()
840
+ if len(hunks) == 0:
841
+ raise PatchApplicationError(f"No hunks found in diff for {target_file}", {
842
+ 'status': 'no_hunks_found',
843
+ 'details': f"Target file path: {target_file}\nDiff content:\n{diff_content[:500]}..."
844
+ })
845
+ return hunks
241
846
 
242
- # Collect hunk lines until the next hunk header or end of diff
243
- while line_index < len(lines):
244
- hunk_line = lines[line_index]
245
- if HUNK_HEADER_REGEX.match(hunk_line):
847
+
848
+ def find_best_chunk_position(file_lines: list[str], old_block: list[str], approximate_line: int) -> tuple[int, float]:
849
+ """
850
+ Return (best_pos, best_ratio). If best_ratio < MIN_CONFIDENCE, we raise or handle outside.
851
+ """
852
+ block_str = '\n'.join(old_block)
853
+ file_len = len(file_lines)
854
+ block_len = len(old_block)
855
+
856
+ # search +/- 20 lines
857
+ search_start = max(0, approximate_line - 20)
858
+ search_end = min(file_len - block_len + 1, approximate_line + 20)
859
+ if search_end < search_start:
860
+ search_start = 0
861
+ search_end = max(0, file_len - block_len + 1)
862
+
863
+ best_pos = approximate_line
864
+ best_ratio = 0.0
865
+ import difflib
866
+ matcher = difflib.SequenceMatcher(None)
867
+
868
+ for pos in range(search_start, search_end + 1):
869
+ window = file_lines[pos:pos+block_len]
870
+ window_str = '\n'.join(window)
871
+ matcher.set_seqs(block_str, window_str)
872
+ ratio = matcher.ratio()
873
+ if ratio > best_ratio:
874
+ best_ratio = ratio
875
+ best_pos = pos
876
+ if best_ratio > 0.98:
246
877
  break
878
+
879
+ logger.debug(f"find_best_chunk_position => best ratio={best_ratio:.2f} at pos={best_pos}, approximate_line={approximate_line}")
880
+ return best_pos, best_ratio
881
+
882
+
883
+ def clamp(value: int, low: int, high: int) -> int:
884
+ """Simple clamp utility to ensure we stay in range."""
885
+ return max(low, min(high, value))
886
+
887
+ class HunkData:
888
+ """
889
+ Stores data for a single hunk in the unified diff: header, start_line, old_lines, new_lines, etc.
890
+ Also includes optional context fields if needed (context_before, context_after).
891
+ """
892
+ def __init__(self, header='', start_line=1, old_lines=None, new_lines=None,
893
+ context_before=None, context_after=None):
894
+ self.header = header
895
+ self.start_line = start_line
896
+ self.old_lines = old_lines or []
897
+ self.new_lines = new_lines or []
898
+ self.context_before = context_before or []
899
+ self.context_after = context_after or []
900
+
901
+ def __repr__(self):
902
+ return (f"<HunkData start_line={self.start_line} "
903
+ f"old={len(self.old_lines)} new={len(self.new_lines)}>")
904
+
905
+
906
+ ##########################################################
907
+ # 2) FIND SECTION BOUNDS
908
+ ##########################################################
909
+
910
+ def parse_unified_diff(diff_content: str) -> List[HunkData]:
911
+ # ...
912
+ # Return a list of HunkData. Or use your existing parser logic:
913
+ lines = diff_content.splitlines()
914
+ hunks: List[HunkData] = []
915
+ in_hunk = False
916
+ current_hunk = None
917
+
918
+ for line in lines:
919
+ if line.startswith(('diff --git', 'index ', 'new file mode', '--- ', '+++ ')):
920
+ continue
921
+ if line.startswith('@@'):
922
+ # close old hunk if any
923
+ if in_hunk and current_hunk:
924
+ hunks.append(current_hunk)
925
+ current_hunk = HunkData(header=line, start_line=1)
926
+ match = re.match(r'^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@', line)
927
+ if match:
928
+ current_hunk.start_line = int(match.group(1))
929
+ else:
930
+ logger.warning(f"Invalid hunk header: {line}")
931
+ in_hunk = True
932
+ continue
933
+
934
+ if in_hunk and current_hunk:
935
+ if line.startswith('+'):
936
+ current_hunk.new_lines.append(line[1:])
937
+ elif line.startswith('-'):
938
+ current_hunk.old_lines.append(line[1:])
939
+ else:
940
+ # Context line
941
+ content = line[1:] if line.startswith(' ') else line
942
+ current_hunk.old_lines.append(content)
943
+ current_hunk.new_lines.append(content)
247
944
  else:
248
- hunk_lines.append(hunk_line)
249
- line_index += 1
250
-
251
- # Find the correct start_line_old by matching context and deleted lines
252
- start_line_old = _find_correct_old_start_line(original_content, hunk_lines)
253
-
254
- # Calculate counts for the hunk lines
255
- for hunk_line in hunk_lines:
256
- if hunk_line.startswith('+') and not hunk_line.startswith('+++'):
257
- actual_count_new += 1
258
- elif hunk_line.startswith('-') and not hunk_line.startswith('---'):
259
- actual_count_old += 1
260
- else:
261
- # Context line (unchanged line)
262
- actual_count_old += 1
263
- actual_count_new += 1
264
-
265
- # Special handling for new file creation
266
- if start_line_old == 0:
267
- # For new files:
268
- # count_old should be 0
269
- actual_count_old = 0
270
- corrected_start_line_new = 1
271
- else:
272
- # For existing files, adjust start_line_new considering previous line offsets
273
- corrected_start_line_new = start_line_old + cumulative_line_offset
945
+ # Lines outside hunks
946
+ pass
274
947
 
275
- # Calculate line offset for subsequent hunks
276
- line_offset = actual_count_new - actual_count_old
948
+ if in_hunk and current_hunk:
949
+ hunks.append(current_hunk)
277
950
 
278
- # Reconstruct the corrected hunk header
279
- corrected_hunk_header = _format_hunk_header(
280
- start_line_old, actual_count_old, corrected_start_line_new, actual_count_new
281
- )
951
+ return hunks
282
952
 
283
- return corrected_hunk_header, hunk_lines, line_index, line_offset
953
+ class PatchApplicationError(Exception):
954
+ def __init__(self, msg, details=None):
955
+ super().__init__(msg)
956
+ self.details = details or {}
284
957
 
285
- def _format_hunk_header(start_old: int, count_old: int, start_new: int, count_new: int) -> str:
958
+
959
+
960
+ def find_section_bounds(
961
+ pos: int,
962
+ lines: List[str],
963
+ is_header: bool = False,
964
+ hunk_header: str = ''
965
+ ) -> Tuple[int, int, Optional[str]]:
966
+ """
967
+ This reproduces the logic in your snippet for scanning backward or forward
968
+ to find function definitions, used to identify the nearest “section” or function.
286
969
  """
287
- Formats the hunk header according to git diff syntax, omitting counts when they are 1.
970
+ logger.debug(f"[find_section_bounds] pos={pos}, total lines={len(lines)}")
288
971
 
289
- Parameters:
290
- start_old (int): Starting line number in the original file.
291
- count_old (int): Number of lines in the hunk in the original file.
292
- start_new (int): Starting line number in the new file.
293
- count_new (int): Number of lines in the hunk in the new file.
972
+ if not lines:
973
+ logger.debug("Empty file, return trivial bounds.")
974
+ return 0, 0, None
294
975
 
295
- Returns:
296
- str: The formatted hunk header.
976
+ # Basic fallback if we can’t find anything
977
+ if pos >= len(lines):
978
+ pos = len(lines) - 1
297
979
 
298
- The hunk header format is:
299
- @@ -start_old[,count_old] +start_new[,count_new] @@
980
+ # For demonstration, we search backward for “def ”
981
+ start = pos
982
+ while start >= 0 and not lines[start].lstrip().startswith('def '):
983
+ start -= 1
984
+ if start < 0:
985
+ # No function found, fallback
986
+ return 0, len(lines), None
300
987
 
301
- If count_old or count_new is 1, the count is omitted.
988
+ # That’s presumably the start of the function
989
+ section_name = extract_function_name(lines[start])
990
+ end = start + 1
991
+ while end < len(lines) and not lines[end].lstrip().startswith('def '):
992
+ end += 1
993
+
994
+ logger.debug(f"[find_section_bounds] Found function {section_name}, range={start}-{end}")
995
+ return start, end, section_name
996
+
997
+
998
+ def extract_function_name(line: str) -> str:
999
+ """
1000
+ Helper to parse 'def something(...)' from a line and return 'something'.
1001
+ """
1002
+ line = line.strip()
1003
+ if not line.startswith('def '):
1004
+ return ''
1005
+ # e.g., def foo(bar):
1006
+ after_def = line[4:].split('(')[0]
1007
+ return after_def.strip()
1008
+
1009
+ def use_git_to_apply_code_diff(git_diff: str, file_path: str) -> None:
302
1010
  """
303
- # Omit counts when they are equal to 1
304
- old_part = f'-{start_old}'
305
- if count_old != 1:
306
- old_part += f',{count_old}'
307
- new_part = f'+{start_new}'
308
- if count_new != 1:
309
- new_part += f',{count_new}'
310
- return f'@@ {old_part} {new_part} @@'
1011
+ Apply a git diff to the user's codebase.
1012
+ Main entry point for patch application.
1013
+ """
1014
+ logger.info("Starting diff application process...")
1015
+ logger.debug("Original diff content:")
1016
+ logger.debug(git_diff)
1017
+
1018
+ # Correct the diff using existing functionality
1019
+ if file_path:
1020
+ git_diff = correct_git_diff(git_diff, file_path)
1021
+ else:
1022
+ raise ValueError("Could not determine target file path")
1023
+
1024
+ user_codebase_dir = os.environ.get("ZIYA_USER_CODEBASE_DIR")
1025
+ if not user_codebase_dir:
1026
+ raise ValueError("ZIYA_USER_CODEBASE_DIR environment variable is not set")
1027
+
1028
+ # Split into lines for analysis
1029
+ diff_lines = git_diff.splitlines()
1030
+
1031
+ # Extract target file path first
1032
+ file_path = None
1033
+ for line in diff_lines:
1034
+ if line.startswith('diff --git'):
1035
+ _, _, path = line.partition(' b/')
1036
+ file_path = os.path.join(user_codebase_dir, path)
1037
+ break
1038
+
1039
+ # Handle new file creation
1040
+ if is_new_file_creation(diff_lines):
1041
+ create_new_file(git_diff, user_codebase_dir)
1042
+ return
1043
+
1044
+ try:
1045
+ # Try system patch first
1046
+ logger.debug("About to run patch command with:")
1047
+ logger.debug(f"CWD: {user_codebase_dir}")
1048
+ logger.debug(f"Input length: {len(git_diff)} bytes")
1049
+ patch_result = subprocess.run(
1050
+ ['patch', '-p1', '--forward', '--ignore-whitespace', '-i', '-'],
1051
+ input=git_diff,
1052
+ cwd=user_codebase_dir,
1053
+ capture_output=True,
1054
+ text=True,
1055
+ timeout=10
1056
+ )
1057
+ logger.debug("Patch command completed with:")
1058
+ logger.debug(f"stdout: {patch_result.stdout}")
1059
+ logger.debug(f"stderr: {patch_result.stderr}")
1060
+
1061
+ if patch_result.returncode == 0:
1062
+ logger.info("System patch succeeded")
1063
+ return
1064
+ elif patch_result.returncode == 2: # Patch failed but gave output
1065
+ logger.warning("System patch failed but provided output")
1066
+
1067
+ # If patch fails, try git apply
1068
+ logger.warning("System patch failed, trying git apply...")
1069
+ timestamp = int(time.time() * 1000)
1070
+ temp_file = os.path.join(user_codebase_dir, f'temp_{timestamp}.diff')
1071
+
1072
+ try:
1073
+ with open(temp_file, 'w', newline='\n') as f:
1074
+ f.write(git_diff)
1075
+
1076
+ git_result = subprocess.run(
1077
+ ['git', 'apply', '--verbose', '--ignore-whitespace',
1078
+ '--ignore-space-change', '--whitespace=nowarn',
1079
+ '--reject', temp_file],
1080
+ cwd=user_codebase_dir,
1081
+ capture_output=True,
1082
+ text=True
1083
+ )
1084
+
1085
+ if git_result.returncode == 0:
1086
+ logger.info("Git apply succeeded")
1087
+ return
1088
+
1089
+ if 'patch does not apply' not in git_result.stderr:
1090
+ git_diff = extract_remaining_hunks(git_diff, git_result.stderr)
1091
+
1092
+ # If both patch and git apply fail, try difflib
1093
+ logger.warning("Git apply failed, trying difflib...")
1094
+ try:
1095
+ apply_diff_with_difflib(file_path, git_diff)
1096
+ except PatchApplicationError as e:
1097
+ if 'available_lines' in e.details:
1098
+ logger.warning(
1099
+ f"Not enough lines in file to apply patch. "
1100
+ f"Requested {e.details['requested_lines']} lines at position {e.details['position']}, "
1101
+ f"but only {e.details['available_lines']} lines available after that position."
1102
+ )
1103
+ elif e.details.get('status') == 'partial':
1104
+ logger.warning(f"Partial success: {e.details.get('summary', '')}")
1105
+ # Re-raise to let the endpoint handle the partial success
1106
+ raise
1107
+ else:
1108
+ logger.error(f"Failed to apply changes: {str(e)}")
1109
+ raise
1110
+ logger.info("Difflib apply succeeded")
1111
+ return
1112
+
1113
+ finally:
1114
+ if os.path.exists(temp_file):
1115
+ os.remove(temp_file)
1116
+ except Exception as e:
1117
+ logger.error(f"Error applying patch: {str(e)}")
1118
+ raise
1119
+
1120
+ def extract_remaining_hunks(git_diff: str, patch_output: str) -> str:
1121
+ """Extract hunks that weren't successfully applied."""
1122
+ logger.debug("Extracting remaining hunks from diff")
1123
+
1124
+ # Parse the original diff into hunks
1125
+ lines = git_diff.splitlines()
1126
+ hunks = []
1127
+ current_hunk = []
1128
+
1129
+ for line in lines:
1130
+ if line.startswith('@@'):
1131
+ if current_hunk:
1132
+ hunks.append(current_hunk)
1133
+ current_hunk = [line]
1134
+ elif current_hunk is not None:
1135
+ current_hunk.append(line)
1136
+
1137
+ if current_hunk:
1138
+ hunks.append(current_hunk)
1139
+
1140
+ # Filter out successfully applied hunks
1141
+ remaining_hunks = [hunk for i, hunk in enumerate(hunks, 1)
1142
+ if f'Hunk #{i} succeeded' not in patch_output]
1143
+
1144
+ return '\n'.join(sum(remaining_hunks, []))
1145
+