@jesec/flood 0.0.0-master.83e789c → 0.0.0-master.84305da

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (440) hide show
  1. package/CHANGELOG.md +710 -103
  2. package/README.md +126 -46
  3. package/SECURITY.md +27 -0
  4. package/dist/assets/icon_128x128.png +0 -0
  5. package/dist/assets/icon_192x192.png +0 -0
  6. package/dist/assets/icon_256x256.png +0 -0
  7. package/dist/assets/icon_384x384.png +0 -0
  8. package/dist/assets/icon_512x512.png +0 -0
  9. package/dist/assets/icon_96x96.png +0 -0
  10. package/dist/assets/icon_maskable.png +0 -0
  11. package/dist/assets/icon_maskable_180x180.png +0 -0
  12. package/dist/assets/index.html +1 -1
  13. package/dist/assets/manifest.json +35 -7
  14. package/dist/assets/static/css/main.968c780bfc4b52a705a5.css +2 -0
  15. package/dist/assets/static/css/main.968c780bfc4b52a705a5.css.map +1 -0
  16. package/dist/assets/static/js/179.43c61c39.chunk.js +2 -0
  17. package/dist/assets/static/js/179.43c61c39.chunk.js.map +1 -0
  18. package/dist/assets/static/js/525.57b74c72.chunk.js +2 -0
  19. package/dist/assets/static/js/525.57b74c72.chunk.js.map +1 -0
  20. package/dist/assets/static/js/579.c74a7ebb.chunk.js +2 -0
  21. package/dist/assets/static/js/579.c74a7ebb.chunk.js.map +1 -0
  22. package/dist/assets/static/js/704.2754d905.chunk.js +2 -0
  23. package/dist/assets/static/js/704.2754d905.chunk.js.map +1 -0
  24. package/dist/assets/static/js/flag0.390f4d80.chunk.js +2 -0
  25. package/dist/assets/static/js/flag0.390f4d80.chunk.js.map +1 -0
  26. package/dist/assets/static/js/flag1.c2493006.chunk.js +1 -0
  27. package/dist/assets/static/js/flag2.55e1234c.chunk.js +1 -0
  28. package/dist/assets/static/js/flag3.f007a894.chunk.js +1 -0
  29. package/dist/assets/static/js/i18n0.ec6ce9de.chunk.js +2 -0
  30. package/dist/assets/static/js/i18n0.ec6ce9de.chunk.js.map +1 -0
  31. package/dist/assets/static/js/i18n1.024a1e0a.chunk.js +2 -0
  32. package/dist/assets/static/js/i18n1.024a1e0a.chunk.js.map +1 -0
  33. package/dist/assets/static/js/i18n10.b180a8fe.chunk.js +2 -0
  34. package/dist/assets/static/js/i18n10.b180a8fe.chunk.js.map +1 -0
  35. package/dist/assets/static/js/i18n11.cc9e4457.chunk.js +2 -0
  36. package/dist/assets/static/js/i18n11.cc9e4457.chunk.js.map +1 -0
  37. package/dist/assets/static/js/i18n12.434bfc84.chunk.js +2 -0
  38. package/dist/assets/static/js/i18n12.434bfc84.chunk.js.map +1 -0
  39. package/dist/assets/static/js/i18n13.4e1bcc7d.chunk.js +2 -0
  40. package/dist/assets/static/js/i18n13.4e1bcc7d.chunk.js.map +1 -0
  41. package/dist/assets/static/js/i18n14.bd0e0339.chunk.js +2 -0
  42. package/dist/assets/static/js/i18n14.bd0e0339.chunk.js.map +1 -0
  43. package/dist/assets/static/js/i18n15.9bccd290.chunk.js +2 -0
  44. package/dist/assets/static/js/i18n15.9bccd290.chunk.js.map +1 -0
  45. package/dist/assets/static/js/i18n16.72597f50.chunk.js +2 -0
  46. package/dist/assets/static/js/i18n16.72597f50.chunk.js.map +1 -0
  47. package/dist/assets/static/js/i18n17.a512a8ea.chunk.js +2 -0
  48. package/dist/assets/static/js/i18n17.a512a8ea.chunk.js.map +1 -0
  49. package/dist/assets/static/js/i18n18.7f743233.chunk.js +2 -0
  50. package/dist/assets/static/js/i18n18.7f743233.chunk.js.map +1 -0
  51. package/dist/assets/static/js/i18n19.39cd469a.chunk.js +2 -0
  52. package/dist/assets/static/js/i18n19.39cd469a.chunk.js.map +1 -0
  53. package/dist/assets/static/js/i18n2.79e0d92e.chunk.js +2 -0
  54. package/dist/assets/static/js/i18n2.79e0d92e.chunk.js.map +1 -0
  55. package/dist/assets/static/js/i18n20.3abdb6e8.chunk.js +2 -0
  56. package/dist/assets/static/js/i18n20.3abdb6e8.chunk.js.map +1 -0
  57. package/dist/assets/static/js/i18n21.50abaf1d.chunk.js +2 -0
  58. package/dist/assets/static/js/i18n21.50abaf1d.chunk.js.map +1 -0
  59. package/dist/assets/static/js/i18n22.1b255305.chunk.js +2 -0
  60. package/dist/assets/static/js/i18n22.1b255305.chunk.js.map +1 -0
  61. package/dist/assets/static/js/i18n23.bed06736.chunk.js +2 -0
  62. package/dist/assets/static/js/i18n23.bed06736.chunk.js.map +1 -0
  63. package/dist/assets/static/js/i18n24.3c9dd350.chunk.js +2 -0
  64. package/dist/assets/static/js/i18n24.3c9dd350.chunk.js.map +1 -0
  65. package/dist/assets/static/js/i18n25.bd8904ad.chunk.js +2 -0
  66. package/dist/assets/static/js/i18n25.bd8904ad.chunk.js.map +1 -0
  67. package/dist/assets/static/js/i18n26.6b4d29ff.chunk.js +2 -0
  68. package/dist/assets/static/js/i18n26.6b4d29ff.chunk.js.map +1 -0
  69. package/dist/assets/static/js/i18n27.aef61718.chunk.js +2 -0
  70. package/dist/assets/static/js/i18n27.aef61718.chunk.js.map +1 -0
  71. package/dist/assets/static/js/i18n28.c7adecad.chunk.js +2 -0
  72. package/dist/assets/static/js/i18n28.c7adecad.chunk.js.map +1 -0
  73. package/dist/assets/static/js/i18n3.0dd26c81.chunk.js +2 -0
  74. package/dist/assets/static/js/i18n3.0dd26c81.chunk.js.map +1 -0
  75. package/dist/assets/static/js/i18n4.aa48660a.chunk.js +2 -0
  76. package/dist/assets/static/js/i18n4.aa48660a.chunk.js.map +1 -0
  77. package/dist/assets/static/js/i18n5.5d0467c6.chunk.js +2 -0
  78. package/dist/assets/static/js/i18n5.5d0467c6.chunk.js.map +1 -0
  79. package/dist/assets/static/js/i18n6.95586fce.chunk.js +2 -0
  80. package/dist/assets/static/js/i18n6.95586fce.chunk.js.map +1 -0
  81. package/dist/assets/static/js/i18n8.c41df595.chunk.js +2 -0
  82. package/dist/assets/static/js/i18n8.c41df595.chunk.js.map +1 -0
  83. package/dist/assets/static/js/i18n9.7a446f59.chunk.js +2 -0
  84. package/dist/assets/static/js/i18n9.7a446f59.chunk.js.map +1 -0
  85. package/dist/assets/static/js/main.8378636b.js +2 -0
  86. package/dist/assets/static/js/main.8378636b.js.map +1 -0
  87. package/dist/assets/static/media/ad.1b24595d.png +0 -0
  88. package/dist/assets/static/media/ae.4dd8f55e.png +0 -0
  89. package/dist/assets/static/media/af.4ce660eb.png +0 -0
  90. package/dist/assets/static/media/ag.fd9409e4.png +0 -0
  91. package/dist/assets/static/media/al.a297aacf.png +0 -0
  92. package/dist/assets/static/media/am.c84ee0cf.png +0 -0
  93. package/dist/assets/static/media/ao.a7c9214e.png +0 -0
  94. package/dist/assets/static/media/ar.7e57ef92.png +0 -0
  95. package/dist/assets/static/media/at.5aa9728a.png +0 -0
  96. package/dist/assets/static/media/au.155b51d8.png +0 -0
  97. package/dist/assets/static/media/az.63afef5b.png +0 -0
  98. package/dist/assets/static/media/ba.5ce8f273.png +0 -0
  99. package/dist/assets/static/media/bb.f369fc62.png +0 -0
  100. package/dist/assets/static/media/bd.516278fc.png +0 -0
  101. package/dist/assets/static/media/be.08ec4a8d.png +0 -0
  102. package/dist/assets/static/media/bf.50bfcb31.png +0 -0
  103. package/dist/assets/static/media/bg.d9346b96.png +0 -0
  104. package/dist/assets/static/media/bh.f06d5914.png +0 -0
  105. package/dist/assets/static/media/bi.4923e3a3.png +0 -0
  106. package/dist/assets/static/media/bj.019fa79b.png +0 -0
  107. package/dist/assets/static/media/bn.077671e2.png +0 -0
  108. package/dist/assets/static/media/bo.8fb15fc6.png +0 -0
  109. package/dist/assets/static/media/br.ec051f0c.png +0 -0
  110. package/dist/assets/static/media/bs.a74a126f.png +0 -0
  111. package/dist/assets/static/media/bt.4217b804.png +0 -0
  112. package/dist/assets/static/media/bw.21fe1567.png +0 -0
  113. package/dist/assets/static/media/by.d247fe16.png +0 -0
  114. package/dist/assets/static/media/bz.98ec59f6.png +0 -0
  115. package/dist/assets/static/media/ca.25743e11.png +0 -0
  116. package/dist/assets/static/media/cd.a5bfda53.png +0 -0
  117. package/dist/assets/static/media/cf.de7d5d92.png +0 -0
  118. package/dist/assets/static/media/cg.a47b626b.png +0 -0
  119. package/dist/assets/static/media/ch.445f47a1.png +0 -0
  120. package/dist/assets/static/media/ci.a6009c5b.png +0 -0
  121. package/dist/assets/static/media/cl.de1d715e.png +0 -0
  122. package/dist/assets/static/media/cm.3ce8a86a.png +0 -0
  123. package/dist/assets/static/media/cn.e6a26073.png +0 -0
  124. package/dist/assets/static/media/co.e9244faa.png +0 -0
  125. package/dist/assets/static/media/cr.c895e035.png +0 -0
  126. package/dist/assets/static/media/cu.e486c055.png +0 -0
  127. package/dist/assets/static/media/cv.a9585acf.png +0 -0
  128. package/dist/assets/static/media/cw.df13039d.png +0 -0
  129. package/dist/assets/static/media/cy.b31f43a9.png +0 -0
  130. package/dist/assets/static/media/cz.8ec5948b.png +0 -0
  131. package/dist/assets/static/media/de.d12f391a.png +0 -0
  132. package/dist/assets/static/media/dj.154c3580.png +0 -0
  133. package/dist/assets/static/media/dk.da382fe2.png +0 -0
  134. package/dist/assets/static/media/dm.f452e6cd.png +0 -0
  135. package/dist/assets/static/media/do.c6bd7637.png +0 -0
  136. package/dist/assets/static/media/dz.672a69c0.png +0 -0
  137. package/dist/assets/static/media/ec.349d9bd7.png +0 -0
  138. package/dist/assets/static/media/ee.2396205f.png +0 -0
  139. package/dist/assets/static/media/eg.ccbf3f45.png +0 -0
  140. package/dist/assets/static/media/eh.af65674a.png +0 -0
  141. package/dist/assets/static/media/er.21afb638.png +0 -0
  142. package/dist/assets/static/media/es.2a6eaee4.png +0 -0
  143. package/dist/assets/static/media/et.8beb65c8.png +0 -0
  144. package/dist/assets/static/media/fi.331f70fd.png +0 -0
  145. package/dist/assets/static/media/fj.7724d800.png +0 -0
  146. package/dist/assets/static/media/fm.eeaf71e9.png +0 -0
  147. package/dist/assets/static/media/fr.5d5ab008.png +0 -0
  148. package/dist/assets/static/media/ga.77ed474c.png +0 -0
  149. package/dist/assets/static/media/gb.e00065bf.png +0 -0
  150. package/dist/assets/static/media/gd.b4522267.png +0 -0
  151. package/dist/assets/static/media/ge.91a7654d.png +0 -0
  152. package/dist/assets/static/media/gh.4759f92f.png +0 -0
  153. package/dist/assets/static/media/gm.81cd9f75.png +0 -0
  154. package/dist/assets/static/media/gn.9f3d376e.png +0 -0
  155. package/dist/assets/static/media/gq.e8ad58be.png +0 -0
  156. package/dist/assets/static/media/gr.26f3ac0b.png +0 -0
  157. package/dist/assets/static/media/gt.9d81c52e.png +0 -0
  158. package/dist/assets/static/media/gw.dc906982.png +0 -0
  159. package/dist/assets/static/media/gy.a4f62b6c.png +0 -0
  160. package/dist/assets/static/media/hk.56555c3f.png +0 -0
  161. package/dist/assets/static/media/hn.64ee6aad.png +0 -0
  162. package/dist/assets/static/media/hr.93ebecd3.png +0 -0
  163. package/dist/assets/static/media/ht.42ca1596.png +0 -0
  164. package/dist/assets/static/media/hu.bb30f05d.png +0 -0
  165. package/dist/assets/static/media/id.2cb49f2d.png +0 -0
  166. package/dist/assets/static/media/ie.b4dd1f19.png +0 -0
  167. package/dist/assets/static/media/il.cd1d1faf.png +0 -0
  168. package/dist/assets/static/media/in.2df03847.png +0 -0
  169. package/dist/assets/static/media/iq.a9b670ab.png +0 -0
  170. package/dist/assets/static/media/ir.9a3de085.png +0 -0
  171. package/dist/assets/static/media/is.d88f4fc9.png +0 -0
  172. package/dist/assets/static/media/it.b73713e3.png +0 -0
  173. package/dist/assets/static/media/je.0353f56a.png +0 -0
  174. package/dist/assets/static/media/jm.20330ef4.png +0 -0
  175. package/dist/assets/static/media/jo.eb66f1d1.png +0 -0
  176. package/dist/assets/static/media/jp.63e382ae.png +0 -0
  177. package/dist/assets/static/media/ke.ab2e43b8.png +0 -0
  178. package/dist/assets/static/media/kg.2c47c2af.png +0 -0
  179. package/dist/assets/static/media/kh.4732c810.png +0 -0
  180. package/dist/assets/static/media/ki.5fba09fd.png +0 -0
  181. package/dist/assets/static/media/km.7bbed3e9.png +0 -0
  182. package/dist/assets/static/media/kn.a9595a16.png +0 -0
  183. package/dist/assets/static/media/kp.8a4dc30a.png +0 -0
  184. package/dist/assets/static/media/kr.5273be1d.png +0 -0
  185. package/dist/assets/static/media/ks.99f78645.png +0 -0
  186. package/dist/assets/static/media/kw.af3521bc.png +0 -0
  187. package/dist/assets/static/media/kz.ea47ef79.png +0 -0
  188. package/dist/assets/static/media/la.78a598d7.png +0 -0
  189. package/dist/assets/static/media/lb.7a7c15a9.png +0 -0
  190. package/dist/assets/static/media/lc.6083a4ff.png +0 -0
  191. package/dist/assets/static/media/li.61c564a4.png +0 -0
  192. package/dist/assets/static/media/lk.6fa85802.png +0 -0
  193. package/dist/assets/static/media/lr.8063f7db.png +0 -0
  194. package/dist/assets/static/media/ls.901ddb71.png +0 -0
  195. package/dist/assets/static/media/lt.9209ace3.png +0 -0
  196. package/dist/assets/static/media/lu.c9872bc1.png +0 -0
  197. package/dist/assets/static/media/lv.7bcacf0a.png +0 -0
  198. package/dist/assets/static/media/ly.2830aa63.png +0 -0
  199. package/dist/assets/static/media/ma.ce5f697b.png +0 -0
  200. package/dist/assets/static/media/mc.4bd5d57a.png +0 -0
  201. package/dist/assets/static/media/md.fb4b5bdf.png +0 -0
  202. package/dist/assets/static/media/me.1f1d1772.png +0 -0
  203. package/dist/assets/static/media/mg.89101bd2.png +0 -0
  204. package/dist/assets/static/media/mh.ff11dff7.png +0 -0
  205. package/dist/assets/static/media/mk.8420e604.png +0 -0
  206. package/dist/assets/static/media/ml.4db47c66.png +0 -0
  207. package/dist/assets/static/media/mm.8e4ac30a.png +0 -0
  208. package/dist/assets/static/media/mn.dc1daa04.png +0 -0
  209. package/dist/assets/static/media/mr.7cbca6d0.png +0 -0
  210. package/dist/assets/static/media/mt.28a4b863.png +0 -0
  211. package/dist/assets/static/media/mu.d93db6c7.png +0 -0
  212. package/dist/assets/static/media/mv.7d026bf1.png +0 -0
  213. package/dist/assets/static/media/mw.960cd4fb.png +0 -0
  214. package/dist/assets/static/media/mx.39b78eb2.png +0 -0
  215. package/dist/assets/static/media/my.916a8392.png +0 -0
  216. package/dist/assets/static/media/mz.facb4ea3.png +0 -0
  217. package/dist/assets/static/media/na.472666a9.png +0 -0
  218. package/dist/assets/static/media/ne.d774701f.png +0 -0
  219. package/dist/assets/static/media/ng.7b06a49f.png +0 -0
  220. package/dist/assets/static/media/ni.7140131c.png +0 -0
  221. package/dist/assets/static/media/nl.4c04aa96.png +0 -0
  222. package/dist/assets/static/media/no.c19eb00d.png +0 -0
  223. package/dist/assets/static/media/np.54fb4f2f.png +0 -0
  224. package/dist/assets/static/media/nr.7527cc38.png +0 -0
  225. package/dist/assets/static/media/nz.738be05b.png +0 -0
  226. package/dist/assets/static/media/om.b25e0a17.png +0 -0
  227. package/dist/assets/static/media/pa.b28a9059.png +0 -0
  228. package/dist/assets/static/media/pe.c1fc1d96.png +0 -0
  229. package/dist/assets/static/media/pg.380115db.png +0 -0
  230. package/dist/assets/static/media/ph.02199ddc.png +0 -0
  231. package/dist/assets/static/media/pk.094f9517.png +0 -0
  232. package/dist/assets/static/media/pl.41521283.png +0 -0
  233. package/dist/assets/static/media/pt.1f82dc04.png +0 -0
  234. package/dist/assets/static/media/pw.a26c2316.png +0 -0
  235. package/dist/assets/static/media/py.926c65ed.png +0 -0
  236. package/dist/assets/static/media/qa.c6a3c20e.png +0 -0
  237. package/dist/assets/static/media/ro.a36876c9.png +0 -0
  238. package/dist/assets/static/media/rs.c6629de8.png +0 -0
  239. package/dist/assets/static/media/ru.a9b948c1.png +0 -0
  240. package/dist/assets/static/media/rw.e8aecba0.png +0 -0
  241. package/dist/assets/static/media/sa.859049c8.png +0 -0
  242. package/dist/assets/static/media/sb.4ad27b27.png +0 -0
  243. package/dist/assets/static/media/sc.3293efde.png +0 -0
  244. package/dist/assets/static/media/sd.19c94faa.png +0 -0
  245. package/dist/assets/static/media/se.195b3f93.png +0 -0
  246. package/dist/assets/static/media/sg.19d81907.png +0 -0
  247. package/dist/assets/static/media/si.367c5443.png +0 -0
  248. package/dist/assets/static/media/sk.4e5b8a39.png +0 -0
  249. package/dist/assets/static/media/sl.4b174b1c.png +0 -0
  250. package/dist/assets/static/media/sm.2cba3dac.png +0 -0
  251. package/dist/assets/static/media/sn.a4c1041d.png +0 -0
  252. package/dist/assets/static/media/so.b455e3bf.png +0 -0
  253. package/dist/assets/static/media/sr.5adc1c00.png +0 -0
  254. package/dist/assets/static/media/st.5ae44155.png +0 -0
  255. package/dist/assets/static/media/sv.43aa6cdf.png +0 -0
  256. package/dist/assets/static/media/sy.0fbd24f7.png +0 -0
  257. package/dist/assets/static/media/sz.ff204912.png +0 -0
  258. package/dist/assets/static/media/td.c7aa2a4e.png +0 -0
  259. package/dist/assets/static/media/tg.857c3bec.png +0 -0
  260. package/dist/assets/static/media/th.683600c7.png +0 -0
  261. package/dist/assets/static/media/tj.d20c5570.png +0 -0
  262. package/dist/assets/static/media/tl.5edd8ea7.png +0 -0
  263. package/dist/assets/static/media/tm.15960215.png +0 -0
  264. package/dist/assets/static/media/tn.40df718e.png +0 -0
  265. package/dist/assets/static/media/to.c3b054df.png +0 -0
  266. package/dist/assets/static/media/tr.adeace6d.png +0 -0
  267. package/dist/assets/static/media/tt.839bd7f1.png +0 -0
  268. package/dist/assets/static/media/tv.628cae3e.png +0 -0
  269. package/dist/assets/static/media/tw.4e885914.png +0 -0
  270. package/dist/assets/static/media/tz.b2f0dc37.png +0 -0
  271. package/dist/assets/static/media/ua.6b103313.png +0 -0
  272. package/dist/assets/static/media/ug.c84042fc.png +0 -0
  273. package/dist/assets/static/media/us.8523c31d.png +0 -0
  274. package/dist/assets/static/media/uy.a943f85e.png +0 -0
  275. package/dist/assets/static/media/uz.25552673.png +0 -0
  276. package/dist/assets/static/media/va.a29e1b53.png +0 -0
  277. package/dist/assets/static/media/vc.7480bd37.png +0 -0
  278. package/dist/assets/static/media/ve.fd4273c2.png +0 -0
  279. package/dist/assets/static/media/vn.7d2eff1b.png +0 -0
  280. package/dist/assets/static/media/vu.48b64cf3.png +0 -0
  281. package/dist/assets/static/media/ws.f3d9202f.png +0 -0
  282. package/dist/assets/static/media/ye.311a0e50.png +0 -0
  283. package/dist/assets/static/media/za.090a856f.png +0 -0
  284. package/dist/assets/static/media/zm.8371e197.png +0 -0
  285. package/dist/assets/static/media/zw.a6809447.png +0 -0
  286. package/dist/index.js +131685 -0
  287. package/package.json +222 -151
  288. package/dist/assets/android-chrome-192x192.png +0 -0
  289. package/dist/assets/android-chrome-512x512.png +0 -0
  290. package/dist/assets/apple-touch-icon.png +0 -0
  291. package/dist/assets/asset-manifest.json +0 -57
  292. package/dist/assets/browserconfig.xml +0 -9
  293. package/dist/assets/favicon-16x16.png +0 -0
  294. package/dist/assets/favicon-32x32.png +0 -0
  295. package/dist/assets/mstile-144x144.png +0 -0
  296. package/dist/assets/mstile-150x150.png +0 -0
  297. package/dist/assets/mstile-310x150.png +0 -0
  298. package/dist/assets/mstile-310x310.png +0 -0
  299. package/dist/assets/mstile-70x70.png +0 -0
  300. package/dist/assets/static/css/main.e5c088b6b6f679087a82.css +0 -1
  301. package/dist/assets/static/js/0.0a556a75.chunk.js +0 -1
  302. package/dist/assets/static/js/1.14dd2d0c.chunk.js +0 -1
  303. package/dist/assets/static/js/10.d4eef924.chunk.js +0 -1
  304. package/dist/assets/static/js/11.53cd515d.chunk.js +0 -1
  305. package/dist/assets/static/js/12.ce0f8a4e.chunk.js +0 -1
  306. package/dist/assets/static/js/13.9ca96920.chunk.js +0 -1
  307. package/dist/assets/static/js/14.588e3d0c.chunk.js +0 -1
  308. package/dist/assets/static/js/15.f28d64ab.chunk.js +0 -1
  309. package/dist/assets/static/js/16.53dd87df.chunk.js +0 -1
  310. package/dist/assets/static/js/17.b764e125.chunk.js +0 -1
  311. package/dist/assets/static/js/18.9b7e5575.chunk.js +0 -1
  312. package/dist/assets/static/js/2.8fafb9ff.chunk.js +0 -1
  313. package/dist/assets/static/js/20.64809e35.chunk.js +0 -1
  314. package/dist/assets/static/js/21.f3058669.chunk.js +0 -1
  315. package/dist/assets/static/js/22.dcfb4883.chunk.js +0 -1
  316. package/dist/assets/static/js/23.840a4201.chunk.js +0 -1
  317. package/dist/assets/static/js/24.0a173a0d.chunk.js +0 -1
  318. package/dist/assets/static/js/25.e4c2217e.chunk.js +0 -1
  319. package/dist/assets/static/js/26.5f03f1a3.chunk.js +0 -1
  320. package/dist/assets/static/js/27.5127408d.chunk.js +0 -1
  321. package/dist/assets/static/js/28.ebac4379.chunk.js +0 -1
  322. package/dist/assets/static/js/29.de46849d.chunk.js +0 -1
  323. package/dist/assets/static/js/3.c219b8a8.chunk.js +0 -1
  324. package/dist/assets/static/js/30.ff543e93.chunk.js +0 -1
  325. package/dist/assets/static/js/31.1f1ad44f.chunk.js +0 -1
  326. package/dist/assets/static/js/32.b4c28098.chunk.js +0 -1
  327. package/dist/assets/static/js/33.3febffaf.chunk.js +0 -1
  328. package/dist/assets/static/js/34.2e764e96.chunk.js +0 -1
  329. package/dist/assets/static/js/35.92c40bb9.chunk.js +0 -1
  330. package/dist/assets/static/js/36.27afe215.chunk.js +0 -1
  331. package/dist/assets/static/js/37.6d94e34b.chunk.js +0 -1
  332. package/dist/assets/static/js/38.107b5aa9.chunk.js +0 -1
  333. package/dist/assets/static/js/39.112b724b.chunk.js +0 -1
  334. package/dist/assets/static/js/4.19d26f13.chunk.js +0 -1
  335. package/dist/assets/static/js/40.44aa79f5.chunk.js +0 -1
  336. package/dist/assets/static/js/41.fb69cc30.chunk.js +0 -1
  337. package/dist/assets/static/js/42.906cc1ff.chunk.js +0 -1
  338. package/dist/assets/static/js/43.135e1560.chunk.js +0 -1
  339. package/dist/assets/static/js/44.a3d23bab.chunk.js +0 -1
  340. package/dist/assets/static/js/45.f025dffe.chunk.js +0 -1
  341. package/dist/assets/static/js/46.3ea25c9e.chunk.js +0 -1
  342. package/dist/assets/static/js/47.5a213255.chunk.js +0 -1
  343. package/dist/assets/static/js/48.ce4bfe23.chunk.js +0 -1
  344. package/dist/assets/static/js/49.857650de.chunk.js +0 -1
  345. package/dist/assets/static/js/5.dc5232a2.chunk.js +0 -1
  346. package/dist/assets/static/js/50.2a5fd558.chunk.js +0 -1
  347. package/dist/assets/static/js/6.210f5d48.chunk.js +0 -1
  348. package/dist/assets/static/js/7.29af7904.chunk.js +0 -1
  349. package/dist/assets/static/js/8.efcd70d8.chunk.js +0 -1
  350. package/dist/assets/static/js/9.23e24017.chunk.js +0 -1
  351. package/dist/assets/static/js/main.c8ce60de.js +0 -1
  352. package/dist/assets/static/media/ABOUT.d02918c9.md +0 -13
  353. package/dist/assets/static/media/Roboto-500.64e69384.woff +0 -0
  354. package/dist/assets/static/media/Roboto-500.7f8f0146.eot +0 -0
  355. package/dist/assets/static/media/Roboto-500.916656a2.ttf +0 -0
  356. package/dist/assets/static/media/Roboto-500.abd255e8.svg +0 -305
  357. package/dist/assets/static/media/Roboto-700.8d11d1e1.ttf +0 -0
  358. package/dist/assets/static/media/Roboto-700.9c9c164e.svg +0 -310
  359. package/dist/assets/static/media/Roboto-700.c65552c8.eot +0 -0
  360. package/dist/assets/static/media/Roboto-700.ee82bda2.woff +0 -0
  361. package/dist/assets/static/media/Roboto-700italic.1dc5bfed.eot +0 -0
  362. package/dist/assets/static/media/Roboto-700italic.686da014.woff +0 -0
  363. package/dist/assets/static/media/Roboto-700italic.896656dc.ttf +0 -0
  364. package/dist/assets/static/media/Roboto-700italic.cacb9681.svg +0 -325
  365. package/dist/assets/static/media/Roboto-italic.09ed2f27.svg +0 -323
  366. package/dist/assets/static/media/Roboto-italic.c1421604.woff +0 -0
  367. package/dist/assets/static/media/Roboto-italic.c38ecad2.ttf +0 -0
  368. package/dist/assets/static/media/Roboto-italic.f7677a07.eot +0 -0
  369. package/dist/assets/static/media/Roboto-regular.5107f918.eot +0 -0
  370. package/dist/assets/static/media/Roboto-regular.6a307cf2.woff +0 -0
  371. package/dist/assets/static/media/Roboto-regular.81dc9b21.ttf +0 -0
  372. package/dist/assets/static/media/Roboto-regular.bcf2ba9e.svg +0 -308
  373. package/dist/config.js +0 -173
  374. package/dist/server/app.js +0 -79
  375. package/dist/server/bin/enforce-prerequisites.js +0 -55
  376. package/dist/server/bin/migrations/fix-is-admin-flag.js +0 -41
  377. package/dist/server/bin/migrations/per-user-rtorrent-instances.js +0 -67
  378. package/dist/server/bin/migrations/run.js +0 -10
  379. package/dist/server/bin/start.js +0 -18
  380. package/dist/server/bin/web-server.js +0 -94
  381. package/dist/server/config/passport.js +0 -32
  382. package/dist/server/constants/clientGatewayServiceEvents.js +0 -15
  383. package/dist/server/constants/diskUsageServiceEvents.js +0 -8
  384. package/dist/server/constants/fileListPropMap.js +0 -29
  385. package/dist/server/constants/historyServiceEvents.js +0 -18
  386. package/dist/server/constants/notificationServiceEvents.js +0 -8
  387. package/dist/server/constants/taxonomyServiceEvents.js +0 -8
  388. package/dist/server/constants/torrentListPropMap.js +0 -200
  389. package/dist/server/constants/torrentServiceEvents.js +0 -8
  390. package/dist/server/constants/transferSummaryPropMap.js +0 -28
  391. package/dist/server/middleware/appendUserServices.js +0 -10
  392. package/dist/server/middleware/booleanCoerce.js +0 -9
  393. package/dist/server/middleware/clientActivityStream.js +0 -124
  394. package/dist/server/middleware/eventStream.js +0 -25
  395. package/dist/server/middleware/requireAdmin.js +0 -8
  396. package/dist/server/models/ClientRequest.js +0 -310
  397. package/dist/server/models/Feed.js +0 -65
  398. package/dist/server/models/Filesystem.js +0 -44
  399. package/dist/server/models/HistoryEra.js +0 -168
  400. package/dist/server/models/ServerEvent.js +0 -27
  401. package/dist/server/models/TemporaryStorage.js +0 -20
  402. package/dist/server/models/Users.js +0 -160
  403. package/dist/server/models/client.js +0 -363
  404. package/dist/server/models/settings.js +0 -119
  405. package/dist/server/routes/api.js +0 -69
  406. package/dist/server/routes/auth.js +0 -184
  407. package/dist/server/routes/client.js +0 -101
  408. package/dist/server/services/BaseService.js +0 -24
  409. package/dist/server/services/clientGatewayService.js +0 -220
  410. package/dist/server/services/clientRequestManager.js +0 -76
  411. package/dist/server/services/diskUsageService.js +0 -133
  412. package/dist/server/services/feedService.js +0 -290
  413. package/dist/server/services/historyService.js +0 -181
  414. package/dist/server/services/index.js +0 -108
  415. package/dist/server/services/notificationService.js +0 -109
  416. package/dist/server/services/taxonomyService.js +0 -107
  417. package/dist/server/services/torrentService.js +0 -235
  418. package/dist/server/util/ajaxUtil.js +0 -19
  419. package/dist/server/util/clientResponseUtil.js +0 -99
  420. package/dist/server/util/fileUtil.js +0 -45
  421. package/dist/server/util/mediainfo.js +0 -34
  422. package/dist/server/util/methodCallUtil.js +0 -22
  423. package/dist/server/util/numberUtils.js +0 -7
  424. package/dist/server/util/rTorrentDeserializer.js +0 -104
  425. package/dist/server/util/rTorrentPropMap.js +0 -13
  426. package/dist/server/util/scgiUtil.js +0 -36
  427. package/dist/server/util/torrentFileUtil.js +0 -23
  428. package/dist/shared/config/paths.js +0 -41
  429. package/dist/shared/constants/clientSettingsMap.js +0 -53
  430. package/dist/shared/constants/diffActionTypes.js +0 -6
  431. package/dist/shared/constants/historySnapshotTypes.js +0 -11
  432. package/dist/shared/constants/serverEventTypes.js +0 -18
  433. package/dist/shared/constants/torrentFilePropsMap.js +0 -6
  434. package/dist/shared/constants/torrentPeerPropsMap.js +0 -32
  435. package/dist/shared/constants/torrentStatusMap.js +0 -17
  436. package/dist/shared/constants/torrentTrackerPropsMap.js +0 -6
  437. package/dist/shared/util/formatUtil.js +0 -33
  438. package/dist/shared/util/objectUtil.js +0 -56
  439. package/dist/shared/util/regEx.js +0 -7
  440. /package/dist/assets/{safari-pinned-tab.svg → icon.svg} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/js/704.2754d905.chunk.js","mappings":"wIAAA,MAkBA,EAlBkC,CAChCA,MAAO,8BACPC,KAAM,6BACNC,OAAQ,+BACRC,UAAW,mCACXC,WAAY,mCACZC,YAAa,iCACbC,KAAM,6BACNC,YAAa,qCACbC,eAAgB,gCAChBC,iBAAkB,0CAClBC,iBAAkB,0CAClBC,eAAgB,wCAChBC,kBAAmB,wCACnBC,cAAe,mCACfC,YAAa,iC,6ECLf,MAeA,GAfsDC,EAAAA,EAAAA,MAAK,EAAEC,aAC3D,OAAQA,GACN,IAAK,QACH,OAAOC,EAAAA,EAAAA,KAACC,EAAAA,GAAK,IACf,IAAK,WACH,OAAOD,EAAAA,EAAAA,KAACE,EAAAA,GAAO,IACjB,IAAK,cAEL,IAAK,UACH,OAAOF,EAAAA,EAAAA,KAACG,EAAAA,GAAK,IACf,QACE,OAAOH,EAAAA,EAAAA,KAACI,EAAAA,GAAI,OCAlB,GAT0CC,EAAAA,EAAAA,IAAS,EAAEC,UAASP,aAC5DQ,EAAAA,EAAAA,MAAA,OAAKC,UAAU,eAAcC,SAAA,EAC3BT,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,qBAAoBC,SAAEV,IAAUC,EAAAA,EAAAA,KAACU,EAAiB,CAACX,OAAQA,OAC1EC,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,8BAA6BC,UAC1CT,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,qBAAqBG,MAAO,CAACC,MAAO,GAAGN,a,mLCH5D,MAaA,EAbgCO,EAAEC,eAAcC,OAAMC,QAAOC,OAAMC,SAAQ,MACzE,MAAMC,EAAUC,IAAW,0BAA2B,CACpD,CAAC,WAAWH,KAAiB,MAARA,IAGvB,OACEV,EAAAA,EAAAA,MAACc,EAAAA,EAAO,CAACC,QAASN,EAAOO,QAAST,EAAcU,SAAS,SAASC,iBAAkBN,EAASO,SAAUR,EAAMT,SAAA,CAC1GM,GACDf,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,gBAAeC,SAAEO,QCTvC,EAVuD,CACrDW,UAAW,OACXC,aAAc,OACdC,WAAY,OACZC,SAAU,OACVC,UAAW,OACXC,OAAQ,OACRC,QAAS,Q,+DCQX,MAAMC,EAA0CA,EAAE1B,YAAWQ,QAAOmB,iBAAgBZ,aAClFY,GACEnC,EAAAA,EAAAA,KAAA,OAAKoC,KAAK,OAAO5B,UAAWA,EAAWe,QAASA,EAAQd,SACrDO,KAGHhB,EAAAA,EAAAA,KAAA,UACEqC,KAAK,SACL7B,UAAWY,IACTZ,GACA8B,EAAAA,EAAAA,IAAI,CACF1B,MAAO,OACP2B,OAAQ,OACRC,UAAW,OACXC,cAAe,CACbC,QAAS,aAIfnB,QAASA,EAAQd,SAEhBO,IAkKP,GAhIiBX,EAAAA,EAAAA,IACf,EACEsC,gBAAgB,WAChBC,uBAAuB,WACvBC,sBAAsB,oBACtBC,mBACAC,YAAY,OACZC,SACAC,oBAAmB,EACnBC,YACAC,UAAS,EACTC,UACAxC,QACAuB,kBAAiB,EACjBkB,mBACAC,aAEA,MAAMC,GAAKC,EAAAA,EAAAA,QAAeC,IAAS,cAC7BC,EAASC,EAAAA,EAAQC,qBAAuBL,EAAGM,QAC3CC,EAA2B1C,IAAWwB,EAAsB,GAAGD,gBAA4BI,IAAa,CAC5G,CAAC,GAAGJ,yBAAsCM,EAC1C,CAAC,GAAGN,YAAwB/B,KAAmB,MAATA,EACtC,CAAC,GAAG+B,cAA2BQ,EAC/B,cAAeO,IAGXK,GAAgBC,EAAAA,EAAAA,aAAY,KAChCC,OAAOC,oBAAoB,QAASH,GAEpCJ,EAAAA,EAAQQ,sBAAsB,OAC7B,KAEHC,EAAAA,EAAAA,GAAiB,SAAU,IAAML,KAEjC,MAAMM,GAAeL,EAAAA,EAAAA,aAAY,KAC/BC,OAAOK,iBAAiB,QAASP,GAE7BT,GACFA,IAGFK,EAAAA,EAAQQ,sBAAsBZ,EAAGM,UAChC,CAACE,EAAeT,IAEbiB,EAAuBC,IAC3BA,GAAOC,kBAEHf,EACFK,IAEAM,KAQJ,IAAIK,EACJ,GALI5B,IACFA,EAAiBe,QAAUU,GAIzBb,EAAQ,CACV,MAAMiB,GACJ3E,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,mBAAkBC,UAC/BT,EAAAA,EAAAA,KAACkC,EAAc,CACb1B,UAAWqC,EACX7B,MAAOgC,EACPb,eAAgBA,IAAkB,EAClCZ,QAASgD,KALyB,mBAUlCK,GACJ5E,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,kBAAiBC,SAC5ByC,EAAU2B,IAAI,CAACC,EAAOC,KACrB/E,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,iBAAgBC,SAC5BqE,EAAMD,IAAI,CAACG,EAAMC,KAChB,MAAM9D,EAAUC,IAAW,4BAA6B4D,EAAKxE,UAAW,CACtE,iBAAqC,IAApBwE,EAAKE,WACtB,cAAeF,EAAKG,WAGtB,OACEnF,EAAAA,EAAAA,KAAA,MAAIQ,UAAWW,EAAQV,UACrBT,EAAAA,EAAAA,KAAA,UACEqC,KAAK,SACL+C,UAA8B,IAApBJ,EAAKE,WACf3D,SACsB,IAApByD,EAAKE,gBACDG,EACA,KACEtB,IACAV,EAAiB2B,IAExBvE,SAEAuE,EAAKM,eAbmBL,MAREF,KAFL,kBAiCtCL,GACE1E,EAAAA,EAAAA,KAACuF,EAAAA,EAAa,CAACC,WAAW,OAAOC,QAAS,CAACC,MAAO,IAAKC,KAAM,KAAKlF,UAChET,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,yBAAwBC,SACtB,OAAdsC,EAAqB,CAAC6B,EAAaD,GAAiB,CAACA,EAAeC,MAI7E,CAEA,OACErE,EAAAA,EAAAA,MAAA,OAAKC,UAAWsD,EAAyBrD,SAAA,EACvCT,EAAAA,EAAAA,KAACkC,EAAc,CACb1B,UAAWqC,EACX7B,MAAOoC,GAAWJ,EAClBb,eAAgBA,IAAkB,EAClCZ,QAASgD,KAEXvE,EAAAA,EAAAA,KAAC4F,EAAAA,EAAe,CAAAnF,SAAEiE,S,cCtL1B,MAAMmB,EAAkB,CACtB,OACA,MACA,WACA,SACA,QACA,kBACA,YACA,UACA,YACA,YACA,eACA,cAsEF,EA7D6CC,IAC3C,MAAM,UAAC/C,EAAS,iBAAEgD,EAAgB,aAAEC,GAAgBF,GAC9C,KAACG,IAAQC,EAAAA,EAAAA,MAEf,GAAwB,MAApBH,EACF,OAAO,KAGT,MAAM/C,GACJzC,EAAAA,EAAAA,MAAA,OAAKC,UAAU,mBAAkBC,SAAA,EAC/BT,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,kBAAiBC,UAC/BT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,2BAEZvD,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,kBAAiBC,UAC/BT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAI6C,EAAAA,EAAmBL,UAK9B7C,EAAY,CAChB2C,EAAgBhB,IAAKwB,IACnB,MAAMC,EAAaD,IAAaN,EAC1BQ,EAAqBD,GACzBtG,EAAAA,EAAAA,KAAA,QAAMQ,UAAW,sDAAsDuC,MACrE,KAEJ,MAAO,CACLuC,aACE/E,EAAAA,EAAAA,MAAA,OAAKC,UAAU,sBAAqBC,SAAA,CACjCwF,EAAKO,EAAEJ,EAAAA,EAAmBC,IAC1BE,KAGLpB,SAAUmB,EACVG,SAAUJ,MAKhB,OACErG,EAAAA,EAAAA,KAAC0G,EAAQ,CACPrD,iBAAmBsD,IACjB,MAAM,SAACF,GAAYE,EAEnB,GAAgB,MAAZF,EACF,OAGF,IAAIG,EAAgCC,EAAeJ,IAAa,MAC5DV,IAAqBU,IACvBG,EAA8B,QAAd7D,EAAsB,OAAS,OAGjDiD,EAAa,CAACjD,UAAW6D,EAAeH,cAE1CzD,OAAQA,EACRE,UAAWA,KCKjB,GA/EsB7C,EAAAA,EAAAA,IAAS,KAC7B,MAAM,KAAC4F,IAAQC,EAAAA,EAAAA,OACRY,aAAcC,EAAM,oBAAEC,GAAuBC,EAAAA,EAAaC,cAE3D/F,EAAUC,IAAW,aAAc,CACvC,2BAAoD,cAAxB4F,IAG9B,OACEzG,EAAAA,EAAAA,MAAA,OAAKC,UAAWW,EAAQV,SAAA,EACtBT,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,qEAAoEC,UACjFT,EAAAA,EAAAA,KAACa,EAAM,CACLG,MAAM,2CACNC,KAAK,0BACLF,MAAMf,EAAAA,EAAAA,KAACmH,EAAAA,GAAI,IACXrG,aAAcA,KACZ,MAAMsG,EAAOC,SAASC,uBAAuB,qBAAqB,GACtD,MAARF,GACFA,EAAKG,UAAUC,OAAO,iDAG1BtG,OAAK,OAGTlB,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,2DAA0DC,UACvET,EAAAA,EAAAA,KAACyH,EAAY,CACX1E,UAAqB,MAAVgE,EAAiBA,EAAOhE,UAAY,OAC/CiD,aAAe0B,IACbC,EAAAA,EAAeC,YAAY,eAAgBF,IAE7C3B,iBAA4B,MAAVgB,EAAiBA,EAAON,SAAW,iBAGzDlG,EAAAA,EAAAA,MAAA,OAAKC,UAAU,gEAA+DC,SAAA,EAC5EF,EAAAA,EAAAA,MAAA,OAAKC,UAAU,oBAAmBC,SAAA,EAChCT,EAAAA,EAAAA,KAACa,EAAM,CACLG,MAAOiF,EAAKO,EAAE,kCACdvF,KAAK,gBACLF,MAAMf,EAAAA,EAAAA,KAACG,EAAAA,GAAK,IACZW,aAAcA,IACZ+G,EAAAA,EAAeC,cAAc,CAC3BC,OAAQC,EAAAA,EAAaC,sBAI3BjI,EAAAA,EAAAA,KAACa,EAAM,CACLG,MAAOiF,EAAKO,EAAE,iCACdvF,KAAK,eACLF,MAAMf,EAAAA,EAAAA,KAACI,EAAAA,GAAI,IACXU,aAAcA,IACZ+G,EAAAA,EAAeK,aAAa,CAC1BH,OAAQC,EAAAA,EAAaC,yBAK7B1H,EAAAA,EAAAA,MAAA,OAAKC,UAAU,mDAAkDC,SAAA,EAC/DT,EAAAA,EAAAA,KAACa,EAAM,CACLG,MAAOiF,EAAKO,EAAE,gCACdvF,KAAK,cACLF,MAAMf,EAAAA,EAAAA,KAACmI,EAAAA,GAAG,IACVrH,aAAcA,IAAM6C,EAAAA,EAAQyE,eAAe,CAAC7E,GAAI,oBAElDvD,EAAAA,EAAAA,KAACa,EAAM,CACLG,MAAOiF,EAAKO,EAAE,mCACdvF,KAAK,iBACLF,MAAMf,EAAAA,EAAAA,KAACqI,EAAAA,GAAM,IACbvH,aAAcA,IACZ6C,EAAAA,EAAQyE,eAAe,CACrB7E,GAAI,iCC1EpB,EAJwD+E,EAAE7H,eACxDT,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,uBAAsBC,SAAEA,ICiBzC,EAdwD6H,EACtD7H,WACAkC,gBAAgB,qBAChBnC,YACA+H,eAEA,MAAMpH,EAAUC,IAAWuB,EAAe,CACxC,CAAC,GAAGA,MAAkB4F,KAAa5F,EACnC,CAACnC,GAAYA,IAGf,OAAOR,EAAAA,EAAAA,KAAA,OAAKQ,UAAWW,EAAQV,SAAEA,K,0ECDnC,MAAM+H,EAAsDA,EAAExH,QAAOyH,YACnElI,EAAAA,EAAAA,MAAA,MAAI,aAAW,QAAQC,UAAU,gCAAgC4B,KAAK,OAAM3B,SAAA,EAC1ET,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,iCAAgCC,SAAEO,KAClDhB,EAAAA,EAAAA,KAAC0I,EAAAA,EAAI,CAAClI,UAAU,sBAAsBiI,MAAOA,OAgEjD,GA5DsBpI,EAAAA,EAAAA,IAAS,KAC7B,MAAM,KAAC4F,IAAQC,EAAAA,EAAAA,OAET,MAACyC,GAASC,EAAAA,GACV,YAACC,GAAe5B,EAAAA,EAAaC,cAEnC,GAAa,MAATyB,GAAgC,MAAfE,EACnB,OAAO,KAGT,MAAMC,EAAUH,EAAMI,OACpB,CAACC,EAAqCC,KAAe,IAChDD,EACH,CAACC,EAAKC,QAASD,IAEjB,CAAC,GAGGE,EAA4BN,EAC/BO,OAAQF,GAAWA,KAAUJ,GAC7BjE,IAAKqE,GAAWJ,EAAQI,IACxBrE,IAAKwE,IACJrJ,EAAAA,EAAAA,KAAA,MAAmBQ,UAAU,0CAA0C4B,KAAK,MAAK3B,UAC/EF,EAAAA,EAAAA,MAACc,EAAAA,EAAO,CACNC,SACEf,EAAAA,EAAAA,MAAA,MAAIC,UAAU,0BAA0B4B,KAAK,UAAS3B,SAAA,EACpDT,EAAAA,EAAAA,KAACwI,EAAoB,CAACC,MAAOY,EAAEC,KAAMtI,MAAOiF,EAAKO,EAAE,4BACnDxG,EAAAA,EAAAA,KAACwI,EAAoB,CAACC,MAAOY,EAAEE,MAAOvI,MAAOiF,EAAKO,EAAE,4BACpDxG,EAAAA,EAAAA,KAACwI,EAAoB,CAACC,MAAOY,EAAEG,KAAMxI,MAAOiF,EAAKO,EAAE,+BAGvDhF,SAAS,MACTiI,QAAQnH,EAAAA,EAAAA,IAAI,CACVoH,OAAQ,YAEVjI,iBAAiB,kBAAiBhB,SAAA,EAElCF,EAAAA,EAAAA,MAAA,OAAKC,UAAU,sBAAqBC,SAAA,CACjC4I,EAAEH,QACH3I,EAAAA,EAAAA,MAAA,QAAAE,SAAA,CAAOkJ,EAAOC,MAAO,IAAMP,EAAEC,KAAQD,EAAEG,KAAM,GAAG,WAElDxJ,EAAAA,EAAAA,KAAC6J,EAAAA,EAAW,CAACvJ,QAASqJ,EAAOC,MAAO,IAAMP,EAAEC,KAAQD,EAAEG,KAAM,SAnBvDH,EAAEH,SAwBf,GAAiB,MAAbC,GAA0C,IAArBA,EAAUW,OACjC,OAAO,KAGT,MAAMC,EAAQ9D,EAAKO,EAAE,0BAErB,OACEjG,EAAAA,EAAAA,MAAA,MAAI,aAAYwJ,EAAOvJ,UAAU,+BAA+B4B,KAAK,QAAO3B,SAAA,EAC1ET,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,qDAAoDC,SAAEsJ,IACnEZ,OClDP,EAxBwBa,KACtB,MAAM,KAAC/D,IAAQC,EAAAA,EAAAA,MACT+D,GAAazG,EAAAA,EAAAA,QAAsB,MAEzC,OACExD,EAAAA,EAAAA,KAACqB,EAAAA,EAAO,CACNC,QAAS2E,EAAKO,EAAE,wBAChBjF,QAASA,KACmB,MAAtB0I,EAAWpG,SACboG,EAAWpG,QAAQqG,iBAGrBvG,EAAAA,EAAQyE,eAAe,CAAC7E,GAAI,WAE9B4G,IAAKF,EACLzI,SAAS,SACTC,iBAAiB,0FACsChB,UAEvDT,EAAAA,EAAAA,KAACoK,EAAAA,GAAI,O,wBCjBX,MAAMC,GAAa/H,EAAAA,EAAAA,IAAI,CACrBgI,OAAQ,CACN5H,QAAS,OACT6H,wBAAyB,iBAsG7B,EA1E8CC,EAC5C/J,WACAgK,KAAMC,EACN3J,OACA4J,WACA1J,OACA2J,QACApB,OACAqB,kBAEA,MAAMC,GAAcC,EAAAA,EAAAA,aACdC,EAnCsBb,KAC5B,MAAOa,EAAYC,IAAiBC,EAAAA,EAAAA,WAAS,GAS7C,OAPAC,EAAAA,EAAAA,WAAU,KACR,GAAIhB,EAAItG,QAAS,CACf,MAAM,QAACA,GAAWsG,EAClBc,EAAcpH,EAAQuH,YAAcvH,EAAQwH,YAC9C,GACC,CAAClB,EAAKA,GAAKtG,SAASuH,YAAajB,GAAKtG,SAASwH,cAE3CL,GAyBYM,CAAqBR,IAElC,KAAC7E,IAAQC,EAAAA,EAAAA,OAERqF,EAAUC,IAAeN,EAAAA,EAAAA,WAAS,GAEnC1F,EAAapE,IAAW,uBAAwB,CACpD,YAAauJ,IAETc,EAAqBrK,IAAW,2BAA4B,CAChE,YAAauJ,EACbY,SAAUA,IAGZ,IAAId,EAAOC,EACX,GAAa,KAATD,EACFA,EAAOxE,EAAKO,EAAE,mBACT,GAAa,aAATiE,EAAqB,CAC9B,GAAc,IAAVG,EACF,OAAO,KAETH,EAAOxE,EAAKO,EAAE,kBAChB,CAEA,MAAa,aAATvF,GAAgC,UAATA,GACX,IAAV2J,GAMJrK,EAAAA,EAAAA,MAAA,MAAAE,SAAA,EACEF,EAAAA,EAAAA,MAAA,OAAKC,UAAWC,GAAW6B,EAAAA,EAAAA,IAAI,CAACoJ,QAAS,cAAWrG,EAAU5E,SAAA,CAC3DA,IACCT,EAAAA,EAAAA,KAAA,UACEQ,UAAW,GAAGiL,KAAsBpB,IACpChI,KAAK,SACLd,QAASA,IAAMiK,GAAaD,GAC5BnJ,KAAK,SACL,eAAcmJ,EAAS9K,UAEvBT,EAAAA,EAAAA,KAACG,EAAAA,GAAK,OAGVI,EAAAA,EAAAA,MAAA,UACEC,UAAW,GAAGgF,KAAc6E,IAC5BhI,KAAK,SACLd,QAAUiD,GAAUqG,EAAY5J,EAAMuD,GACtCpC,KAAK,WAAU3B,SAAA,CAEdM,GACDf,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,OAAO2J,IAAKW,EAAaf,MAAOiB,EAAaP,GAAQ,QAAKpF,EAAU5E,SACjFgK,KAEHzK,EAAAA,EAAAA,KAAC2L,EAAAA,EAAK,CAAAlL,SAAEmK,IACC,MAARpB,IAAgBxJ,EAAAA,EAAAA,KAAC0I,EAAAA,EAAI,CAACD,MAAOe,EAAMhJ,UAAU,eAGjDC,GAAY8K,IAAYvL,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,yBAAwBC,SAAEA,OAhC1D,M,cCtEb,MAAMmL,EAA2BC,IAC/B,GAAiC,IAA7BA,EAASpL,SAASqJ,QAAgB+B,EAASC,iBAAmBD,EAASpL,SAAS,GAAGqL,eAAgB,CACrG,MAAMC,EAAYF,EAASpL,SAAS,GAC9BuL,EAAYD,EAAUE,SAASC,SAAS,KAAO,IAAM,KAC3D,OAAON,EAAwB,IAC1BG,EACHI,cAAeN,EAASM,cAAgBH,EAAYD,EAAUI,eAElE,CAEA,MAAM1L,EAAWoL,EAASpL,SAASoE,IAAI+G,GAEvC,OACE5L,EAAAA,EAAAA,KAACwK,EAAa,CACZK,YAAaA,CAACzB,EAAqB5E,IACjC4H,EAAAA,EAAmBC,mBAAmBjD,EAAQ5E,GAEhDoG,MAAOiB,EAASC,eAEhBnB,SACyB,KAAtBkB,EAASI,WAAoBG,EAAAA,EAAmBE,eAAexC,QAChEsC,EAAAA,EAAmBE,eAAeJ,SAASL,EAASI,UAEtDxB,KAAMoB,EAASM,cACflL,KAAM4K,EAASI,SACfzC,KAAMqC,EAASU,cAAc9L,SAE3BA,EAASqJ,QAAUrJ,QAAa4E,GAT7BwG,EAASI,WAmCpB,GArB4B5L,EAAAA,EAAAA,IAAS,KACnC,MAAM,KAAC4F,IAAQC,EAAAA,EAAAA,MAEf,GAAgE,IAA5DkG,EAAAA,EAAmBI,SAASC,aAAaX,eAC3C,OAAO,KAGT,MAAMY,EAAiBd,EAAwBQ,EAAAA,EAAmBI,SAASC,cAErE1C,EAAQ9D,EAAKO,EAAE,yBAErB,OACEjG,EAAAA,EAAAA,MAAA,MAAI,aAAYwJ,EAAOvJ,UAAU,+BAA+B4B,KAAK,OAAM3B,SAAA,EACzET,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,qDAAqD4B,KAAK,OAAM3B,SAC3EsJ,IAEF2C,O,cC3CP,MAAMC,EAAyB,GAEzBC,EAAsBC,GAC1BC,EAAAA,EAAaF,mBAAmB,CAC9BrJ,GAAI,uBACJwJ,MAAOJ,EACP5N,MAAO8N,IAQLG,EAA0DA,EAC9DH,kBACAI,wBAEA,MAAM,KAAChH,IAAQC,EAAAA,EAAAA,MAEf,GAAI+G,EAAoBN,EAAwB,CAC9C,IAAIO,EAAaL,EAAkB,EAC/BM,EAAWN,EAAkBF,EAUjC,OARIO,EAAaD,IACfC,EAAaD,GAGXE,EAAWF,IACbE,EAAWF,IAIXjN,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,0FAAyFC,UACtGF,EAAAA,EAAAA,MAAA,QAAMC,UAAU,qCAAoCC,SAAA,CACjD,GAAGwF,EAAKO,EAAE,4BACXjG,EAAAA,EAAAA,MAAA,UAAAE,SAAA,CACGyM,EACA,IAAIjH,EAAKO,EAAE,iBACX2G,KAEF,IAAIlH,EAAKO,EAAE,kBACZxG,EAAAA,EAAAA,KAAA,UAAAS,SAASwM,QAIjB,CAEA,OAAO,MAOHG,EAA8CA,EAAEC,mBACpD,MAAM,KAACpH,IAAQC,EAAAA,EAAAA,MAEf,OACE3F,EAAAA,EAAAA,MAAA,MAAIC,UAAU,4BAA2BC,SAAA,EACvCF,EAAAA,EAAAA,MAAA,OAAKC,UAAU,wBAAuBC,SAAA,EACpCT,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,yBAAwBC,SAAEwF,EAAKO,EAAE,GAAG6G,EAAa9J,gBAChE,OACDvD,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,0BAAyBC,SACtCwF,EAAKqH,KAAK,IAAIC,KAAKF,EAAaG,IAAK,CACpCC,KAAM,UACNC,MAAO,OACPC,IAAK,UACLC,KAAM,UACNC,OAAQ,kBAId7N,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,wBAAuBC,SAAEwF,EAAKO,EAAE,GAAG6G,EAAa9J,UAAW8J,EAAaS,YAavFC,GAAgEA,EACpElB,kBACAI,oBACAe,cACAC,eACAC,kBAEA,MAAM,KAACjI,IAAQC,EAAAA,EAAAA,MAEf,GAAI+G,EAAoB,EAAG,CACzB,IAAIkB,EAAUtB,EAAkBF,GAC5ByB,EAAYvB,EAAkBF,EAUlC,OARIwB,EAAUlB,IACZkB,EAAUlB,GAGRmB,EAAY,IACdA,EAAY,IAIZ7N,EAAAA,EAAAA,MAAA,MACEC,UAAU,+DACMC,SAAA,EAEhBT,EAAAA,EAAAA,KAAA,MACEQ,UAAWY,IAAW,sCAAuC,CAC3D,cAAmC,IAApByL,IACdpM,UAEHF,EAAAA,EAAAA,MAAA,UAAQC,UAAU,sCAAsC6B,KAAK,SAASd,QAASyM,EAAYvN,SAAA,EACzFT,EAAAA,EAAAA,KAACqO,EAAAA,GAAW,IACX,GAAGD,EAAY,OAAOvB,UAG3B7M,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,sCAAqCC,UACjDT,EAAAA,EAAAA,KAAA,UAAQQ,UAAU,sCAAsC6B,KAAK,SAASd,QAAS0M,EAAaxN,SACzFwF,EAAKO,EAAE,+BAGZxG,EAAAA,EAAAA,KAAA,MACEQ,UAAWY,IAAW,sCAAuC,CAC3D,cAAeyL,EAAkBF,GAA0BM,IAC1DxM,UAEHF,EAAAA,EAAAA,MAAA,UAAQC,UAAU,sCAAsC6B,KAAK,SAASd,QAAS2M,EAAYzN,SAAA,CACxF,GAAGoM,EAAkBF,EAAyB,OAAOwB,KACtDnO,EAAAA,EAAAA,KAACsO,EAAAA,GAAY,WAKvB,CAEA,OAAO,MA8FT,IA3FgCjO,EAAAA,EAAAA,IAAS,KACvC,MAAM,KAAC4F,IAAQC,EAAAA,EAAAA,MAET+D,GAAazG,EAAAA,EAAAA,QAAsB,MACnC+K,GAAuB/K,EAAAA,EAAAA,QAAyB,OAE/CgL,EAAWC,IAAgBvD,EAAAA,EAAAA,WAAkB,IAC7C2B,EAAiB6B,IAAsBxD,EAAAA,EAAAA,UAAiB,IACxDyD,EAAYC,IAAiB1D,EAAAA,EAAAA,UAAiB,IAE/C,gBAAC2D,EAAe,cAAEC,EAAa,kBAAEC,GAAqBC,EAAAA,EAS5D,OAPA7D,EAAAA,EAAAA,WAAU,KACJ4D,EAAkBE,MAAQ,GAAKhF,EAAWpG,SAASH,WACrD+K,GAAa,GACb7B,EAAmBC,GAAiBqC,QAAQ,IAAMT,GAAa,MAEhE,CAACM,EAAmBlC,KAGrBtM,EAAAA,EAAAA,MAACc,EAAAA,EAAO,CACN8N,iBAAiB,gDACjB7N,QACEuN,GACEtO,EAAAA,EAAAA,MAAA,OACEC,UAAWY,IAAW,gBAAiB,CACrC,4BAA6BoN,IAC5B/N,SAAA,EAEHT,EAAAA,EAAAA,KAACgN,EAAsB,CAACH,gBAAiBA,EAAiBI,kBAAmB8B,EAAkBE,SAC/FjP,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,mCAAkCC,UAC/CT,EAAAA,EAAAA,KAACoP,EAAAA,GAAoB,OAEvBpP,EAAAA,EAAAA,KAAA,MACEQ,UAAU,0DACV2J,IAAKoE,EACL5N,MAAO,CAAC0O,UAAWV,GAAYlO,SAE9BqO,EAAcjK,IAAI,CAACwI,EAActI,KAChC/E,EAAAA,EAAAA,KAACoN,EAAgB,CAAaC,aAAcA,GAArBtI,OAG3B/E,EAAAA,EAAAA,KAAC+N,GAAyB,CACxBlB,gBAAiBA,EACjBI,kBAAmB8B,EAAkBE,MACrCjB,YAAaA,KACX,MAAMsB,EAAqBzC,EAAkBF,EACzC2C,GAAsB,IACxBV,EAAcL,EAAqB1K,SAAS0L,cAAgB,GAC5Db,EAAmBY,KAGvBrB,aAAcA,KACc,MAAtBhE,EAAWpG,SACboG,EAAWpG,QAAQqG,iBAGrB4C,EAAAA,EAAa0C,qBAEbZ,EAAc,GACdF,EAAmB,IAErBR,YAAaA,KACX,MAAMoB,EAAqBzC,EAAkBF,EACzCoC,EAAkBE,MAAQK,IAC5BV,EAAcL,EAAqB1K,SAAS0L,cAAgB,GAC5Db,EAAmBY,WAM3BtP,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,oDAAoDG,MAAO,CAAC6B,UAAW,UAAU/B,SAC7FwF,EAAKO,EAAE,kCAIdiJ,aAAW,EACXnM,OAAQA,IAAMsJ,EAAmBC,GACjC1C,IAAKF,EACLrJ,MAAO,IACPY,SAAS,SACTC,iBAAiB,wDACIhB,SAAA,EAErBT,EAAAA,EAAAA,KAAC0P,EAAAA,GAAgB,IAChBb,GAAkB7O,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,uBAAsBC,SAAEsO,EAAkBE,QAAgB,UCvLnG,IApDsB5O,EAAAA,EAAAA,IAAS,KAC7B,MAAM,KAAC4F,IAAQC,EAAAA,EAAAA,MACTyJ,GAAWnM,EAAAA,EAAAA,QAAyB,OAEpC,aAACoM,GAAgBxD,EAAAA,GAEvBjB,EAAAA,EAAAA,WAAU,KACgB,MAApBwE,EAAS9L,SACP+L,IAAiBD,EAAS9L,QAAQ4E,QACpCkH,EAAS9L,QAAQ4E,MAAQmH,IAG5B,CAACD,EAAUC,IAEd,MAAMC,EAAkC,KAAjBD,EAEvB,OACErP,EAAAA,EAAAA,MAAA,OACEC,UAAWY,IAAW,CACpB0O,eAAe,EACfC,QAAQ,EACR,YAAaF,IACZpP,SAAA,CAEFoP,IACC7P,EAAAA,EAAAA,KAAA,UACEQ,UAAU,8BACVe,QAASA,KACP6K,EAAAA,EAAmB4D,gBAAgB,IACX,MAApBL,EAAS9L,SACX8L,EAAS9L,QAAQoM,QAGrB5N,KAAK,SAAQ5B,UAEbT,EAAAA,EAAAA,KAACkQ,EAAAA,GAAK,OAGVlQ,EAAAA,EAAAA,KAACmQ,EAAAA,GAAM,KACPnQ,EAAAA,EAAAA,KAAA,SACEQ,UAAU,UACV2J,IAAKwF,EACLtN,KAAK,OACL+N,YAAanK,EAAKO,EAAE,8BACpB6J,SAAW7L,IACT4H,EAAAA,EAAmB4D,gBAAgBxL,EAAM0E,OAAOT,eCrB1D,GAxB2B6H,KACzB,MAAM,KAACrK,IAAQC,EAAAA,EAAAA,MACT+D,GAAazG,EAAAA,EAAAA,QAAsB,MAEzC,OACExD,EAAAA,EAAAA,KAACqB,EAAAA,EAAO,CACNC,QAAS2E,EAAKO,EAAE,2BAChBjF,QAASA,KACmB,MAAtB0I,EAAWpG,SACboG,EAAWpG,QAAQqG,iBAGrBvG,EAAAA,EAAQyE,eAAe,CAAC7E,GAAI,cAE9B4G,IAAKF,EACLzI,SAAS,SACTC,iBAAiB,0FACsChB,UAEvDT,EAAAA,EAAAA,KAACuQ,EAAAA,GAAQ,OCjBf,GAJgDC,EAAE/P,eAChDT,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,mBAAkBC,SAAEA,I,qCCYrC,MAAMgQ,GAA0CA,EAAEC,WACtC,IAAVA,GAAc1Q,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,qBAAuBvD,EAAAA,EAAAA,KAAC0I,EAAAA,EAAI,CAACD,MAAOiI,EAAOC,SAAO,EAACC,UAAW,IAElFC,GAAeA,EACnB5K,OACAlD,YACA+N,cACAC,0BACAC,4BAWA,MAAMC,EAAU,CACdzQ,UAAW,oCAAoCuC,OAC7B,aAAdA,EACA,CAACuC,YAAaW,EAAKO,EAAE,iCACrB,CAAClB,YAAaW,EAAKO,EAAE,+BACzBtB,YAAY,EACZuD,MAAO,MAGHyI,EAAqD,CACzDC,SAAUJ,EACVK,OAAQJ,GAGJK,EAAmBP,EAAY/N,GAErC,IAAIuO,GAAwB,EAC5B,MAAMxM,EAAgDuM,EAAOxM,IAAK6L,IAChE,IAAIvL,GAAW,EASf,OALI+L,GAAmBA,EAAgBnO,KAAe2N,IACpDvL,GAAW,EACXmM,GAAwB,GAGnB,CACLhM,aAAatF,EAAAA,EAAAA,KAACyQ,GAAkB,CAACC,MAAOA,IACxCjK,SAAU1D,EACVoC,WACAD,YAAY,EACZuD,MAAOiI,KAMX,GAAIY,GAAyBJ,EAAiB,CAG5C,MAAMK,EAAiBC,KAAYH,EAAQH,EAAgBnO,IAE3D+B,EAAM2M,OAAOF,EAAgB,EAAG,CAC9BjM,aAAatF,EAAAA,EAAAA,KAACyQ,GAAkB,CAACC,MAAOQ,EAAgBnO,KACxD0D,SAAU1D,EACVoC,UAAU,EACVD,YAAY,EACZuD,MAAOyI,EAAgBnO,IAE3B,CAIA,OAFA+B,EAAM4M,QAAQT,GAEPnM,GAkET,IA/D+BzE,EAAAA,EAAAA,IAAS,KACtC,MAAM,KAAC4F,IAAQC,EAAAA,EAAAA,MACT+D,GAAazG,EAAAA,EAAAA,QAAsB,MACnCV,GAAmBU,EAAAA,EAAAA,QAAmB,QAItCxC,EAAQiF,EAAKO,EAAE,8BACfmL,EAAmB,CACvB1L,OACA6K,YAAa7J,EAAAA,EAAaC,cAAc4J,YACxCC,wBAAyB9J,EAAAA,EAAa2K,gBAAgBb,yBAA2B,EACjFC,sBAAuB/J,EAAAA,EAAa2K,gBAAgBZ,uBAAyB,GAG/E,OACEhR,EAAAA,EAAAA,KAAC0G,EAAQ,CACP5D,iBAAkBA,EAClBF,qBAAqB,kDACrBS,iBAAmB2B,IACC,MAAdA,EAAKyD,QACe,aAAlBzD,EAAKyB,SACPoL,GAAAA,EAAcjK,YAAY,0BAA2B5C,EAAKyD,OAC/B,WAAlBzD,EAAKyB,UACdoL,GAAAA,EAAcjK,YAAY,wBAAyB5C,EAAKyD,SAI9DzF,QACEzC,EAAAA,EAAAA,MAAA,OACEC,UAAU,sFAEVuJ,MAAO/I,EAAMP,SAAA,EAEbT,EAAAA,EAAAA,KAAC8R,EAAAA,GAAM,IACN9Q,KAGLkC,UAAW,CACT2N,GAAa,CAAC9N,UAAW,cAAe4O,IACxCd,GAAa,CAAC9N,UAAW,YAAa4O,KAExCrO,OAAQA,KACoB,MAAtB2G,EAAWpG,SACboG,EAAWpG,QAAQqG,kBAGvB9G,SACEpD,EAAAA,EAAAA,KAACqB,EAAAA,EAAO,CACNC,QAASN,EACTQ,SAAS,SACT2I,IAAKF,EACLxI,iBAAiB,wCACjBF,QAASA,IAAMuB,EAAiBe,YAAYpD,UAE5CT,EAAAA,EAAAA,KAAC8R,EAAAA,GAAM,MAGX3P,gBAAc,MCtIpB,GAPkC4P,EAAEtR,WAAUD,YAAW+K,WAAUV,kBACjEtK,EAAAA,EAAAA,MAAA,UAAQC,UAAWA,EAAWe,QAAUiD,GAAUqG,EAAYrG,GAAO/D,SAAA,CAClEA,EACA8K,GAAWvL,EAAAA,EAAAA,KAACgS,EAAAA,GAAO,CAACxR,WAAW8B,EAAAA,EAAAA,IAAI,CAAC2P,UAAW,kBAAqBjS,EAAAA,EAAAA,KAACgS,EAAAA,GAAO,OCuFjF,IA1F0B3R,EAAAA,EAAAA,IAAS,KACjC,MAAM,KAAC4F,IAAQC,EAAAA,EAAAA,MAsDTwG,EAhDD,CACH,CACE1L,MAAOiF,EAAKO,EAAE,cACdvF,KAAM,GACNF,MAAMf,EAAAA,EAAAA,KAACkS,EAAAA,GAAG,KAEZ,CACElR,MAAOiF,EAAKO,EAAE,6BACdvF,KAAM,cACNF,MAAMf,EAAAA,EAAAA,KAACmS,EAAAA,GAAa,KAEtB,CACEnR,MAAOiF,EAAKO,EAAE,yBACdvF,KAAM,UACNF,MAAMf,EAAAA,EAAAA,KAACoS,EAAAA,GAAW,KAEpB,CACEpR,MAAOiF,EAAKO,EAAE,0BACdvF,KAAM,WACNF,MAAMf,EAAAA,EAAAA,KAACE,EAAAA,GAAO,KAEhB,CACEc,MAAOiF,EAAKO,EAAE,2BACdvF,KAAM,WACNF,MAAMf,EAAAA,EAAAA,KAACqS,EAAAA,GAAS,KAElB,CACErR,MAAOiF,EAAKO,EAAE,yBACdvF,KAAM,UACNF,MAAMf,EAAAA,EAAAA,KAACI,EAAAA,GAAI,KAEb,CACEY,MAAOiF,EAAKO,EAAE,wBACdvF,KAAM,SACNF,MAAMf,EAAAA,EAAAA,KAACsS,EAAAA,GAAM,KAEf,CACEtR,MAAOiF,EAAKO,EAAE,0BACdvF,KAAM,WACNF,MAAMf,EAAAA,EAAAA,KAACuS,EAAAA,GAAQ,KAEjB,CACEvR,MAAOiF,EAAKO,EAAE,uBACdvF,KAAM,QACNF,MAAMf,EAAAA,EAAAA,KAACC,EAAAA,GAAK,MAIe4E,IAAKuE,IAClCpJ,EAAAA,EAAAA,KAACwK,EAAa,CACZK,YAAaA,CAAClE,EAAWnC,IAAU4H,EAAAA,EAAmBoG,iBAAiB7L,EAA4BnC,GACnGoG,MAAOwB,EAAAA,EAAmBI,SAASiG,aAAarJ,EAAOnI,OAAS,EAEhEF,KAAMqI,EAAOrI,KACb4J,SACmB,KAAhBvB,EAAOnI,OAAgBmL,EAAAA,EAAmBsG,aAAa5I,QACxDsC,EAAAA,EAAmBsG,aAAaxG,SAAS9C,EAAOnI,MAElDwJ,KAAMrB,EAAOpI,MACbC,KAAMmI,EAAOnI,KACbuI,KAAM4C,EAAAA,EAAmBI,SAASmG,YAAYvJ,EAAOnI,OAAS,GARzDmI,EAAOnI,OAYV8I,EAAQ9D,EAAKO,EAAE,wBAEd+E,EAAUC,IAAeN,EAAAA,EAAAA,WAAkB,GAKlD,OACE3K,EAAAA,EAAAA,MAAA,MAAI,aAAYwJ,EAAOvJ,UAAU,+BAA+B4B,KAAK,OAAM3B,SAAA,EACzET,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,uBAAuB4B,KAAK,OAAM3B,UAC9CT,EAAAA,EAAAA,KAAC+R,GAAO,CAACvR,UAAU,gCAAgC+K,SAAUA,EAAUV,YAPxD+H,KACnBpH,GAAaD,IAMwF9K,SAC9FsJ,MAGJwB,GAAYmB,OCnCnB,IAtDuBrM,EAAAA,EAAAA,IAAS,KAC9B,MAAM,KAAC4F,IAAQC,EAAAA,EAAAA,OACRqF,EAAUC,IAAeN,EAAAA,EAAAA,WAAkB,GAE5C2H,EAAOC,OAAOC,KAAK3G,EAAAA,EAAmBI,SAASwG,WAErD,GAAqB,IAAhBH,EAAK/I,QAA4B,KAAZ+I,EAAK,IAA+B,IAAhBA,EAAK/I,QAA4B,aAAZ+I,EAAK,GACtE,OAAO,KAGT,MAYMnG,EAZcmG,EAAKI,QAAQC,KAAK,CAACC,EAAGC,IAC9B,KAAND,GAAkB,aAANA,GACN,EAGA,KAANC,GAAkB,aAANA,EACP,EAGFD,EAAEE,cAAcD,IAGUvO,IAAKuE,IACtCpJ,EAAAA,EAAAA,KAACwK,EAAa,CACZK,YAAaA,CAACyI,EAAK9O,IAAU4H,EAAAA,EAAmBmH,cAAcD,EAAK9O,GACnEoG,MAAOwB,EAAAA,EAAmBI,SAASwG,UAAU5J,IAAW,EAExDuB,SACc,KAAXvB,IAAkBgD,EAAAA,EAAmBoH,UAAU1J,QAAWsC,EAAAA,EAAmBoH,UAAUtH,SAAS9C,GAEnGqB,KAAMrB,EACNnI,KAAMmI,EACNI,KAAM4C,EAAAA,EAAmBI,SAASiH,SAASrK,IANtCA,IAUHW,EAAQ9D,EAAKO,EAAE,oBAMrB,OACEjG,EAAAA,EAAAA,MAAA,MAAI,aAAYwJ,EAAOvJ,UAAU,+BAA+B4B,KAAK,OAAM3B,SAAA,EACzET,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,uBAAuB4B,KAAK,OAAM3B,UAC9CT,EAAAA,EAAAA,KAAC+R,GAAO,CAACvR,UAAU,gCAAgC+K,SAAUA,EAAUV,YAPxD+H,KACnBpH,GAAaD,IAMwF9K,SAC9FsJ,MAGJwB,GAAYmB,O,eCjDnB,MAgBA,GAhB8BgH,KAC5B,MAAM,KAACzN,IAAQC,EAAAA,EAAAA,MAEf,OACElG,EAAAA,EAAAA,KAACqB,EAAAA,EAAO,CACNC,QAAS2E,EAAKO,EAAEmN,GAAAA,EAAYC,aAAe,6BAA+B,6BAC1ErS,QAASA,IAAMoS,GAAAA,EAAYE,mBAAmBF,GAAAA,EAAYC,cAC1DpS,SAAS,SACTC,iBAAiB,0FACsChB,UAEvDT,EAAAA,EAAAA,KAAC8T,EAAAA,GAAW,OC0ClB,IArD2BzT,EAAAA,EAAAA,IAAS,KAClC,MAAM,KAAC4F,IAAQC,EAAAA,EAAAA,OACRqF,EAAUC,IAAeN,EAAAA,EAAAA,WAAkB,GAE5C6I,EAAWjB,OAAOC,KAAK3G,EAAAA,EAAmBI,SAASwH,eAEzD,GAAwB,IAApBD,EAASjK,QAAgC,KAAhBiK,EAAS,GACpC,OAAO,KAGT,MAWMrH,EAXcqH,EAASd,QAAQC,KAAK,CAACC,EAAGC,IAClC,KAAND,GACM,EAEA,KAANC,EACK,EAGFD,EAAEE,cAAcD,IAGUvO,IAAKuE,IACtCpJ,EAAAA,EAAAA,KAACwK,EAAa,CACZK,YAAaA,CAACoJ,EAASzP,IAAU4H,EAAAA,EAAmB8H,kBAAkBD,EAASzP,GAC/EoG,MAAOwB,EAAAA,EAAmBI,SAASwH,cAAc5K,IAAW,EAE5DuB,SACc,KAAXvB,IAAkBgD,EAAAA,EAAmB+H,cAAcrK,QAAWsC,EAAAA,EAAmB+H,cAAcjI,SAAS9C,GAE3GqB,KAAMrB,EACNnI,KAAMmI,EACNI,KAAM4C,EAAAA,EAAmBI,SAAS4H,aAAahL,IAN1CA,IAUHW,EAAQ9D,EAAKO,EAAE,wBAMrB,OACEjG,EAAAA,EAAAA,MAAA,MAAI,aAAYwJ,EAAOvJ,UAAU,+BAA+B4B,KAAK,OAAM3B,SAAA,EACzET,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,uBAAuB4B,KAAK,OAAM3B,UAC9CT,EAAAA,EAAAA,KAAC+R,GAAO,CAACvR,UAAU,gCAAgC+K,SAAUA,EAAUV,YAPxD+H,KACnBpH,GAAaD,IAMwF9K,SAC9FsJ,MAGJwB,GAAYmB,O,gDCvCnB,MAAM2H,GAAQ,CACZlD,UAAUnR,EAAAA,EAAAA,KAACsU,EAAAA,GAAQ,IACnBC,UAAUvU,EAAAA,EAAAA,KAACwU,EAAAA,GAAY,IACvBpD,QAAQpR,EAAAA,EAAAA,KAACyU,EAAAA,GAAM,KAwFjB,IAjF0DpU,EAAAA,EAAAA,IAAS,EAAEqU,qBACnE,MAAM,KAACzO,IAAQC,EAAAA,EAAAA,MAETyO,EAAyBA,CAAC5R,EAA8B6R,EAAyC,CAAC,KACtG,MAAM,wBAAC7D,EAA0B,EAAC,sBAAEC,EAAwB,GAAK/J,EAAAA,EAAa2K,gBAAkB,CAAC,GAC3F,gBAACiD,GAAmBC,GAAAA,EAEpBC,EAAY,CAChB5D,SAAUJ,EACVK,OAAQJ,GAGJgE,EAAiB,CACrB7D,SAAU0D,EAAgB9S,UAC1BqP,OAAQyD,EAAgB5S,SAG1B,IAAIgT,EAAgB,CAClB9D,SAAU0D,EAAgB/S,SAC1BsP,OAAQyD,EAAgB7S,QAGJ,MAAlB0S,IACFO,EAAgB,CACd7D,OAAQsD,EAAetD,OACvBD,SAAUuD,EAAevD,WAI7B,MAAM+D,EAAuB9T,IAAW,sCAAuC,CAC7E,aAAgC,MAAlBsT,GAA0BS,GAAAA,EAAkBC,cAGtDC,EAAmBjU,IAAW,sCAAuC,CACzE,aAAgC,MAAlBsT,GAA0BE,EAAQU,oBAGlD,IAAIC,EAAY,KACiB,MAA7Bb,GAAgBa,YAClBA,GACEvV,EAAAA,EAAAA,KAAA,OAAKQ,UAAW6U,EAAiB5U,UAC/BT,EAAAA,EAAAA,KAACwV,GAAAA,EAAQ,CAACC,OAAQxP,EAAKO,EAAE,eAAgBiC,MAAOiN,KAAKC,OAAOpI,KAAKqI,MAAQlB,EAAea,WAAa,UAK3G,IAAIxI,EAAQ,KAQZ,OALEA,EAD2B,IAAzBgI,EAAUhS,GACJsR,GAAME,UAENvU,EAAAA,EAAAA,KAAC0I,EAAAA,EAAI,CAACD,MAAOsM,EAAUhS,GAAY4N,SAAO,KAIlDpQ,EAAAA,EAAAA,MAAA,OAAKC,UAAW,0CAA0CuC,IAAYtC,SAAA,EACpET,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,2BAA0BC,SAAE4T,GAAMtR,MACjDxC,EAAAA,EAAAA,MAAA,OAAKC,UAAU,2BAA0BC,SAAA,EACvCT,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,oCAAmCC,UAChDT,EAAAA,EAAAA,KAAC0I,EAAAA,EAAI,CAACD,MAAOwM,EAAclS,GAAY4N,SAAO,MAE/C4E,GACDhV,EAAAA,EAAAA,MAAA,OAAKC,UAAW0U,EAAqBzU,SAAA,EACnCT,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,kCAAiCC,UAC9CT,EAAAA,EAAAA,KAAC0I,EAAAA,EAAI,CAACD,MAAOuM,EAAejS,QAE9B/C,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,kCAAiCC,SAAEsM,cAO5D,OACExM,EAAAA,EAAAA,MAAA,OAAKC,UAAU,sBAAqBC,SAAA,CACjCkU,EAAuB,WAAY,CAACW,mBAAmB,IACvDX,EAAuB,e,0DC7F9B,MAAMkB,GAAgEA,EAAE9S,gBACtExC,EAAAA,EAAAA,MAAA,kBAAgBgD,GAAI,oBAAoBR,IAAa+S,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,OAAMxV,SAAA,EACpFT,EAAAA,EAAAA,KAAA,QAAMQ,UAAW,8CAA8CuC,IAAamT,OAAO,QACnFlW,EAAAA,EAAAA,KAAA,QAAMQ,UAAW,oDAAoDuC,IAAamT,OAAO,YAyBvFC,GAAuBA,CAACC,EAA0BrT,EAA8BsT,KACpF,MAAMC,EAAaF,EAAQrT,GAAW2S,KAAKa,KAAKF,IAC1CG,EAAaJ,EAAQrT,GAAW2S,KAAKe,MAAMJ,IACjD,OAAOG,EAA0CH,EAAa,GAAzCC,EAAaE,IAyFpC,IAtFsDnW,EAAAA,EAAAA,IACpD,EAAEkD,KAAIhB,SAAQ3B,QAAO8V,cAAaC,UAASC,iBACzC,MAAOC,EAAWC,IAAgB5L,EAAAA,EAAAA,WAAkB,GAE9CmL,GAAa7S,EAAAA,EAAAA,QAAe,GAC5BkR,GAAiBlR,EAAAA,EAAAA,QAAwC,CAAC2N,SAAU,EAAGC,OAAQ,EAAGmE,UAAW,IAE7FwB,EAAiBjC,GAAAA,EAAkBG,cAEnC+B,GAASC,EAAAA,GAAAA,KACZC,OAAO,CAAC,EAAGH,EAAe5F,SAASrH,OAAS,IAC5CqN,MAAM,CAAC,EAAGvW,IAEPwW,GAASH,EAAAA,GAAAA,KACZC,OAAO,CACN,GACAG,EAAAA,GAAAA,GAAIN,EAAe5F,SAAU,CAACmG,EAAWvS,IAAU2Q,KAAK2B,IAAIC,EAAWP,EAAe3F,OAAOrM,OAE9FoS,MAAM,CAAC5U,EAAS,GAAI,KAEvBmU,EAAY7S,QAAU,CACpB0T,gBAAkBC,IAChBnB,EAAWxS,QAAUmT,EAAOS,OAAOD,GACnCb,EAAQjC,EAAe7Q,UAEzB6T,eAAgBA,KACdZ,GAAa,GACbF,KAEFe,gBAAiBA,KACfb,GAAa,KAIbD,IACFnC,EAAe7Q,QAAU,CACvBsN,SAAUgF,GAAqBY,EAAgB,WAAYV,EAAWxS,SACtEuN,OAAQ+E,GAAqBY,EAAgB,SAAUV,EAAWxS,SAClE0R,UAAWwB,EAAea,WAAWlC,KAAK9L,MAAMyM,EAAWxS,YAI/D,MAAMgU,EAAgBC,GAAAA,EAEtB,OACEvX,EAAAA,EAAAA,MAAA,OAAKC,UAAU,QAAQ+C,GAAIA,EAAIhB,OAAO,OAAO3B,MAAM,OAAMH,SAAA,EACvDF,EAAAA,EAAAA,MAAA,QAAAE,SAAA,EACET,EAAAA,EAAAA,KAAC6V,GAAyB,CAAC9S,UAAU,YACrC/C,EAAAA,EAAAA,KAAC6V,GAAyB,CAAC9S,UAAU,gBAEtCgV,GAAAA,EAAoBlT,IAAK9B,GAAc,EACtC/C,EAAAA,EAAAA,KAAA,QACEQ,UAAU,cAEVwX,KAAM,0BAA0BjV,MAChCsG,GACE4O,EAAAA,GAAAA,KACGC,EAAE,CAACC,EAAYpT,IAAUiS,EAAOjS,IAAU,GAC1CqT,GAAG7V,GACHwT,GAAIuB,GAAcF,EAAOE,IAAc,GACvCe,MAAMR,EAJTI,CAIwBlB,EAAehU,KAPpC,QAAQA,MAUf/C,EAAAA,EAAAA,KAAA,QACEQ,UAAW,4BAA4BuC,IAEvCsG,GACEiP,EAAAA,GAAAA,KACGJ,EAAE,CAACC,EAAYpT,IAAUiS,EAAOjS,IAAU,GAC1CwT,EAAGjB,GAAcF,EAAOE,IAAc,GACtCe,MAAMR,EAHTS,CAGwBvB,EAAehU,KALpC,QAAQA,MAQf/C,EAAAA,EAAAA,KAAA,UACEQ,UAAW,gCAAgCuC,IAE3CyV,EAAG,IACH7X,MAAO,CAAC8X,QAAS5B,EAAY,EAAI,GACjC5E,UAAW,aAAa+E,EAAOX,EAAWxS,YAAYuT,EAAO1C,EAAe7Q,QAAQd,QAH/E,SAASA,YC3D1B,IAlDyB1C,EAAAA,EAAAA,IAAS,KAChC,MAAOqY,EAAqBC,IAA0BzN,EAAAA,EAAAA,UAAiD,OAChG0N,EAAcC,IAAmB3N,EAAAA,EAAAA,UAAiB,KACnD4N,GAAuBtV,EAAAA,EAAAA,QAAuC,MAEpE,OACExD,EAAAA,EAAAA,KAAC+Y,GAAAA,EAAO,CACN7C,QAAM,EACN8C,SAAWC,IACLA,EAAY/C,QAAQtV,OACtBiY,EAAgBI,EAAY/C,OAAOtV,QAErCH,SAEDA,EAAEyY,iBACDlZ,EAAAA,EAAAA,KAAA,OAAKmK,IAAK+O,EAAY1Y,UAAU,sCAAqCC,UACnEF,EAAAA,EAAAA,MAAA,OACEC,UAAU,eACV2Y,YAAc3U,IACuB,MAA/BA,GAAO4U,aAAaC,SACtBP,EAAqBjV,SAAS0T,gBAAgB/S,EAAM4U,YAAYC,UAGpEC,YAAaA,IAAMR,EAAqBjV,SAAS8T,kBACjDf,WAAYA,IAAMkC,EAAqBjV,SAAS6T,iBAChD6B,QAASA,IAAMT,EAAqBjV,SAAS8T,kBAC7C6B,OAAQA,IAAMV,EAAqBjV,SAAS6T,iBAAiBjX,SAAA,EAE7DT,EAAAA,EAAAA,KAACyZ,GAAmB,CAAC/E,eAAgBgE,IACpCvD,GAAAA,EAAkBC,cACjBpV,EAAAA,EAAAA,KAAC0Z,GAAiB,CAChBnX,OAAQ,IACRgB,GAAG,sBACHqT,WAAYA,KACV+B,EAAuB,OAEzBhC,QAAUjC,IACRiE,EAAuBjE,IAEzBgC,YAAaoC,EACblY,MAAOgY,aCOvB,GAvCoBe,KAClB3Z,EAAAA,EAAAA,KAAC4Z,EAAAA,EAA0B,CACzBpZ,UAAU,uBACVoU,QAAS,CACPiF,WAAY,CACVC,SAAU,SACVC,aAAa,EACbC,YAAY,EACZC,MAAO,iBAETC,SAAU,CACRhC,EAAG,SACHK,EAAG,WAEL9X,UAEFF,EAAAA,EAAAA,MAAA,OAAKI,MAAO,CAAC+K,QAAS,OAAQyO,cAAe,UAAU1Z,SAAA,EACrDF,EAAAA,EAAAA,MAACiQ,GAAc,CAAA/P,SAAA,EACbT,EAAAA,EAAAA,KAACoa,GAAkB,KACnBpa,EAAAA,EAAAA,KAACsQ,GAAc,KACftQ,EAAAA,EAAAA,KAACgK,EAAW,KACZhK,EAAAA,EAAAA,KAACqa,GAAmB,KACpBra,EAAAA,EAAAA,KAACsa,EAAAA,EAAY,QAEfta,EAAAA,EAAAA,KAACua,GAAY,KACbva,EAAAA,EAAAA,KAACwa,GAAS,KACVxa,EAAAA,EAAAA,KAACya,GAAa,KACdza,EAAAA,EAAAA,KAAC0a,GAAU,KACX1a,EAAAA,EAAAA,KAAC2a,GAAc,KACf3a,EAAAA,EAAAA,KAAC4a,EAAe,KAChB5a,EAAAA,EAAAA,KAAC6a,EAAS,KACV7a,EAAAA,EAAAA,KAAA,OAAKW,MAAO,CAACma,SAAU,MACvB9a,EAAAA,EAAAA,KAACwQ,GAAc,CAAA/P,UACbT,EAAAA,EAAAA,KAAC0T,GAAiB,W,+CCpC1B,MAiGA,IAjG8DrT,EAAAA,EAAAA,IAAS,EAAEkD,SACvE,MAAMG,EAASC,EAAAA,EAAQoX,mBAAmBxX,KAAOA,EAC3CuB,EAAQnB,EAAAA,EAAQoX,mBAAmBjW,OAAS,GAC5CkW,EAAqBrX,EAAAA,EAAQoX,mBAAmBE,eAAiB,CACrE/C,EAAG,EACHK,EAAG,IAGC,KAACtS,IAAQC,EAAAA,EAAAA,MAIf,OAFA9B,EAAAA,EAAAA,GAAiB,SAAU,IAAMT,EAAAA,EAAQuX,mBAAmB3X,KAG1DvD,EAAAA,EAAAA,KAACmb,GAAAA,GAAW,CACVH,mBAAoBA,EACpBI,eAAgBA,KACdzX,EAAAA,EAAQuX,mBAAmB3X,IAE7B8X,oBAAsBC,IACpBA,EAAEC,kBAEJC,KAAM9X,EAAOjD,SAEZqE,EAAMD,IAAI,CAACG,EAAMD,KAChB,IAAI0W,EACAC,EAEJ,GACO,WADC1W,EAAK3C,KAETqZ,EAAkBta,IAAW,aAAc,CACzC,gBAAiB4D,EAAKlE,eAExB2a,GACElb,EAAAA,EAAAA,MAAA,QAAAE,SAAA,EACEF,EAAAA,EAAAA,MAAA,QACEC,UAAWY,IAAW,6BAA8B,CAClD,aAAc4D,EAAK2W,cAClBlb,SAAA,EAEHT,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,oBAAmBC,SAAEwF,EAAKO,EAAExB,EAAKhE,SAChDgE,EAAK2W,aACJ3b,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,4BAA2BC,UACzCT,EAAAA,EAAAA,KAACgF,EAAK2W,YAAW,WAEjBtW,KAELL,EAAK4W,gBACJ5b,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,+BAA8BC,UAC5CT,EAAAA,EAAAA,KAACgF,EAAK4W,eAAc,WAEpBvW,UAMRqW,EAAkBta,IAAW,aAAc,CACzC,wBAAuC,cAAd4D,EAAK3C,OAKpC,OACErC,EAAAA,EAAAA,KAAA,MAAIQ,UAAWkb,EAAgBjb,UAC7BT,EAAAA,EAAAA,KAAA,UACEqC,KAAK,SACL+C,SAAwB,WAAdJ,EAAK3C,OAAsB2C,EAAKlE,aAC1CS,QAAUiD,IACU,cAAdQ,EAAK3C,QACkB,IAArB2C,EAAK6W,aACPrX,EAAM4U,YAAY0C,2BAGhB9W,EAAKlE,cACPkE,EAAKlE,aAAa0D,IAGK,IAArBQ,EAAK6W,aACPlY,EAAAA,EAAQuX,mBAAmB3X,KAIxB,GAETwY,cAAgBvX,IACdA,EAAM+W,kBACN9a,SAEDgb,KAzB8C,WAAdzW,EAAK3C,KAAoB2C,EAAKgX,OAAS,OAAOjX,W,wBCnE7F,MAAMkX,IAAWC,EAAAA,EAAAA,YAAkD,CAACpW,EAA8BqE,KAChG,MAAM,SAAC1J,EAAQ,SAAE0b,GAAYrW,EACvBsW,GAAQ5Y,EAAAA,EAAAA,QAAsC,MA6BpD,OA3BA2H,EAAAA,EAAAA,WAAU,KACR,MAAMkR,EAAeD,EAAMvY,QAE3B,GAAoB,MAAhBwY,EACF,MAAO,OAKT,MAAMC,EAAWD,EAAaE,cAAcC,WAAWF,SAWvD,OAToBnS,EACRmS,GAERH,GACFG,EAAShY,iBAAiB,SAAWgX,GAAMa,EAASb,GAA0C,CAC5FmB,SAAS,IAIN,KACDN,GACFG,EAASpY,oBAAoB,SAAWoX,GAAMa,EAASb,MAG1D,CAACa,EAAUhS,KAGZnK,EAAAA,EAAAA,KAAC4Z,EAAAA,EAA0B,IACrB9T,EACJ8O,QAAS,CACPiF,WAAY,CACVC,SAAU,QACVC,aAAa,EACbE,MAAO,aAAYtG,GAAAA,EAAYC,aAAe,QAAU,UAG5DzJ,IAAKiS,EAAM3b,SAEVA,MAUDic,IAAeR,EAAAA,EAAAA,YAA6C,CAACpW,EAA0BqE,KAC3F,MAAM,UAAC3J,EAAS,UAAEmc,EAAS,QAAEC,EAAO,aAAEC,EAAY,SAAEC,EAAQ,SAAEC,GAAYjX,GACnEvD,OAAQya,IAAgBC,EAAAA,GAAAA,KAE/B,OACEjd,EAAAA,EAAAA,KAACkd,GAAAA,GAAa,CACZ1c,UAAWA,EACX+B,OAAQmT,KAAK2B,IAAe,GAAXyF,EAAeE,GAChCL,UAAWA,EACXC,QAASA,EACTE,SAAUA,EACVlc,MAAM,OACNuc,iBAAkBxJ,GAAAA,EAAYyJ,mBAAgB/X,EAAY4W,GAC1D9R,IAAKA,EACLkT,cAAe,GACfN,SAAUA,EAAStc,SAElBoc,MAKP,IAAexc,EAAAA,EAAAA,IAASqc,I,eC3ExB,MAAMY,GAAoB,uFA2J1B,IAhJqBjd,EAAAA,EAAAA,KACnB6b,EAAAA,EAAAA,YACE,EAAEqB,cAAaC,cAAaC,kBAAoCtT,KAC9D,MAAOuT,EAAeC,IAAoBzS,EAAAA,EAAAA,WAAkB,GAEtD0S,GAAcpa,EAAAA,EAAAA,UACdqa,GAAmBra,EAAAA,EAAAA,UACnBsa,GAAeta,EAAAA,EAAAA,UACfua,GAAeC,EAAAA,GAAAA,GAAuC7T,GACtD8T,GAAaza,EAAAA,EAAAA,QAAuB,OAEpC,KAACyC,IAAQC,EAAAA,EAAAA,MAETgY,EAAqB1Z,IACzB,IAAI2Z,EAAa,EACW,MAAxBL,EAAaja,UACfsa,EAAa3Z,EAAM6U,QAAUyE,EAAaja,SAG5C,IAAIua,EAAgB,GACY,MAA5BP,EAAiBha,UACnBua,EAAgBP,EAAiBha,QAAUsa,GAGzCC,EAAgB,KAClBP,EAAiBha,QAAUua,EAC3BN,EAAaja,QAAUW,EAAM6U,QACH,MAAtB4E,EAAWpa,SAA2C,MAAxBka,EAAala,UAC7Coa,EAAWpa,QAAQlD,MAAMsR,UAAY,aAAayD,KAAK2B,IAAI,EAAG7S,EAAM6U,eAClE0E,EAAala,QAAQwa,wBAAwBC,YAM/CC,EAAkBA,KACtB5a,EAAAA,EAAQ6a,kBAAkBlB,IAC1BrZ,OAAOC,oBAAoB,YAAaqa,GACxCta,OAAOC,oBAAoB,cAAega,GAE1CP,GAAiB,GACjBG,EAAaja,aAAUwB,EAEG,MAAtB4Y,EAAWpa,UACboa,EAAWpa,QAAQlD,MAAM8X,QAAU,KAGV,MAAvBmF,EAAY/Z,SAA+C,MAA5Bga,EAAiBha,SAClD4Z,EAAeG,EAAY/Z,QAASga,EAAiBha,SAGvD+Z,EAAY/Z,aAAUwB,EACtBwY,EAAiBha,aAAUwB,GAG7B,OACE9E,EAAAA,EAAAA,MAAA,OAAKC,UAAU,iCAAiC4B,KAAK,MAAM+H,IAAK4T,EAAatd,SAAA,CAC1EwG,EAAAA,EAAaC,cAAcuX,mBAAmB1V,OAAO,CAAC2V,GAAmCnb,KAAIob,cAC5F,IAAKA,EACH,OAAOD,EAGT,MAAME,EAAUxY,EAAAA,EAAmB7C,GACnC,GAAe,MAAXqb,EACF,OAAOF,EAGT,IAAIG,EAAS,KACb,MAAMje,EAAQqG,EAAAA,EAAaC,cAAc4X,wBAAwBvb,IAAO,IAEnEma,IACHmB,GACE7e,EAAAA,EAAAA,KAAA,QACEQ,UAAU,yBACVue,cAAgBva,IACTkZ,GAAuC,MAAtBO,EAAWpa,SAA2C,MAAxBka,EAAala,UAC/D8Z,GAAiB,GAEjBC,EAAY/Z,QAAUN,EACtBsa,EAAiBha,QAAUjD,EAC3Bkd,EAAaja,QAAUW,EAAM6U,QAE7BpV,OAAOK,iBAAiB,YAAaia,GACrCta,OAAOK,iBAAiB,cAAe4Z,GACvCva,EAAAA,EAAQqb,eAAe1B,IAEvBW,EAAWpa,QAAQlD,MAAMsR,UAAY,aAAayD,KAAK2B,IAAI,EAAG7S,EAAM6U,eAClE0E,EAAala,QAAQwa,wBAAwBC,SAE/CL,EAAWpa,QAAQlD,MAAM8X,QAAU,SAO7C,MAAMwG,EAAe1b,IAAO0D,EAAAA,EAAaC,cAAcJ,aAAaL,SAC9DtF,EAAUC,IAAW,6BAA8B,CACvD,4BAA6B6d,EAC7B,CAAC,8BAA8BhY,EAAAA,EAAaC,cAAcJ,aAAa/D,aAAckc,IAmCvF,OAhCAP,EAAYQ,MACV3e,EAAAA,EAAAA,MAAA,UACEC,UAAW,GAAGW,MAAWmB,EAAAA,EAAAA,IAAI,CAC3BE,UAAW,OACX8H,OAAQ,CACN5H,QAAS,OACT6H,wBAAyB,mBAG7BnI,KAAK,eACL,YACE6c,EAC0D,QAAtDhY,EAAAA,EAAaC,cAAcJ,aAAa/D,UACtC,YACA,aACF,OAENV,KAAK,SAELd,QAASA,IAAMgc,EAAYha,GAC3BgW,QAASA,IAAMiE,IACf7c,MAAO,CACLC,MAAO,GAAGA,OACVH,SAAA,EAEFT,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,wBAAwBuJ,MAAO9D,EAAKO,EAAEoY,GAASne,UAC7DT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAIqb,MAEZC,IAVItb,IAcFmb,GACN,KACH1e,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,qDACfR,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,8BAA8B2J,IAAK8T,U,eCxJ5D,MAAMkB,GAAkBC,IACtB,MAAMC,EAAiC,GAEvCD,EAAME,QAASC,IACb,MAAMC,EAAS,IAAIC,WACnBD,EAAOE,OAAUpE,IACS,MAApBA,EAAEpS,QAAQyW,QAA6C,iBAApBrE,EAAEpS,OAAOyW,QAC9CN,EAAeH,KAAK,CAClBzU,KAAM8U,EAAK9U,KACXqD,KAAMwN,EAAEpS,OAAOyW,OAAOC,MAAM,WAAW,KAIvCP,EAAevV,SAAWsV,EAAMtV,QAA+B,MAArBuV,EAAe,IAC3D1b,EAAAA,EAAQyE,eAAe,CAAC7E,GAAI,eAAgBsc,IAAK,UAAWT,MAAOC,KAGvEG,EAAOM,cAAcP,MAqBzB,GAjBuDQ,EAAEtf,eACvD,MAAM,aAACuf,EAAY,aAAEC,IAAgBC,EAAAA,GAAAA,IAAY,CAC/CC,OAAQhB,GACRiB,SAAS,EACTC,YAAY,IAGd,OACErgB,EAAAA,EAAAA,KAAA,UACMggB,EAAa,CAACze,QAAU+e,GAAQA,EAAI/E,mBACxC/a,UAAW,6CAA4Cyf,EAAe,wBAA0B,IAAKxf,SAEpGA,K,gDCxBP,MAAM8f,GAAyBA,IAAcvY,EAAAA,EAAaC,iBAAiBD,EAAAA,EAAaC,iBAAiB6B,OAAS,GAE5G0W,IAAyEngB,EAAAA,EAAAA,IAC7E,EAAEoG,eACAzG,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,wBAAwBG,MAAO,CAAC+K,QAAS,UAAUjL,UACjET,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,0BAAyBC,UACtCT,EAAAA,EAAAA,KAAA,OACEQ,UAAU,gCACVG,MAAO,CACL8X,QAASzQ,EAAAA,EAAayY,SAASF,MAA0B9Z,GAAY,SAAMpB,GAC3E5E,UAEFT,EAAAA,EAAAA,KAAC0gB,EAAAA,GAAS,WAOPC,GAAuBC,IAClC,MAAMC,GAAwB9V,EAAAA,EAAAA,aAE9B,MAAO,CACL,CACE1I,KAAM,SACN2Z,OAAQ,QACRhb,MAAO8f,GAAAA,EAA0B/hB,MACjC+B,aAAcA,KACZ+G,EAAAA,EAAeC,cAAc,CAC3BC,OAAQC,EAAAA,EAAaC,qBAI3B,CACE5F,KAAM,SACN2Z,OAAQ,OACRhb,MAAO8f,GAAAA,EAA0B9hB,KACjC8B,aAAcA,KACZ+G,EAAAA,EAAeK,aAAa,CAC1BH,OAAQC,EAAAA,EAAaC,qBAI3B,CACE5F,KAAM,SACN2Z,OAAQ,SACRhb,MAAO8f,GAAAA,EAA0B7hB,OACjC6B,aAAcA,KACZ6C,EAAAA,EAAQyE,eAAe,CAAC7E,GAAI,sBAGhC,CACElB,KAAM,SACN2Z,OAAQ,YACRhb,MAAO8f,GAAAA,EAA0B5hB,UACjC4B,aAAcA,KACZ+G,EAAAA,EAAe3I,UAAU,CACvB6I,OAAQC,EAAAA,EAAaC,qBAI3B,CACE5F,KAAM,SACN2Z,OAAQ,aACRhb,MAAO8f,GAAAA,EAA0B3hB,WACjC2B,aAAcA,KACZ+G,EAAAA,EAAe1I,WAAW,CACxB4I,OAAQC,EAAAA,EAAaC,qBAI3B,CACE5F,KAAM,aAER,CACEA,KAAM,SACN2Z,OAAQ,cACRhb,MAAO8f,GAAAA,EAA0B1hB,YACjC0B,aAAcA,KACZ6C,EAAAA,EAAQyE,eAAe,CAAC7E,GAAI,mBAGhC,CACElB,KAAM,SACN2Z,OAAQ,OACRhb,MAAO8f,GAAAA,EAA0BzhB,KACjCyB,aAAcA,KACZ6C,EAAAA,EAAQyE,eAAe,CAAC7E,GAAI,oBAGhC,CACElB,KAAM,SACN2Z,OAAQ,cACRhb,MAAO8f,GAAAA,EAA0BxhB,YACjCwB,aAAcA,KACZ6C,EAAAA,EAAQyE,eAAe,CAAC7E,GAAI,mBAGhC,CACElB,KAAM,aAER,CACEA,KAAM,SACN2Z,OAAQ,iBACRhb,MAAO8f,GAAAA,EAA0BvhB,eACjCuB,aAAcA,KACZ6C,EAAAA,EAAQyE,eAAe,CACrB7E,GAAI,kBACJwd,KAAMR,SAIZ,CACEle,KAAM,SACN2Z,OAAQ,mBACRhb,MAAO8f,GAAAA,EAA0BthB,iBACjCsB,aAAewa,IACbA,EAAEC,iBAEFvT,EAAAA,EAAaC,iBAAiBqX,QAASyB,IACrC,MAAMC,EAAO3Z,SAAS4Z,cAAc,KAEpCD,EAAK7P,SAAW,GAChB6P,EAAKE,KAAO,GAAGvN,GAAAA,EAAYwN,uBAAuBJ,sBAClDC,EAAKrgB,MAAM+K,QAAU,OAErBrE,SAAS+Z,KAAKC,YAAYL,GAC1BA,EAAKM,QACLja,SAAS+Z,KAAKG,YAAYP,OAIhC,CACE3e,KAAM,SACN2Z,OAAQ,mBACRhb,MAAO8f,GAAAA,EAA0BrhB,iBACjCqB,aAAewa,IACbA,EAAEC,iBAEF,MAAMyF,EAAO3Z,SAAS4Z,cAAc,KAEpCD,EAAK7P,SAAW,GAChB6P,EAAKE,KAAO,GAAGvN,GAAAA,EAAYwN,uBAAuBnZ,EAAAA,EAAaC,iBAAiBuZ,KAAK,gBACrFR,EAAKrgB,MAAM+K,QAAU,OAErBrE,SAAS+Z,KAAKC,YAAYL,GAC1BA,EAAKM,QACLja,SAAS+Z,KAAKG,YAAYP,KAG9B,CACE3e,KAAM,SACN2Z,OAAQ,iBACRhb,MAAO8f,GAAAA,EAA0BphB,eACjCoB,aAAcA,KACZ6C,EAAAA,EAAQyE,eAAe,CAAC7E,GAAI,sBAGhC,CACElB,KAAM,SACN2Z,OAAQ,oBACRhb,MAAO8f,GAAAA,EAA0BnhB,kBACjCmB,aAAcA,KACZ,MAAM,iBAACmH,GAAoBD,EAAAA,EAC3BH,EAAAA,EAAelI,kBAAkB,CAC/BoI,OAAQE,EACRwZ,kBAAmBzZ,EAAAA,EAAayY,SAASF,MAA0BkB,oBAGvE5F,aAAa,EACbF,YAAaA,KAAM3b,EAAAA,EAAAA,KAACwgB,GAA6B,CAAC/Z,SAAS,sBAE7D,CACEpE,KAAM,SACN2Z,OAAQ,gBACRhb,MAAO8f,GAAAA,EAA0BlhB,cACjCkB,aAAcA,KACZ,MAAM,iBAACmH,GAAoBD,EAAAA,EAC3BH,EAAAA,EAAejI,cAAc,CAC3BmI,OAAQE,EACRyZ,cAAe1Z,EAAAA,EAAayY,SAASF,MAA0BmB,gBAGnE7F,aAAa,EACbF,YAAaA,KAAM3b,EAAAA,EAAAA,KAACwgB,GAA6B,CAAC/Z,SAAS,kBAE7D,CACEpE,KAAM,SACN2Z,OAAQ,cACRhb,MAAO8f,GAAAA,EAA0BjhB,YACjCiB,aAAcA,KACyB,MAAjC+f,EAAsBhd,SACxBgE,EAAAA,EAAehI,YAAY,CACzBkI,OAAQC,EAAAA,EAAaC,iBACrB0Z,SAAUd,EAAsBhd,aAItCgY,aAAa,EACbF,YAAaA,KACX3b,EAAAA,EAAAA,KAAC4hB,GAAAA,EAAa,CACZre,GAAIqd,EAAQG,KAEZc,MAAOjB,EAAQe,SACfG,SAAU,EACVzR,SAAUA,OACV0R,aAAa,UACbC,WAAW,EACXnB,sBAAuBA,EACvBoB,cAAY,GAPPrB,EAAQG,SCtLjBmB,GAAyD,CAC7DC,KAAKniB,EAAAA,EAAAA,KAACoiB,EAAAA,GAAK,IACXC,WAAWriB,EAAAA,EAAAA,KAACsiB,EAAAA,GAAQ,IACpBxgB,UAAU9B,EAAAA,EAAAA,KAACuiB,EAAAA,GAAa,IACxBC,WAAWxiB,EAAAA,EAAAA,KAACyiB,EAAAA,GAAiB,IAC7B1B,MAAM/gB,EAAAA,EAAAA,KAAC0iB,EAAAA,GAAI,IACX7gB,YAAY7B,EAAAA,EAAAA,KAACoiB,EAAAA,GAAK,IAClBzgB,WAAW3B,EAAAA,EAAAA,KAAC2iB,EAAAA,GAAQ,IACpBC,aAAa5iB,EAAAA,EAAAA,KAAC6iB,EAAAA,GAAe,IAC7BjhB,cAAc5B,EAAAA,EAAAA,KAAC8iB,EAAAA,GAAgB,IAC/BC,WAAW/iB,EAAAA,EAAAA,KAACgjB,EAAAA,GAAI,IAChBC,SAASjjB,EAAAA,EAAAA,KAACkjB,EAAAA,GAAc,IACxBC,iBAAiBnjB,EAAAA,EAAAA,KAACuiB,EAAAA,GAAa,IAC/Ba,OAAOpjB,EAAAA,EAAAA,KAACqjB,EAAAA,GAAK,IACbC,OAAOtjB,EAAAA,EAAAA,KAACujB,EAAAA,GAAK,IACbC,OAAOxjB,EAAAA,EAAAA,KAACyjB,EAAAA,GAAK,IACbC,aAAa1jB,EAAAA,EAAAA,KAAC2jB,EAAAA,GAAK,IACnB3hB,QAAQhC,EAAAA,EAAAA,KAAC4jB,EAAAA,GAAW,IACpB3hB,SAASjC,EAAAA,EAAAA,KAAC4jB,EAAAA,GAAW,KAGjBC,IAAoCxjB,EAAAA,EAAAA,IAAS,EAAEoI,WACnDA,GAAQzI,EAAAA,EAAAA,KAAC8jB,EAAAA,GAAc,CAACtjB,UAAU,2DAA8D,MAG5FujB,IAA+B1jB,EAAAA,EAAAA,IAAS,EAAEiN,WAC9C,MAAM,KAACrH,IAAQC,EAAAA,EAAAA,MAEf,OAAa,IAAToH,EACK,MAGFtN,EAAAA,EAAAA,KAAA,QAAAS,SAAOwF,EAAKqH,KAAK,IAAIC,KAAY,IAAPD,QAG7B0W,IAA6B3jB,EAAAA,EAAAA,IAAS,EAAE8hB,SAAyBA,GAAMniB,EAAAA,EAAAA,KAACwV,GAAAA,EAAQ,CAAC/M,MAAO0Z,IAAU,MAElG8B,IAA6D5jB,EAAAA,EAAAA,IACjE,EAAE6jB,iBAAgBC,iBAChB,MAAM,KAACle,IAAQC,EAAAA,EAAAA,MAEf,OACElG,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CACJ5C,GAAG,qBACH6gB,OAAQ,CACNC,UAAWpe,EAAKqe,OAAOJ,GACvBK,IACEvkB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,4BAGd0L,MAAOhJ,EAAKqe,OAAOH,QAOvBK,IAAiCnkB,EAAAA,EAAAA,IAAS,EAAEijB,YAChD,MAAM,KAACrd,IAAQC,EAAAA,EAAAA,MAEf,OAAOlG,EAAAA,EAAAA,KAAA,QAAAS,SAAOwF,EAAKqe,OAAOhB,EAAO,CAACmB,sBAAuB,QAGrDC,IAAiCrkB,EAAAA,EAAAA,IAAS,EAAEwS,WAChD7S,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,oBAAmBC,SAC9BoS,EAAKhO,IAAKyO,IACTtT,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,eAAcC,SACzB6S,GAD+BA,OAOlCqR,IAAyCtkB,EAAAA,EAAAA,IAAS,EAAE0T,eACxD/T,EAAAA,EAAAA,KAAA,QAAAS,SAAOsT,EAASyN,KAAK,SAQjBoD,IAAiEvkB,EAAAA,EAAAA,IACrE,EAAEugB,UAASiE,aACT,OAAQA,GACN,IAAK,aAEL,IAAK,YAEL,IAAK,cAEL,IAAK,eACH,OAAO7kB,EAAAA,EAAAA,KAAC+jB,GAAQ,CAACzW,KAAMsT,EAAQiE,KACjC,IAAK,WAEL,IAAK,SACH,OAAO7kB,EAAAA,EAAAA,KAAC0I,EAAAA,EAAI,CAACD,MAAOmY,EAAQiE,GAASlU,SAAO,IAC9C,IAAK,YAEL,IAAK,UAEL,IAAK,YACH,OAAO3Q,EAAAA,EAAAA,KAAC0I,EAAAA,EAAI,CAACD,MAAOmY,EAAQiE,KAC9B,IAAK,QACH,OAAO7kB,EAAAA,EAAAA,KAACwkB,GAAS,CAAClB,MAAO1C,EAAQiE,KACnC,IAAK,YACH,OAAO7kB,EAAAA,EAAAA,KAAC6jB,GAAW,CAACpb,MAAOmY,EAAQiE,KACrC,IAAK,OACH,OAAO7kB,EAAAA,EAAAA,KAAC0kB,GAAQ,CAAC7R,KAAM+N,EAAQiE,KACjC,IAAK,cACH,OAAO7kB,EAAAA,EAAAA,KAAC2kB,GAAY,CAAC5Q,SAAU6M,EAAQiE,KACzC,IAAK,MACH,OAAO7kB,EAAAA,EAAAA,KAACgkB,GAAO,CAAC7B,IAAKvB,EAAQiE,KAC/B,IAAK,QACH,OAAO7kB,EAAAA,EAAAA,KAACikB,GAAQ,CAACC,eAAgBtD,EAAQkE,eAAgBX,WAAYvD,EAAQmE,aAC/E,IAAK,QACH,OAAO/kB,EAAAA,EAAAA,KAACikB,GAAQ,CAACC,eAAgBtD,EAAQsD,eAAgBC,WAAYvD,EAAQoE,aAC/E,IAAK,kBACH,OACEhlB,EAAAA,EAAAA,KAAC6J,EAAAA,EAAW,CACVvJ,SAAS2kB,EAAAA,GAAAA,IAAS,IAAMvP,KAAKa,KAAKqK,EAAQuC,kBAAkB+B,MAC5DnlB,QAAQklB,EAAAA,GAAAA,IAAS,KAAME,EAAAA,GAAAA,GAAuBvE,EAAQ7gB,SAASmlB,QAGrE,QACE,OAAOllB,EAAAA,EAAAA,KAAA,QAAAS,SAAOmgB,EAAQiE,QAqD9B,IAtCkDxkB,EAAAA,EAAAA,IAChD,EACE0gB,OACAzf,QAAS8jB,EAAyBR,GAClCC,SACArkB,YACA6kB,qBAAoB,EACpBzkB,QACA0kB,YAAW,MAEX,MAAMvkB,EAAOukB,EAAWpD,GAAM2C,GAAU,KAExC,OACEtkB,EAAAA,EAAAA,MAAA,OACEC,UACE6kB,EACI7kB,EACAY,IACE,kBACA,oBAAoByjB,IACpBrkB,GACA8B,EAAAA,EAAAA,IAAI,CAACijB,cAAe,OAAQC,WAAY,UAGhDpjB,KAAK,OACLzB,MAAO,CAACC,MAAO,GAAGA,OAAWH,SAAA,CAE5BM,EACAqkB,GACCplB,EAAAA,EAAAA,KAAColB,EAAsB,CAACxE,QAAS5Y,EAAAA,EAAayY,SAASM,GAAO8D,OAAQA,KAEtE7kB,EAAAA,EAAAA,KAACylB,EAAAA,GAAkB,SCxH7B,IAhEgCplB,EAAAA,EAAAA,KAC9B6b,EAAAA,EAAAA,YACE,EAEI1b,YACAG,QACAogB,OACAlW,cACA6a,oBACAC,mBACAC,mBACAC,iBACAC,oBACGC,GAEL5b,KAEA,MAAMsU,EAAqBxX,EAAAA,EAAaC,cAAcuX,mBAAmB1V,OACvE,CAAC2V,GAAmCnb,KAAIob,aACR,MAA1BvY,EAAAA,EAAmB7C,GACdmb,EAGJC,GAILD,EAAYQ,MACVlf,EAAAA,EAAAA,KAACgmB,GAAe,CACdxlB,UAAU,cAEVugB,KAAMA,EACN8D,OAAQthB,EACR3C,MAAOqG,EAAAA,EAAaC,cAAc4X,wBAAwBvb,IAHrDA,IAOFmb,GAbEA,EAeX,IAGF,OACE1e,EAAAA,EAAAA,KAAA,OACEQ,UAAWA,EACX4B,KAAK,MACLzB,MAAOA,EACPslB,SAAU,EACV1kB,QAAU+Z,GAAMzQ,EAAYkW,EAAMzF,GAClCS,cAAgBT,GAAMqK,EAAiB5E,EAAMzF,GAC7C4K,cAAeA,IAAMR,EAAkB3E,GACvCoF,aAAcP,EACdQ,WAAYP,EACZQ,WAAYP,EACZ3b,IAAKA,KACD4b,EAActlB,SAEjBge,OCnDL6H,IAAmEjmB,EAAAA,EAAAA,IACvE,EAAEugB,cACA,MAAM,KAAC3a,IAAQC,EAAAA,EAAAA,MACf,OACE3F,EAAAA,EAAAA,MAAA,QAAAE,SAAA,CACGwF,EAAKqe,OAAO1D,EAAQuC,gBAAiB,CAACsB,sBAAuB,KAC9DzkB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,SAAC,MAAM,OAE3BT,EAAAA,EAAAA,KAAC0I,EAAAA,EAAI,CAACD,MAAOmY,EAAQ7e,iBA0G7B,IApG+B1B,EAAAA,EAAAA,KAC7B6b,EAAAA,EAAAA,YACE,EAEI1b,YACAG,QACAogB,OACAlW,cACA6a,oBACAC,mBACAC,mBACAC,iBACAC,oBACGC,GAEL5b,KAEA,MAAMoc,EAAUtf,EAAAA,EAAaC,cAAcuX,mBAErC+H,EAAsC,EAC1CxmB,EAAAA,EAAAA,KAACgmB,GAAe,CAEdjF,KAAMA,EACN8D,OAAO,OACPrkB,UAAU,gEAHN,SAMFimB,EAAwC,EAC5CzmB,EAAAA,EAAAA,KAACgmB,GAAe,CAAWjF,KAAMA,EAAM8D,OAAO,MAAMS,UAAQ,GAAvC,QACrBtlB,EAAAA,EAAAA,KAACgmB,GAAe,CAAgBjF,KAAMA,EAAM8D,OAAO,WAAWS,UAAQ,GAAjD,aACrBtlB,EAAAA,EAAAA,KAACgmB,GAAe,CAAcjF,KAAMA,EAAM8D,OAAO,SAASS,UAAQ,GAA7C,WAEjBoB,EAAuC,EAC3C1mB,EAAAA,EAAAA,KAACgmB,GAAe,CAEdjF,KAAMA,EACN8D,OAAO,kBACPvjB,QAASglB,GACThB,UAAQ,GAJJ,oBAOFqB,EAAyC,EAC7C3mB,EAAAA,EAAAA,KAACgmB,GAAe,CAEdjF,KAAMA,EACN8D,OAAO,kBACPrkB,UAAU,kEACV6kB,mBAAiB,GAJb,eASR,IAAK,IAAItgB,EAAQ,EAAGA,EAAQwhB,EAAQzc,OAAQ/E,GAAS,EAAG,CACtD,MAAM,GAACxB,EAAE,QAAEob,GAAW4H,EAAQxhB,GAE9B,GAA8B,MAA1BqB,EAAAA,EAAmB7C,IAAeob,EACpC,OAAQpb,GACN,IAAK,OAEL,IAAK,WACL,IAAK,SACL,IAAK,MAEL,IAAK,YACL,IAAK,kBACH,MACF,QACEmjB,EAAgBxH,MAAKlf,EAAAA,EAAAA,KAACgmB,GAAe,CAAUjF,KAAMA,EAAM8D,OAAQthB,EAAI+hB,UAAQ,GAApC/hB,IAInD,CAEA,OACEhD,EAAAA,EAAAA,MAAA,OACEC,UAAWA,EACX4B,KAAK,MACLzB,MAAOA,EACPslB,SAAU,EACV1kB,QAAU+Z,GAAMzQ,EAAYkW,EAAMzF,GAClCS,cAAgBT,GAAMqK,EAAiB5E,EAAMzF,GAC7C4K,cAAeA,IAAMR,EAAkB3E,GACvCoF,aAAcP,EACdQ,WAAYP,EACZQ,WAAYP,EACZ3b,IAAKA,KACD4b,EAActlB,SAAA,EAElBF,EAAAA,EAAAA,MAAA,OAAKC,WAAW8B,EAAAA,EAAAA,IAAI,CAACskB,WAAY,SAAUlb,QAAS,SAASjL,SAAA,CAC1D+lB,GACDxmB,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,iEAAgEC,SAAEgmB,QAEnFzmB,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,gEAA+DC,SAAEimB,IAC/EC,QCxHLE,GAAqBA,CAAC9F,EAAcvc,MACf,IAArBA,EAAMsiB,YACRtiB,EAAM+W,iBAGR,MAAMwL,EAAgBviB,EAAgC6U,QAChD2N,EAAgBxiB,EAAgCyiB,QAChDC,EAAgB1iB,EAAgC2iB,UAAU,GAAG9N,QAC7D+N,EAAgB5iB,EAAgC2iB,UAAU,GAAGF,QAE9Djf,EAAAA,EAAaC,iBAAiBiE,SAAS6U,IAC1C/Y,EAAAA,EAAaqf,oBAAoB,CAACtG,OAAMvc,UAG1C,MAAM,0BAAC8iB,EAA4BC,GAAAA,EAAqBD,2BAA6BrgB,EAAAA,EAAaC,cAC5F0Z,EAAU5Y,EAAAA,EAAayY,SAASM,GAEtCpd,EAAAA,EAAQ6jB,qBAAqB,CAC3BjkB,GAAI,oBACJ0X,cAAe,CACb/C,EAAG6O,GAAgBG,GAAgB,EACnC3O,EAAGyO,GAAgBI,GAAgB,GAErCtiB,MAAO6b,GAAoBC,GAASxX,OAAQpE,GACxB,cAAdA,EAAK3C,MAIFilB,EAA0BG,KAAMzL,GAAWA,EAAOzY,KAAOyB,EAAKgX,SAA6B,IAAnBA,EAAO2C,aAKtF+I,GAAyB3G,GAAiBpd,EAAAA,EAAQyE,eAAe,CAAC7E,GAAI,kBAAmBwd,SAEzF4G,GAAgBA,CAAC5G,EAAcvc,IACnCwD,EAAAA,EAAaqf,oBAAoB,CAACtG,OAAMvc,UAEpC6hB,GAAaA,CAACtF,EAAczF,KAClB,MAAVA,EAAEsM,KAAyB,UAAVtM,EAAEsM,KAA6B,gBAAVtM,EAAEsM,MAC1CtM,EAAEC,iBACEvT,EAAAA,EAAaC,iBAAiBiE,SAAS6U,GAC3B,UAAVzF,EAAEsM,IACJF,GAAsB3G,GACH,gBAAVzF,EAAEsM,KACXf,GAAmB9F,EAAMzF,GAG3BqM,GAAc5G,EAAMzF,KAsG1B,IA5FgDjb,EAAAA,EAAAA,IAAS,EAAE0gB,OAAMpgB,YAC/D,MAAOknB,EAAaC,IAAkB5c,EAAAA,EAAAA,UAAiB,GACjD6c,GAA8BvkB,EAAAA,EAAAA,SAAgB,GAC9CwkB,GAASxkB,EAAAA,EAAAA,QAAuB,MAEhCykB,EAAiE,cAAnDhhB,EAAAA,EAAaC,cAAcF,oBACzCV,GAAa2e,EAAAA,GAAAA,IAAS,IAAMjd,EAAAA,EAAaC,iBAAiBiE,SAAS6U,IAAOmE,OAE1E,OAACnlB,EAAM,OAAEiC,EAAM,SAAEF,GAAYkG,EAAAA,EAAayY,WAAWM,IAAS,CAAC,EAC/DmH,GAAiBC,EAAAA,GAAAA,GACrB,CAACpoB,SAAQiC,SAAQF,YACjBV,IAAW,CACT,uBAAwBkF,EACxB,wBAAyB2hB,EACzB,wBAAyBA,IAE3B,YAGI,aAAC9B,EAAY,WAAEC,IAAcgC,EAAAA,GAAAA,GAAc9M,IAC/C,MAAM+M,EAAiBL,EAAOnkB,SAASwa,wBAAwBC,IACtD,MAALhD,GAA+B,MAAlB+M,GAA0B3S,KAAK4S,IAAID,EAAiBR,GAAe,IAClFhB,GAAmB9F,EAAMzF,KAIvBiN,EAAsBjN,IACrBtT,EAAAA,EAAaC,iBAAiBiE,SAAS6U,IAC1C4G,GAAc5G,EAAMzF,GAGlByM,EAA4BlkB,QAC9B6jB,GAAsB3G,IAEtBgH,EAA4BlkB,SAAU,EACtC2kB,WAAW,KACTT,EAA4BlkB,SAAU,GACrC,MAGLikB,EAAeE,EAAOnkB,SAASwa,wBAAwBC,KAAO,GAE9D6H,EAAa7K,IAGTsF,EAAU5Y,EAAAA,EAAayY,WAAWM,GAClC0H,EAAgB,WAAW1H,IAC3B2H,EAAgB3oB,GAAQyhB,KAAK,MAAQ,UAE3C,OAAIyG,GAEAjoB,EAAAA,EAAAA,KAAC2oB,GAAuB,CACtBnoB,UAAW0nB,EACX/d,IAAK6d,EACLrnB,MAAOA,EACPogB,KAAMA,EACNlW,YAAa8c,GACbjC,kBAAmBgC,GACnB/B,iBAAkBkB,GAClBjB,iBAAkB2C,EAClB1C,eAAgBO,EAChBN,eAAiBxK,GAAM+K,GAAWtF,EAAMzF,GACxC,cAAamN,EACb,sBAAqBC,EACrB,oBAAmB9H,GAASnW,KAC5B,mBAAkBnE,EAClB,iBAAe,eAMnBtG,EAAAA,EAAAA,KAAC4oB,GAAsB,CACrBpoB,UAAW0nB,EACX/d,IAAK6d,EACLrnB,MAAOA,EACPogB,KAAMA,EACNlW,YAAa8c,GACbjC,kBAAmBgC,GACnB/B,iBAAkBkB,GAClBjB,iBAAkB2C,EAClB1C,eAAgBO,EAChBN,eAAiBxK,GAAM+K,GAAWtF,EAAMzF,GACxC,cAAamN,EACb,sBAAqBC,EACrB,oBAAmB9H,GAASnW,KAC5B,mBAAkBnE,EAClB,iBAAe,eCtIfuiB,IAAsDxoB,EAAAA,EAAAA,IAAS,EAAE0E,QAAOpE,YAC5EX,EAAAA,EAAAA,KAAC8oB,GAAc,CAAC/H,KAAM/Y,EAAAA,EAAa+gB,iBAAiBhkB,GAAOgc,KAAMpgB,MAAOA,KAwK1E,IArKwBN,EAAAA,EAAAA,IAAS,KAC/B,MAAM2oB,GAAgBxlB,EAAAA,EAAAA,QAAuB,MACvCylB,GAAkBzlB,EAAAA,EAAAA,QAAsB,MACxC0lB,GAAuB1lB,EAAAA,EAAAA,QAA8B,OAE3D2H,EAAAA,EAAAA,WAAU,KACQge,EAAAA,GAAAA,IACd,IAAM/c,EAAAA,EAAmBgd,cACzB,KACiC,MAA3BH,EAAgBplB,SAClBolB,EAAgBplB,QAAQwlB,SAAS,KAMtC,KAEHC,EAAAA,GAAAA,GAAS,UAAYhO,IACnB,MAAM,QAACiO,EAAO,IAAE3B,EAAG,QAAE4B,EAAO,OAAEC,EAAM,OAAEvgB,GAAUoS,EAE1CoO,EAAWxgB,GAAwBwgB,SAASC,cAClC,UAAZD,GAAmC,aAAZA,IAIvBD,KAICD,GAAWD,IAAoB,MAAR3B,IAC1BtM,EAAEC,iBACFvT,EAAAA,EAAa4hB,sBAGVJ,GAAWD,IAAoB,MAAR3B,GAC1B,WACE,MAAMiC,QAAaC,WAAWC,WAAWC,YACnCC,EAAeJ,GAAMK,WAAW,YAChCC,EAAgBN,GAAMK,WAAW,SAAWL,GAAMO,SAAS,aAC7DH,GAAgBE,KAClB7O,EAAEC,iBACF5X,EAAAA,EAAQyE,eAAe,CAAC7E,GAAI,eAAgBsc,IAAK,SAAUwK,KAAM,CAAC,CAAC9mB,GAAI,EAAGkF,MAAOohB,MAEpF,EARD,OAYJ,MAAMpJ,EAAWzY,EAAAA,EAAa+gB,kBACxB,oBAAC/hB,EAAsB,aAAeC,EAAAA,EAAaC,cAEnD+gB,EAAsC,cAAxBjhB,EACdsjB,EAA0B,MAAZ7J,GAAwC,IAApBA,EAAS3W,OAEjD,IAAIxI,EAAqB,KACrBipB,EAAgC,KA2FpC,OA1FKpV,GAAAA,EAAkBC,YAQZkV,GAA2B,MAAZ7J,EACxBnf,GACEf,EAAAA,EAAAA,MAAA,OAAKC,UAAU,2BAA0BC,SAAA,EACvCT,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,kBAAiBC,UAC9BT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,gCAEX6I,EAAAA,EAAmBoe,gBAClBxqB,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,0BAAyBC,UACtCT,EAAAA,EAAAA,KAACyqB,GAAAA,GAAM,CACLlpB,QAASA,KACP6K,EAAAA,EAAmBse,mBAErB/I,SAAS,WAAUlhB,UAEnBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,oCAGZ,SAIJ0kB,IACFsC,GACEvqB,EAAAA,EAAAA,KAAC2qB,GAAY,CACXnN,YAAaA,KACyB,MAAhC0L,EAAqBrlB,SAA4C,MAAzBmlB,EAAcnlB,UACxDqlB,EAAqBrlB,QAAQ+mB,WAAa5B,EAAcnlB,QAAQ+mB,aAGpErN,YAAc9W,IACZ,MAAMokB,EAAc5jB,EAAAA,EAAaC,cAAcJ,aAE/C,IAAIF,EAAgBC,EAAeJ,IAAa,MAE5CokB,EAAYpkB,WAAaA,IAC3BG,EAA0C,QAA1BikB,EAAY9nB,UAAsB,OAAS,OAG7D,MAAMgE,EAAS,CACbN,WACA1D,UAAW6D,GAGbe,EAAAA,EAAeC,YAAY,eAAgBb,IAE7C0W,eAAgBA,CAACoH,EAA2BjkB,KAC1C,MAAM,wBAACke,EAA0ByI,GAAAA,EAAqBzI,yBAA2B7X,EAAAA,EAAaC,cAE9FS,EAAAA,EAAeC,YAAY,0BAA2B,IACjDkX,EACH,CAAC+F,GAASjkB,KAGduJ,IAAK6e,KAMX1nB,GACEtB,EAAAA,EAAAA,KAAC0c,GAAY,CACXlc,UAAU,0BACVmc,UAAW8D,EAAS3W,OACpB8S,QAAU7X,GAAUiD,EAAAA,EAAa+gB,iBAAiBhkB,GAAOgc,KACzDlE,aAAcgM,GACd/L,SAAUmL,EAAc,GAAK,GAC7B9d,IAAK8e,EACLlM,SAAW5S,IACT,MAAM2gB,EAAc3gB,EACD,MAAf2gB,GAA+C,MAAxBA,EAAYC,WACrCD,EAAYC,SAAW,KACQ,MAAzB/B,EAAcnlB,UAChBmlB,EAAcnlB,QAAQ+mB,WAAaE,EAAYF,cAIrD1B,EAAqBrlB,QAAUinB,MAnFrCxpB,GACEtB,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,2BAA0BC,UACvCT,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,kBAAiBC,UAC9BT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,sCAuFhBhD,EAAAA,EAAAA,MAACwf,GAAmB,CAAAtf,SAAA,EAClBF,EAAAA,EAAAA,MAAA,OAAKC,UAAU,yBAAyB4B,KAAK,QAAO3B,SAAA,EAClDT,EAAAA,EAAAA,KAACgrB,GAAqB,CAACznB,GAAG,sBACzBgnB,EACAjpB,MAEHtB,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,oBAAmBC,UAChCF,EAAAA,EAAAA,MAAA,OAAKC,UAAU,iBAAgBC,SAAA,EAC7BT,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,iBAAgBC,UAC7BT,EAAAA,EAAAA,KAACirB,EAAAA,GAAK,OAERjrB,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,iC,cC3KpB,GAAoC,iBAAzB2nB,GAAAA,GAAyD,oBAAb7jB,SAA0B,CAC/E,MAAM8jB,EAAe9jB,SAAS4Z,cAAc,SAC5CkK,EAAaC,YAAc,wBAAwBF,GAAAA,MACnDC,EAAaE,aAAa,aAAc,eACxChkB,SAASikB,KAAKjK,YAAY8J,EAC5B,CCXA,MAAMI,IAASC,EAAAA,EAAAA,MAAK,IAAM,+BACpBC,IAASD,EAAAA,EAAAA,MAAK,IAAM,sDAsB1B,GApBqBE,MACnBvgB,EAAAA,EAAAA,WAAU,KACR2B,EAAAA,EAAa6e,uBACZ,KAGDprB,EAAAA,EAAAA,MAACqrB,EAAAA,EAAe,CAAAnrB,SAAA,EACdT,EAAAA,EAAAA,KAAC2Z,GAAO,KACRpZ,EAAAA,EAAAA,MAAC+H,EAAkB,CAAA7H,SAAA,EACjBF,EAAAA,EAAAA,MAACsrB,EAAgB,CAACtjB,SAAS,eAAe/H,UAAU,qBAAoBC,SAAA,EACtET,EAAAA,EAAAA,KAAC8rB,EAAS,KACV9rB,EAAAA,EAAAA,KAAC+rB,GAAW,QAEd/rB,EAAAA,EAAAA,KAACyrB,GAAM,KACPzrB,EAAAA,EAAAA,KAACurB,GAAM,U,iFCzBf,MAMA,EANsBS,KACpBhsB,EAAAA,EAAAA,KAAC4rB,EAAAA,EAAe,CAACrjB,SAAS,YAAW9H,UACnCT,EAAAA,EAAAA,KAACisB,EAAAA,EAAQ,CAACC,KAAK,W,iECHZ,MAAM/D,EAAuBA,EACjCpoB,SAAQ+B,WAAUE,aAChBb,IAEHC,IAAWD,EAAS,CAClB,qBAAsBpB,EAAOmM,SAAS,SACtC,sBAAuBnM,EAAOmM,SAAS,WACvC,0BAA2BnM,EAAOmM,SAAS,eAC3C,oCAAqCpK,EAAW,EAChD,kCAAmCE,EAAS,EAC5C,sBAAuBjC,EAAOmM,SAAS,WACvC,wBAAyBnM,EAAOmM,SAAS,YACzC,uBAAwBnM,EAAOmM,SAAS,YACxC,uBAAwBnM,EAAOmM,SAAS,cAG/BiZ,EAA0BplB,IACrC,IAAI4f,EAA8C,UAUlD,MARA,CAAC,QAAS,WAAY,UAAW,cAAe,WAAW8H,KAAM0E,KAC3DpsB,EAAOmM,SAASigB,KAClBxM,EAASwM,GACF,IAKJxM,E,kCC/BT,MAwBA,EAxB2B,CACzBhe,UAAW,iCACXC,aAAc,oCACdE,SAAU,qCACVC,UAAW,qCACXogB,IAAK,0BACL1X,KAAM,2BACN2Y,MAAO,4BACPD,gBAAiB,iCACjBG,MAAO,4BACPE,MAAO,4BACPnB,UAAW,2BACXxP,KAAM,2BACN7Q,OAAQ,mCACRC,QAAS,mCACT2gB,YAAa,mCACbJ,UAAW,gCACXzB,KAAM,2BACNgC,UAAW,iCACXE,QAAS,sCACTS,YAAa,+BACb7hB,WAAY,kC,0DClBd,MAuJA,EA9GoC2T,EAAEC,SAAQhN,YAC5C,GAAa,MAATA,EACF,OAAO,KAGT,IAAInH,EAAU,KACV8qB,EAAgB,KAEhB3W,IACF2W,GAAgBpsB,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,oBAAmBC,SAAEgV,KAGvD,MAAM4W,GAAsB,IAAX5jB,GAAgB,EApDjC6jB,KAUA,MAAMC,EAAQ7W,KAAKe,MAAM6V,EAAa,SAChCE,EAAQ9W,KAAKe,MAAO6V,EAAa,QAAY,QAC7CG,EAAO/W,KAAKe,MAAQ6V,EAAa,QAAY,OAAU,OACvDI,EAAQhX,KAAKe,MAAS6V,EAAa,QAAY,OAAU,MAAS,MAClEK,EAAUjX,KAAKe,MAAU6V,EAAa,QAAY,OAAU,MAAS,KAAQ,IAC7EM,EAAUlX,KAAKe,MAAM6V,EAAuB,GAAVK,GACxC,IAAIE,EAAgB,KAgBpB,OAbEA,EADEN,EAAQ,EACM,CAACA,QAAOC,QAAOF,cACtBE,EAAQ,EACD,CAACA,QAAOC,OAAMH,cACrBG,EAAO,EACA,CAACA,OAAMC,QAAOJ,cACrBI,EAAQ,EACD,CAACA,QAAOC,UAASL,cACxBK,EAAU,EACH,CAACA,UAASC,UAASN,cAEnB,CAACM,UAASN,cAGrBO,GAoB8BC,CAAkBrkB,GA0FvD,OAvFEnH,GADgB,IAAd+qB,GACQrsB,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,uBACO,MAAlB8oB,EAASE,OAAiBF,EAASE,MAAQ,EAC1C,EACRhsB,EAAAA,EAAAA,MAAA,QAAMC,UAAU,oBAAmBC,SAAA,CAChC4rB,EAASE,OACVvsB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,uBAH0B,UAMxChD,EAAAA,EAAAA,MAAA,QAAMC,UAAU,oBAAmBC,SAAA,CAChC4rB,EAASG,OACVxsB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,uBAH0B,UAOf,MAAlB8oB,EAASG,OAAiBH,EAASG,MAAQ,EAC1C,EACRjsB,EAAAA,EAAAA,MAAA,QAAMC,UAAU,oBAAmBC,SAAA,CAChC4rB,EAASG,OACVxsB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,uBAH0B,UAMxChD,EAAAA,EAAAA,MAAA,QAAMC,UAAU,oBAAmBC,SAAA,CAChC4rB,EAASI,MACVzsB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,sBAH0B,SAOhB,MAAjB8oB,EAASI,MAAgBJ,EAASI,KAAO,EACxC,EACRlsB,EAAAA,EAAAA,MAAA,QAAMC,UAAU,oBAAmBC,SAAA,CAChC4rB,EAASI,MACVzsB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,sBAH0B,SAMxChD,EAAAA,EAAAA,MAAA,QAAMC,UAAU,oBAAmBC,SAAA,CAChC4rB,EAASK,OACV1sB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,uBAH0B,UAOf,MAAlB8oB,EAASK,OAAiBL,EAASK,MAAQ,EAC1C,EACRnsB,EAAAA,EAAAA,MAAA,QAAMC,UAAU,oBAAmBC,SAAA,CAChC4rB,EAASK,OACV1sB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,uBAH0B,UAMxChD,EAAAA,EAAAA,MAAA,QAAMC,UAAU,oBAAmBC,SAAA,CAChC4rB,EAASM,SACV3sB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,yBAH0B,YAOb,MAApB8oB,EAASM,SAAmBN,EAASM,QAAU,EAC9C,EACRpsB,EAAAA,EAAAA,MAAA,QAAMC,UAAU,oBAAmBC,SAAA,CAChC4rB,EAASM,SACV3sB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,yBAH0B,YAMxChD,EAAAA,EAAAA,MAAA,QAAMC,UAAU,oBAAmBC,SAAA,CAChC4rB,EAASO,SACV5sB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,yBAH0B,aASxChD,EAAAA,EAAAA,MAAA,QAAMC,UAAU,oBAAmBC,SAAA,CAChC4rB,EAASO,SACV5sB,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,UAClBT,EAAAA,EAAAA,KAACmG,EAAAA,GAAK,CAAC5C,GAAG,2BAOhBhD,EAAAA,EAAAA,MAAA,QAAMC,UAAU,WAAUC,SAAA,CACvBa,EACA8qB,K,iGCpHP,MAAM,QAACjL,GAAWxN,EAAAA,EAEZoZ,EAAwBniB,IAC5BoiB,EAAAA,EAAWC,IAAI,CACb1pB,GAAI,yBACJqH,WAIEsiB,EAAyBtiB,IAC7BoiB,EAAAA,EAAWC,IAAI,CACb1pB,GAAI,oBACJlB,KAAM,UACNuI,WAIEuiB,EAA+BviB,IACnCoiB,EAAAA,EAAWC,IAAI,CACb1pB,GAAI,2BACJlB,KAAM,QACNuI,WAwNJ,EApNuB,CACrBwiB,kBAAoBxY,GAClByY,EAAAA,EAAMC,KAAyB,GAAGnM,yBAAgCvM,GAAS2Y,KACzE,EAAEzf,WACIA,EAAKhE,OACPojB,EAAsBpf,EAAKhE,QAE3BijB,EAAqBnY,EAAQyV,KAAKvgB,SAGtC,KACEqjB,EAA4BvY,EAAQyV,KAAKvgB,UAI/C0jB,mBAAqB5Y,GACnByY,EAAAA,EAAMC,KAAyB,GAAGnM,0BAAiCvM,GAAS2Y,KAC1E,EAAEzf,WACIA,EAAKhE,OACPojB,EAAsBpf,EAAKhE,QAE3BijB,EAAqBnY,EAAQwK,MAAMtV,SAGvC,KACEqjB,EAA4BvY,EAAQwK,MAAMtV,UAIhD2jB,cAAgB7Y,GACdyY,EAAAA,EAAMC,KAAW,GAAGnM,uBAA8BvM,EAAS,CAAC8Y,aAAc,SAASH,KACjF,EAAEzf,WACAqD,IAASrD,GAAO8G,EAAQnK,MAAQ,GAAG8C,KAAKqI,SAAS+X,OAAO,aACxDT,EAAsB,IAExB,KACEC,EAA4B,KAIlCS,eAAiBhZ,GACfyY,EAAAA,EAAMC,KAAK,GAAGnM,uBAA8BvM,GAAS2Y,KACnD,IACEP,EAAAA,EAAWC,IAAI,CACb1pB,GAAI,uBACJlB,KAAM,UACNuI,MAAOgK,EAAQ7M,OAAO+B,SAE1B,IACEkjB,EAAAA,EAAWC,IAAI,CACb1pB,GAAI,8BACJlB,KAAM,QACNuI,MAAOgK,EAAQ7M,OAAO+B,UAI9B5K,UAAY0V,GACVyY,EAAAA,EAAMC,KAAK,GAAGnM,2BAAkCvM,GAAS2Y,KACvD,OAGA,QAKJM,eAAgBA,CAAC9M,EAAiC+M,IAChDT,EAAAA,EACGnI,IAA8B,GAAG/D,iBAAuBJ,cAAkB,CAAC+M,gBAC3EP,KAAwBQ,GAAQA,EAAIjgB,MAEzCkgB,qBAAuBjN,GACrBsM,EAAAA,EAAMnI,IAA2B,GAAG/D,iBAAuBJ,cAAiBwM,KACzEQ,GAAQA,EAAIjgB,KACb,IAAM,MAGVmgB,kBAAoBlN,GAClBsM,EAAAA,EAAMnI,IAAwB,GAAG/D,iBAAuBJ,WAAcwM,KACnEQ,GAAQA,EAAIjgB,KACb,IAAM,MAGVogB,qBAAuBnN,GACrBsM,EAAAA,EAAMnI,IAA2B,GAAG/D,iBAAuBJ,cAAiBwM,KACzEQ,GAAQA,EAAIjgB,KACb,IAAM,MAGVqgB,gCAAiCA,CAACpN,EAAiCqN,IACjEf,EAAAA,EACGnI,IAAI,GAAGvR,EAAAA,EAAYwN,uBAAuBJ,cAAiBqN,EAAQ5M,KAAK,cACxE+L,KACEQ,GACC,GAAG9pB,OAAO4H,SAASwiB,aAAapqB,OAAO4H,SAASyiB,OAC9C3a,EAAAA,EAAYwN,uBACEJ,cAAiBqN,EAAQ5M,KAAK,mBAAmBuM,EAAIjgB,QAG7EygB,aAAe3Z,GACbyY,EAAAA,EAAMC,KAAK,GAAGnM,qBAA4BvM,GAAS2Y,KACjD,IACEP,EAAAA,EAAWC,IAAI,CACb1pB,GAAI,qBACJlB,KAAM,UACNuI,MAAOgK,EAAQ7M,OAAO+B,SAE1B,IACEkjB,EAAAA,EAAWC,IAAI,CACb1pB,GAAI,4BACJlB,KAAM,QACNuI,MAAOgK,EAAQ7M,OAAO+B,UAI9B3K,WAAayV,GACXyY,EAAAA,EAAMC,KAAK,GAAGnM,2BAAkCvM,GAAS2Y,KACvD,OAGA,QAKJzlB,cAAe0mB,UACb,GAAI5Z,EAAQ7M,OAAO+B,OAAS,EAC1B,OAAOujB,EAAAA,EAAMC,KAAK,GAAGnM,sBAA6BvM,GAAS2Y,KACzD,OAGA,SAQNrlB,aAAcsmB,UACZ,GAAI5Z,EAAQ7M,OAAO+B,OAAS,EAC1B,OAAOujB,EAAAA,EAAMC,KAAK,GAAGnM,qBAA4BvM,GAAS2Y,KACxD,OAGA,SAQN5tB,kBAAoBiV,GAClByY,EAAAA,EAAMoB,MAAM,GAAGtN,gCAAuCvM,GAAS2Y,KAC7D,OAGA,QAKJ1tB,YAAc+U,GACZyY,EAAAA,EAAMoB,MAAM,GAAGtN,yBAAgCvM,GAAS2Y,KACtD,OAGA,QAKJ3tB,cAAgBgV,GACdyY,EAAAA,EAAMoB,MAAM,GAAGtN,2BAAkCvM,GAAS2Y,KACxD,OAGA,QAKJmB,gBAAiBA,CAAC3N,EAAiCnM,IACjDyY,EAAAA,EAAMoB,MAAM,GAAGtN,iBAAuBJ,aAAiBnM,GAAS2Y,KAC9D,OAGA,QAKJoB,QAAU/Z,GACRyY,EAAAA,EAAMoB,MAAM,GAAGtN,qBAA4BvM,GAAS2Y,KAClD,IAAM5pB,EAAAA,EAAQirB,2BACd,QAKJtvB,YAAcsV,GACZyY,EAAAA,EAAMoB,MAAM,GAAGtN,yBAAgCvM,GAAS2Y,KACtD,OAGA,Q,iFCnQN,MAMA,EANsBvB,KACpBhsB,EAAAA,EAAAA,KAAC4rB,EAAAA,EAAe,CAACrjB,SAAS,YAAW9H,UACnCT,EAAAA,EAAAA,KAACisB,EAAAA,EAAQ,CAACC,KAAK,c,gDCDnB,MAEA,EAF8BvgB,EAAElL,eAA0BT,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,QAAOC,SAAEA,G,mECElF,MAQA,EARkDmrB,EAAEnrB,WAAU8H,eAC5D,MAAMpH,EAAUC,IAAW,oBAAqB,CAC9C,CAAC,sBAAsBmH,KAAyB,MAAZA,IAGtC,OAAOvI,EAAAA,EAAAA,KAAA,OAAKQ,UAAWW,EAAQV,SAAEA,I,oECDnC,MAoBA,EApB4BiI,EAAED,QAAOkI,WAAU,EAAOnQ,YAAWoQ,YAAY,MAC3E,MAAMqU,GAAW4J,EAAAA,EAAAA,GAAQpmB,EAAOmI,IAC1B,KAAC3K,IAAQC,EAAAA,EAAAA,MAEf,IAAI4oB,EAAiB7oB,EAAKO,GAAEuoB,EAAAA,EAAAA,GAAqB9J,EAAS+J,OAQ1D,OANIre,IACFme,EAAiB7oB,EAAKO,EAAE,aAAc,CACpCyoB,SAAUH,MAKZvuB,EAAAA,EAAAA,MAAA,QAAMC,UAAWA,EAAUC,SAAA,CACxByuB,OAAOC,MAAMlK,EAASxc,OAAS,IAAMxC,EAAKqe,OAAOW,EAASxc,QAC3DzI,EAAAA,EAAAA,KAAA,MAAIQ,UAAU,OAAMC,SAAEquB,O,sHCK5B,MA+IA,EA/IoC7C,EAAEC,WACpC,MAAM,KAACjmB,IAAQC,EAAAA,EAAAA,MACTkpB,GAAU5rB,EAAAA,EAAAA,QAAmB,MAC7B6rB,GAA8B7rB,EAAAA,EAAAA,QAAwC,OACrE8rB,EAAcC,IAAmBrkB,EAAAA,EAAAA,eAA4C7F,IAC7EmqB,EAAcC,IAAmBvkB,EAAAA,EAAAA,WAAkB,GAEpDwkB,GAAWC,EAAAA,EAAAA,MAEXC,EAAuB,UAAT1D,EAEpB,OACElsB,EAAAA,EAAAA,KAAA,OAAKQ,UAAU,6BAA4BC,UACzCT,EAAAA,EAAAA,KAAC6vB,EAAAA,GAAK,CAACC,QAAQ,QAAOrvB,UACpBF,EAAAA,EAAAA,MAACwvB,EAAAA,GAAI,CACHC,SAAWC,IACTA,EAAWzrB,MAAM+W,iBAEjBkU,GAAgB,GAEhB,MAAMS,EAAWD,EAAWC,SAE5B,GAAyB,MAArBA,EAASC,UAA0C,KAAtBD,EAASC,SAGxC,OAFAV,GAAgB,QAChBF,EAAgB,CAAChsB,GAAI,8BAIvB,GAAyB,MAArB2sB,EAASE,UAA0C,KAAtBF,EAASE,SAGxC,OAFAX,GAAgB,QAChBF,EAAgB,CAAChsB,GAAI,8BAIvB,GAAIqsB,EAAa,CACf,MAAMS,EAAcH,EAEpBI,EAAAA,EAAYC,aAAa,CACvBJ,SAAUE,EAAYF,SACtBC,SAAUC,EAAYD,WAErB7C,KAAK,KACJkC,GAAgB,GAChBC,EAAS,YAAa,CAACc,SAAS,MAEjCC,MAAOC,IACNjB,GAAgB,GAChBF,EAAgBmB,EAAMzN,SACtByM,EAAS,SAAU,CAACc,SAAS,KAEnC,KAAO,CACL,MAAMG,EAAST,EAEf,GAA2C,MAAvCb,EAA4BxrB,QAG9B,OAFA4rB,GAAgB,QAChBF,EAAgB,CAAChsB,GAAI,oCAIvB,MAAMqtB,EAAqBvB,EAA4BxrB,QACvD,GAA0B,MAAtB+sB,EAGF,OAFAnB,GAAgB,QAChBF,EAAgB,CAAChsB,GAAI,oCAIvB+sB,EAAAA,EAAYO,SAAS,CACnBV,SAAUQ,EAAOR,SACjBC,SAAUO,EAAOP,SACjBU,OAAQF,EACR/O,MAAOkP,EAAAA,EAAYC,gBAClBzD,KACD,KACEkC,GAAgB,GAChBC,EAAS,YAAa,CAACc,SAAS,KAEjCE,IACCjB,GAAgB,GAChBF,EAAgBmB,EAAMzN,UAG5B,GAEF9Y,IAAKilB,EAAQ3uB,SAAA,EAEbT,EAAAA,EAAAA,KAACixB,EAAAA,GAAW,CAAAxwB,UACVT,EAAAA,EAAAA,KAAA,MAAAS,SAAKmvB,EAAc3pB,EAAKO,EAAE,cAAgBP,EAAKO,EAAE,+BAEnDjG,EAAAA,EAAAA,MAAC2wB,EAAAA,GAAY,CAAAzwB,SAAA,EACXT,EAAAA,EAAAA,KAAA,KAAGQ,UAAU,aAAYC,SACtBmvB,EAAc3pB,EAAKO,EAAE,oBAAsBP,EAAKO,EAAE,kCAEpC,MAAhB8oB,GACCtvB,EAAAA,EAAAA,KAACmxB,EAAAA,GAAO,CAAA1wB,UACNT,EAAAA,EAAAA,KAACoxB,EAAAA,GAAS,CAAC5iB,UAAWghB,EAAa/uB,SACR,iBAAjB6uB,EAA4BA,EAAerpB,EAAKO,EAAE8oB,OAG5D,MACJtvB,EAAAA,EAAAA,KAACmxB,EAAAA,GAAO,CAAA1wB,UACNT,EAAAA,EAAAA,KAACqxB,EAAAA,GAAO,CAACjhB,YAAanK,EAAKO,EAAE,iBAAkBjD,GAAG,WAAW+tB,aAAa,gBAE5EtxB,EAAAA,EAAAA,KAACmxB,EAAAA,GAAO,CAAA1wB,UACNT,EAAAA,EAAAA,KAACqxB,EAAAA,GAAO,CACNjhB,YAAanK,EAAKO,EAAE,iBACpBjD,GAAG,WACHlB,KAAK,WACLivB,aAAc1B,EAAc,mBAAqB,sBAItDA,EAAc,MACb5vB,EAAAA,EAAAA,KAACkxB,EAAAA,GAAY,CAACK,WAAS,EAAA9wB,UACrBT,EAAAA,EAAAA,KAACwxB,EAAAA,EAA4B,CAC3BC,iBAAmBC,IACjBrC,EAA4BxrB,QAAU6tB,QAK9C1xB,EAAAA,EAAAA,KAAC2xB,EAAAA,GAAW,CAACJ,WAAS,EAAA9wB,UACpBF,EAAAA,EAAAA,MAAC4wB,EAAAA,GAAO,CAACS,QAAQ,MAAKnxB,SAAA,EACpBT,EAAAA,EAAAA,KAACyqB,EAAAA,GAAM,CACL9I,SAAS,WACTpgB,QAASA,KACgB,MAAnB6tB,EAAQvrB,SACVurB,EAAQvrB,QAAQguB,aAElBpxB,SAEDwF,EAAKO,EAAE,uBAEVxG,EAAAA,EAAAA,KAACyqB,EAAAA,GAAM,CAACjc,UAAWghB,EAAcntB,KAAK,SAAQ5B,SAC3CmvB,EAAc3pB,EAAKO,EAAE,eAAiBP,EAAKO,EAAE,qC,oECrK9D,MAcA,EAduB,CACrB+Y,KAAM,CACJ,EAAG,gBACH,EAAG,SACH,EAAG,QAELqB,QAAS,CACP,EAAG,gBACH,EAAG,MACH,EAAG,SACH,EAAG,S,cCOP,MAwFA,EAxF8CgB,EAC5Cre,KACAse,QACAC,WACAC,eACAC,aAAY,EACZC,gBAAe,EACfpB,wBACAxQ,eAEA,MAAM,KAACpK,IAAQC,EAAAA,EAAAA,OACR4rB,EAAeC,IAAoB7mB,EAAAA,EAAAA,UAAiB2W,GAErDmQ,EAAiBA,KACrB,IAAIC,EAAWH,EAWf,OATIG,GAAYnQ,EACdmQ,EAAW,EAEXA,GAAY,EAGdF,EAAiBE,GACjB5hB,EAAS9M,EAAI0uB,GAENA,GAOT,IAAIC,EACJ,GAL6B,MAAzBrR,IACFA,EAAsBhd,QAAUmuB,GAI9BhQ,EAAW,CAGb,IAAImQ,EACJ,OAHuBC,EAAerQ,GAGf+P,IACrB,IAAK,gBACHK,EAAuBlsB,EAAKO,EAAE,0BAC9B,MACF,IAAK,OACH2rB,EAAuBlsB,EAAKO,EAAE,iBAC9B,MACF,IAAK,MACH2rB,EAAuBlsB,EAAKO,EAAE,gBAC9B,MACF,QACE2rB,EAAuBlsB,EAAKO,EAAE,mBAIlC0rB,GAAelyB,EAAAA,EAAAA,KAAA,QAAMQ,UAAU,wBAAuBC,SAAE0xB,GAC1D,CAEA,MAAME,GACJryB,EAAAA,EAAAA,KAAA,OAAKQ,UAAW,sCAAsCshB,2BAAkCgQ,MAGpFroB,GAASnH,EAAAA,EAAAA,IAAI,CACjBgI,OAAQ,CACN5H,QAAS,OACT6H,wBAAyB,eAE3B9H,cAAe,CACbC,QAAS,YAIb,OAAOuf,GACL1hB,EAAAA,EAAAA,MAAA,OAAKC,UAAW,2BAA2BiJ,IAAShJ,SAAA,CACjD4xB,EACAH,MAGH3xB,EAAAA,EAAAA,MAAA,UACEC,UAAW,2BAA2BiJ,IACtCpH,KAAK,SACLd,QAASA,KACPywB,KACAvxB,SAAA,CAED4xB,EACAH,K","sources":["client/src/javascript/constants/TorrentContextMenuActions.ts","client/src/javascript/components/general/TorrentStatusIcon.tsx","client/src/javascript/components/general/ProgressBar.tsx","client/src/javascript/components/torrent-list/Action.tsx","client/src/javascript/constants/SortDirections.ts","client/src/javascript/components/general/form-elements/Dropdown.tsx","client/src/javascript/components/torrent-list/SortDropdown.tsx","client/src/javascript/components/torrent-list/ActionBar.tsx","client/src/javascript/components/layout/ApplicationContent.tsx","client/src/javascript/components/layout/ApplicationPanel.tsx","client/src/javascript/components/sidebar/DiskUsage.tsx","client/src/javascript/components/sidebar/FeedsButton.tsx","client/src/javascript/components/sidebar/SidebarFilter.tsx","client/src/javascript/components/sidebar/LocationFilters.tsx","client/src/javascript/components/sidebar/NotificationsButton.tsx","client/src/javascript/components/sidebar/SearchBox.tsx","client/src/javascript/components/sidebar/SettingsButton.tsx","client/src/javascript/components/sidebar/SidebarActions.tsx","client/src/javascript/components/sidebar/SpeedLimitDropdown.tsx","client/src/javascript/components/sidebar/Expando.tsx","client/src/javascript/components/sidebar/StatusFilters.tsx","client/src/javascript/components/sidebar/TagFilters.tsx","client/src/javascript/components/sidebar/ThemeSwitchButton.tsx","client/src/javascript/components/sidebar/TrackerFilters.tsx","client/src/javascript/components/sidebar/TransferRateDetails.tsx","client/src/javascript/components/sidebar/TransferRateGraph.tsx","client/src/javascript/components/sidebar/TransferData.tsx","client/src/javascript/components/sidebar/Sidebar.tsx","client/src/javascript/components/general/ContextMenuMountPoint.tsx","client/src/javascript/components/general/ListViewport.tsx","client/src/javascript/components/torrent-list/TableHeading.tsx","client/src/javascript/components/torrent-list/TorrentListDropzone.tsx","client/src/javascript/components/torrent-list/TorrentListContextMenu.tsx","client/src/javascript/components/torrent-list/TorrentListCell.tsx","client/src/javascript/components/torrent-list/TorrentListRowCondensed.tsx","client/src/javascript/components/torrent-list/TorrentListRowExpanded.tsx","client/src/javascript/components/torrent-list/TorrentListRow.tsx","client/src/javascript/components/torrent-list/TorrentList.tsx","client/src/javascript/util/loadOverlayScrollbars.ts","client/src/javascript/routes/Overview.tsx","client/src/javascript/routes/Login.tsx","client/src/javascript/util/torrentStatus.ts","client/src/javascript/constants/TorrentListColumns.ts","client/src/javascript/components/general/Duration.tsx","client/src/javascript/actions/TorrentActions.ts","client/src/javascript/routes/Register.tsx","client/src/javascript/components/general/Badge.tsx","client/src/javascript/components/layout/ApplicationView.tsx","client/src/javascript/components/general/Size.tsx","client/src/javascript/components/auth/AuthForm.tsx","client/src/javascript/constants/PriorityLevels.ts","client/src/javascript/components/general/PriorityMeter.tsx"],"sourcesContent":["const TorrentContextMenuActions = {\n start: 'torrents.list.context.start',\n stop: 'torrents.list.context.stop',\n remove: 'torrents.list.context.remove',\n checkHash: 'torrents.list.context.check.hash',\n reannounce: 'torrents.list.context.reannounce',\n setTaxonomy: 'torrents.list.context.set.tags',\n move: 'torrents.list.context.move',\n setTrackers: 'torrents.list.context.set.trackers',\n torrentDetails: 'torrents.list.context.details',\n downloadContents: 'torrents.list.context.download.contents',\n downloadMetainfo: 'torrents.list.context.download.metainfo',\n generateMagnet: 'torrents.list.context.generate.magnet',\n setInitialSeeding: 'torrents.list.context.initial.seeding',\n setSequential: 'torrents.list.context.sequential',\n setPriority: 'torrents.list.context.priority',\n} as const;\n\nexport default TorrentContextMenuActions;\nexport type TorrentContextMenuAction = keyof typeof TorrentContextMenuActions;\n","import {FC, memo} from 'react';\n\nimport {Error, Spinner, Start, Stop} from '@client/ui/icons';\n\nimport type {TorrentStatus} from '@shared/constants/torrentStatusMap';\n\ninterface TorrentStatusIconProps {\n status: TorrentStatus;\n}\n\nconst TorrentStatusIcon: FC<TorrentStatusIconProps> = memo(({status}: TorrentStatusIconProps) => {\n switch (status) {\n case 'error':\n return <Error />;\n case 'checking':\n return <Spinner />;\n case 'downloading':\n return <Start />;\n case 'seeding':\n return <Start />;\n default:\n return <Stop />;\n }\n});\n\nexport default TorrentStatusIcon;\n","import {FC} from 'react';\nimport {observer} from 'mobx-react-lite';\n\nimport type {TorrentStatus} from '@shared/constants/torrentStatusMap';\n\nimport TorrentStatusIcon from './TorrentStatusIcon';\n\ninterface ProgressBarProps {\n percent: number;\n status?: TorrentStatus;\n}\n\nconst ProgressBar: FC<ProgressBarProps> = observer(({percent, status}: ProgressBarProps) => (\n <div className=\"progress-bar\">\n <div className=\"progress-bar__icon\">{status && <TorrentStatusIcon status={status} />}</div>\n <div className=\"progress-bar__fill__wrapper\">\n <div className=\"progress-bar__fill\" style={{width: `${percent}%`}} />\n </div>\n </div>\n));\n\nexport default ProgressBar;\n","import classnames from 'classnames';\nimport {FC, ReactNode} from 'react';\n\nimport Tooltip from '../general/Tooltip';\n\ninterface ActionProps {\n clickHandler: () => void;\n icon: ReactNode;\n label: ReactNode;\n slug: string;\n noTip?: boolean;\n}\n\nconst Action: FC<ActionProps> = ({clickHandler, icon, label, slug, noTip = false}: ActionProps) => {\n const classes = classnames('action tooltip__wrapper', {\n [`action--${slug}`]: slug != null,\n });\n\n return (\n <Tooltip content={label} onClick={clickHandler} position=\"bottom\" wrapperClassName={classes} suppress={noTip}>\n {icon}\n <span className=\"action__label\">{label}</span>\n </Tooltip>\n );\n};\n\nexport default Action;\n","// Overwrite initial sort direction (ascending)\n\nconst SortDirections: Record<string, 'asc' | 'desc'> = {\n dateAdded: 'desc',\n dateFinished: 'desc',\n dateActive: 'desc',\n downRate: 'desc',\n downTotal: 'desc',\n upRate: 'desc',\n upTotal: 'desc',\n};\n\nexport default SortDirections;\n","import classnames from 'classnames';\nimport {CSSTransition, TransitionGroup} from 'react-transition-group';\nimport {EventHandler, FC, MutableRefObject, ReactNode, SyntheticEvent, useCallback, useRef} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport uniqueId from 'lodash/uniqueId';\nimport {useKeyPressEvent} from 'react-use';\n\nimport {css} from '@client/styled-system/css';\nimport UIStore from '@client/stores/UIStore';\n\ninterface DropdownButtonProps {\n className?: string;\n label: ReactNode;\n isFocusHandled: boolean;\n onClick: EventHandler<SyntheticEvent>;\n}\n\nconst DropdownButton: FC<DropdownButtonProps> = ({className, label, isFocusHandled, onClick}: DropdownButtonProps) =>\n isFocusHandled ? (\n <div role=\"none\" className={className} onClick={onClick}>\n {label}\n </div>\n ) : (\n <button\n type=\"button\"\n className={classnames(\n className,\n css({\n width: '100%',\n height: '100%',\n textAlign: 'left',\n _focusVisible: {\n outline: 'dashed',\n },\n }),\n )}\n onClick={onClick}\n >\n {label}\n </button>\n );\n\nexport interface DropdownItem<T extends string = string> {\n className?: string;\n displayName: ReactNode;\n selectable?: boolean;\n selected?: boolean;\n property?: T;\n value?: number | null;\n}\n\ntype DropdownItems<T extends string = string> = Array<DropdownItem<T>>;\n\ninterface DropdownProps<T extends string = string> {\n header: ReactNode;\n trigger?: ReactNode;\n dropdownButtonClass?: string;\n dropdownClickRef?: MutableRefObject<() => void>;\n menuItems: Array<DropdownItems<T>>;\n handleItemSelect: (item: DropdownItem<T>) => void;\n onOpen?: () => void;\n\n dropdownWrapperClass?: string;\n baseClassName?: string;\n direction?: 'down' | 'up';\n width?: 'small' | 'medium' | 'large';\n matchButtonWidth?: boolean;\n noWrap?: boolean;\n\n isFocusHandled?: boolean;\n}\n\nconst Dropdown = observer(\n <T extends string = string>({\n baseClassName = 'dropdown',\n dropdownWrapperClass = 'dropdown',\n dropdownButtonClass = 'dropdown__trigger',\n dropdownClickRef,\n direction = 'down',\n header,\n matchButtonWidth = false,\n menuItems,\n noWrap = false,\n trigger,\n width,\n isFocusHandled = false,\n handleItemSelect,\n onOpen,\n }: DropdownProps<T>) => {\n const id = useRef<string>(uniqueId('dropdown_'));\n const isOpen = UIStore.activeDropdownMenu === id.current;\n const dropdownWrapperClassName = classnames(dropdownWrapperClass, `${baseClassName}--direction-${direction}`, {\n [`${baseClassName}--match-button-width`]: matchButtonWidth,\n [`${baseClassName}--width-${width}`]: width != null,\n [`${baseClassName}--no-wrap`]: noWrap,\n 'is-expanded': isOpen,\n });\n\n const closeDropdown = useCallback(() => {\n window.removeEventListener('click', closeDropdown);\n\n UIStore.setActiveDropdownMenu(null);\n }, []);\n\n useKeyPressEvent('Escape', () => closeDropdown());\n\n const openDropdown = useCallback(() => {\n window.addEventListener('click', closeDropdown);\n\n if (onOpen) {\n onOpen();\n }\n\n UIStore.setActiveDropdownMenu(id.current);\n }, [closeDropdown, onOpen]);\n\n const handleDropdownClick = (event?: SyntheticEvent): void => {\n event?.stopPropagation();\n\n if (isOpen) {\n closeDropdown();\n } else {\n openDropdown();\n }\n };\n\n if (dropdownClickRef) {\n dropdownClickRef.current = handleDropdownClick;\n }\n\n let contentElement: ReactNode;\n if (isOpen) {\n const headerElement = (\n <div className=\"dropdown__header\" key=\"dropdown-header\">\n <DropdownButton\n className={dropdownButtonClass}\n label={header}\n isFocusHandled={isFocusHandled ?? false}\n onClick={handleDropdownClick}\n />\n </div>\n );\n\n const listElement = (\n <ul className=\"dropdown__items\" key=\"dropdown-items\">\n {menuItems.map((items, index) => (\n <div className=\"dropdown__list\" key={index}>\n {items.map((item, itemIndex) => {\n const classes = classnames('dropdown__item menu__item', item.className, {\n 'is-selectable': item.selectable !== false,\n 'is-selected': item.selected,\n });\n\n return (\n <li className={classes} key={itemIndex}>\n <button\n type=\"button\"\n disabled={item.selectable === false}\n onClick={\n item.selectable === false\n ? undefined\n : () => {\n closeDropdown();\n handleItemSelect(item);\n }\n }\n >\n {item.displayName}\n </button>\n </li>\n );\n })}\n </div>\n ))}\n </ul>\n );\n\n contentElement = (\n <CSSTransition classNames=\"menu\" timeout={{enter: 250, exit: 250}}>\n <div className=\"dropdown__content menu\">\n {direction === 'up' ? [listElement, headerElement] : [headerElement, listElement]}\n </div>\n </CSSTransition>\n );\n }\n\n return (\n <div className={dropdownWrapperClassName}>\n <DropdownButton\n className={dropdownButtonClass}\n label={trigger ?? header}\n isFocusHandled={isFocusHandled ?? false}\n onClick={handleDropdownClick}\n />\n <TransitionGroup>{contentElement}</TransitionGroup>\n </div>\n );\n },\n);\n\nexport default Dropdown;\n","import {FC} from 'react';\nimport {Trans, useLingui} from '@lingui/react';\n\nimport SortDirections from '@client/constants/SortDirections';\n\nimport type {FloodSettings} from '@shared/types/FloodSettings';\n\nimport Dropdown from '../general/form-elements/Dropdown';\nimport TorrentListColumns from '../../constants/TorrentListColumns';\n\nimport type {TorrentListColumn} from '../../constants/TorrentListColumns';\n\nconst SORT_PROPERTIES = [\n 'name',\n 'eta',\n 'downRate',\n 'upRate',\n 'ratio',\n 'percentComplete',\n 'downTotal',\n 'upTotal',\n 'sizeBytes',\n 'dateAdded',\n 'dateFinished',\n 'dateActive',\n] as const;\n\ninterface SortDropdownProps {\n selectedProperty: TorrentListColumn;\n direction: 'asc' | 'desc';\n onSortChange: (sortBy: FloodSettings['sortTorrents']) => void;\n}\n\nconst SortDropdown: FC<SortDropdownProps> = (props: SortDropdownProps) => {\n const {direction, selectedProperty, onSortChange} = props;\n const {i18n} = useLingui();\n\n if (selectedProperty == null) {\n return null;\n }\n\n const header = (\n <div className=\"dropdown__button\">\n <span className=\"dropdown__label\">\n <Trans id=\"torrents.sort.title\" />\n </span>\n <span className=\"dropdown__value\">\n <Trans id={TorrentListColumns[selectedProperty]} />\n </span>\n </div>\n );\n\n const menuItems = [\n SORT_PROPERTIES.map((sortProp) => {\n const isSelected = sortProp === selectedProperty;\n const directionIndicator = isSelected ? (\n <span className={`sort-dropdown__indicator sort-dropdown__indicator--${direction}`} />\n ) : null;\n\n return {\n displayName: (\n <div className=\"sort-dropdown__item\">\n {i18n._(TorrentListColumns[sortProp])}\n {directionIndicator}\n </div>\n ),\n selected: isSelected,\n property: sortProp,\n };\n }),\n ];\n\n return (\n <Dropdown\n handleItemSelect={(selection) => {\n const {property} = selection;\n\n if (property == null) {\n return;\n }\n\n let nextDirection: 'asc' | 'desc' = SortDirections[property] ?? 'asc';\n if (selectedProperty === property) {\n nextDirection = direction === 'asc' ? 'desc' : 'asc';\n }\n\n onSortChange({direction: nextDirection, property});\n }}\n header={header}\n menuItems={menuItems}\n />\n );\n};\n\nexport default SortDropdown;\n","import classnames from 'classnames';\nimport {FC} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLingui} from '@lingui/react';\n\nimport {Add, Menu, Remove, Start, Stop} from '@client/ui/icons';\nimport SettingActions from '@client/actions/SettingActions';\nimport SettingStore from '@client/stores/SettingStore';\nimport TorrentActions from '@client/actions/TorrentActions';\nimport TorrentStore from '@client/stores/TorrentStore';\nimport UIStore from '@client/stores/UIStore';\n\nimport Action from './Action';\nimport SortDropdown from './SortDropdown';\n\nconst ActionBar: FC = observer(() => {\n const {i18n} = useLingui();\n const {sortTorrents: sortBy, torrentListViewSize} = SettingStore.floodSettings;\n\n const classes = classnames('action-bar', {\n 'action-bar--is-condensed': torrentListViewSize === 'condensed',\n });\n\n return (\n <nav className={classes}>\n <div className=\"actions action-bar__item action-bar__item--sidebar-expand-collapse\">\n <Action\n label=\"actionbar.button.sidebar.expand.collapse\"\n slug=\"sidebar-expand-collapse\"\n icon={<Menu />}\n clickHandler={() => {\n const view = document.getElementsByClassName('application__view')[0];\n if (view != null) {\n view.classList.toggle('application__view--sidebar-alternative-state');\n }\n }}\n noTip\n />\n </div>\n <div className=\"actions action-bar__item action-bar__item--sort-torrents\">\n <SortDropdown\n direction={sortBy != null ? sortBy.direction : 'desc'}\n onSortChange={(newSortBy) => {\n SettingActions.saveSetting('sortTorrents', newSortBy);\n }}\n selectedProperty={sortBy != null ? sortBy.property : 'dateAdded'}\n />\n </div>\n <div className=\"actions action-bar__item action-bar__item--torrent-operations\">\n <div className=\"action-bar__group\">\n <Action\n label={i18n._('actionbar.button.start.torrent')}\n slug=\"start-torrent\"\n icon={<Start />}\n clickHandler={() =>\n TorrentActions.startTorrents({\n hashes: TorrentStore.selectedTorrents,\n })\n }\n />\n <Action\n label={i18n._('actionbar.button.stop.torrent')}\n slug=\"stop-torrent\"\n icon={<Stop />}\n clickHandler={() =>\n TorrentActions.stopTorrents({\n hashes: TorrentStore.selectedTorrents,\n })\n }\n />\n </div>\n <div className=\"action-bar__group action-bar__group--has-divider\">\n <Action\n label={i18n._('actionbar.button.add.torrent')}\n slug=\"add-torrent\"\n icon={<Add />}\n clickHandler={() => UIStore.setActiveModal({id: 'add-torrents'})}\n />\n <Action\n label={i18n._('actionbar.button.remove.torrent')}\n slug=\"remove-torrent\"\n icon={<Remove />}\n clickHandler={() =>\n UIStore.setActiveModal({\n id: 'remove-torrents',\n })\n }\n />\n </div>\n </div>\n </nav>\n );\n});\n\nexport default ActionBar;\n","import {FC, ReactNode} from 'react';\n\ninterface ApplicationContentProps {\n children: ReactNode;\n}\n\nconst ApplicationContent: FC<ApplicationContentProps> = ({children}: ApplicationContentProps) => (\n <div className=\"application__content\">{children}</div>\n);\n\nexport default ApplicationContent;\n","import classnames from 'classnames';\nimport {FC, ReactNode} from 'react';\n\ninterface ApplicationContentProps {\n children: ReactNode;\n baseClassName?: string;\n className: string;\n modifier: string;\n}\n\nconst ApplicationContent: FC<ApplicationContentProps> = ({\n children,\n baseClassName = 'application__panel',\n className,\n modifier,\n}: ApplicationContentProps) => {\n const classes = classnames(baseClassName, {\n [`${baseClassName}--${modifier}`]: baseClassName,\n [className]: className,\n });\n\n return <div className={classes}>{children}</div>;\n};\n\nexport default ApplicationContent;\n","import {FC, ReactNode, ReactNodeArray} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLingui} from '@lingui/react';\nimport {css} from '@client/styled-system/css';\n\nimport * as lodash from 'lodash';\n\nimport type {Disk} from '@shared/types/DiskUsage';\n\nimport DiskUsageStore from '../../stores/DiskUsageStore';\nimport Size from '../general/Size';\nimport Tooltip from '../general/Tooltip';\nimport ProgressBar from '../general/ProgressBar';\nimport SettingStore from '../../stores/SettingStore';\n\ninterface DiskUsageTooltipItemProps {\n label: ReactNode;\n value: number;\n}\n\nconst DiskUsageTooltipItem: FC<DiskUsageTooltipItemProps> = ({label, value}: DiskUsageTooltipItemProps) => (\n <li aria-label=\"label\" className=\"diskusage__details-list__item\" role=\"cell\">\n <span className=\"diskusage__details-list__label\">{label}</span>\n <Size className=\"diskuage__size-used\" value={value} />\n </li>\n);\n\nconst DiskUsage: FC = observer(() => {\n const {i18n} = useLingui();\n\n const {disks} = DiskUsageStore;\n const {mountPoints} = SettingStore.floodSettings;\n\n if (disks == null || mountPoints == null) {\n return null;\n }\n\n const diskMap = disks.reduce(\n (disksByTarget: Record<string, Disk>, disk: Disk) => ({\n ...disksByTarget,\n [disk.target]: disk,\n }),\n {},\n );\n\n const diskNodes: ReactNodeArray = mountPoints\n .filter((target) => target in diskMap)\n .map((target) => diskMap[target])\n .map((d) => (\n <li key={d.target} className=\"sidebar-filter__item sidebar__diskusage\" role=\"row\">\n <Tooltip\n content={\n <ul className=\"diskusage__details-list\" role=\"tooltip\">\n <DiskUsageTooltipItem value={d.used} label={i18n._('status.diskusage.used')} />\n <DiskUsageTooltipItem value={d.avail} label={i18n._('status.diskusage.free')} />\n <DiskUsageTooltipItem value={d.size} label={i18n._('status.diskusage.total')} />\n </ul>\n }\n position=\"top\"\n styles={css({\n cursor: 'default',\n })}\n wrapperClassName=\"diskusage__item\"\n >\n <div className=\"diskusage__text-row\">\n {d.target}\n <span>{lodash.round((100 * d.used) / d.size, 2)}%</span>\n </div>\n <ProgressBar percent={lodash.round((100 * d.used) / d.size, 2)} />\n </Tooltip>\n </li>\n ));\n\n if (diskNodes == null || diskNodes.length === 0) {\n return null;\n }\n\n const title = i18n._('status.diskusage.title');\n\n return (\n <ul aria-label={title} className=\"sidebar-filter sidebar__item\" role=\"table\">\n <li className=\"sidebar-filter__item sidebar-filter__item--heading\">{title}</li>\n {diskNodes}\n </ul>\n );\n});\n\nexport default DiskUsage;\n","import {FC, useRef} from 'react';\nimport {useLingui} from '@lingui/react';\n\nimport {Feed} from '@client/ui/icons';\nimport UIStore from '@client/stores/UIStore';\n\nimport Tooltip, {TooltipHandle} from '../general/Tooltip';\n\nconst FeedsButton: FC = () => {\n const {i18n} = useLingui();\n const tooltipRef = useRef<TooltipHandle>(null);\n\n return (\n <Tooltip\n content={i18n._('sidebar.button.feeds')}\n onClick={() => {\n if (tooltipRef.current != null) {\n tooltipRef.current.dismissTooltip();\n }\n\n UIStore.setActiveModal({id: 'feeds'});\n }}\n ref={tooltipRef}\n position=\"bottom\"\n wrapperClassName=\"sidebar__action sidebar__icon-button\n sidebar__icon-button--interactive tooltip__wrapper\"\n >\n <Feed />\n </Tooltip>\n );\n};\n\nexport default FeedsButton;\n","import classnames from 'classnames';\nimport {createRef, FC, ReactNode, KeyboardEvent, MouseEvent, RefObject, TouchEvent, useEffect, useState} from 'react';\nimport {useLingui} from '@lingui/react';\n\nimport {css} from '@client/styled-system/css';\nimport {Start} from '@client/ui/icons';\n\nimport Badge from '../general/Badge';\nimport Size from '../general/Size';\n\nconst focusStyle = css({\n _focus: {\n outline: 'none',\n WebkitTapHighlightColor: 'transparent',\n },\n});\n\nconst useRefTextOverflowed = (ref: RefObject<HTMLElement>) => {\n const [overflowed, setOverflowed] = useState(false);\n\n useEffect(() => {\n if (ref.current) {\n const {current} = ref;\n setOverflowed(current.scrollWidth > current.clientWidth);\n }\n }, [ref, ref?.current?.scrollWidth, ref?.current?.clientWidth]);\n\n return overflowed;\n};\n\ninterface SidebarFilterProps {\n children?: ReactNode[];\n name: string;\n icon?: ReactNode;\n isActive: boolean;\n slug: string;\n count: number;\n size?: number;\n handleClick: (slug: string, event: KeyboardEvent | MouseEvent | TouchEvent) => void;\n}\n\nconst SidebarFilter: FC<SidebarFilterProps> = ({\n children,\n name: _name,\n icon,\n isActive,\n slug,\n count,\n size,\n handleClick,\n}: SidebarFilterProps) => {\n const nameSpanRef = createRef<HTMLSpanElement>();\n const overflowed = useRefTextOverflowed(nameSpanRef);\n\n const {i18n} = useLingui();\n\n const [expanded, setExpanded] = useState(false);\n\n const classNames = classnames('sidebar-filter__item', {\n 'is-active': isActive,\n });\n const expanderClassNames = classnames('sidebar-filter__expander', {\n 'is-active': isActive,\n expanded: expanded,\n });\n\n let name = _name;\n if (name === '') {\n name = i18n._('filter.all');\n } else if (name === 'untagged') {\n if (count === 0) {\n return null;\n }\n name = i18n._('filter.untagged');\n }\n\n if (slug === 'checking' || slug === 'error') {\n if (count === 0) {\n return null;\n }\n }\n\n return (\n <li>\n <div className={children ? css({display: 'flex'}) : undefined}>\n {children && (\n <button\n className={`${expanderClassNames} ${focusStyle}`}\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n role=\"switch\"\n aria-checked={expanded}\n >\n <Start />\n </button>\n )}\n <button\n className={`${classNames} ${focusStyle}`}\n type=\"button\"\n onClick={(event) => handleClick(slug, event)}\n role=\"menuitem\"\n >\n {icon}\n <span className=\"name\" ref={nameSpanRef} title={overflowed ? name || '' : undefined}>\n {name}\n </span>\n <Badge>{count}</Badge>\n {size != null && <Size value={size} className=\"size\" />}\n </button>\n </div>\n {children && expanded && <ul className=\"sidebar-filter__nested\">{children}</ul>}\n </li>\n );\n};\n\nexport default SidebarFilter;\n","import {FC, KeyboardEvent, MouseEvent, ReactNode, TouchEvent} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLingui} from '@lingui/react';\nimport {LocationTreeNode} from '@shared/types/Taxonomy';\n\nimport SidebarFilter from './SidebarFilter';\nimport TorrentFilterStore from '../../stores/TorrentFilterStore';\n\nconst buildLocationFilterTree = (location: LocationTreeNode): ReactNode => {\n if (location.children.length === 1 && location.containedCount === location.children[0].containedCount) {\n const onlyChild = location.children[0];\n const separator = onlyChild.fullPath.includes('/') ? '/' : '\\\\';\n return buildLocationFilterTree({\n ...onlyChild,\n directoryName: location.directoryName + separator + onlyChild.directoryName,\n });\n }\n\n const children = location.children.map(buildLocationFilterTree);\n\n return (\n <SidebarFilter\n handleClick={(filter: string | '', event: KeyboardEvent | MouseEvent | TouchEvent) =>\n TorrentFilterStore.setLocationFilters(filter, event)\n }\n count={location.containedCount}\n key={location.fullPath}\n isActive={\n (location.fullPath === '' && !TorrentFilterStore.locationFilter.length) ||\n TorrentFilterStore.locationFilter.includes(location.fullPath)\n }\n name={location.directoryName}\n slug={location.fullPath}\n size={location.containedSize}\n >\n {(children.length && children) || undefined}\n </SidebarFilter>\n );\n};\n\nconst LocationFilters: FC = observer(() => {\n const {i18n} = useLingui();\n\n if (TorrentFilterStore.taxonomy.locationTree.containedCount === 0) {\n return null;\n }\n\n const filterElements = buildLocationFilterTree(TorrentFilterStore.taxonomy.locationTree);\n\n const title = i18n._('filter.location.title');\n\n return (\n <ul aria-label={title} className=\"sidebar-filter sidebar__item\" role=\"menu\">\n <li className=\"sidebar-filter__item sidebar-filter__item--heading\" role=\"none\">\n {title}\n </li>\n {filterElements}\n </ul>\n );\n});\n\nexport default LocationFilters;\n","import classnames from 'classnames';\nimport {FC, useEffect, useRef, useState} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLingui} from '@lingui/react';\n\nimport FloodActions from '@client/actions/FloodActions';\nimport {ChevronLeft, ChevronRight, LoadingIndicatorDots, Notification as NotificationIcon} from '@client/ui/icons';\nimport NotificationStore from '@client/stores/NotificationStore';\n\nimport type {Notification} from '@shared/types/Notification';\n\nimport Tooltip, {TooltipHandle} from '../general/Tooltip';\n\nconst NOTIFICATIONS_PER_PAGE = 10;\n\nconst fetchNotifications = (paginationStart: number) =>\n FloodActions.fetchNotifications({\n id: 'notification-tooltip',\n limit: NOTIFICATIONS_PER_PAGE,\n start: paginationStart,\n });\n\ninterface NotificationTopToolbarProps {\n paginationStart: number;\n notificationTotal: number;\n}\n\nconst NotificationTopToolbar: FC<NotificationTopToolbarProps> = ({\n paginationStart,\n notificationTotal,\n}: NotificationTopToolbarProps) => {\n const {i18n} = useLingui();\n\n if (notificationTotal > NOTIFICATIONS_PER_PAGE) {\n let countStart = paginationStart + 1;\n let countEnd = paginationStart + NOTIFICATIONS_PER_PAGE;\n\n if (countStart > notificationTotal) {\n countStart = notificationTotal;\n }\n\n if (countEnd > notificationTotal) {\n countEnd = notificationTotal;\n }\n\n return (\n <div className=\"toolbar toolbar--dark toolbar--top tooltip__toolbar tooltip__content--padding-surrogate\">\n <span className=\"toolbar__item toolbar__item--label\">\n {`${i18n._('notification.showing')} `}\n <strong>\n {countStart}\n {` ${i18n._('general.to')} `}\n {countEnd}\n </strong>\n {` ${i18n._('general.of')} `}\n <strong>{notificationTotal}</strong>\n </span>\n </div>\n );\n }\n\n return null;\n};\n\ninterface NotificationItemProps {\n notification: Notification;\n}\n\nconst NotificationItem: FC<NotificationItemProps> = ({notification}: NotificationItemProps) => {\n const {i18n} = useLingui();\n\n return (\n <li className=\"notifications__list__item\">\n <div className=\"notification__heading\">\n <span className=\"notification__category\">{i18n._(`${notification.id}.heading`)}</span>\n {' — '}\n <span className=\"notification__timestamp\">\n {i18n.date(new Date(notification.ts), {\n year: 'numeric',\n month: 'long',\n day: '2-digit',\n hour: 'numeric',\n minute: 'numeric',\n })}\n </span>\n </div>\n <div className=\"notification__message\">{i18n._(`${notification.id}.body`, notification.data)}</div>\n </li>\n );\n};\n\ninterface NotificationBottomToolbarProps {\n paginationStart: number;\n notificationTotal: number;\n onPrevClick: () => void;\n onNextClick: () => void;\n onClearClick: () => void;\n}\n\nconst NotificationBottomToolbar: FC<NotificationBottomToolbarProps> = ({\n paginationStart,\n notificationTotal,\n onPrevClick,\n onClearClick,\n onNextClick,\n}: NotificationBottomToolbarProps) => {\n const {i18n} = useLingui();\n\n if (notificationTotal > 0) {\n let olderTo = paginationStart + NOTIFICATIONS_PER_PAGE * 2;\n let newerFrom = paginationStart - NOTIFICATIONS_PER_PAGE;\n\n if (olderTo > notificationTotal) {\n olderTo = notificationTotal;\n }\n\n if (newerFrom < 0) {\n newerFrom = 0;\n }\n\n return (\n <ul\n className=\"notifications__toolbar toolbar toolbar--dark\n toolbar--bottom\"\n >\n <li\n className={classnames('toolbar__item toolbar__item--button', {\n 'is-disabled': paginationStart === 0,\n })}\n >\n <button className=\"tooltip__content--padding-surrogate\" type=\"button\" onClick={onPrevClick}>\n <ChevronLeft />\n {`${newerFrom + 1} - ${paginationStart}`}\n </button>\n </li>\n <li className=\"toolbar__item toolbar__item--button\">\n <button className=\"tooltip__content--padding-surrogate\" type=\"button\" onClick={onClearClick}>\n {i18n._('notification.clear.all')}\n </button>\n </li>\n <li\n className={classnames('toolbar__item toolbar__item--button', {\n 'is-disabled': paginationStart + NOTIFICATIONS_PER_PAGE >= notificationTotal,\n })}\n >\n <button className=\"tooltip__content--padding-surrogate\" type=\"button\" onClick={onNextClick}>\n {`${paginationStart + NOTIFICATIONS_PER_PAGE + 1} - ${olderTo}`}\n <ChevronRight />\n </button>\n </li>\n </ul>\n );\n }\n\n return null;\n};\n\nconst NotificationsButton: FC = observer(() => {\n const {i18n} = useLingui();\n\n const tooltipRef = useRef<TooltipHandle>(null);\n const notificationsListRef = useRef<HTMLUListElement>(null);\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [paginationStart, setPaginationStart] = useState<number>(0);\n const [prevHeight, setPrevHeight] = useState<number>(0);\n\n const {hasNotification, notifications, notificationCount} = NotificationStore;\n\n useEffect(() => {\n if (notificationCount.total > 0 && tooltipRef.current?.isOpen()) {\n setIsLoading(true);\n fetchNotifications(paginationStart).finally(() => setIsLoading(false));\n }\n }, [notificationCount, paginationStart]);\n\n return (\n <Tooltip\n contentClassName=\"tooltip__content tooltip__content--no-padding\"\n content={\n hasNotification ? (\n <div\n className={classnames('notifications', {\n 'notifications--is-loading': isLoading,\n })}\n >\n <NotificationTopToolbar paginationStart={paginationStart} notificationTotal={notificationCount.total} />\n <div className=\"notifications__loading-indicator\">\n <LoadingIndicatorDots />\n </div>\n <ul\n className=\"notifications__list tooltip__content--padding-surrogate\"\n ref={notificationsListRef}\n style={{minHeight: prevHeight}}\n >\n {notifications.map((notification, index) => (\n <NotificationItem key={index} notification={notification} />\n ))}\n </ul>\n <NotificationBottomToolbar\n paginationStart={paginationStart}\n notificationTotal={notificationCount.total}\n onPrevClick={() => {\n const newPaginationStart = paginationStart - NOTIFICATIONS_PER_PAGE;\n if (newPaginationStart >= 0) {\n setPrevHeight(notificationsListRef.current?.clientHeight || 0);\n setPaginationStart(newPaginationStart);\n }\n }}\n onClearClick={() => {\n if (tooltipRef.current != null) {\n tooltipRef.current.dismissTooltip();\n }\n\n FloodActions.clearNotifications();\n\n setPrevHeight(0);\n setPaginationStart(0);\n }}\n onNextClick={() => {\n const newPaginationStart = paginationStart + NOTIFICATIONS_PER_PAGE;\n if (notificationCount.total > newPaginationStart) {\n setPrevHeight(notificationsListRef.current?.clientHeight || 0);\n setPaginationStart(newPaginationStart);\n }\n }}\n />\n </div>\n ) : (\n <div className=\"notifications tooltip__content--padding-surrogate\" style={{textAlign: 'center'}}>\n {i18n._('notification.no.notification')}\n </div>\n )\n }\n interactive\n onOpen={() => fetchNotifications(paginationStart)}\n ref={tooltipRef}\n width={340}\n position=\"bottom\"\n wrapperClassName=\"sidebar__action sidebar__icon-button\n tooltip__wrapper\"\n >\n <NotificationIcon />\n {hasNotification ? <span className=\"notifications__badge\">{notificationCount.total}</span> : null}\n </Tooltip>\n );\n});\n\nexport default NotificationsButton;\n","import classnames from 'classnames';\nimport {FC, useEffect, useRef} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLingui} from '@lingui/react';\n\nimport {Close, Search} from '@client/ui/icons';\nimport TorrentFilterStore from '@client/stores/TorrentFilterStore';\n\nconst SearchBox: FC = observer(() => {\n const {i18n} = useLingui();\n const inputRef = useRef<HTMLInputElement>(null);\n\n const {searchFilter} = TorrentFilterStore;\n\n useEffect(() => {\n if (inputRef.current != null) {\n if (searchFilter !== inputRef.current.value) {\n inputRef.current.value = searchFilter;\n }\n }\n }, [inputRef, searchFilter]);\n\n const isSearchActive = searchFilter !== '';\n\n return (\n <div\n className={classnames({\n sidebar__item: true,\n search: true,\n 'is-in-use': isSearchActive,\n })}\n >\n {isSearchActive && (\n <button\n className=\"button search__reset-button\"\n onClick={() => {\n TorrentFilterStore.setSearchFilter('');\n if (inputRef.current != null) {\n inputRef.current.blur();\n }\n }}\n type=\"button\"\n >\n <Close />\n </button>\n )}\n <Search />\n <input\n className=\"textbox\"\n ref={inputRef}\n type=\"text\"\n placeholder={i18n._('sidebar.search.placeholder')}\n onChange={(event) => {\n TorrentFilterStore.setSearchFilter(event.target.value);\n }}\n />\n </div>\n );\n});\n\nexport default SearchBox;\n","import {FC, useRef} from 'react';\nimport {useLingui} from '@lingui/react';\n\nimport {Settings} from '@client/ui/icons';\nimport UIStore from '@client/stores/UIStore';\n\nimport Tooltip, {TooltipHandle} from '../general/Tooltip';\n\nconst SettingsButton: FC = () => {\n const {i18n} = useLingui();\n const tooltipRef = useRef<TooltipHandle>(null);\n\n return (\n <Tooltip\n content={i18n._('sidebar.button.settings')}\n onClick={() => {\n if (tooltipRef.current != null) {\n tooltipRef.current.dismissTooltip();\n }\n\n UIStore.setActiveModal({id: 'settings'});\n }}\n ref={tooltipRef}\n position=\"bottom\"\n wrapperClassName=\"sidebar__action sidebar__icon-button\n sidebar__icon-button--interactive tooltip__wrapper\"\n >\n <Settings />\n </Tooltip>\n );\n};\n\nexport default SettingsButton;\n","import {FC, ReactNode} from 'react';\n\ninterface SidebarActionsProps {\n children: ReactNode;\n}\n\nconst SidebarActions: FC<SidebarActionsProps> = ({children}: SidebarActionsProps) => (\n <div className=\"sidebar__actions\">{children}</div>\n);\n\nexport default SidebarActions;\n","import {FC, useRef} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport sortedIndex from 'lodash/sortedIndex';\nimport {Trans, useLingui} from '@lingui/react';\n\nimport type {I18n} from '@lingui/core';\n\nimport ClientActions from '@client/actions/ClientActions';\nimport {Limits} from '@client/ui/icons';\nimport SettingStore from '@client/stores/SettingStore';\n\nimport type {TransferDirection} from '@shared/types/TransferData';\n\nimport Dropdown from '../general/form-elements/Dropdown';\nimport Size from '../general/Size';\nimport Tooltip, {TooltipHandle} from '../general/Tooltip';\n\nimport type {DropdownItem} from '../general/form-elements/Dropdown';\n\nconst HumanReadableSpeed: FC<{bytes: number}> = ({bytes}: {bytes: number}) =>\n bytes === 0 ? <Trans id=\"speed.unlimited\" /> : <Size value={bytes} isSpeed precision={1} />;\n\nconst getSpeedList = ({\n i18n,\n direction,\n speedLimits,\n throttleGlobalDownSpeed,\n throttleGlobalUpSpeed,\n}: {\n i18n: I18n;\n direction: TransferDirection;\n speedLimits: {\n download: Array<number>;\n upload: Array<number>;\n };\n throttleGlobalDownSpeed: number;\n throttleGlobalUpSpeed: number;\n}): Array<DropdownItem<TransferDirection>> => {\n const heading = {\n className: `dropdown__label dropdown__label--${direction}`,\n ...(direction === 'download'\n ? {displayName: i18n._('sidebar.speedlimits.download')}\n : {displayName: i18n._('sidebar.speedlimits.upload')}),\n selectable: false,\n value: null,\n };\n\n const currentThrottle: Record<TransferDirection, number> = {\n download: throttleGlobalDownSpeed,\n upload: throttleGlobalUpSpeed,\n };\n\n const speeds: number[] = speedLimits[direction];\n\n let insertCurrentThrottle = true;\n const items: Array<DropdownItem<TransferDirection>> = speeds.map((bytes) => {\n let selected = false;\n\n // Check if the current throttle setting exists in the preset speeds list.\n // Determine if we need to add the current throttle setting to the menu.\n if (currentThrottle && currentThrottle[direction] === bytes) {\n selected = true;\n insertCurrentThrottle = false;\n }\n\n return {\n displayName: <HumanReadableSpeed bytes={bytes} />,\n property: direction,\n selected,\n selectable: true,\n value: bytes,\n };\n });\n\n // If the current throttle setting doesn't exist in the pre-set speeds list,\n // add it and show it as selected.\n if (insertCurrentThrottle && currentThrottle) {\n // Find the position to insert the current throttle setting so that it\n // remains sorted from lowest to highest.\n const insertionPoint = sortedIndex(speeds, currentThrottle[direction]);\n\n items.splice(insertionPoint, 0, {\n displayName: <HumanReadableSpeed bytes={currentThrottle[direction]} />,\n property: direction,\n selected: true,\n selectable: true,\n value: currentThrottle[direction],\n });\n }\n\n items.unshift(heading);\n\n return items;\n};\n\nconst SpeedLimitDropdown: FC = observer(() => {\n const {i18n} = useLingui();\n const tooltipRef = useRef<TooltipHandle>(null);\n const dropdownClickRef = useRef<() => void>(() => {\n // do nothing.\n });\n\n const label = i18n._('sidebar.button.speedlimits');\n const speedListOptions = {\n i18n,\n speedLimits: SettingStore.floodSettings.speedLimits,\n throttleGlobalDownSpeed: SettingStore.clientSettings?.throttleGlobalDownSpeed ?? 0,\n throttleGlobalUpSpeed: SettingStore.clientSettings?.throttleGlobalUpSpeed ?? 0,\n };\n\n return (\n <Dropdown\n dropdownClickRef={dropdownClickRef}\n dropdownWrapperClass=\"dropdown dropdown--speed-limits sidebar__action\"\n handleItemSelect={(item) => {\n if (item.value != null) {\n if (item.property === 'download') {\n ClientActions.saveSetting('throttleGlobalDownSpeed', item.value);\n } else if (item.property === 'upload') {\n ClientActions.saveSetting('throttleGlobalUpSpeed', item.value);\n }\n }\n }}\n header={\n <div\n className=\"sidebar__icon-button sidebar__icon-button--interactive\n sidebar__icon-button--limits\"\n title={label}\n >\n <Limits />\n {label}\n </div>\n }\n menuItems={[\n getSpeedList({direction: 'download', ...speedListOptions}),\n getSpeedList({direction: 'upload', ...speedListOptions}),\n ]}\n onOpen={() => {\n if (tooltipRef.current != null) {\n tooltipRef.current.dismissTooltip();\n }\n }}\n trigger={\n <Tooltip\n content={label}\n position=\"bottom\"\n ref={tooltipRef}\n wrapperClassName=\"sidebar__icon-button tooltip__wrapper\"\n onClick={() => dropdownClickRef.current?.()}\n >\n <Limits />\n </Tooltip>\n }\n isFocusHandled\n />\n );\n});\n\nexport default SpeedLimitDropdown;\n","import {FC, KeyboardEvent, MouseEvent, ReactNode, TouchEvent} from 'react';\n\nimport {css} from '@client/styled-system/css';\nimport {Chevron} from '@client/ui/icons';\n\ninterface ExpandoProps {\n children: ReactNode;\n className?: string;\n expanded: boolean;\n handleClick: (event: KeyboardEvent | MouseEvent | TouchEvent) => void;\n}\n\nconst Expando: FC<ExpandoProps> = ({children, className, expanded, handleClick}: ExpandoProps) => (\n <button className={className} onClick={(event) => handleClick(event)}>\n {children}\n {expanded ? <Chevron className={css({transform: 'scaleY(-1)'})} /> : <Chevron />}\n </button>\n);\n\nexport default Expando;\n","import {FC, useState} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLingui} from '@lingui/react';\n\nimport {Active, All, Completed, DownloadSmall, Error, Inactive, Stop, Spinner, UploadSmall} from '@client/ui/icons';\nimport TorrentFilterStore from '@client/stores/TorrentFilterStore';\n\nimport type {TorrentStatus} from '@shared/constants/torrentStatusMap';\n\nimport SidebarFilter from './SidebarFilter';\nimport Expando from './Expando';\n\nconst StatusFilters: FC = observer(() => {\n const {i18n} = useLingui();\n\n const filters: Array<{\n label: string;\n slug: TorrentStatus | '';\n icon: JSX.Element;\n }> = [\n {\n label: i18n._('filter.all'),\n slug: '',\n icon: <All />,\n },\n {\n label: i18n._('filter.status.downloading'),\n slug: 'downloading',\n icon: <DownloadSmall />,\n },\n {\n label: i18n._('filter.status.seeding'),\n slug: 'seeding',\n icon: <UploadSmall />,\n },\n {\n label: i18n._('filter.status.checking'),\n slug: 'checking',\n icon: <Spinner />,\n },\n {\n label: i18n._('filter.status.completed'),\n slug: 'complete',\n icon: <Completed />,\n },\n {\n label: i18n._('filter.status.stopped'),\n slug: 'stopped',\n icon: <Stop />,\n },\n {\n label: i18n._('filter.status.active'),\n slug: 'active',\n icon: <Active />,\n },\n {\n label: i18n._('filter.status.inactive'),\n slug: 'inactive',\n icon: <Inactive />,\n },\n {\n label: i18n._('filter.status.error'),\n slug: 'error',\n icon: <Error />,\n },\n ];\n\n const filterElements = filters.map((filter) => (\n <SidebarFilter\n handleClick={(selection, event) => TorrentFilterStore.setStatusFilters(selection as TorrentStatus, event)}\n count={TorrentFilterStore.taxonomy.statusCounts[filter.slug] || 0}\n key={filter.slug}\n icon={filter.icon}\n isActive={\n (filter.slug === '' && !TorrentFilterStore.statusFilter.length) ||\n TorrentFilterStore.statusFilter.includes(filter.slug as TorrentStatus)\n }\n name={filter.label}\n slug={filter.slug}\n size={TorrentFilterStore.taxonomy.statusSizes[filter.slug] ?? 0}\n />\n ));\n\n const title = i18n._('filter.status.title');\n\n const [expanded, setExpanded] = useState<boolean>(true);\n const expandoClick = () => {\n setExpanded(!expanded);\n };\n\n return (\n <ul aria-label={title} className=\"sidebar-filter sidebar__item\" role=\"menu\">\n <li className=\"sidebar-filter__item\" role=\"none\">\n <Expando className=\"sidebar-filter__item--heading\" expanded={expanded} handleClick={expandoClick}>\n {title}\n </Expando>\n </li>\n {expanded && filterElements}\n </ul>\n );\n});\n\nexport default StatusFilters;\n","import {FC, useState} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLingui} from '@lingui/react';\n\nimport SidebarFilter from './SidebarFilter';\nimport Expando from './Expando';\nimport TorrentFilterStore from '../../stores/TorrentFilterStore';\n\nconst TagFilters: FC = observer(() => {\n const {i18n} = useLingui();\n const [expanded, setExpanded] = useState<boolean>(true);\n\n const tags = Object.keys(TorrentFilterStore.taxonomy.tagCounts);\n\n if ((tags.length === 1 && tags[0] === '') || (tags.length === 2 && tags[1] === 'untagged')) {\n return null;\n }\n\n const filterItems = tags.slice().sort((a, b) => {\n if (a === '' || a === 'untagged') {\n return -1;\n }\n\n if (b === '' || b === 'untagged') {\n return 1;\n }\n\n return a.localeCompare(b);\n });\n\n const filterElements = filterItems.map((filter) => (\n <SidebarFilter\n handleClick={(tag, event) => TorrentFilterStore.setTagFilters(tag, event)}\n count={TorrentFilterStore.taxonomy.tagCounts[filter] || 0}\n key={filter}\n isActive={\n (filter === '' && !TorrentFilterStore.tagFilter.length) || TorrentFilterStore.tagFilter.includes(filter)\n }\n name={filter}\n slug={filter}\n size={TorrentFilterStore.taxonomy.tagSizes[filter]}\n />\n ));\n\n const title = i18n._('filter.tag.title');\n\n const expandoClick = () => {\n setExpanded(!expanded);\n };\n\n return (\n <ul aria-label={title} className=\"sidebar-filter sidebar__item\" role=\"menu\">\n <li className=\"sidebar-filter__item\" role=\"none\">\n <Expando className=\"sidebar-filter__item--heading\" expanded={expanded} handleClick={expandoClick}>\n {title}\n </Expando>\n </li>\n {expanded && filterElements}\n </ul>\n );\n});\n\nexport default TagFilters;\n","import {FC} from 'react';\nimport {useLingui} from '@lingui/react';\n\nimport ConfigStore from '@client/stores/ConfigStore';\nimport {ThemeSwitch} from '@client/ui/icons';\n\nimport Tooltip from '../general/Tooltip';\n\nconst ThemeSwitchButton: FC = () => {\n const {i18n} = useLingui();\n\n return (\n <Tooltip\n content={i18n._(ConfigStore.isPreferDark ? 'sidebar.button.theme.light' : 'sidebar.button.theme.dark')}\n onClick={() => ConfigStore.setUserPreferDark(!ConfigStore.isPreferDark)}\n position=\"bottom\"\n wrapperClassName=\"sidebar__action sidebar__icon-button\n sidebar__icon-button--interactive tooltip__wrapper\"\n >\n <ThemeSwitch />\n </Tooltip>\n );\n};\n\nexport default ThemeSwitchButton;\n","import {FC, useState} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLingui} from '@lingui/react';\n\nimport SidebarFilter from './SidebarFilter';\nimport Expando from './Expando';\nimport TorrentFilterStore from '../../stores/TorrentFilterStore';\n\nconst TrackerFilters: FC = observer(() => {\n const {i18n} = useLingui();\n const [expanded, setExpanded] = useState<boolean>(true);\n\n const trackers = Object.keys(TorrentFilterStore.taxonomy.trackerCounts);\n\n if (trackers.length === 1 && trackers[0] === '') {\n return null;\n }\n\n const filterItems = trackers.slice().sort((a, b) => {\n if (a === '') {\n return -1;\n }\n if (b === '') {\n return 1;\n }\n\n return a.localeCompare(b);\n });\n\n const filterElements = filterItems.map((filter) => (\n <SidebarFilter\n handleClick={(tracker, event) => TorrentFilterStore.setTrackerFilters(tracker, event)}\n count={TorrentFilterStore.taxonomy.trackerCounts[filter] || 0}\n key={filter}\n isActive={\n (filter === '' && !TorrentFilterStore.trackerFilter.length) || TorrentFilterStore.trackerFilter.includes(filter)\n }\n name={filter}\n slug={filter}\n size={TorrentFilterStore.taxonomy.trackerSizes[filter]}\n />\n ));\n\n const title = i18n._('filter.tracker.title');\n\n const expandoClick = () => {\n setExpanded(!expanded);\n };\n\n return (\n <ul aria-label={title} className=\"sidebar-filter sidebar__item\" role=\"menu\">\n <li className=\"sidebar-filter__item\" role=\"none\">\n <Expando className=\"sidebar-filter__item--heading\" expanded={expanded} handleClick={expandoClick}>\n {title}\n </Expando>\n </li>\n {expanded && filterElements}\n </ul>\n );\n});\n\nexport default TrackerFilters;\n","import classnames from 'classnames';\nimport {FC} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLingui} from '@lingui/react';\n\nimport ClientStatusStore from '@client/stores/ClientStatusStore';\nimport {Download, InfinityIcon, Upload} from '@client/ui/icons';\nimport SettingStore from '@client/stores/SettingStore';\nimport TransferDataStore from '@client/stores/TransferDataStore';\n\nimport type {TransferDirection} from '@shared/types/TransferData';\n\nimport Duration from '../general/Duration';\nimport Size from '../general/Size';\n\nimport type {TransferRateGraphInspectorPoint} from './TransferRateGraph';\n\nconst icons = {\n download: <Download />,\n infinity: <InfinityIcon />,\n upload: <Upload />,\n};\n\ninterface TransferRateDetailsProps {\n inspectorPoint?: TransferRateGraphInspectorPoint | null;\n}\n\nconst TransferRateDetails: FC<TransferRateDetailsProps> = observer(({inspectorPoint}: TransferRateDetailsProps) => {\n const {i18n} = useLingui();\n\n const getCurrentTransferRate = (direction: TransferDirection, options: {showHoverDuration?: boolean} = {}) => {\n const {throttleGlobalDownSpeed = 0, throttleGlobalUpSpeed = 0} = SettingStore.clientSettings || {};\n const {transferSummary} = TransferDataStore;\n\n const throttles = {\n download: throttleGlobalDownSpeed,\n upload: throttleGlobalUpSpeed,\n };\n\n const transferTotals = {\n download: transferSummary.downTotal,\n upload: transferSummary.upTotal,\n };\n\n let transferRates = {\n download: transferSummary.downRate,\n upload: transferSummary.upRate,\n };\n\n if (inspectorPoint != null) {\n transferRates = {\n upload: inspectorPoint.upload,\n download: inspectorPoint.download,\n };\n }\n\n const secondaryDataClasses = classnames('client-stats__rate__data--secondary', {\n 'is-visible': inspectorPoint == null && ClientStatusStore.isConnected,\n });\n\n const timestampClasses = classnames('client-stats__rate__data--timestamp', {\n 'is-visible': inspectorPoint != null && options.showHoverDuration,\n });\n\n let timestamp = null;\n if (inspectorPoint?.timestamp != null) {\n timestamp = (\n <div className={timestampClasses}>\n <Duration suffix={i18n._('general.ago')} value={Math.trunc((Date.now() - inspectorPoint.timestamp) / 1000)} />\n </div>\n );\n }\n\n let limit = null;\n\n if (throttles[direction] === 0) {\n limit = icons.infinity;\n } else {\n limit = <Size value={throttles[direction]} isSpeed />;\n }\n\n return (\n <div className={`client-stats__rate client-stats__rate--${direction}`}>\n <div className=\"client-stats__rate__icon\">{icons[direction]}</div>\n <div className=\"client-stats__rate__data\">\n <div className=\"client-stats__rate__data--primary\">\n <Size value={transferRates[direction]} isSpeed />\n </div>\n {timestamp}\n <div className={secondaryDataClasses}>\n <div className=\"client-stats__rate__data--total\">\n <Size value={transferTotals[direction]} />\n </div>\n <div className=\"client-stats__rate__data--limit\">{limit}</div>\n </div>\n </div>\n </div>\n );\n };\n\n return (\n <div className=\"client-stats__rates\">\n {getCurrentTransferRate('download', {showHoverDuration: true})}\n {getCurrentTransferRate('upload')}\n </div>\n );\n});\n\nexport default TransferRateDetails;\n","import {area, curveMonotoneX, line} from 'd3-shape';\nimport {FC, MutableRefObject, useRef, useState} from 'react';\nimport {max} from 'd3-array';\nimport {observer} from 'mobx-react-lite';\nimport {scaleLinear} from 'd3-scale';\n\nimport type {TransferDirection, TransferHistory} from '@shared/types/TransferData';\n\nimport TransferDataStore, {TRANSFER_DIRECTIONS} from '../../stores/TransferDataStore';\n\nconst TransferRateGraphGradient: FC<{direction: TransferDirection}> = ({direction}: {direction: TransferDirection}) => (\n <linearGradient id={`graph__gradient--${direction}`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop className={`graph__gradient--top graph__gradient--top--${direction}`} offset=\"0%\" />\n <stop className={`graph__gradient--bottom graph__gradient--bottom--${direction}`} offset=\"100%\" />\n </linearGradient>\n);\n\nexport interface TransferRateGraphEventHandlers {\n handleMouseMove: (mouseX: number) => void;\n handleMouseOut: () => void;\n handleMouseOver: () => void;\n}\n\nexport interface TransferRateGraphInspectorPoint {\n upload: number;\n download: number;\n timestamp: number;\n}\n\ninterface TransferRateGraphProps {\n id: string;\n height: number;\n width: number;\n handlerRefs: MutableRefObject<TransferRateGraphEventHandlers | null>;\n onHover: (inspectorPoint: TransferRateGraphInspectorPoint) => void;\n onMouseOut: () => void;\n}\n\nconst getSpeedAtHoverPoint = (history: TransferHistory, direction: TransferDirection, hoverPoint: number) => {\n const upperSpeed = history[direction][Math.ceil(hoverPoint)];\n const lowerSpeed = history[direction][Math.floor(hoverPoint)];\n return lowerSpeed + (upperSpeed - lowerSpeed) * (hoverPoint % 1);\n};\n\nconst TransferRateGraph: FC<TransferRateGraphProps> = observer(\n ({id, height, width, handlerRefs, onHover, onMouseOut}: TransferRateGraphProps) => {\n const [isHovered, setIsHovered] = useState<boolean>(false);\n\n const hoverPoint = useRef<number>(0);\n const inspectorPoint = useRef<TransferRateGraphInspectorPoint>({download: 0, upload: 0, timestamp: 0});\n\n const historicalData = TransferDataStore.transferRates;\n\n const xScale = scaleLinear()\n .domain([0, historicalData.download.length - 1])\n .range([0, width]);\n\n const yScale = scaleLinear()\n .domain([\n 0,\n max(historicalData.download, (dataPoint, index) => Math.max(dataPoint, historicalData.upload[index])) as number,\n ])\n .range([height - 10, 10]);\n\n handlerRefs.current = {\n handleMouseMove: (mouseX: number) => {\n hoverPoint.current = xScale.invert(mouseX);\n onHover(inspectorPoint.current);\n },\n handleMouseOut: () => {\n setIsHovered(false);\n onMouseOut();\n },\n handleMouseOver: () => {\n setIsHovered(true);\n },\n };\n\n if (isHovered) {\n inspectorPoint.current = {\n download: getSpeedAtHoverPoint(historicalData, 'download', hoverPoint.current),\n upload: getSpeedAtHoverPoint(historicalData, 'upload', hoverPoint.current),\n timestamp: historicalData.timestamps[Math.round(hoverPoint.current)],\n };\n }\n\n const interpolation = curveMonotoneX;\n\n return (\n <svg className=\"graph\" id={id} height=\"100%\" width=\"100%\">\n <defs>\n <TransferRateGraphGradient direction=\"upload\" />\n <TransferRateGraphGradient direction=\"download\" />\n </defs>\n {TRANSFER_DIRECTIONS.map((direction) => [\n <path\n className=\"graph__area\"\n key={`area-${direction}`}\n fill={`url('#graph__gradient--${direction}')`}\n d={\n area<number>()\n .x((_dataPoint, index) => xScale(index) || 0)\n .y0(height)\n .y1((dataPoint) => yScale(dataPoint) || 0)\n .curve(interpolation)(historicalData[direction]) as string\n }\n />,\n <path\n className={`graph__line graph__line--${direction}`}\n key={`line-${direction}`}\n d={\n line<number>()\n .x((_dataPoint, index) => xScale(index) || 0)\n .y((dataPoint) => yScale(dataPoint) || 0)\n .curve(interpolation)(historicalData[direction]) as string\n }\n />,\n <circle\n className={`graph__circle graph__circle--${direction}`}\n key={`point-${direction}`}\n r={2.5}\n style={{opacity: isHovered ? 1 : 0}}\n transform={`translate(${xScale(hoverPoint.current)},${yScale(inspectorPoint.current[direction])})`}\n />,\n ])}\n </svg>\n );\n },\n);\n\nexport default TransferRateGraph;\n","import {FC, useState, useRef} from 'react';\nimport Measure from 'react-measure';\nimport {observer} from 'mobx-react-lite';\n\nimport ClientStatusStore from '../../stores/ClientStatusStore';\nimport TransferRateDetails from './TransferRateDetails';\nimport TransferRateGraph from './TransferRateGraph';\n\nimport type {TransferRateGraphEventHandlers, TransferRateGraphInspectorPoint} from './TransferRateGraph';\n\nconst TransferData: FC = observer(() => {\n const [graphInspectorPoint, setGraphInspectorPoint] = useState<TransferRateGraphInspectorPoint | null>(null);\n const [sidebarWidth, setSidebarWidth] = useState<number>(250);\n const rateGraphHandlerRefs = useRef<TransferRateGraphEventHandlers>(null);\n\n return (\n <Measure\n offset\n onResize={(contentRect) => {\n if (contentRect.offset?.width) {\n setSidebarWidth(contentRect.offset.width);\n }\n }}\n >\n {({measureRef}) => (\n <div ref={measureRef} className=\"client-stats__wrapper sidebar__item\">\n <div\n className=\"client-stats\"\n onMouseMove={(event) => {\n if (event?.nativeEvent?.clientX != null) {\n rateGraphHandlerRefs.current?.handleMouseMove(event.nativeEvent.clientX);\n }\n }}\n onMouseOver={() => rateGraphHandlerRefs.current?.handleMouseOver()}\n onMouseOut={() => rateGraphHandlerRefs.current?.handleMouseOut()}\n onFocus={() => rateGraphHandlerRefs.current?.handleMouseOver()}\n onBlur={() => rateGraphHandlerRefs.current?.handleMouseOut()}\n >\n <TransferRateDetails inspectorPoint={graphInspectorPoint} />\n {ClientStatusStore.isConnected && (\n <TransferRateGraph\n height={150}\n id=\"transfer-rate-graph\"\n onMouseOut={() => {\n setGraphInspectorPoint(null);\n }}\n onHover={(inspectorPoint) => {\n setGraphInspectorPoint(inspectorPoint);\n }}\n handlerRefs={rateGraphHandlerRefs}\n width={sidebarWidth}\n />\n )}\n </div>\n </div>\n )}\n </Measure>\n );\n});\n\nexport default TransferData;\n","import {FC} from 'react';\nimport {OverlayScrollbarsComponent} from 'overlayscrollbars-react';\n\nimport DiskUsage from './DiskUsage';\nimport FeedsButton from './FeedsButton';\nimport LogoutButton from './LogoutButton';\nimport LocationFilters from './LocationFilters';\nimport NotificationsButton from './NotificationsButton';\nimport SearchBox from './SearchBox';\nimport SettingsButton from './SettingsButton';\nimport SidebarActions from './SidebarActions';\nimport SpeedLimitDropdown from './SpeedLimitDropdown';\nimport StatusFilters from './StatusFilters';\nimport TagFilters from './TagFilters';\nimport ThemeSwitchButton from './ThemeSwitchButton';\nimport TrackerFilters from './TrackerFilters';\nimport TransferData from './TransferData';\n\nconst Sidebar: FC = () => (\n <OverlayScrollbarsComponent\n className=\"application__sidebar\"\n options={{\n scrollbars: {\n autoHide: 'scroll',\n clickScroll: false,\n dragScroll: false,\n theme: `os-theme-thin`,\n },\n overflow: {\n x: 'hidden',\n y: 'scroll',\n },\n }}\n >\n <div style={{display: 'flex', flexDirection: 'column'}}>\n <SidebarActions>\n <SpeedLimitDropdown />\n <SettingsButton />\n <FeedsButton />\n <NotificationsButton />\n <LogoutButton />\n </SidebarActions>\n <TransferData />\n <SearchBox />\n <StatusFilters />\n <TagFilters />\n <TrackerFilters />\n <LocationFilters />\n <DiskUsage />\n <div style={{flexGrow: 1}} />\n <SidebarActions>\n <ThemeSwitchButton />\n </SidebarActions>\n </div>\n </OverlayScrollbarsComponent>\n);\n\nexport default Sidebar;\n","import classnames from 'classnames';\nimport {FC} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLingui} from '@lingui/react';\nimport {useKeyPressEvent} from 'react-use';\n\nimport {ContextMenu} from '@client/ui';\nimport UIStore from '@client/stores/UIStore';\n\nimport type {ActiveContextMenu} from '@client/stores/UIStore';\n\ninterface ContextMenuMountPointProps {\n id: ActiveContextMenu['id'];\n}\n\nconst ContextMenuMountPoint: FC<ContextMenuMountPointProps> = observer(({id}: ContextMenuMountPointProps) => {\n const isOpen = UIStore.activeContextMenu?.id === id;\n const items = UIStore.activeContextMenu?.items ?? [];\n const triggerCoordinates = UIStore.activeContextMenu?.clickPosition ?? {\n x: 0,\n y: 0,\n };\n\n const {i18n} = useLingui();\n\n useKeyPressEvent('Escape', () => UIStore.dismissContextMenu(id));\n\n return (\n <ContextMenu\n triggerCoordinates={triggerCoordinates}\n onOverlayClick={() => {\n UIStore.dismissContextMenu(id);\n }}\n onOverlayRightClick={(e) => {\n e.preventDefault();\n }}\n isIn={isOpen}\n >\n {items.map((item, index) => {\n let menuItemContent;\n let menuItemClasses;\n\n switch (item.type) {\n case 'action':\n menuItemClasses = classnames('menu__item', {\n 'is-selectable': item.clickHandler,\n });\n menuItemContent = (\n <span>\n <span\n className={classnames('menu__item__label--primary', {\n 'has-action': item.labelAction,\n })}\n >\n <span className=\"menu__item__label\">{i18n._(item.label)}</span>\n {item.labelAction ? (\n <span className=\"menu__item__label__action\">\n <item.labelAction />\n </span>\n ) : undefined}\n </span>\n {item.labelSecondary ? (\n <span className=\"menu__item__label--secondary\">\n <item.labelSecondary />\n </span>\n ) : undefined}\n </span>\n );\n break;\n case 'separator':\n default:\n menuItemClasses = classnames('menu__item', {\n 'menu__item--separator': item.type === 'separator',\n });\n break;\n }\n\n return (\n <li className={menuItemClasses} key={item.type === 'action' ? item.action : `sep-${index}`}>\n <button\n type=\"button\"\n disabled={item.type !== 'action' || !item.clickHandler}\n onClick={(event) => {\n if (item.type !== 'separator') {\n if (item.dismissMenu === false) {\n event.nativeEvent.stopImmediatePropagation();\n }\n\n if (item.clickHandler) {\n item.clickHandler(event);\n }\n\n if (item.dismissMenu !== false) {\n UIStore.dismissContextMenu(id);\n }\n }\n\n return false;\n }}\n onContextMenu={(event) => {\n event.preventDefault();\n }}\n >\n {menuItemContent}\n </button>\n </li>\n );\n })}\n </ContextMenu>\n );\n});\n\nexport default ContextMenuMountPoint;\n","import {ComponentProps, FC, forwardRef, RefCallback, UIEvent, useEffect, useRef} from 'react';\nimport {FixedSizeList} from 'react-window';\nimport {observer} from 'mobx-react-lite';\nimport {OverlayScrollbarsComponent} from 'overlayscrollbars-react';\nimport {useWindowSize} from 'react-use';\n\nimport ConfigStore from '@client/stores/ConfigStore';\n\nimport type {OverlayScrollbarsComponentRef} from 'overlayscrollbars-react';\nimport type {FixedSizeListProps, ListChildComponentProps} from 'react-window';\n\nconst Overflow = forwardRef<HTMLDivElement, ComponentProps<'div'>>((props: ComponentProps<'div'>, ref) => {\n const {children, onScroll} = props;\n const osRef = useRef<OverlayScrollbarsComponentRef>(null);\n\n useEffect(() => {\n const scrollbarRef = osRef.current;\n\n if (scrollbarRef == null) {\n return () => {\n // do nothing.\n };\n }\n\n const viewport = scrollbarRef.osInstance()?.elements().viewport as HTMLDivElement;\n\n const refCallback = ref as RefCallback<HTMLDivElement>;\n refCallback(viewport);\n\n if (onScroll) {\n viewport.addEventListener('scroll', (e) => onScroll(e as unknown as UIEvent<HTMLDivElement>), {\n passive: true,\n });\n }\n\n return () => {\n if (onScroll) {\n viewport.removeEventListener('scroll', (e) => onScroll(e as unknown as UIEvent<HTMLDivElement>));\n }\n };\n }, [onScroll, ref]);\n\n return (\n <OverlayScrollbarsComponent\n {...props}\n options={{\n scrollbars: {\n autoHide: 'leave',\n clickScroll: true,\n theme: `os-theme-${ConfigStore.isPreferDark ? 'light' : 'dark'}`,\n },\n }}\n ref={osRef}\n >\n {children}\n </OverlayScrollbarsComponent>\n );\n});\n\ninterface ListViewportProps\n extends Pick<FixedSizeListProps, 'className' | 'itemCount' | 'itemKey' | 'itemSize' | 'outerRef'> {\n itemRenderer: FC<ListChildComponentProps>;\n}\n\nconst ListViewport = forwardRef<FixedSizeList, ListViewportProps>((props: ListViewportProps, ref) => {\n const {className, itemCount, itemKey, itemRenderer, itemSize, outerRef} = props;\n const {height: windowHeight} = useWindowSize();\n\n return (\n <FixedSizeList\n className={className}\n height={Math.max(itemSize * 30, windowHeight)}\n itemCount={itemCount}\n itemKey={itemKey}\n itemSize={itemSize}\n width=\"100%\"\n outerElementType={ConfigStore.isSmallScreen ? undefined : Overflow} // Don't use custom scrollbar on smaller screens\n ref={ref}\n overscanCount={30}\n outerRef={outerRef}\n >\n {itemRenderer}\n </FixedSizeList>\n );\n});\n\nexport default observer(ListViewport);\n","import classnames from 'classnames';\nimport {forwardRef, MutableRefObject, ReactElement, useRef, useState} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {Trans, useLingui} from '@lingui/react';\nimport {useEnsuredForwardedRef} from 'react-use';\n\nimport {css} from '@client/styled-system/css';\nimport TorrentListColumns, {TorrentListColumn} from '../../constants/TorrentListColumns';\nimport SettingStore from '../../stores/SettingStore';\nimport UIStore from '../../stores/UIStore';\n\nconst pointerDownStyles = `\n body { user-select: none !important; }\n * { cursor: col-resize !important; }\n`;\n\ninterface TableHeadingProps {\n onCellClick: (column: TorrentListColumn) => void;\n onCellFocus: () => void;\n onWidthsChange: (column: TorrentListColumn, width: number) => void;\n}\n\nconst TableHeading = observer(\n forwardRef<HTMLDivElement, TableHeadingProps>(\n ({onCellClick, onCellFocus, onWidthsChange}: TableHeadingProps, ref) => {\n const [isPointerDown, setIsPointerDown] = useState<boolean>(false);\n\n const focusedCell = useRef<TorrentListColumn>();\n const focusedCellWidth = useRef<number>();\n const lastPointerX = useRef<number>();\n const tableHeading = useEnsuredForwardedRef<HTMLDivElement>(ref as MutableRefObject<HTMLDivElement>);\n const resizeLine = useRef<HTMLDivElement>(null);\n\n const {i18n} = useLingui();\n\n const handlePointerMove = (event: PointerEvent) => {\n let widthDelta = 0;\n if (lastPointerX.current != null) {\n widthDelta = event.clientX - lastPointerX.current;\n }\n\n let nextCellWidth = 20;\n if (focusedCellWidth.current != null) {\n nextCellWidth = focusedCellWidth.current + widthDelta;\n }\n\n if (nextCellWidth > 20) {\n focusedCellWidth.current = nextCellWidth;\n lastPointerX.current = event.clientX;\n if (resizeLine.current != null && tableHeading.current != null) {\n resizeLine.current.style.transform = `translate(${Math.max(0, event.clientX)}px, ${\n tableHeading.current.getBoundingClientRect().top\n }px)`;\n }\n }\n };\n\n const handlePointerUp = () => {\n UIStore.removeGlobalStyle(pointerDownStyles);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('pointermove', handlePointerMove);\n\n setIsPointerDown(false);\n lastPointerX.current = undefined;\n\n if (resizeLine.current != null) {\n resizeLine.current.style.opacity = '0';\n }\n\n if (focusedCell.current != null && focusedCellWidth.current != null) {\n onWidthsChange(focusedCell.current, focusedCellWidth.current);\n }\n\n focusedCell.current = undefined;\n focusedCellWidth.current = undefined;\n };\n\n return (\n <div className=\"table__row table__row--heading\" role=\"row\" ref={tableHeading}>\n {SettingStore.floodSettings.torrentListColumns.reduce((accumulator: Array<ReactElement>, {id, visible}) => {\n if (!visible) {\n return accumulator;\n }\n\n const labelID = TorrentListColumns[id];\n if (labelID == null) {\n return accumulator;\n }\n\n let handle = null;\n const width = SettingStore.floodSettings.torrentListColumnWidths[id] || 100;\n\n if (!isPointerDown) {\n handle = (\n <span\n className=\"table__heading__handle\"\n onPointerDown={(event) => {\n if (!isPointerDown && resizeLine.current != null && tableHeading.current != null) {\n setIsPointerDown(true);\n\n focusedCell.current = id;\n focusedCellWidth.current = width;\n lastPointerX.current = event.clientX;\n\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('pointermove', handlePointerMove);\n UIStore.addGlobalStyle(pointerDownStyles);\n\n resizeLine.current.style.transform = `translate(${Math.max(0, event.clientX)}px, ${\n tableHeading.current.getBoundingClientRect().top\n }px)`;\n resizeLine.current.style.opacity = '1';\n }\n }}\n />\n );\n }\n\n const isSortActive = id === SettingStore.floodSettings.sortTorrents.property;\n const classes = classnames('table__cell table__heading', {\n 'table__heading--is-sorted': isSortActive,\n [`table__heading--direction--${SettingStore.floodSettings.sortTorrents.direction}`]: isSortActive,\n });\n\n accumulator.push(\n <button\n className={`${classes} ${css({\n textAlign: 'left',\n _focus: {\n outline: 'none',\n WebkitTapHighlightColor: 'transparent',\n },\n })}`}\n role=\"columnheader\"\n aria-sort={\n isSortActive\n ? SettingStore.floodSettings.sortTorrents.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none'\n }\n type=\"button\"\n key={id}\n onClick={() => onCellClick(id)}\n onFocus={() => onCellFocus()}\n style={{\n width: `${width}px`,\n }}\n >\n <span className=\"table__heading__label\" title={i18n._(labelID)}>\n <Trans id={labelID} />\n </span>\n {handle}\n </button>,\n );\n\n return accumulator;\n }, [])}\n <div className=\"table__cell table__heading table__heading--fill\" />\n <div className=\"table__heading__resize-line\" ref={resizeLine} />\n </div>\n );\n },\n ),\n);\n\nexport default TableHeading;\n","import {FC, ReactNode} from 'react';\nimport {useDropzone} from 'react-dropzone';\n\nimport UIStore from '@client/stores/UIStore';\n\nimport type {ProcessedFiles} from '@client/components/general/form-elements/FileDropzone';\n\nconst handleFileDrop = (files: Array<File>) => {\n const processedFiles: ProcessedFiles = [];\n\n files.forEach((file) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n if (e.target?.result != null && typeof e.target.result === 'string') {\n processedFiles.push({\n name: file.name,\n data: e.target.result.split('base64,')[1],\n });\n }\n\n if (processedFiles.length === files.length && processedFiles[0] != null) {\n UIStore.setActiveModal({id: 'add-torrents', tab: 'by-file', files: processedFiles});\n }\n };\n reader.readAsDataURL(file);\n });\n};\n\nconst TorrentListDropzone: FC<{children: ReactNode}> = ({children}: {children: ReactNode}) => {\n const {getRootProps, isDragActive} = useDropzone({\n onDrop: handleFileDrop,\n noClick: true,\n noKeyboard: true,\n });\n\n return (\n <div\n {...getRootProps({onClick: (evt) => evt.preventDefault()})}\n className={`dropzone dropzone--with-overlay torrents ${isDragActive ? 'dropzone--is-dragging' : ''}`}\n >\n {children}\n </div>\n );\n};\n\nexport default TorrentListDropzone;\n","import {createRef, FC, MutableRefObject} from 'react';\nimport {observer} from 'mobx-react-lite';\n\nimport {Checkmark} from '@client/ui/icons';\nimport ConfigStore from '@client/stores/ConfigStore';\nimport TorrentActions from '@client/actions/TorrentActions';\nimport TorrentContextMenuActions from '@client/constants/TorrentContextMenuActions';\nimport TorrentStore from '@client/stores/TorrentStore';\nimport UIStore from '@client/stores/UIStore';\n\nimport type {ContextMenuItem} from '@client/stores/UIStore';\n\nimport type {TorrentProperties} from '@shared/types/Torrent';\n\nimport PriorityMeter from '../general/PriorityMeter';\n\nconst getLastSelectedTorrent = (): string => TorrentStore.selectedTorrents[TorrentStore.selectedTorrents.length - 1];\n\nconst InlineTorrentPropertyCheckbox: FC<{property: keyof TorrentProperties}> = observer(\n ({property}: {property: keyof TorrentProperties}) => (\n <span className=\"toggle-input checkbox\" style={{display: 'inline'}}>\n <div className=\"toggle-input__indicator\">\n <div\n className=\"toggle-input__indicator__icon\"\n style={{\n opacity: TorrentStore.torrents[getLastSelectedTorrent()][property] ? '1' : undefined,\n }}\n >\n <Checkmark />\n </div>\n </div>\n </span>\n ),\n);\n\nexport const getContextMenuItems = (torrent: TorrentProperties): Array<ContextMenuItem> => {\n const changePriorityFuncRef = createRef<() => number>();\n\n return [\n {\n type: 'action',\n action: 'start',\n label: TorrentContextMenuActions.start,\n clickHandler: () => {\n TorrentActions.startTorrents({\n hashes: TorrentStore.selectedTorrents,\n });\n },\n },\n {\n type: 'action',\n action: 'stop',\n label: TorrentContextMenuActions.stop,\n clickHandler: () => {\n TorrentActions.stopTorrents({\n hashes: TorrentStore.selectedTorrents,\n });\n },\n },\n {\n type: 'action',\n action: 'remove',\n label: TorrentContextMenuActions.remove,\n clickHandler: () => {\n UIStore.setActiveModal({id: 'remove-torrents'});\n },\n },\n {\n type: 'action',\n action: 'checkHash',\n label: TorrentContextMenuActions.checkHash,\n clickHandler: () => {\n TorrentActions.checkHash({\n hashes: TorrentStore.selectedTorrents,\n });\n },\n },\n {\n type: 'action',\n action: 'reannounce',\n label: TorrentContextMenuActions.reannounce,\n clickHandler: () => {\n TorrentActions.reannounce({\n hashes: TorrentStore.selectedTorrents as [string, ...string[]],\n });\n },\n },\n {\n type: 'separator',\n },\n {\n type: 'action',\n action: 'setTaxonomy',\n label: TorrentContextMenuActions.setTaxonomy,\n clickHandler: () => {\n UIStore.setActiveModal({id: 'set-taxonomy'});\n },\n },\n {\n type: 'action',\n action: 'move',\n label: TorrentContextMenuActions.move,\n clickHandler: () => {\n UIStore.setActiveModal({id: 'move-torrents'});\n },\n },\n {\n type: 'action',\n action: 'setTrackers',\n label: TorrentContextMenuActions.setTrackers,\n clickHandler: () => {\n UIStore.setActiveModal({id: 'set-trackers'});\n },\n },\n {\n type: 'separator',\n },\n {\n type: 'action',\n action: 'torrentDetails',\n label: TorrentContextMenuActions.torrentDetails,\n clickHandler: () => {\n UIStore.setActiveModal({\n id: 'torrent-details',\n hash: getLastSelectedTorrent(),\n });\n },\n },\n {\n type: 'action',\n action: 'downloadContents',\n label: TorrentContextMenuActions.downloadContents,\n clickHandler: (e) => {\n e.preventDefault();\n\n TorrentStore.selectedTorrents.forEach((hash) => {\n const link = document.createElement('a');\n\n link.download = '';\n link.href = `${ConfigStore.baseURI}api/torrents/${hash}/contents/all/data`;\n link.style.display = 'none';\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n });\n },\n },\n {\n type: 'action',\n action: 'downloadMetainfo',\n label: TorrentContextMenuActions.downloadMetainfo,\n clickHandler: (e) => {\n e.preventDefault();\n\n const link = document.createElement('a');\n\n link.download = '';\n link.href = `${ConfigStore.baseURI}api/torrents/${TorrentStore.selectedTorrents.join(',')}/metainfo`;\n link.style.display = 'none';\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n },\n },\n {\n type: 'action',\n action: 'generateMagnet',\n label: TorrentContextMenuActions.generateMagnet,\n clickHandler: () => {\n UIStore.setActiveModal({id: 'generate-magnet'});\n },\n },\n {\n type: 'action',\n action: 'setInitialSeeding',\n label: TorrentContextMenuActions.setInitialSeeding,\n clickHandler: () => {\n const {selectedTorrents} = TorrentStore;\n TorrentActions.setInitialSeeding({\n hashes: selectedTorrents,\n isInitialSeeding: !TorrentStore.torrents[getLastSelectedTorrent()].isInitialSeeding,\n });\n },\n dismissMenu: false,\n labelAction: () => <InlineTorrentPropertyCheckbox property=\"isInitialSeeding\" />,\n },\n {\n type: 'action',\n action: 'setSequential',\n label: TorrentContextMenuActions.setSequential,\n clickHandler: () => {\n const {selectedTorrents} = TorrentStore;\n TorrentActions.setSequential({\n hashes: selectedTorrents,\n isSequential: !TorrentStore.torrents[getLastSelectedTorrent()].isSequential,\n });\n },\n dismissMenu: false,\n labelAction: () => <InlineTorrentPropertyCheckbox property=\"isSequential\" />,\n },\n {\n type: 'action',\n action: 'setPriority',\n label: TorrentContextMenuActions.setPriority,\n clickHandler: () => {\n if (changePriorityFuncRef.current != null) {\n TorrentActions.setPriority({\n hashes: TorrentStore.selectedTorrents,\n priority: changePriorityFuncRef.current(),\n });\n }\n },\n dismissMenu: false,\n labelAction: () => (\n <PriorityMeter\n id={torrent.hash}\n key={torrent.hash}\n level={torrent.priority}\n maxLevel={3}\n onChange={() => undefined}\n priorityType=\"torrent\"\n showLabel={false}\n changePriorityFuncRef={changePriorityFuncRef as MutableRefObject<() => number>}\n clickHandled\n />\n ),\n },\n ];\n};\n","import classnames from 'classnames';\nimport {computed} from 'mobx';\nimport {FC} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {Trans, useLingui} from '@lingui/react';\n\nimport {css} from '@client/styled-system/css';\nimport {\n CalendarFinished,\n CalendarCreated,\n Calendar,\n CheckmarkThick,\n Clock,\n DiskFlat,\n DetailNotAvailable,\n DownloadThick,\n FolderClosedSolid,\n Hash,\n Lock,\n TrackerMessage,\n Peers,\n Ratio,\n Seeds,\n Radar,\n UploadThick,\n} from '@client/ui/icons';\nimport Duration from '@client/components/general/Duration';\nimport ProgressBar from '@client/components/general/ProgressBar';\nimport Size from '@client/components/general/Size';\nimport {torrentStatusEffective} from '@client/util/torrentStatus';\nimport TorrentStore from '@client/stores/TorrentStore';\n\nimport type {TorrentListColumn} from '@client/constants/TorrentListColumns';\n\nimport type {TorrentProperties} from '@shared/types/Torrent';\n\nconst ICONS: Partial<Record<TorrentListColumn, JSX.Element>> = {\n eta: <Clock />,\n sizeBytes: <DiskFlat />,\n downRate: <DownloadThick />,\n directory: <FolderClosedSolid />,\n hash: <Hash />,\n dateActive: <Clock />,\n dateAdded: <Calendar />,\n dateCreated: <CalendarCreated />,\n dateFinished: <CalendarFinished />,\n isPrivate: <Lock />,\n message: <TrackerMessage />,\n percentComplete: <DownloadThick />,\n peers: <Peers />,\n ratio: <Ratio />,\n seeds: <Seeds />,\n trackerURIs: <Radar />,\n upRate: <UploadThick />,\n upTotal: <UploadThick />,\n} as const;\n\nconst BooleanCell: FC<{value: boolean}> = observer(({value}: {value: boolean}) =>\n value ? <CheckmarkThick className=\"torrent__detail__icon torrent__detail__icon--checkmark\" /> : null,\n);\n\nconst DateCell: FC<{date: number}> = observer(({date}: {date: number}) => {\n const {i18n} = useLingui();\n\n if (date === 0) {\n return null;\n }\n\n return <span>{i18n.date(new Date(date * 1000))}</span>;\n});\n\nconst ETACell: FC<{eta: number}> = observer(({eta}: {eta: number}) => (eta ? <Duration value={eta} /> : null));\n\nconst PeerCell: FC<{peersConnected: number; totalPeers: number}> = observer(\n ({peersConnected, totalPeers}: {peersConnected: number; totalPeers: number}) => {\n const {i18n} = useLingui();\n\n return (\n <Trans\n id=\"torrent.list.peers\"\n values={{\n connected: i18n.number(peersConnected),\n of: (\n <em className=\"unit\">\n <Trans id=\"torrent.list.peers.of\" />\n </em>\n ),\n total: i18n.number(totalPeers),\n }}\n />\n );\n },\n);\n\nconst RatioCell: FC<{ratio: number}> = observer(({ratio}: {ratio: number}) => {\n const {i18n} = useLingui();\n\n return <span>{i18n.number(ratio, {maximumFractionDigits: 2})}</span>;\n});\n\nconst TagsCell: FC<{tags: string[]}> = observer(({tags}: {tags: string[]}) => (\n <ul className=\"torrent__tags tag\">\n {tags.map((tag) => (\n <li className=\"torrent__tag\" key={tag}>\n {tag}\n </li>\n ))}\n </ul>\n));\n\nconst TrackersCell: FC<{trackers: string[]}> = observer(({trackers}: {trackers: string[]}) => (\n <span>{trackers.join(', ')}</span>\n));\n\nexport interface TorrentListCellContentProps {\n torrent: TorrentProperties;\n column: TorrentListColumn;\n}\n\nconst DefaultTorrentListCellContent: FC<TorrentListCellContentProps> = observer(\n ({torrent, column}: TorrentListCellContentProps) => {\n switch (column) {\n case 'dateActive':\n return <DateCell date={torrent[column]} />;\n case 'dateAdded':\n return <DateCell date={torrent[column]} />;\n case 'dateCreated':\n return <DateCell date={torrent[column]} />;\n case 'dateFinished':\n return <DateCell date={torrent[column]} />;\n case 'downRate':\n return <Size value={torrent[column]} isSpeed />;\n case 'upRate':\n return <Size value={torrent[column]} isSpeed />;\n case 'downTotal':\n return <Size value={torrent[column]} />;\n case 'upTotal':\n return <Size value={torrent[column]} />;\n case 'sizeBytes':\n return <Size value={torrent[column]} />;\n case 'ratio':\n return <RatioCell ratio={torrent[column]} />;\n case 'isPrivate':\n return <BooleanCell value={torrent[column]} />;\n case 'tags':\n return <TagsCell tags={torrent[column]} />;\n case 'trackerURIs':\n return <TrackersCell trackers={torrent[column]} />;\n case 'eta':\n return <ETACell eta={torrent[column]} />;\n case 'seeds':\n return <PeerCell peersConnected={torrent.seedsConnected} totalPeers={torrent.seedsTotal} />;\n case 'peers':\n return <PeerCell peersConnected={torrent.peersConnected} totalPeers={torrent.peersTotal} />;\n case 'percentComplete':\n return (\n <ProgressBar\n percent={computed(() => Math.ceil(torrent.percentComplete)).get()}\n status={computed(() => torrentStatusEffective(torrent.status)).get()}\n />\n );\n default:\n return <span>{torrent[column]}</span>;\n }\n },\n);\n\ninterface TorrentListCellProps {\n hash: string;\n column: TorrentListColumn;\n content?: FC<TorrentListCellContentProps>;\n className?: string;\n classNameOverride?: boolean;\n width?: number;\n showIcon?: boolean;\n}\n\nconst TorrentListCell: FC<TorrentListCellProps> = observer(\n ({\n hash,\n content: TorrentListCellContent = DefaultTorrentListCellContent,\n column,\n className,\n classNameOverride = false,\n width,\n showIcon = false,\n }: TorrentListCellProps) => {\n const icon = showIcon ? ICONS[column] : null;\n\n return (\n <div\n className={\n classNameOverride\n ? className\n : classnames(\n 'torrent__detail',\n `torrent__detail--${column}`,\n className,\n css({pointerEvents: 'none', userSelect: 'none'}),\n )\n }\n role=\"cell\"\n style={{width: `${width}px`}}\n >\n {icon}\n {TorrentListCellContent ? (\n <TorrentListCellContent torrent={TorrentStore.torrents[hash]} column={column} />\n ) : (\n <DetailNotAvailable />\n )}\n </div>\n );\n },\n);\n\nexport default TorrentListCell;\n","import {CSSProperties, forwardRef, KeyboardEvent, MouseEvent, ReactElement, TouchEvent} from 'react';\nimport {observer} from 'mobx-react-lite';\n\nimport SettingStore from '../../stores/SettingStore';\nimport TorrentListCell from './TorrentListCell';\nimport TorrentListColumns from '../../constants/TorrentListColumns';\n\ninterface TorrentListRowCondensedProps {\n className: string;\n style: CSSProperties;\n hash: string;\n handleClick: (hash: string, event: MouseEvent) => void;\n handleDoubleClick: (hash: string) => void;\n handleRightClick: (hash: string, event: MouseEvent) => void;\n handleTouchStart: (event: TouchEvent) => void;\n handleTouchEnd: (event: TouchEvent) => void;\n handleKeyPress: (event: KeyboardEvent) => void;\n 'data-testid'?: string;\n 'data-torrent-status'?: string;\n 'data-torrent-name'?: string;\n 'data-is-selected'?: boolean;\n 'data-view-size'?: string;\n}\n\nconst TorrentListRowCondensed = observer(\n forwardRef<HTMLDivElement, TorrentListRowCondensedProps>(\n (\n {\n className,\n style,\n hash,\n handleClick,\n handleDoubleClick,\n handleRightClick,\n handleTouchStart,\n handleTouchEnd,\n handleKeyPress,\n ...dataAttributes\n }: TorrentListRowCondensedProps,\n ref,\n ) => {\n const torrentListColumns = SettingStore.floodSettings.torrentListColumns.reduce(\n (accumulator: Array<ReactElement>, {id, visible}) => {\n if (TorrentListColumns[id] == null) {\n return accumulator;\n }\n\n if (!visible) {\n return accumulator;\n }\n\n accumulator.push(\n <TorrentListCell\n className=\"table__cell\"\n key={id}\n hash={hash}\n column={id}\n width={SettingStore.floodSettings.torrentListColumnWidths[id]}\n />,\n );\n\n return accumulator;\n },\n [],\n );\n\n return (\n <div\n className={className}\n role=\"row\"\n style={style}\n tabIndex={0}\n onClick={(e) => handleClick(hash, e)}\n onContextMenu={(e) => handleRightClick(hash, e)}\n onDoubleClick={() => handleDoubleClick(hash)}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n onKeyPress={handleKeyPress}\n ref={ref}\n {...dataAttributes}\n >\n {torrentListColumns}\n </div>\n );\n },\n ),\n);\n\nexport default TorrentListRowCondensed;\n","import {CSSProperties, FC, forwardRef, KeyboardEvent, MouseEvent, ReactElement, TouchEvent} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLingui} from '@lingui/react';\n\nimport {css} from '@client/styled-system/css';\nimport SettingStore from '@client/stores/SettingStore';\nimport TorrentListColumns from '@client/constants/TorrentListColumns';\n\nimport Size from '../general/Size';\nimport TorrentListCell from './TorrentListCell';\n\nimport type {TorrentListCellContentProps} from './TorrentListCell';\n\ninterface TorrentListRowExpandedProps {\n className: string;\n style: CSSProperties;\n hash: string;\n handleClick: (hash: string, event: KeyboardEvent | MouseEvent) => void;\n handleDoubleClick: (hash: string) => void;\n handleRightClick: (hash: string, event: KeyboardEvent | MouseEvent) => void;\n handleTouchStart: (event: TouchEvent) => void;\n handleTouchEnd: (event: TouchEvent) => void;\n handleKeyPress: (event: KeyboardEvent) => void;\n 'data-testid'?: string;\n 'data-torrent-status'?: string;\n 'data-torrent-name'?: string;\n 'data-is-selected'?: boolean;\n 'data-view-size'?: string;\n}\n\nconst TorrentListCellPercentageNumber: FC<TorrentListCellContentProps> = observer(\n ({torrent}: TorrentListCellContentProps) => {\n const {i18n} = useLingui();\n return (\n <span>\n {i18n.number(torrent.percentComplete, {maximumFractionDigits: 1})}\n <em className=\"unit\">%</em>\n &nbsp;&mdash;&nbsp;\n <Size value={torrent.downTotal} />\n </span>\n );\n },\n);\n\nconst TorrentListRowExpanded = observer(\n forwardRef<HTMLDivElement, TorrentListRowExpandedProps>(\n (\n {\n className,\n style,\n hash,\n handleClick,\n handleDoubleClick,\n handleRightClick,\n handleTouchStart,\n handleTouchEnd,\n handleKeyPress,\n ...dataAttributes\n }: TorrentListRowExpandedProps,\n ref,\n ) => {\n const columns = SettingStore.floodSettings.torrentListColumns;\n\n const primarySection: Array<ReactElement> = [\n <TorrentListCell\n key=\"name\"\n hash={hash}\n column=\"name\"\n className=\"torrent__details__section torrent__details__section--primary\"\n />,\n ];\n const secondarySection: Array<ReactElement> = [\n <TorrentListCell key=\"eta\" hash={hash} column=\"eta\" showIcon />,\n <TorrentListCell key=\"downRate\" hash={hash} column=\"downRate\" showIcon />,\n <TorrentListCell key=\"upRate\" hash={hash} column=\"upRate\" showIcon />,\n ];\n const tertiarySection: Array<ReactElement> = [\n <TorrentListCell\n key=\"percentComplete\"\n hash={hash}\n column=\"percentComplete\"\n content={TorrentListCellPercentageNumber}\n showIcon\n />,\n ];\n const quaternarySection: Array<ReactElement> = [\n <TorrentListCell\n key=\"percentBar\"\n hash={hash}\n column=\"percentComplete\"\n className=\"torrent__details__section torrent__details__section--quaternary\"\n classNameOverride\n />,\n ];\n\n // Using a for loop to maximize performance.\n for (let index = 0; index < columns.length; index += 1) {\n const {id, visible} = columns[index];\n\n if (TorrentListColumns[id] != null && visible) {\n switch (id) {\n case 'name':\n break;\n case 'downRate':\n case 'upRate':\n case 'eta':\n break;\n case 'downTotal':\n case 'percentComplete':\n break;\n default:\n tertiarySection.push(<TorrentListCell key={id} hash={hash} column={id} showIcon />);\n break;\n }\n }\n }\n\n return (\n <div\n className={className}\n role=\"row\"\n style={style}\n tabIndex={0}\n onClick={(e) => handleClick(hash, e)}\n onContextMenu={(e) => handleRightClick(hash, e)}\n onDoubleClick={() => handleDoubleClick(hash)}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n onKeyPress={handleKeyPress}\n ref={ref}\n {...dataAttributes}\n >\n <div className={css({alignItems: 'center', display: 'flex'})}>\n {primarySection}\n <div className=\"torrent__details__section torrent__details__section--secondary\">{secondarySection}</div>\n </div>\n <div className=\"torrent__details__section torrent__details__section--tertiary\">{tertiarySection}</div>\n {quaternarySection}\n </div>\n );\n },\n ),\n);\n\nexport default TorrentListRowExpanded;\n","import classnames from 'classnames';\nimport {computed} from 'mobx';\nimport {CSSProperties, FC, KeyboardEvent, MouseEvent, TouchEvent, useRef, useState} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {useLongPress} from 'react-use';\n\nimport defaultFloodSettings from '@shared/constants/defaultFloodSettings';\n\nimport SettingStore from '@client/stores/SettingStore';\nimport {torrentStatusClasses} from '@client/util/torrentStatus';\nimport TorrentStore from '@client/stores/TorrentStore';\nimport UIStore from '@client/stores/UIStore';\n\nimport {getContextMenuItems} from './TorrentListContextMenu';\nimport TorrentListRowCondensed from './TorrentListRowCondensed';\nimport TorrentListRowExpanded from './TorrentListRowExpanded';\n\nconst displayContextMenu = (hash: string, event: KeyboardEvent | MouseEvent | TouchEvent) => {\n if (event.cancelable === true) {\n event.preventDefault();\n }\n\n const mouseClientX = (event as unknown as MouseEvent).clientX;\n const mouseClientY = (event as unknown as MouseEvent).clientY;\n const touchClientX = (event as unknown as TouchEvent).touches?.[0].clientX;\n const touchClientY = (event as unknown as TouchEvent).touches?.[0].clientY;\n\n if (!TorrentStore.selectedTorrents.includes(hash)) {\n TorrentStore.setSelectedTorrents({hash, event});\n }\n\n const {torrentContextMenuActions = defaultFloodSettings.torrentContextMenuActions} = SettingStore.floodSettings;\n const torrent = TorrentStore.torrents[hash];\n\n UIStore.setActiveContextMenu({\n id: 'torrent-list-item',\n clickPosition: {\n x: mouseClientX || touchClientX || 0,\n y: mouseClientY || touchClientY || 0,\n },\n items: getContextMenuItems(torrent).filter((item) => {\n if (item.type === 'separator') {\n return true;\n }\n\n return torrentContextMenuActions.some((action) => action.id === item.action && action.visible === true);\n }),\n });\n};\n\nconst displayTorrentDetails = (hash: string) => UIStore.setActiveModal({id: 'torrent-details', hash});\n\nconst selectTorrent = (hash: string, event: KeyboardEvent | MouseEvent | TouchEvent) =>\n TorrentStore.setSelectedTorrents({hash, event});\n\nconst onKeyPress = (hash: string, e: KeyboardEvent) => {\n if (e.key === ' ' || e.key === 'Enter' || e.key === 'ContextMenu') {\n e.preventDefault();\n if (TorrentStore.selectedTorrents.includes(hash)) {\n if (e.key === 'Enter') {\n displayTorrentDetails(hash);\n } else if (e.key === 'ContextMenu') {\n displayContextMenu(hash, e);\n }\n } else {\n selectTorrent(hash, e);\n }\n }\n};\n\ninterface TorrentListRowProps {\n hash: string;\n style: CSSProperties;\n}\n\nconst TorrentListRow: FC<TorrentListRowProps> = observer(({hash, style}: TorrentListRowProps) => {\n const [rowLocation, setRowLocation] = useState<number>(0);\n const shouldDisplayTorrentDetails = useRef<boolean>(false);\n const rowRef = useRef<HTMLDivElement>(null);\n\n const isCondensed = SettingStore.floodSettings.torrentListViewSize === 'condensed';\n const isSelected = computed(() => TorrentStore.selectedTorrents.includes(hash)).get();\n\n const {status, upRate, downRate} = TorrentStore.torrents?.[hash] || {};\n const torrentClasses = torrentStatusClasses(\n {status, upRate, downRate},\n classnames({\n 'torrent--is-selected': isSelected,\n 'torrent--is-condensed': isCondensed,\n 'torrent--is-expanded': !isCondensed,\n }),\n 'torrent',\n );\n\n const {onTouchStart, onTouchEnd} = useLongPress((e) => {\n const curRowLocation = rowRef.current?.getBoundingClientRect().top;\n if (e != null && curRowLocation != null && Math.abs(curRowLocation - rowLocation) < 25) {\n displayContextMenu(hash, e as unknown as TouchEvent);\n }\n });\n\n const onTouchStartHooked = (e: TouchEvent) => {\n if (!TorrentStore.selectedTorrents.includes(hash)) {\n selectTorrent(hash, e);\n }\n\n if (shouldDisplayTorrentDetails.current) {\n displayTorrentDetails(hash);\n } else {\n shouldDisplayTorrentDetails.current = true;\n setTimeout(() => {\n shouldDisplayTorrentDetails.current = false;\n }, 200);\n }\n\n setRowLocation(rowRef.current?.getBoundingClientRect().top || 0);\n\n onTouchStart(e);\n };\n\n const torrent = TorrentStore.torrents?.[hash];\n const torrentTestId = `torrent-${hash}`;\n const torrentStatus = status?.join('-') || 'unknown';\n\n if (isCondensed) {\n return (\n <TorrentListRowCondensed\n className={torrentClasses}\n ref={rowRef}\n style={style}\n hash={hash}\n handleClick={selectTorrent}\n handleDoubleClick={displayTorrentDetails}\n handleRightClick={displayContextMenu}\n handleTouchStart={onTouchStartHooked}\n handleTouchEnd={onTouchEnd}\n handleKeyPress={(e) => onKeyPress(hash, e)}\n data-testid={torrentTestId}\n data-torrent-status={torrentStatus}\n data-torrent-name={torrent?.name}\n data-is-selected={isSelected}\n data-view-size=\"condensed\"\n />\n );\n }\n\n return (\n <TorrentListRowExpanded\n className={torrentClasses}\n ref={rowRef}\n style={style}\n hash={hash}\n handleClick={selectTorrent}\n handleDoubleClick={displayTorrentDetails}\n handleRightClick={displayContextMenu}\n handleTouchStart={onTouchStartHooked}\n handleTouchEnd={onTouchEnd}\n handleKeyPress={(e) => onKeyPress(hash, e)}\n data-testid={torrentTestId}\n data-torrent-status={torrentStatus}\n data-torrent-name={torrent?.name}\n data-is-selected={isSelected}\n data-view-size=\"expanded\"\n />\n );\n});\n\nexport default TorrentListRow;\n","import {FC, KeyboardEvent, ReactNode, useEffect, useRef} from 'react';\nimport {observer} from 'mobx-react-lite';\nimport {reaction} from 'mobx';\nimport {Trans} from '@lingui/react';\nimport {useEvent} from 'react-use';\n\nimport type {FixedSizeList, ListChildComponentProps} from 'react-window';\n\nimport {Button} from '@client/ui';\nimport {Files} from '@client/ui/icons';\nimport ClientStatusStore from '@client/stores/ClientStatusStore';\nimport SettingActions from '@client/actions/SettingActions';\nimport SettingStore from '@client/stores/SettingStore';\nimport TorrentFilterStore from '@client/stores/TorrentFilterStore';\nimport TorrentStore from '@client/stores/TorrentStore';\nimport SortDirections from '@client/constants/SortDirections';\nimport UIStore from '@client/stores/UIStore';\n\nimport type {TorrentListColumn} from '@client/constants/TorrentListColumns';\n\nimport defaultFloodSettings from '@shared/constants/defaultFloodSettings';\n\nimport ContextMenuMountPoint from '../general/ContextMenuMountPoint';\nimport ListViewport from '../general/ListViewport';\nimport TableHeading from './TableHeading';\nimport TorrentListDropzone from './TorrentListDropzone';\nimport TorrentListRow from './TorrentListRow';\n\nconst TorrentListRowRenderer: FC<ListChildComponentProps> = observer(({index, style}) => (\n <TorrentListRow hash={TorrentStore.filteredTorrents[index].hash} style={style} />\n));\n\nconst TorrentList: FC = observer(() => {\n const listHeaderRef = useRef<HTMLDivElement>(null);\n const listViewportRef = useRef<FixedSizeList>(null);\n const listViewportOuterRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const dispose = reaction(\n () => TorrentFilterStore.filterTrigger,\n () => {\n if (listViewportRef.current != null) {\n listViewportRef.current.scrollTo(0);\n }\n },\n );\n\n return dispose;\n }, []);\n\n useEvent('keydown', (e: KeyboardEvent) => {\n const {ctrlKey, key, metaKey, repeat, target} = e;\n\n const tagName = (target as HTMLElement)?.tagName?.toUpperCase();\n if (tagName === 'INPUT' || tagName === 'TEXTAREA') {\n return;\n }\n\n if (repeat) {\n return;\n }\n\n if ((metaKey || ctrlKey) && key === 'a') {\n e.preventDefault();\n TorrentStore.selectAllTorrents();\n }\n\n if ((metaKey || ctrlKey) && key === 'v') {\n (async () => {\n const text = await navigator?.clipboard?.readText();\n const isMagnetLink = text?.startsWith('magnet:?');\n const isTorrentLink = text?.startsWith('http') && text?.endsWith('.torrent');\n if (isMagnetLink || isTorrentLink) {\n e.preventDefault();\n UIStore.setActiveModal({id: 'add-torrents', tab: 'by-url', urls: [{id: 0, value: text}]});\n }\n })();\n }\n });\n\n const torrents = TorrentStore.filteredTorrents;\n const {torrentListViewSize = 'condensed'} = SettingStore.floodSettings;\n\n const isCondensed = torrentListViewSize === 'condensed';\n const isListEmpty = torrents == null || torrents.length === 0;\n\n let content: ReactNode = null;\n let torrentListHeading: ReactNode = null;\n if (!ClientStatusStore.isConnected) {\n content = (\n <div className=\"torrents__alert__wrapper\">\n <div className=\"torrents__alert\">\n <Trans id=\"torrents.list.cannot.connect\" />\n </div>\n </div>\n );\n } else if (isListEmpty || torrents == null) {\n content = (\n <div className=\"torrents__alert__wrapper\">\n <div className=\"torrents__alert\">\n <Trans id=\"torrents.list.no.torrents\" />\n </div>\n {TorrentFilterStore.isFilterActive ? (\n <div className=\"torrents__alert__action\">\n <Button\n onClick={() => {\n TorrentFilterStore.clearAllFilters();\n }}\n priority=\"tertiary\"\n >\n <Trans id=\"torrents.list.clear.filters\" />\n </Button>\n </div>\n ) : null}\n </div>\n );\n } else {\n if (isCondensed) {\n torrentListHeading = (\n <TableHeading\n onCellFocus={() => {\n if (listViewportOuterRef.current != null && listHeaderRef.current != null) {\n listViewportOuterRef.current.scrollLeft = listHeaderRef.current.scrollLeft;\n }\n }}\n onCellClick={(property: TorrentListColumn) => {\n const currentSort = SettingStore.floodSettings.sortTorrents;\n\n let nextDirection = SortDirections[property] ?? 'asc';\n\n if (currentSort.property === property) {\n nextDirection = currentSort.direction === 'asc' ? 'desc' : 'asc';\n }\n\n const sortBy = {\n property,\n direction: nextDirection,\n };\n\n SettingActions.saveSetting('sortTorrents', sortBy);\n }}\n onWidthsChange={(column: TorrentListColumn, width: number) => {\n const {torrentListColumnWidths = defaultFloodSettings.torrentListColumnWidths} = SettingStore.floodSettings;\n\n SettingActions.saveSetting('torrentListColumnWidths', {\n ...torrentListColumnWidths,\n [column]: width,\n });\n }}\n ref={listHeaderRef}\n />\n );\n }\n\n // itemSize must sync with styles &--is-condensed and &--is-expanded\n content = (\n <ListViewport\n className=\"torrent__list__viewport\"\n itemCount={torrents.length}\n itemKey={(index) => TorrentStore.filteredTorrents[index].hash}\n itemRenderer={TorrentListRowRenderer}\n itemSize={isCondensed ? 30 : 70}\n ref={listViewportRef}\n outerRef={(ref) => {\n const viewportDiv = ref;\n if (viewportDiv != null && viewportDiv.onscroll == null) {\n viewportDiv.onscroll = () => {\n if (listHeaderRef.current != null) {\n listHeaderRef.current.scrollLeft = viewportDiv.scrollLeft;\n }\n };\n }\n listViewportOuterRef.current = viewportDiv;\n }}\n />\n );\n }\n\n return (\n <TorrentListDropzone>\n <div className=\"torrent__list__wrapper\" role=\"table\">\n <ContextMenuMountPoint id=\"torrent-list-item\" />\n {torrentListHeading}\n {content}\n </div>\n <div className=\"dropzone__overlay\">\n <div className=\"dropzone__copy\">\n <div className=\"dropzone__icon\">\n <Files />\n </div>\n <Trans id=\"torrents.list.drop\" />\n </div>\n </div>\n </TorrentListDropzone>\n );\n});\n\nexport default TorrentList;\n","/**\n * Loads OverlayScrollbars CSS into the third-party layer\n *\n * This workaround is necessary due to a known css-loader bug:\n * https://github.com/webpack-contrib/css-loader/issues/1532\n *\n * The issue: css-loader ignores @layer definitions when @import statements\n * appear later in the same file. Wrapping an @import with @layer like:\n * @layer third-party { @import 'overlayscrollbars/overlayscrollbars.css'; }\n * does NOT work - the CSS either doesn't load or loads without the layer.\n *\n * Our solution: Use raw-loader to import the CSS as text, then manually\n * inject it into the DOM wrapped in the correct @layer.\n */\n\n// @ts-expect-error - webpack loader syntax not recognized by TypeScript\nimport overlayScrollbarsCSS from '!raw-loader!overlayscrollbars/styles/overlayscrollbars.css';\n\n// Only inject if we successfully loaded the CSS\nif (typeof overlayScrollbarsCSS === 'string' && typeof document !== 'undefined') {\n const styleElement = document.createElement('style');\n styleElement.textContent = `@layer third-party { ${overlayScrollbarsCSS} }`;\n styleElement.setAttribute('data-layer', 'third-party');\n document.head.appendChild(styleElement);\n}\n","import {FC, lazy, useEffect} from 'react';\n\nimport ActionBar from '@client/components/torrent-list/ActionBar';\nimport ApplicationContent from '@client/components/layout/ApplicationContent';\nimport ApplicationPanel from '@client/components/layout/ApplicationPanel';\nimport ApplicationView from '@client/components/layout/ApplicationView';\nimport FloodActions from '@client/actions/FloodActions';\nimport Sidebar from '@client/components/sidebar/Sidebar';\nimport TorrentList from '@client/components/torrent-list/TorrentList';\n\n// Load OverlayScrollbars CSS into the third-party layer\nimport '@client/util/loadOverlayScrollbars';\n\nconst Alerts = lazy(() => import('@client/components/alerts/Alerts'));\nconst Modals = lazy(() => import('@client/components/modals/Modals'));\n\nconst Overview: FC = () => {\n useEffect(() => {\n FloodActions.startActivityStream();\n }, []);\n\n return (\n <ApplicationView>\n <Sidebar />\n <ApplicationContent>\n <ApplicationPanel modifier=\"torrent-list\" className=\"view--torrent-list\">\n <ActionBar />\n <TorrentList />\n </ApplicationPanel>\n <Modals />\n <Alerts />\n </ApplicationContent>\n </ApplicationView>\n );\n};\n\nexport default Overview;\n","import {FC} from 'react';\n\nimport ApplicationView from '@client/components/layout/ApplicationView';\nimport AuthForm from '@client/components/auth/AuthForm';\n\nconst LoginView: FC = () => (\n <ApplicationView modifier=\"auth-form\">\n <AuthForm mode=\"login\" />\n </ApplicationView>\n);\n\nexport default LoginView;\n","import classnames from 'classnames';\n\nimport type {TorrentProperties} from '@shared/types/Torrent';\n\nexport const torrentStatusClasses = (\n {status, downRate, upRate}: Pick<TorrentProperties, 'status' | 'downRate' | 'upRate'>,\n ...classes: Array<string>\n): string =>\n classnames(classes, {\n 'torrent--has-error': status.includes('error'),\n 'torrent--is-stopped': status.includes('stopped'),\n 'torrent--is-downloading': status.includes('downloading'),\n 'torrent--is-downloading--actively': downRate > 0,\n 'torrent--is-uploading--actively': upRate > 0,\n 'torrent--is-seeding': status.includes('seeding'),\n 'torrent--is-completed': status.includes('complete'),\n 'torrent--is-checking': status.includes('checking'),\n 'torrent--is-inactive': status.includes('inactive'),\n });\n\nexport const torrentStatusEffective = (status: TorrentProperties['status']): TorrentProperties['status'][number] => {\n let result: TorrentProperties['status'][number] = 'stopped';\n\n ['error', 'checking', 'stopped', 'downloading', 'seeding'].some((state) => {\n if (status.includes(state as TorrentProperties['status'][number])) {\n result = state as TorrentProperties['status'][number];\n return true;\n }\n return false;\n });\n\n return result;\n};\n","const TorrentListColumns = {\n dateAdded: 'torrents.properties.date.added',\n dateFinished: 'torrents.properties.date.finished',\n downRate: 'torrents.properties.download.speed',\n downTotal: 'torrents.properties.download.total',\n eta: 'torrents.properties.eta',\n name: 'torrents.properties.name',\n peers: 'torrents.properties.peers',\n percentComplete: 'torrents.properties.percentage',\n ratio: 'torrents.properties.ratio',\n seeds: 'torrents.properties.seeds',\n sizeBytes: 'torrents.properties.size',\n tags: 'torrents.properties.tags',\n upRate: 'torrents.properties.upload.speed',\n upTotal: 'torrents.properties.upload.total',\n dateCreated: 'torrents.properties.date.created',\n directory: 'torrents.properties.directory',\n hash: 'torrents.properties.hash',\n isPrivate: 'torrents.properties.is.private',\n message: 'torrents.properties.tracker.message',\n trackerURIs: 'torrents.properties.trackers',\n dateActive: 'torrents.properties.date.active',\n} as const;\n\nexport default TorrentListColumns;\nexport type TorrentListColumn = keyof typeof TorrentListColumns;\n","import {FC, ReactNode} from 'react';\nimport {Trans} from '@lingui/react';\n\nconst secondsToDuration = (\n cumSeconds: number,\n): {\n years?: number;\n weeks?: number;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n cumSeconds: number;\n} => {\n const years = Math.floor(cumSeconds / 31536000);\n const weeks = Math.floor((cumSeconds % 31536000) / 604800);\n const days = Math.floor(((cumSeconds % 31536000) % 604800) / 86400);\n const hours = Math.floor((((cumSeconds % 31536000) % 604800) % 86400) / 3600);\n const minutes = Math.floor(((((cumSeconds % 31536000) % 604800) % 86400) % 3600) / 60);\n const seconds = Math.floor(cumSeconds - minutes * 60);\n let timeRemaining = null;\n\n if (years > 0) {\n timeRemaining = {years, weeks, cumSeconds};\n } else if (weeks > 0) {\n timeRemaining = {weeks, days, cumSeconds};\n } else if (days > 0) {\n timeRemaining = {days, hours, cumSeconds};\n } else if (hours > 0) {\n timeRemaining = {hours, minutes, cumSeconds};\n } else if (minutes > 0) {\n timeRemaining = {minutes, seconds, cumSeconds};\n } else {\n timeRemaining = {seconds, cumSeconds};\n }\n\n return timeRemaining;\n};\n\ninterface DurationProps {\n suffix?: ReactNode;\n value: number;\n}\n\nconst Duration: FC<DurationProps> = ({suffix, value}: DurationProps) => {\n if (value == null) {\n return null;\n }\n\n let content = null;\n let suffixElement = null;\n\n if (suffix) {\n suffixElement = <span className=\"duration--segment\">{suffix}</span>;\n }\n\n const duration = value === -1 ? -1 : secondsToDuration(value);\n\n if (duration === -1) {\n content = <Trans id=\"unit.time.infinity\" />;\n } else if (duration.years != null && duration.years > 0) {\n content = [\n <span className=\"duration--segment\" key=\"years\">\n {duration.years}\n <em className=\"unit\">\n <Trans id=\"unit.time.year\" />\n </em>\n </span>,\n <span className=\"duration--segment\" key=\"weeks\">\n {duration.weeks}\n <em className=\"unit\">\n <Trans id=\"unit.time.week\" />\n </em>\n </span>,\n ];\n } else if (duration.weeks != null && duration.weeks > 0) {\n content = [\n <span className=\"duration--segment\" key=\"weeks\">\n {duration.weeks}\n <em className=\"unit\">\n <Trans id=\"unit.time.week\" />\n </em>\n </span>,\n <span className=\"duration--segment\" key=\"days\">\n {duration.days}\n <em className=\"unit\">\n <Trans id=\"unit.time.day\" />\n </em>\n </span>,\n ];\n } else if (duration.days != null && duration.days > 0) {\n content = [\n <span className=\"duration--segment\" key=\"days\">\n {duration.days}\n <em className=\"unit\">\n <Trans id=\"unit.time.day\" />\n </em>\n </span>,\n <span className=\"duration--segment\" key=\"hours\">\n {duration.hours}\n <em className=\"unit\">\n <Trans id=\"unit.time.hour\" />\n </em>\n </span>,\n ];\n } else if (duration.hours != null && duration.hours > 0) {\n content = [\n <span className=\"duration--segment\" key=\"hours\">\n {duration.hours}\n <em className=\"unit\">\n <Trans id=\"unit.time.hour\" />\n </em>\n </span>,\n <span className=\"duration--segment\" key=\"minutes\">\n {duration.minutes}\n <em className=\"unit\">\n <Trans id=\"unit.time.minute\" />\n </em>\n </span>,\n ];\n } else if (duration.minutes != null && duration.minutes > 0) {\n content = [\n <span className=\"duration--segment\" key=\"minutes\">\n {duration.minutes}\n <em className=\"unit\">\n <Trans id=\"unit.time.minute\" />\n </em>\n </span>,\n <span className=\"duration--segment\" key=\"seconds\">\n {duration.seconds}\n <em className=\"unit\">\n <Trans id=\"unit.time.second\" />\n </em>\n </span>,\n ];\n } else {\n content = (\n <span className=\"duration--segment\">\n {duration.seconds}\n <em className=\"unit\">\n <Trans id=\"unit.time.second\" />\n </em>\n </span>\n );\n }\n\n return (\n <span className=\"duration\">\n {content}\n {suffixElement}\n </span>\n );\n};\n\nexport default Duration;\n","import axios, {CancelToken} from 'axios';\nimport download from 'js-file-download';\n\nimport AlertStore from '@client/stores/AlertStore';\nimport ConfigStore from '@client/stores/ConfigStore';\nimport UIStore from '@client/stores/UIStore';\n\nimport type {\n AddTorrentByFileOptions,\n AddTorrentByURLOptions,\n ReannounceTorrentsOptions,\n SetTorrentsTagsOptions,\n} from '@shared/schema/api/torrents';\nimport {\n CheckTorrentsOptions,\n ICreateTorrentOptions,\n DeleteTorrentsOptions,\n MoveTorrentsOptions,\n SetTorrentContentsPropertiesOptions,\n SetTorrentsInitialSeedingOptions,\n SetTorrentsPriorityOptions,\n SetTorrentsSequentialOptions,\n SetTorrentsTrackersOptions,\n StartTorrentsOptions,\n StopTorrentsOptions,\n TorrentAddResponse,\n TorrentMediainfoResponse,\n} from '@shared/types/api/torrents';\nimport type {TorrentContent} from '@shared/types/TorrentContent';\nimport type {TorrentPeer} from '@shared/types/TorrentPeer';\nimport type {TorrentTracker} from '@shared/types/TorrentTracker';\nimport type {TorrentProperties} from '@shared/types/Torrent';\n\nconst {baseURI} = ConfigStore;\n\nconst emitRequestSentAlert = (count: number) => {\n AlertStore.add({\n id: 'alert.torrent.add.sent',\n count,\n });\n};\n\nconst emitTorrentAddedAlert = (count: number) => {\n AlertStore.add({\n id: 'alert.torrent.add',\n type: 'success',\n count,\n });\n};\n\nconst emitFailedToAddTorrentAlert = (count: number) => {\n AlertStore.add({\n id: 'alert.torrent.add.failed',\n type: 'error',\n count,\n });\n};\n\nconst TorrentActions = {\n addTorrentsByUrls: (options: AddTorrentByURLOptions): Promise<void> =>\n axios.post<TorrentAddResponse>(`${baseURI}api/torrents/add-urls`, options).then(\n ({data}) => {\n if (data.length) {\n emitTorrentAddedAlert(data.length);\n } else {\n emitRequestSentAlert(options.urls.length);\n }\n },\n () => {\n emitFailedToAddTorrentAlert(options.urls.length);\n },\n ),\n\n addTorrentsByFiles: (options: AddTorrentByFileOptions): Promise<void> =>\n axios.post<TorrentAddResponse>(`${baseURI}api/torrents/add-files`, options).then(\n ({data}) => {\n if (data.length) {\n emitTorrentAddedAlert(data.length);\n } else {\n emitRequestSentAlert(options.files.length);\n }\n },\n () => {\n emitFailedToAddTorrentAlert(options.files.length);\n },\n ),\n\n createTorrent: (options: ICreateTorrentOptions): Promise<void> =>\n axios.post<Blob>(`${baseURI}api/torrents/create`, options, {responseType: 'blob'}).then(\n ({data}) => {\n download(data, (options.name || `${Date.now()}`).concat('.torrent'));\n emitTorrentAddedAlert(1);\n },\n () => {\n emitFailedToAddTorrentAlert(1);\n },\n ),\n\n deleteTorrents: (options: DeleteTorrentsOptions): Promise<void> =>\n axios.post(`${baseURI}api/torrents/delete`, options).then(\n () =>\n AlertStore.add({\n id: 'alert.torrent.remove',\n type: 'success',\n count: options.hashes.length,\n }),\n () =>\n AlertStore.add({\n id: 'alert.torrent.remove.failed',\n type: 'error',\n count: options.hashes.length,\n }),\n ),\n\n checkHash: (options: CheckTorrentsOptions): Promise<void> =>\n axios.post(`${baseURI}api/torrents/check-hash`, options).then(\n () => {\n // do nothing.\n },\n () => {\n // do nothing.\n },\n ),\n\n fetchMediainfo: (hash: TorrentProperties['hash'], cancelToken?: CancelToken): Promise<{output: string}> =>\n axios\n .get<TorrentMediainfoResponse>(`${baseURI}api/torrents/${hash}/mediainfo`, {cancelToken})\n .then<{output: string}>((res) => res.data),\n\n fetchTorrentContents: (hash: TorrentProperties['hash']): Promise<Array<TorrentContent> | null> =>\n axios.get<Array<TorrentContent>>(`${baseURI}api/torrents/${hash}/contents`).then(\n (res) => res.data,\n () => null,\n ),\n\n fetchTorrentPeers: (hash: TorrentProperties['hash']): Promise<Array<TorrentPeer> | null> =>\n axios.get<Array<TorrentPeer>>(`${baseURI}api/torrents/${hash}/peers`).then(\n (res) => res.data,\n () => null,\n ),\n\n fetchTorrentTrackers: (hash: TorrentProperties['hash']): Promise<Array<TorrentTracker> | null> =>\n axios.get<Array<TorrentTracker>>(`${baseURI}api/torrents/${hash}/trackers`).then(\n (res) => res.data,\n () => null,\n ),\n\n getTorrentContentsDataPermalink: (hash: TorrentProperties['hash'], indices: number[]): Promise<string> =>\n axios\n .get(`${ConfigStore.baseURI}api/torrents/${hash}/contents/${indices.join(',')}/token`)\n .then(\n (res) =>\n `${window.location.protocol}//${window.location.host}${\n ConfigStore.baseURI\n }api/torrents/${hash}/contents/${indices.join(',')}/data?token=${res.data}`,\n ),\n\n moveTorrents: (options: MoveTorrentsOptions): Promise<void> =>\n axios.post(`${baseURI}api/torrents/move`, options).then(\n () =>\n AlertStore.add({\n id: 'alert.torrent.move',\n type: 'success',\n count: options.hashes.length,\n }),\n () =>\n AlertStore.add({\n id: 'alert.torrent.move.failed',\n type: 'error',\n count: options.hashes.length,\n }),\n ),\n\n reannounce: (options: ReannounceTorrentsOptions): Promise<void> =>\n axios.post(`${baseURI}api/torrents/reannounce`, options).then(\n () => {\n // do nothing.\n },\n () => {\n // do nothing.\n },\n ),\n\n startTorrents: async (options: StartTorrentsOptions): Promise<void> => {\n if (options.hashes.length > 0) {\n return axios.post(`${baseURI}api/torrents/start`, options).then(\n () => {\n // do nothing.\n },\n () => {\n // do nothing.\n },\n );\n }\n return undefined;\n },\n\n stopTorrents: async (options: StopTorrentsOptions): Promise<void> => {\n if (options.hashes.length > 0) {\n return axios.post(`${baseURI}api/torrents/stop`, options).then(\n () => {\n // do nothing.\n },\n () => {\n // do nothing.\n },\n );\n }\n return undefined;\n },\n\n setInitialSeeding: (options: SetTorrentsInitialSeedingOptions): Promise<void> =>\n axios.patch(`${baseURI}api/torrents/initial-seeding`, options).then(\n () => {\n // do nothing.\n },\n () => {\n // do nothing.\n },\n ),\n\n setPriority: (options: SetTorrentsPriorityOptions): Promise<void> =>\n axios.patch(`${baseURI}api/torrents/priority`, options).then(\n () => {\n // do nothing.\n },\n () => {\n // do nothing.\n },\n ),\n\n setSequential: (options: SetTorrentsSequentialOptions): Promise<void> =>\n axios.patch(`${baseURI}api/torrents/sequential`, options).then(\n () => {\n // do nothing.\n },\n () => {\n // do nothing.\n },\n ),\n\n setFilePriority: (hash: TorrentProperties['hash'], options: SetTorrentContentsPropertiesOptions): Promise<void> =>\n axios.patch(`${baseURI}api/torrents/${hash}/contents`, options).then(\n () => {\n // do nothing.\n },\n () => {\n // do nothing.\n },\n ),\n\n setTags: (options: SetTorrentsTagsOptions): Promise<void> =>\n axios.patch(`${baseURI}api/torrents/tags`, options).then(\n () => UIStore.handleSetTaxonomySuccess(),\n () => {\n // do nothing.\n },\n ),\n\n setTrackers: (options: SetTorrentsTrackersOptions): Promise<void> =>\n axios.patch(`${baseURI}api/torrents/trackers`, options).then(\n () => {\n // do nothing.\n },\n () => {\n // do nothing.\n },\n ),\n};\n\nexport default TorrentActions;\n","import {FC} from 'react';\n\nimport AuthForm from '@client/components/auth/AuthForm';\nimport ApplicationView from '@client/components/layout/ApplicationView';\n\nconst LoginView: FC = () => (\n <ApplicationView modifier=\"auth-form\">\n <AuthForm mode=\"register\" />\n </ApplicationView>\n);\n\nexport default LoginView;\n","import {FC, ReactNode} from 'react';\n\ninterface BadgeProps {\n children: ReactNode;\n}\n\nconst Badge: FC<BadgeProps> = ({children}: BadgeProps) => <div className=\"badge\">{children}</div>;\n\nexport default Badge;\n","import classnames from 'classnames';\nimport {FC, ReactNode} from 'react';\n\ninterface ApplicationViewProps {\n children: ReactNode;\n modifier?: string;\n}\n\nconst ApplicationView: FC<ApplicationViewProps> = ({children, modifier}: ApplicationViewProps) => {\n const classes = classnames('application__view', {\n [`application__view--${modifier}`]: modifier != null,\n });\n\n return <div className={classes}>{children}</div>;\n};\n\nexport default ApplicationView;\n","import {FC} from 'react';\nimport {useLingui} from '@lingui/react';\n\nimport {compute, getTranslationString} from '../../util/size';\n\ninterface SizeProps {\n value: number;\n precision?: number;\n isSpeed?: boolean;\n className?: string;\n}\n\nconst Size: FC<SizeProps> = ({value, isSpeed = false, className, precision = 2}: SizeProps) => {\n const computed = compute(value, precision);\n const {i18n} = useLingui();\n\n let translatedUnit = i18n._(getTranslationString(computed.unit));\n\n if (isSpeed) {\n translatedUnit = i18n._('unit.speed', {\n baseUnit: translatedUnit,\n });\n }\n\n return (\n <span className={className}>\n {Number.isNaN(computed.value) ? '—' : i18n.number(computed.value)}\n <em className=\"unit\">{translatedUnit}</em>\n </span>\n );\n};\n\nexport default Size;\n","import {FC, useRef, useState} from 'react';\nimport {useLingui} from '@lingui/react';\nimport {useNavigate} from 'react-router';\n\nimport {\n Button,\n Form,\n FormHandle,\n FormError,\n FormRow,\n Panel,\n PanelContent,\n PanelHeader,\n PanelFooter,\n Textbox,\n} from '@client/ui';\nimport AuthActions from '@client/actions/AuthActions';\n\nimport {AccessLevel} from '@shared/schema/constants/Auth';\n\nimport type {Credentials} from '@shared/schema/Auth';\nimport type {ClientConnectionSettings} from '@shared/schema/ClientConnectionSettings';\n\nimport ClientConnectionSettingsForm from '../general/connection-settings/ClientConnectionSettingsForm';\n\ntype LoginFormData = Pick<Credentials, 'username' | 'password'>;\ntype RegisterFormData = Pick<Credentials, 'username' | 'password'>;\n\ninterface AuthFormProps {\n mode: 'login' | 'register';\n}\n\nconst AuthForm: FC<AuthFormProps> = ({mode}: AuthFormProps) => {\n const {i18n} = useLingui();\n const formRef = useRef<FormHandle>(null);\n const clientConnectionSettingsRef = useRef<ClientConnectionSettings | null>(null);\n const [errorMessage, setErrorMessage] = useState<string | {id: string} | undefined>(undefined);\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n\n const navigate = useNavigate();\n\n const isLoginMode = mode === 'login';\n\n return (\n <div className=\"application__entry-barrier\">\n <Panel spacing=\"large\">\n <Form\n onSubmit={(submission) => {\n submission.event.preventDefault();\n\n setIsSubmitting(true);\n\n const formData = submission.formData as Partial<LoginFormData> | Partial<RegisterFormData>;\n\n if (formData.username == null || formData.username === '') {\n setIsSubmitting(false);\n setErrorMessage({id: 'auth.error.username.empty'});\n return;\n }\n\n if (formData.password == null || formData.password === '') {\n setIsSubmitting(false);\n setErrorMessage({id: 'auth.error.password.empty'});\n return;\n }\n\n if (isLoginMode) {\n const credentials = formData as LoginFormData;\n\n AuthActions.authenticate({\n username: credentials.username,\n password: credentials.password,\n })\n .then(() => {\n setIsSubmitting(false);\n navigate('/overview', {replace: true});\n })\n .catch((error: Error) => {\n setIsSubmitting(false);\n setErrorMessage(error.message);\n navigate('/login', {replace: true});\n });\n } else {\n const config = formData as RegisterFormData;\n\n if (clientConnectionSettingsRef.current == null) {\n setIsSubmitting(false);\n setErrorMessage({id: 'connection.settings.error.empty'});\n return;\n }\n\n const connectionSettings = clientConnectionSettingsRef.current;\n if (connectionSettings == null) {\n setIsSubmitting(false);\n setErrorMessage({id: 'connection.settings.error.empty'});\n return;\n }\n\n AuthActions.register({\n username: config.username,\n password: config.password,\n client: connectionSettings,\n level: AccessLevel.ADMINISTRATOR,\n }).then(\n () => {\n setIsSubmitting(false);\n navigate('/overview', {replace: true});\n },\n (error: Error) => {\n setIsSubmitting(false);\n setErrorMessage(error.message);\n },\n );\n }\n }}\n ref={formRef}\n >\n <PanelHeader>\n <h1>{isLoginMode ? i18n._('auth.login') : i18n._('auth.create.an.account')}</h1>\n </PanelHeader>\n <PanelContent>\n <p className=\"copy--lead\">\n {isLoginMode ? i18n._('auth.login.intro') : i18n._('auth.create.an.account.intro')}\n </p>\n {errorMessage != null ? (\n <FormRow>\n <FormError isLoading={isSubmitting}>\n {typeof errorMessage === 'string' ? errorMessage : i18n._(errorMessage)}\n </FormError>\n </FormRow>\n ) : null}\n <FormRow>\n <Textbox placeholder={i18n._('auth.username')} id=\"username\" autoComplete=\"username\" />\n </FormRow>\n <FormRow>\n <Textbox\n placeholder={i18n._('auth.password')}\n id=\"password\"\n type=\"password\"\n autoComplete={isLoginMode ? 'current-password' : 'new-password'}\n />\n </FormRow>\n </PanelContent>\n {isLoginMode ? null : (\n <PanelContent hasBorder>\n <ClientConnectionSettingsForm\n onSettingsChange={(settings) => {\n clientConnectionSettingsRef.current = settings;\n }}\n />\n </PanelContent>\n )}\n <PanelFooter hasBorder>\n <FormRow justify=\"end\">\n <Button\n priority=\"tertiary\"\n onClick={() => {\n if (formRef.current != null) {\n formRef.current.resetForm();\n }\n }}\n >\n {i18n._('auth.input.clear')}\n </Button>\n <Button isLoading={isSubmitting} type=\"submit\">\n {isLoginMode ? i18n._('auth.log.in') : i18n._('auth.create.account')}\n </Button>\n </FormRow>\n </PanelFooter>\n </Form>\n </Panel>\n </div>\n );\n};\n\nexport default AuthForm;\n","const PriorityLevels = {\n file: {\n 0: 'DONT_DOWNLOAD',\n 1: 'NORMAL',\n 2: 'HIGH',\n },\n torrent: {\n 0: 'DONT_DOWNLOAD',\n 1: 'LOW',\n 2: 'NORMAL',\n 3: 'HIGH',\n },\n} as const;\n\nexport default PriorityLevels;\n","import React, {FC, ReactNode, useState} from 'react';\nimport {useLingui} from '@lingui/react';\nimport {css} from '@client/styled-system/css';\n\nimport PriorityLevels from '../../constants/PriorityLevels';\n\ninterface PriorityMeterProps {\n id: string | number;\n level: number;\n maxLevel: number;\n priorityType: keyof typeof PriorityLevels;\n showLabel?: boolean;\n clickHandled?: boolean;\n changePriorityFuncRef?: React.MutableRefObject<() => number>;\n onChange: (id: this['id'], level: this['level']) => void;\n}\n\nconst PriorityMeter: FC<PriorityMeterProps> = ({\n id,\n level,\n maxLevel,\n priorityType,\n showLabel = false,\n clickHandled = false,\n changePriorityFuncRef,\n onChange,\n}: PriorityMeterProps) => {\n const {i18n} = useLingui();\n const [priorityLevel, setPriorityLevel] = useState<number>(level);\n\n const changePriority = () => {\n let newLevel = priorityLevel;\n\n if (newLevel >= maxLevel) {\n newLevel = 0;\n } else {\n newLevel += 1;\n }\n\n setPriorityLevel(newLevel);\n onChange(id, newLevel);\n\n return newLevel;\n };\n\n if (changePriorityFuncRef != null) {\n changePriorityFuncRef.current = changePriority;\n }\n\n let labelElement: ReactNode;\n if (showLabel) {\n const priorityLevels = PriorityLevels[priorityType];\n\n let priorityLabelElement: ReactNode;\n switch (priorityLevels[priorityLevel as keyof typeof priorityLevels]) {\n case 'DONT_DOWNLOAD':\n priorityLabelElement = i18n._('priority.dont.download');\n break;\n case 'HIGH':\n priorityLabelElement = i18n._('priority.high');\n break;\n case 'LOW':\n priorityLabelElement = i18n._('priority.low');\n break;\n default:\n priorityLabelElement = i18n._('priority.normal');\n break;\n }\n\n labelElement = <span className=\"priority-meter__label\">{priorityLabelElement}</span>;\n }\n\n const levelElement = (\n <div className={`priority-meter priority-meter--max-${maxLevel} priority-meter--level-${priorityLevel}`} />\n );\n\n const styles = css({\n _focus: {\n outline: 'none',\n WebkitTapHighlightColor: 'transparent',\n },\n _focusVisible: {\n outline: 'dashed',\n },\n });\n\n return clickHandled ? (\n <div className={`priority-meter__wrapper ${styles}`}>\n {levelElement}\n {labelElement}\n </div>\n ) : (\n <button\n className={`priority-meter__wrapper ${styles}`}\n type=\"button\"\n onClick={() => {\n changePriority();\n }}\n >\n {levelElement}\n {labelElement}\n </button>\n );\n};\n\nexport default PriorityMeter;\n"],"names":["start","stop","remove","checkHash","reannounce","setTaxonomy","move","setTrackers","torrentDetails","downloadContents","downloadMetainfo","generateMagnet","setInitialSeeding","setSequential","setPriority","memo","status","_jsx","Error","Spinner","Start","Stop","observer","percent","_jsxs","className","children","TorrentStatusIcon","style","width","Action","clickHandler","icon","label","slug","noTip","classes","classnames","Tooltip","content","onClick","position","wrapperClassName","suppress","dateAdded","dateFinished","dateActive","downRate","downTotal","upRate","upTotal","DropdownButton","isFocusHandled","role","type","css","height","textAlign","_focusVisible","outline","baseClassName","dropdownWrapperClass","dropdownButtonClass","dropdownClickRef","direction","header","matchButtonWidth","menuItems","noWrap","trigger","handleItemSelect","onOpen","id","useRef","uniqueId","isOpen","UIStore","activeDropdownMenu","current","dropdownWrapperClassName","closeDropdown","useCallback","window","removeEventListener","setActiveDropdownMenu","useKeyPressEvent","openDropdown","addEventListener","handleDropdownClick","event","stopPropagation","contentElement","headerElement","listElement","map","items","index","item","itemIndex","selectable","selected","disabled","undefined","displayName","CSSTransition","classNames","timeout","enter","exit","TransitionGroup","SORT_PROPERTIES","props","selectedProperty","onSortChange","i18n","useLingui","Trans","TorrentListColumns","sortProp","isSelected","directionIndicator","_","property","Dropdown","selection","nextDirection","SortDirections","sortTorrents","sortBy","torrentListViewSize","SettingStore","floodSettings","Menu","view","document","getElementsByClassName","classList","toggle","SortDropdown","newSortBy","SettingActions","saveSetting","TorrentActions","startTorrents","hashes","TorrentStore","selectedTorrents","stopTorrents","Add","setActiveModal","Remove","ApplicationContent","modifier","DiskUsageTooltipItem","value","Size","disks","DiskUsageStore","mountPoints","diskMap","reduce","disksByTarget","disk","target","diskNodes","filter","d","used","avail","size","styles","cursor","lodash","round","ProgressBar","length","title","FeedsButton","tooltipRef","dismissTooltip","ref","Feed","focusStyle","_focus","WebkitTapHighlightColor","SidebarFilter","name","_name","isActive","count","handleClick","nameSpanRef","createRef","overflowed","setOverflowed","useState","useEffect","scrollWidth","clientWidth","useRefTextOverflowed","expanded","setExpanded","expanderClassNames","display","Badge","buildLocationFilterTree","location","containedCount","onlyChild","separator","fullPath","includes","directoryName","TorrentFilterStore","setLocationFilters","locationFilter","containedSize","taxonomy","locationTree","filterElements","NOTIFICATIONS_PER_PAGE","fetchNotifications","paginationStart","FloodActions","limit","NotificationTopToolbar","notificationTotal","countStart","countEnd","NotificationItem","notification","date","Date","ts","year","month","day","hour","minute","data","NotificationBottomToolbar","onPrevClick","onClearClick","onNextClick","olderTo","newerFrom","ChevronLeft","ChevronRight","notificationsListRef","isLoading","setIsLoading","setPaginationStart","prevHeight","setPrevHeight","hasNotification","notifications","notificationCount","NotificationStore","total","finally","contentClassName","LoadingIndicatorDots","minHeight","newPaginationStart","clientHeight","clearNotifications","interactive","NotificationIcon","inputRef","searchFilter","isSearchActive","sidebar__item","search","setSearchFilter","blur","Close","Search","placeholder","onChange","SettingsButton","Settings","SidebarActions","HumanReadableSpeed","bytes","isSpeed","precision","getSpeedList","speedLimits","throttleGlobalDownSpeed","throttleGlobalUpSpeed","heading","currentThrottle","download","upload","speeds","insertCurrentThrottle","insertionPoint","sortedIndex","splice","unshift","speedListOptions","clientSettings","ClientActions","Limits","Expando","Chevron","transform","All","DownloadSmall","UploadSmall","Completed","Active","Inactive","setStatusFilters","statusCounts","statusFilter","statusSizes","expandoClick","tags","Object","keys","tagCounts","slice","sort","a","b","localeCompare","tag","setTagFilters","tagFilter","tagSizes","ThemeSwitchButton","ConfigStore","isPreferDark","setUserPreferDark","ThemeSwitch","trackers","trackerCounts","tracker","setTrackerFilters","trackerFilter","trackerSizes","icons","Download","infinity","InfinityIcon","Upload","inspectorPoint","getCurrentTransferRate","options","transferSummary","TransferDataStore","throttles","transferTotals","transferRates","secondaryDataClasses","ClientStatusStore","isConnected","timestampClasses","showHoverDuration","timestamp","Duration","suffix","Math","trunc","now","TransferRateGraphGradient","x1","y1","x2","y2","offset","getSpeedAtHoverPoint","history","hoverPoint","upperSpeed","ceil","lowerSpeed","floor","handlerRefs","onHover","onMouseOut","isHovered","setIsHovered","historicalData","xScale","scaleLinear","domain","range","yScale","max","dataPoint","handleMouseMove","mouseX","invert","handleMouseOut","handleMouseOver","timestamps","interpolation","curveMonotoneX","TRANSFER_DIRECTIONS","fill","area","x","_dataPoint","y0","curve","line","y","r","opacity","graphInspectorPoint","setGraphInspectorPoint","sidebarWidth","setSidebarWidth","rateGraphHandlerRefs","Measure","onResize","contentRect","measureRef","onMouseMove","nativeEvent","clientX","onMouseOver","onFocus","onBlur","TransferRateDetails","TransferRateGraph","Sidebar","OverlayScrollbarsComponent","scrollbars","autoHide","clickScroll","dragScroll","theme","overflow","flexDirection","SpeedLimitDropdown","NotificationsButton","LogoutButton","TransferData","SearchBox","StatusFilters","TagFilters","TrackerFilters","LocationFilters","DiskUsage","flexGrow","activeContextMenu","triggerCoordinates","clickPosition","dismissContextMenu","ContextMenu","onOverlayClick","onOverlayRightClick","e","preventDefault","isIn","menuItemContent","menuItemClasses","labelAction","labelSecondary","dismissMenu","stopImmediatePropagation","onContextMenu","action","Overflow","forwardRef","onScroll","osRef","scrollbarRef","viewport","osInstance","elements","passive","ListViewport","itemCount","itemKey","itemRenderer","itemSize","outerRef","windowHeight","useWindowSize","FixedSizeList","outerElementType","isSmallScreen","overscanCount","pointerDownStyles","onCellClick","onCellFocus","onWidthsChange","isPointerDown","setIsPointerDown","focusedCell","focusedCellWidth","lastPointerX","tableHeading","useEnsuredForwardedRef","resizeLine","handlePointerMove","widthDelta","nextCellWidth","getBoundingClientRect","top","handlePointerUp","removeGlobalStyle","torrentListColumns","accumulator","visible","labelID","handle","torrentListColumnWidths","onPointerDown","addGlobalStyle","isSortActive","push","handleFileDrop","files","processedFiles","forEach","file","reader","FileReader","onload","result","split","tab","readAsDataURL","TorrentListDropzone","getRootProps","isDragActive","useDropzone","onDrop","noClick","noKeyboard","evt","getLastSelectedTorrent","InlineTorrentPropertyCheckbox","torrents","Checkmark","getContextMenuItems","torrent","changePriorityFuncRef","TorrentContextMenuActions","hash","link","createElement","href","baseURI","body","appendChild","click","removeChild","join","isInitialSeeding","isSequential","priority","PriorityMeter","level","maxLevel","priorityType","showLabel","clickHandled","ICONS","eta","Clock","sizeBytes","DiskFlat","DownloadThick","directory","FolderClosedSolid","Hash","Calendar","dateCreated","CalendarCreated","CalendarFinished","isPrivate","Lock","message","TrackerMessage","percentComplete","peers","Peers","ratio","Ratio","seeds","Seeds","trackerURIs","Radar","UploadThick","BooleanCell","CheckmarkThick","DateCell","ETACell","PeerCell","peersConnected","totalPeers","values","connected","number","of","RatioCell","maximumFractionDigits","TagsCell","TrackersCell","DefaultTorrentListCellContent","column","seedsConnected","seedsTotal","peersTotal","computed","get","torrentStatusEffective","TorrentListCellContent","classNameOverride","showIcon","pointerEvents","userSelect","DetailNotAvailable","handleDoubleClick","handleRightClick","handleTouchStart","handleTouchEnd","handleKeyPress","dataAttributes","TorrentListCell","tabIndex","onDoubleClick","onTouchStart","onTouchEnd","onKeyPress","TorrentListCellPercentageNumber","columns","primarySection","secondarySection","tertiarySection","quaternarySection","alignItems","displayContextMenu","cancelable","mouseClientX","mouseClientY","clientY","touchClientX","touches","touchClientY","setSelectedTorrents","torrentContextMenuActions","defaultFloodSettings","setActiveContextMenu","some","displayTorrentDetails","selectTorrent","key","rowLocation","setRowLocation","shouldDisplayTorrentDetails","rowRef","isCondensed","torrentClasses","torrentStatusClasses","useLongPress","curRowLocation","abs","onTouchStartHooked","setTimeout","torrentTestId","torrentStatus","TorrentListRowCondensed","TorrentListRowExpanded","TorrentListRowRenderer","TorrentListRow","filteredTorrents","listHeaderRef","listViewportRef","listViewportOuterRef","reaction","filterTrigger","scrollTo","useEvent","ctrlKey","metaKey","repeat","tagName","toUpperCase","selectAllTorrents","text","navigator","clipboard","readText","isMagnetLink","startsWith","isTorrentLink","endsWith","urls","isListEmpty","torrentListHeading","isFilterActive","Button","clearAllFilters","TableHeading","scrollLeft","currentSort","viewportDiv","onscroll","ContextMenuMountPoint","Files","overlayScrollbarsCSS","styleElement","textContent","setAttribute","head","Alerts","lazy","Modals","Overview","startActivityStream","ApplicationView","ApplicationPanel","ActionBar","TorrentList","LoginView","AuthForm","mode","state","suffixElement","duration","cumSeconds","years","weeks","days","hours","minutes","seconds","timeRemaining","secondsToDuration","emitRequestSentAlert","AlertStore","add","emitTorrentAddedAlert","emitFailedToAddTorrentAlert","addTorrentsByUrls","axios","post","then","addTorrentsByFiles","createTorrent","responseType","concat","deleteTorrents","fetchMediainfo","cancelToken","res","fetchTorrentContents","fetchTorrentPeers","fetchTorrentTrackers","getTorrentContentsDataPermalink","indices","protocol","host","moveTorrents","async","patch","setFilePriority","setTags","handleSetTaxonomySuccess","compute","translatedUnit","getTranslationString","unit","baseUnit","Number","isNaN","formRef","clientConnectionSettingsRef","errorMessage","setErrorMessage","isSubmitting","setIsSubmitting","navigate","useNavigate","isLoginMode","Panel","spacing","Form","onSubmit","submission","formData","username","password","credentials","AuthActions","authenticate","replace","catch","error","config","connectionSettings","register","client","AccessLevel","ADMINISTRATOR","PanelHeader","PanelContent","FormRow","FormError","Textbox","autoComplete","hasBorder","ClientConnectionSettingsForm","onSettingsChange","settings","PanelFooter","justify","resetForm","priorityLevel","setPriorityLevel","changePriority","newLevel","labelElement","priorityLabelElement","PriorityLevels","levelElement"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(globalThis.webpackChunk_jesec_flood=globalThis.webpackChunk_jesec_flood||[]).push([[703],{233:(t,e,s)=>{t.exports=s.p+"static/media/mz.facb4ea3.png"},240:(t,e,s)=>{t.exports=s.p+"static/media/ec.349d9bd7.png"},357:(t,e,s)=>{t.exports=s.p+"static/media/pa.b28a9059.png"},524:(t,e,s)=>{t.exports=s.p+"static/media/km.7bbed3e9.png"},679:(t,e,s)=>{t.exports=s.p+"static/media/bi.4923e3a3.png"},1078:(t,e,s)=>{t.exports=s.p+"static/media/so.b455e3bf.png"},1206:(t,e,s)=>{t.exports=s.p+"static/media/kg.2c47c2af.png"},1429:(t,e,s)=>{t.exports=s.p+"static/media/cd.a5bfda53.png"},1530:(t,e,s)=>{t.exports=s.p+"static/media/hn.64ee6aad.png"},2111:(t,e,s)=>{t.exports=s.p+"static/media/cn.e6a26073.png"},2514:(t,e,s)=>{t.exports=s.p+"static/media/bd.516278fc.png"},2616:(t,e,s)=>{t.exports=s.p+"static/media/sa.859049c8.png"},2627:(t,e,s)=>{t.exports=s.p+"static/media/ad.1b24595d.png"},3095:(t,e,s)=>{t.exports=s.p+"static/media/cf.de7d5d92.png"},3650:(t,e,s)=>{t.exports=s.p+"static/media/my.916a8392.png"},3781:(t,e,s)=>{t.exports=s.p+"static/media/dm.f452e6cd.png"},3792:(t,e,s)=>{t.exports=s.p+"static/media/bf.50bfcb31.png"},4243:(t,e,s)=>{t.exports=s.p+"static/media/ls.901ddb71.png"},4250:(t,e,s)=>{t.exports=s.p+"static/media/sc.3293efde.png"},4961:(t,e,s)=>{t.exports=s.p+"static/media/zw.a6809447.png"},5032:(t,e,s)=>{t.exports=s.p+"static/media/pt.1f82dc04.png"},5725:(t,e,s)=>{t.exports=s.p+"static/media/az.63afef5b.png"},6182:(t,e,s)=>{s.r(e),s.d(e,{default:()=>x});var a=s(2618),p=s(6488),i=s(3443),c=s(6942),n=s.n(c),d=s(9161),r=s(7550),o=s(942),l=s(4848);const m=(0,i.PA)(t=>{const{id:e}=t,{count:s,type:a}=r.A.alerts[e]||{};if(null==e||null==s||null==a)return null;const p=n()("alert",{"is-success":"success"===a,"is-error":"error"===a});let i=(0,l.jsx)(o.Ol,{});return"error"===a&&(i=(0,l.jsx)(o.qz,{})),(0,l.jsxs)("li",{className:p,children:[i,(0,l.jsx)("span",{className:"alert__content",children:(0,l.jsx)(d.x6,{id:e,values:{count:s,countElement:(0,l.jsx)("span",{className:"alert__count",children:s})}})})]})}),x=(0,i.PA)(()=>{const{sortedAlerts:t}=r.A;return(0,l.jsx)(a.A,{children:null!=t&&t.length>0?(0,l.jsx)(p.A,{classNames:"alerts__list",timeout:{enter:250,exit:250},children:(0,l.jsx)("ul",{className:"alerts__list",children:t.map(t=>(0,l.jsx)(m,{id:t.id},t.id))},"alerts-list")}):null})})},6336:(t,e,s)=>{t.exports=s.p+"static/media/nr.7527cc38.png"},6571:(t,e,s)=>{t.exports=s.p+"static/media/jm.20330ef4.png"},7066:(t,e,s)=>{t.exports=s.p+"static/media/uy.a943f85e.png"},7256:(t,e,s)=>{t.exports=s.p+"static/media/nz.738be05b.png"},7559:(t,e,s)=>{t.exports=s.p+"static/media/gb.e00065bf.png"},7941:(t,e,s)=>{t.exports=s.p+"static/media/st.5ae44155.png"},8052:(t,e,s)=>{t.exports=s.p+"static/media/gy.a4f62b6c.png"},8579:(t,e,s)=>{t.exports=s.p+"static/media/il.cd1d1faf.png"},9160:(t,e,s)=>{t.exports=s.p+"static/media/bn.077671e2.png"},9332:(t,e,s)=>{t.exports=s.p+"static/media/br.ec051f0c.png"},9923:(t,e,s)=>{t.exports=s.p+"static/media/sr.5adc1c00.png"},9985:(t,e,s)=>{t.exports=s.p+"static/media/kh.4732c810.png"}}]);
2
+ //# sourceMappingURL=flag0.390f4d80.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/js/flag0.390f4d80.chunk.js","mappings":"0iDAYA,MAkCA,GAlC8BA,EAAAA,EAAAA,IAAUC,IACtC,MAAM,GAACC,GAAMD,GACP,MAACE,EAAK,KAAEC,GAAQC,EAAAA,EAAWC,OAAOJ,IAAO,CAAC,EAEhD,GAAU,MAANA,GAAuB,MAATC,GAAyB,MAARC,EACjC,OAAO,KAGT,MAAMG,EAAeC,IAAW,QAAS,CACvC,aAAuB,YAATJ,EACd,WAAqB,UAATA,IAGd,IAAIK,GAAOC,EAAAA,EAAAA,KAACC,EAAAA,GAAe,IAK3B,MAJa,UAATP,IACFK,GAAOC,EAAAA,EAAAA,KAACE,EAAAA,GAAiB,MAIzBC,EAAAA,EAAAA,MAAA,MAAIC,UAAWP,EAAaQ,SAAA,CACzBN,GACDC,EAAAA,EAAAA,KAAA,QAAMI,UAAU,iBAAgBC,UAC9BL,EAAAA,EAAAA,KAACM,EAAAA,GAAK,CACJd,GAAIA,EACJe,OAAQ,CACNd,QACAe,cAAcR,EAAAA,EAAAA,KAAA,QAAMI,UAAU,eAAcC,SAAEZ,cCb1D,GAlBmBH,EAAAA,EAAAA,IAAS,KAC1B,MAAM,aAACmB,GAAgBd,EAAAA,EAEvB,OACEK,EAAAA,EAAAA,KAACU,EAAAA,EAAe,CAAAL,SACG,MAAhBI,GAAwBA,EAAaE,OAAS,GAC7CX,EAAAA,EAAAA,KAACY,EAAAA,EAAa,CAACC,WAAW,eAAeC,QAAS,CAACC,MAAO,IAAKC,KAAM,KAAKX,UACxEL,EAAAA,EAAAA,KAAA,MAAII,UAAU,eAAcC,SACzBI,EAAaQ,IAAKC,IACjBlB,EAAAA,EAAAA,KAACmB,EAAK,CAAgB3B,GAAI0B,EAAM1B,IAApB0B,EAAM1B,MAFW,iBAMjC,Q","sources":["client/src/javascript/components/alerts/Alert.tsx","client/src/javascript/components/alerts/Alerts.tsx"],"sourcesContent":["import {FC} from 'react';\nimport classnames from 'classnames';\nimport {observer} from 'mobx-react-lite';\nimport {Trans} from '@lingui/react';\n\nimport AlertStore from '@client/stores/AlertStore';\nimport {CircleCheckmark, CircleExclamation} from '@client/ui/icons';\n\ninterface AlertProps {\n id: string;\n}\n\nconst Alert: FC<AlertProps> = observer((props: AlertProps) => {\n const {id} = props;\n const {count, type} = AlertStore.alerts[id] || {};\n\n if (id == null || count == null || type == null) {\n return null;\n }\n\n const alertClasses = classnames('alert', {\n 'is-success': type === 'success',\n 'is-error': type === 'error',\n });\n\n let icon = <CircleCheckmark />;\n if (type === 'error') {\n icon = <CircleExclamation />;\n }\n\n return (\n <li className={alertClasses}>\n {icon}\n <span className=\"alert__content\">\n <Trans\n id={id}\n values={{\n count,\n countElement: <span className=\"alert__count\">{count}</span>,\n }}\n />\n </span>\n </li>\n );\n});\n\nexport default Alert;\n","import {CSSTransition, TransitionGroup} from 'react-transition-group';\nimport {FC} from 'react';\nimport {observer} from 'mobx-react-lite';\n\nimport Alert from './Alert';\nimport AlertStore from '../../stores/AlertStore';\n\nconst Alerts: FC = observer(() => {\n const {sortedAlerts} = AlertStore;\n\n return (\n <TransitionGroup>\n {sortedAlerts != null && sortedAlerts.length > 0 ? (\n <CSSTransition classNames=\"alerts__list\" timeout={{enter: 250, exit: 250}}>\n <ul className=\"alerts__list\" key=\"alerts-list\">\n {sortedAlerts.map((alert) => (\n <Alert key={alert.id} id={alert.id} />\n ))}\n </ul>\n </CSSTransition>\n ) : null}\n </TransitionGroup>\n );\n});\n\nexport default Alerts;\n"],"names":["observer","props","id","count","type","AlertStore","alerts","alertClasses","classnames","icon","_jsx","CircleCheckmark","CircleExclamation","_jsxs","className","children","Trans","values","countElement","sortedAlerts","TransitionGroup","length","CSSTransition","classNames","timeout","enter","exit","map","alert","Alert"],"sourceRoot":""}