openc3-cosmos-tool-docs 6.8.0 → 6.9.0

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 (250) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -5
  3. data/Rakefile +1 -1
  4. data/tools/staticdocs/404.html +2 -2
  5. data/tools/staticdocs/assets/css/styles.946be27d.css +1 -0
  6. data/tools/staticdocs/assets/js/019369f3.64763f3d.js +1 -0
  7. data/tools/staticdocs/assets/js/058ffc22.4be515f5.js +1 -0
  8. data/tools/staticdocs/assets/js/0686a885.3d58085e.js +1 -0
  9. data/tools/staticdocs/assets/js/078dbab0.f2cbcc66.js +1 -0
  10. data/tools/staticdocs/assets/js/{0f5d161c.0727eb1b.js → 0f5d161c.978b9fee.js} +1 -1
  11. data/tools/staticdocs/assets/js/0ff569c9.27128023.js +1 -0
  12. data/tools/staticdocs/assets/js/10209fc9.669ef887.js +1 -0
  13. data/tools/staticdocs/assets/js/103cc3be.1a538098.js +1 -0
  14. data/tools/staticdocs/assets/js/{13196248.9e1ebaa5.js → 13196248.f932d5bd.js} +1 -1
  15. data/tools/staticdocs/assets/js/{13c1b4e4.6446ccbc.js → 13c1b4e4.9735bb59.js} +1 -1
  16. data/tools/staticdocs/assets/js/1c0a0c05.427f2699.js +1 -0
  17. data/tools/staticdocs/assets/js/{1e02e6a3.a89f2446.js → 1e02e6a3.da7b7250.js} +1 -1
  18. data/tools/staticdocs/assets/js/{2047b354.0955283c.js → 2047b354.c86efa5f.js} +1 -1
  19. data/tools/staticdocs/assets/js/22b3ac48.1932e5a5.js +1 -0
  20. data/tools/staticdocs/assets/js/26b8abb2.858cb22d.js +1 -0
  21. data/tools/staticdocs/assets/js/2bb7bf90.78594fbb.js +1 -0
  22. data/tools/staticdocs/assets/js/2c15ad40.1b2d4730.js +1 -0
  23. data/tools/staticdocs/assets/js/3326.2db66e1b.js +4 -0
  24. data/tools/staticdocs/assets/js/3402.80344ef5.js +1 -0
  25. data/tools/staticdocs/assets/js/35398c5c.8a74eece.js +1 -0
  26. data/tools/staticdocs/assets/js/{3dd7ef3b.f43cd057.js → 3dd7ef3b.ceb26a04.js} +1 -1
  27. data/tools/staticdocs/assets/js/40365d27.f6769d57.js +1 -0
  28. data/tools/staticdocs/assets/js/4071.821f3b2b.js +1 -0
  29. data/tools/staticdocs/assets/js/{411898ad.28293824.js → 411898ad.8ed3452c.js} +1 -1
  30. data/tools/staticdocs/assets/js/42170351.7ff72adc.js +1 -0
  31. data/tools/staticdocs/assets/js/43652efd.ec6bb7e9.js +1 -0
  32. data/tools/staticdocs/assets/js/5072.9a0a2752.js +1 -0
  33. data/tools/staticdocs/assets/js/{53ca7c5b.9468b8ed.js → 53ca7c5b.3ae5bb0f.js} +1 -1
  34. data/tools/staticdocs/assets/js/54d0d530.2f7aa091.js +1 -0
  35. data/tools/staticdocs/assets/js/5525.dd1645b0.js +101 -0
  36. data/tools/staticdocs/assets/js/59ed27a4.695b2435.js +1 -0
  37. data/tools/staticdocs/assets/js/5b233ba7.b0d1a8b1.js +1 -0
  38. data/tools/staticdocs/assets/js/5bc719f6.c731b998.js +1 -0
  39. data/tools/staticdocs/assets/js/5c6ce5ec.211ced47.js +1 -0
  40. data/tools/staticdocs/assets/js/5e3ed378.821e5ed4.js +1 -0
  41. data/tools/staticdocs/assets/js/5fe211ef.9d68057c.js +1 -0
  42. data/tools/staticdocs/assets/js/6246.60dfff30.js +1 -0
  43. data/tools/staticdocs/assets/js/6831b732.dc5bae56.js +1 -0
  44. data/tools/staticdocs/assets/js/696b4199.d197d085.js +1 -0
  45. data/tools/staticdocs/assets/js/6b210247.d400f853.js +1 -0
  46. data/tools/staticdocs/assets/js/6b65133b.3550bdf0.js +1 -0
  47. data/tools/staticdocs/assets/js/6f92e431.0bc45585.js +1 -0
  48. data/tools/staticdocs/assets/js/72c6d8a8.7e6fb4fd.js +1 -0
  49. data/tools/staticdocs/assets/js/75e64983.338d2338.js +1 -0
  50. data/tools/staticdocs/assets/js/867640d5.555ba5ca.js +1 -0
  51. data/tools/staticdocs/assets/js/89e76475.a301b5e3.js +1 -0
  52. data/tools/staticdocs/assets/js/8b939c74.0ebaed2a.js +1 -0
  53. data/tools/staticdocs/assets/js/8f7843ee.e33ef7db.js +1 -0
  54. data/tools/staticdocs/assets/js/9424f0b3.4b6f004e.js +1 -0
  55. data/tools/staticdocs/assets/js/{8434.a3e5442b.js → 9623.44668503.js} +1 -1
  56. data/tools/staticdocs/assets/js/{964eb012.4253acd5.js → 964eb012.c7f626c5.js} +1 -1
  57. data/tools/staticdocs/assets/js/97535711.a6342866.js +1 -0
  58. data/tools/staticdocs/assets/js/99581c43.2bd0766d.js +1 -0
  59. data/tools/staticdocs/assets/js/{9d6e81d0.b9f15524.js → 9d6e81d0.879c9e9e.js} +1 -1
  60. data/tools/staticdocs/assets/js/9fb6059a.ce4de002.js +1 -0
  61. data/tools/staticdocs/assets/js/a677c089.758701f0.js +1 -0
  62. data/tools/staticdocs/assets/js/a9987364.e29e8a93.js +1 -0
  63. data/tools/staticdocs/assets/js/a9b2dc27.b7e66efd.js +1 -0
  64. data/tools/staticdocs/assets/js/aa6b6c1b.6bcbf484.js +1 -0
  65. data/tools/staticdocs/assets/js/b062d239.2cebb42b.js +1 -0
  66. data/tools/staticdocs/assets/js/b38a6d74.bb58fcec.js +1 -0
  67. data/tools/staticdocs/assets/js/b4596165.9e7f0be7.js +1 -0
  68. data/tools/staticdocs/assets/js/b6d70f94.5e40680e.js +1 -0
  69. data/tools/staticdocs/assets/js/{b9f60ba6.2c4823f0.js → b9f60ba6.63638354.js} +1 -1
  70. data/tools/staticdocs/assets/js/bd0034eb.9f460215.js +1 -0
  71. data/tools/staticdocs/assets/js/c24eae19.2ef0c706.js +1 -0
  72. data/tools/staticdocs/assets/js/cb8c3f08.28d962a4.js +1 -0
  73. data/tools/staticdocs/assets/js/cd879be4.782edb7f.js +1 -0
  74. data/tools/staticdocs/assets/js/cf1c01b8.7d5b6d66.js +1 -0
  75. data/tools/staticdocs/assets/js/d1b923aa.c012712f.js +1 -0
  76. data/tools/staticdocs/assets/js/d1bfc316.13a64896.js +1 -0
  77. data/tools/staticdocs/assets/js/d24bf9b6.bb93853a.js +1 -0
  78. data/tools/staticdocs/assets/js/d57a4b5d.e9712631.js +1 -0
  79. data/tools/staticdocs/assets/js/d59d8a14.79f4b29e.js +1 -0
  80. data/tools/staticdocs/assets/js/d5d77c37.6b4ab31e.js +1 -0
  81. data/tools/staticdocs/assets/js/d66bf9c0.ca34a583.js +1 -0
  82. data/tools/staticdocs/assets/js/d8ca4191.599a241b.js +1 -0
  83. data/tools/staticdocs/assets/js/d9b92eba.44fde84d.js +1 -0
  84. data/tools/staticdocs/assets/js/db8fa1d0.39b9fdb6.js +1 -0
  85. data/tools/staticdocs/assets/js/dbe31111.4e811739.js +1 -0
  86. data/tools/staticdocs/assets/js/{dc5f7beb.15b70d4b.js → dc5f7beb.c703e464.js} +1 -1
  87. data/tools/staticdocs/assets/js/e501b0d1.c00adfa4.js +1 -0
  88. data/tools/staticdocs/assets/js/f15615f1.8591b830.js +1 -0
  89. data/tools/staticdocs/assets/js/f75a5f33.f16b6dd5.js +1 -0
  90. data/tools/staticdocs/assets/js/{fd886806.f7bfd80c.js → fd886806.fb8a587e.js} +1 -1
  91. data/tools/staticdocs/assets/js/main.331b7e10.js +38 -0
  92. data/tools/staticdocs/assets/js/runtime~main.53a0c91e.js +1 -0
  93. data/tools/staticdocs/docs/configuration/accessors.html +46 -46
  94. data/tools/staticdocs/docs/configuration/command.html +97 -97
  95. data/tools/staticdocs/docs/configuration/conversions.html +53 -53
  96. data/tools/staticdocs/docs/configuration/format.html +22 -22
  97. data/tools/staticdocs/docs/configuration/interfaces.html +55 -55
  98. data/tools/staticdocs/docs/configuration/limits-response.html +10 -10
  99. data/tools/staticdocs/docs/configuration/plugins.html +127 -127
  100. data/tools/staticdocs/docs/configuration/processors.html +17 -17
  101. data/tools/staticdocs/docs/configuration/protocols.html +66 -66
  102. data/tools/staticdocs/docs/configuration/ssl-tls.html +15 -15
  103. data/tools/staticdocs/docs/configuration/table.html +53 -53
  104. data/tools/staticdocs/docs/configuration/target.html +21 -21
  105. data/tools/staticdocs/docs/configuration/telemetry-screens.html +289 -289
  106. data/tools/staticdocs/docs/configuration/telemetry.html +86 -86
  107. data/tools/staticdocs/docs/configuration.html +2 -2
  108. data/tools/staticdocs/docs/development/curl.html +14 -14
  109. data/tools/staticdocs/docs/development/developing.html +27 -27
  110. data/tools/staticdocs/docs/development/json-api.html +15 -15
  111. data/tools/staticdocs/docs/development/log-structure.html +13 -13
  112. data/tools/staticdocs/docs/development/roadmap.html +4 -4
  113. data/tools/staticdocs/docs/development/streaming-api.html +24 -24
  114. data/tools/staticdocs/docs/development/testing.html +20 -20
  115. data/tools/staticdocs/docs/development.html +2 -2
  116. data/tools/staticdocs/docs/getting-started/cli.html +39 -39
  117. data/tools/staticdocs/docs/getting-started/generators.html +25 -25
  118. data/tools/staticdocs/docs/getting-started/gettingstarted.html +19 -19
  119. data/tools/staticdocs/docs/getting-started/installation.html +23 -21
  120. data/tools/staticdocs/docs/getting-started/key-concepts.html +20 -20
  121. data/tools/staticdocs/docs/getting-started/podman.html +23 -23
  122. data/tools/staticdocs/docs/getting-started/requirements.html +19 -19
  123. data/tools/staticdocs/docs/getting-started/upgrading.html +47 -47
  124. data/tools/staticdocs/docs/getting-started.html +2 -2
  125. data/tools/staticdocs/docs/guides/bridges.html +19 -12
  126. data/tools/staticdocs/docs/guides/cfs.html +32 -32
  127. data/tools/staticdocs/docs/guides/custom-widgets.html +36 -36
  128. data/tools/staticdocs/docs/guides/dynamic-packets.html +8 -8
  129. data/tools/staticdocs/docs/guides/exposing-microservices.html +11 -11
  130. data/tools/staticdocs/docs/guides/little-endian-bitfields.html +4 -4
  131. data/tools/staticdocs/docs/guides/local-mode.html +13 -13
  132. data/tools/staticdocs/docs/guides/logging.html +9 -9
  133. data/tools/staticdocs/docs/guides/monitoring.html +18 -18
  134. data/tools/staticdocs/docs/guides/performance.html +10 -10
  135. data/tools/staticdocs/docs/guides/raspberrypi.html +4 -4
  136. data/tools/staticdocs/docs/guides/reference-architectures.html +6 -6
  137. data/tools/staticdocs/docs/guides/script-writing.html +80 -80
  138. data/tools/staticdocs/docs/guides/scripting-api.html +707 -635
  139. data/tools/staticdocs/docs/guides/troubleshooting.html +8 -7
  140. data/tools/staticdocs/docs/guides.html +2 -2
  141. data/tools/staticdocs/docs/meta/contributing.html +12 -12
  142. data/tools/staticdocs/docs/meta/licenses.html +9 -9
  143. data/tools/staticdocs/docs/meta/philosophy.html +3 -3
  144. data/tools/staticdocs/docs/meta/xtce.html +12 -12
  145. data/tools/staticdocs/docs/meta.html +2 -2
  146. data/tools/staticdocs/docs/privacy.html +17 -17
  147. data/tools/staticdocs/docs/tools/admin.html +24 -24
  148. data/tools/staticdocs/docs/tools/autonomic.html +19 -19
  149. data/tools/staticdocs/docs/tools/bucket-explorer.html +9 -9
  150. data/tools/staticdocs/docs/tools/calendar.html +18 -18
  151. data/tools/staticdocs/docs/tools/cmd-sender.html +14 -14
  152. data/tools/staticdocs/docs/tools/cmd-tlm-server.html +20 -20
  153. data/tools/staticdocs/docs/tools/command-history.html +6 -6
  154. data/tools/staticdocs/docs/tools/command-queue.html +8 -8
  155. data/tools/staticdocs/docs/tools/data-extractor.html +25 -25
  156. data/tools/staticdocs/docs/tools/data-viewer.html +11 -11
  157. data/tools/staticdocs/docs/tools/handbooks.html +4 -4
  158. data/tools/staticdocs/docs/tools/limits-monitor.html +16 -16
  159. data/tools/staticdocs/docs/tools/log-explorer.html +9 -9
  160. data/tools/staticdocs/docs/tools/packet-viewer.html +12 -12
  161. data/tools/staticdocs/docs/tools/script-runner.html +43 -43
  162. data/tools/staticdocs/docs/tools/systemhealth.html +21 -21
  163. data/tools/staticdocs/docs/tools/table-manager.html +11 -11
  164. data/tools/staticdocs/docs/tools/tlm-grapher.html +22 -22
  165. data/tools/staticdocs/docs/tools/tlm-viewer.html +16 -16
  166. data/tools/staticdocs/docs/tools.html +2 -2
  167. data/tools/staticdocs/docs.html +11 -11
  168. data/tools/staticdocs/index.html +2 -2
  169. data/tools/staticdocs/lunr-index-1759527994448.json +1 -0
  170. data/tools/staticdocs/lunr-index.json +1 -1
  171. data/tools/staticdocs/markdown-page.html +3 -3
  172. data/tools/staticdocs/search-doc-1759527994448.json +1 -0
  173. data/tools/staticdocs/search-doc.json +1 -1
  174. metadata +92 -92
  175. data/tools/staticdocs/assets/css/styles.0edf3032.css +0 -1
  176. data/tools/staticdocs/assets/js/019369f3.5366d64b.js +0 -1
  177. data/tools/staticdocs/assets/js/058ffc22.31b5fa22.js +0 -1
  178. data/tools/staticdocs/assets/js/0686a885.eb311155.js +0 -1
  179. data/tools/staticdocs/assets/js/078dbab0.974abc47.js +0 -1
  180. data/tools/staticdocs/assets/js/0ff569c9.c8815d72.js +0 -1
  181. data/tools/staticdocs/assets/js/10209fc9.ae369363.js +0 -1
  182. data/tools/staticdocs/assets/js/103cc3be.32c30401.js +0 -1
  183. data/tools/staticdocs/assets/js/1085.d1eba438.js +0 -1
  184. data/tools/staticdocs/assets/js/1319.d9ec0592.js +0 -101
  185. data/tools/staticdocs/assets/js/1c0a0c05.a24e9a5c.js +0 -1
  186. data/tools/staticdocs/assets/js/22b3ac48.81906212.js +0 -1
  187. data/tools/staticdocs/assets/js/26b8abb2.9d3cbdeb.js +0 -1
  188. data/tools/staticdocs/assets/js/2bb7bf90.a04c2a3c.js +0 -1
  189. data/tools/staticdocs/assets/js/2c15ad40.38a25aed.js +0 -1
  190. data/tools/staticdocs/assets/js/35398c5c.d3ee7838.js +0 -1
  191. data/tools/staticdocs/assets/js/40365d27.db29df30.js +0 -1
  192. data/tools/staticdocs/assets/js/42170351.c5a07a3b.js +0 -1
  193. data/tools/staticdocs/assets/js/43652efd.35825078.js +0 -1
  194. data/tools/staticdocs/assets/js/5074.653f3924.js +0 -1
  195. data/tools/staticdocs/assets/js/5410.60ab1dba.js +0 -1
  196. data/tools/staticdocs/assets/js/54d0d530.dfcfecc5.js +0 -1
  197. data/tools/staticdocs/assets/js/59ed27a4.8eb3444b.js +0 -1
  198. data/tools/staticdocs/assets/js/5b233ba7.814a9779.js +0 -1
  199. data/tools/staticdocs/assets/js/5bc719f6.ea5fa091.js +0 -1
  200. data/tools/staticdocs/assets/js/5c6ce5ec.dde1bfbc.js +0 -1
  201. data/tools/staticdocs/assets/js/5e3ed378.6deb22ed.js +0 -1
  202. data/tools/staticdocs/assets/js/5fe211ef.622c8b76.js +0 -1
  203. data/tools/staticdocs/assets/js/6242.bdac32c1.js +0 -4
  204. data/tools/staticdocs/assets/js/6831b732.7cf97282.js +0 -1
  205. data/tools/staticdocs/assets/js/696b4199.b96d263c.js +0 -1
  206. data/tools/staticdocs/assets/js/6b210247.75ed74f4.js +0 -1
  207. data/tools/staticdocs/assets/js/6b65133b.8ceb772d.js +0 -1
  208. data/tools/staticdocs/assets/js/6f92e431.11fea7a0.js +0 -1
  209. data/tools/staticdocs/assets/js/72c6d8a8.241ba59b.js +0 -1
  210. data/tools/staticdocs/assets/js/75e64983.c8cb1f1a.js +0 -1
  211. data/tools/staticdocs/assets/js/867640d5.a02df5f7.js +0 -1
  212. data/tools/staticdocs/assets/js/8851.4837d29a.js +0 -1
  213. data/tools/staticdocs/assets/js/89e76475.cdd88da3.js +0 -1
  214. data/tools/staticdocs/assets/js/8b939c74.c9ac09c3.js +0 -1
  215. data/tools/staticdocs/assets/js/8f7843ee.676b5d36.js +0 -1
  216. data/tools/staticdocs/assets/js/9424f0b3.a3b9746a.js +0 -1
  217. data/tools/staticdocs/assets/js/97535711.2a29c3e7.js +0 -1
  218. data/tools/staticdocs/assets/js/99581c43.791cdc39.js +0 -1
  219. data/tools/staticdocs/assets/js/9fb6059a.5f39bd90.js +0 -1
  220. data/tools/staticdocs/assets/js/a677c089.2695e35a.js +0 -1
  221. data/tools/staticdocs/assets/js/a9987364.71b17b00.js +0 -1
  222. data/tools/staticdocs/assets/js/a9b2dc27.c8eb51b6.js +0 -1
  223. data/tools/staticdocs/assets/js/aa6b6c1b.2d0fadd1.js +0 -1
  224. data/tools/staticdocs/assets/js/b062d239.e240f32e.js +0 -1
  225. data/tools/staticdocs/assets/js/b38a6d74.7363be85.js +0 -1
  226. data/tools/staticdocs/assets/js/b4596165.2a473696.js +0 -1
  227. data/tools/staticdocs/assets/js/b6d70f94.dda7b69f.js +0 -1
  228. data/tools/staticdocs/assets/js/bd0034eb.7282117c.js +0 -1
  229. data/tools/staticdocs/assets/js/c24eae19.60c8e0c8.js +0 -1
  230. data/tools/staticdocs/assets/js/cb8c3f08.2466362b.js +0 -1
  231. data/tools/staticdocs/assets/js/cd879be4.6a299bce.js +0 -1
  232. data/tools/staticdocs/assets/js/cf1c01b8.1913e9f8.js +0 -1
  233. data/tools/staticdocs/assets/js/d1b923aa.482b8f7b.js +0 -1
  234. data/tools/staticdocs/assets/js/d1bfc316.ada87033.js +0 -1
  235. data/tools/staticdocs/assets/js/d24bf9b6.2b9e8d63.js +0 -1
  236. data/tools/staticdocs/assets/js/d57a4b5d.bf08c8f5.js +0 -1
  237. data/tools/staticdocs/assets/js/d59d8a14.479869f6.js +0 -1
  238. data/tools/staticdocs/assets/js/d5d77c37.199e159b.js +0 -1
  239. data/tools/staticdocs/assets/js/d66bf9c0.210077a2.js +0 -1
  240. data/tools/staticdocs/assets/js/d8ca4191.57f74139.js +0 -1
  241. data/tools/staticdocs/assets/js/d9b92eba.015f5324.js +0 -1
  242. data/tools/staticdocs/assets/js/db8fa1d0.1c778ff1.js +0 -1
  243. data/tools/staticdocs/assets/js/dbe31111.37d6f071.js +0 -1
  244. data/tools/staticdocs/assets/js/e501b0d1.c42aad75.js +0 -1
  245. data/tools/staticdocs/assets/js/f15615f1.a8a415cb.js +0 -1
  246. data/tools/staticdocs/assets/js/f75a5f33.4d2501bc.js +0 -1
  247. data/tools/staticdocs/assets/js/main.17e85c34.js +0 -38
  248. data/tools/staticdocs/assets/js/runtime~main.44311138.js +0 -1
  249. data/tools/staticdocs/lunr-index-1757639970943.json +0 -1
  250. data/tools/staticdocs/search-doc-1757639970943.json +0 -1
@@ -0,0 +1,101 @@
1
+ (self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["5525"],{8224:function(e,t,n){"use strict";e.exports=n(8737)},2845:function(e,t,n){"use strict";var i=n(6514),r={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:"0"},defaultClasses:{root:"algolia-autocomplete",prefix:"aa",noPrefix:!1,dropdownMenu:"dropdown-menu",input:"input",hint:"hint",suggestions:"suggestions",suggestion:"suggestion",cursor:"cursor",dataset:"dataset",empty:"empty"},appendTo:{wrapper:{position:"absolute",zIndex:"100",display:"none"},input:{},inputWithNoHint:{},dropdown:{display:"block"}}};i.isMsie()&&i.mixin(r.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),i.isMsie()&&7>=i.isMsie()&&i.mixin(r.input,{marginTop:"-1px"}),e.exports=r},4566:function(e,t,n){"use strict";var i="aaDataset",r="aaValue",s="aaDatum",o=n(6514),a=n(2711),u=n(6557),c=n(2845),l=n(1601);function h(e){(e=e||{}).templates=e.templates||{},e.source||o.error("missing source"),e.name&&(t=e.name,!/^[_a-zA-Z0-9-]+$/.test(t))&&o.error("invalid dataset name: "+e.name),this.query=null,this._isEmpty=!0,this.highlight=!!e.highlight,this.name=void 0===e.name||null===e.name?o.getUniqueId():e.name,this.source=e.source,this.displayFn=(n=(n=e.display||e.displayKey)||"value",o.isFunction(n)?n:function(e){return e[n]}),this.debounce=e.debounce,this.cache=!1!==e.cache,this.templates=(i=e.templates,r=this.displayFn,{empty:i.empty&&o.templatify(i.empty),header:i.header&&o.templatify(i.header),footer:i.footer&&o.templatify(i.footer),suggestion:i.suggestion||function(e){return"<p>"+r(e)+"</p>"}}),this.css=o.mixin({},c,e.appendTo?c.appendTo:{}),this.cssClasses=e.cssClasses=o.mixin({},c.defaultClasses,e.cssClasses||{}),this.cssClasses.prefix=e.cssClasses.formattedPrefix||o.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix);var t,n,i,r,s=o.className(this.cssClasses.prefix,this.cssClasses.dataset);this.$el=e.$menu&&e.$menu.find(s+"-"+this.name).length>0?a.element(e.$menu.find(s+"-"+this.name)[0]):a.element(u.dataset.replace("%CLASS%",this.name).replace("%PREFIX%",this.cssClasses.prefix).replace("%DATASET%",this.cssClasses.dataset)),this.$menu=e.$menu,this.clearCachedSuggestions()}h.extractDatasetName=function(e){return a.element(e).data(i)},h.extractValue=function(e){return a.element(e).data(r)},h.extractDatum=function(e){var t=a.element(e).data(s);return"string"==typeof t&&(t=JSON.parse(t)),t},o.mixin(h.prototype,l,{_render:function(e,t){if(this.$el){var n,c=this,l=[].slice.call(arguments,2);if(this.$el.empty(),n=t&&t.length,this._isEmpty=!n,!n&&this.templates.empty)this.$el.html((function(){var t=[].slice.call(arguments,0);return t=[{query:e,isEmpty:!0}].concat(t),c.templates.empty.apply(this,t)}).apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(n)this.$el.html((function(){var e,n,l=[].slice.call(arguments,0),h=this,p=u.suggestions.replace("%PREFIX%",this.cssClasses.prefix).replace("%SUGGESTIONS%",this.cssClasses.suggestions);return e=a.element(p).css(this.css.suggestions),n=o.map(t,function(e){var t,n=u.suggestion.replace("%PREFIX%",h.cssClasses.prefix).replace("%SUGGESTION%",h.cssClasses.suggestion);return(t=a.element(n).attr({role:"option",id:["option",Math.floor(1e8*Math.random())].join("-")}).append(c.templates.suggestion.apply(this,[e].concat(l)))).data(i,c.name),t.data(r,c.displayFn(e)||void 0),t.data(s,JSON.stringify(e)),t.children().each(function(){a.element(this).css(h.css.suggestionChild)}),t}),e.append.apply(e,n),e}).apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(t&&!Array.isArray(t))throw TypeError("suggestions must be an array");this.$menu&&this.$menu.addClass(this.cssClasses.prefix+(n?"with":"without")+"-"+this.name).removeClass(this.cssClasses.prefix+(n?"without":"with")+"-"+this.name),this.trigger("rendered",e)}function h(){var t=[].slice.call(arguments,0);return t=[{query:e,isEmpty:!n}].concat(t),c.templates.header.apply(this,t)}function p(){var t=[].slice.call(arguments,0);return t=[{query:e,isEmpty:!n}].concat(t),c.templates.footer.apply(this,t)}},getRoot:function(){return this.$el},update:function(e){function t(t){if(!this.canceled&&e===this.query){var n=[].slice.call(arguments,1);this.cacheSuggestions(e,t,n),this._render.apply(this,[e,t].concat(n))}}if(this.query=e,this.canceled=!1,this.shouldFetchFromCache(e))t.apply(this,[this.cachedSuggestions].concat(this.cachedRenderExtraArgs));else{var n=this,i=function(){n.canceled||n.source(e,t.bind(n))};this.debounce?(clearTimeout(this.debounceTimeout),this.debounceTimeout=setTimeout(function(){n.debounceTimeout=null,i()},this.debounce)):i()}},cacheSuggestions:function(e,t,n){this.cachedQuery=e,this.cachedSuggestions=t,this.cachedRenderExtraArgs=n},shouldFetchFromCache:function(e){return this.cache&&this.cachedQuery===e&&this.cachedSuggestions&&this.cachedSuggestions.length},clearCachedSuggestions:function(){delete this.cachedQuery,delete this.cachedSuggestions,delete this.cachedRenderExtraArgs},cancel:function(){this.canceled=!0},clear:function(){this.$el&&(this.cancel(),this.$el.empty(),this.trigger("rendered",""))},isEmpty:function(){return this._isEmpty},destroy:function(){this.clearCachedSuggestions(),this.$el=null}}),e.exports=h},6521:function(e,t,n){"use strict";var i=n(6514),r=n(2711),s=n(1601),o=n(4566),a=n(2845);function u(e){var t,n,s,o=this;(e=e||{}).menu||i.error("menu is required"),i.isArray(e.datasets)||i.isObject(e.datasets)||i.error("1 or more datasets required"),e.datasets||i.error("datasets is required"),this.isOpen=!1,this.isEmpty=!0,this.minLength=e.minLength||0,this.templates={},this.appendTo=e.appendTo||!1,this.css=i.mixin({},a,e.appendTo?a.appendTo:{}),this.cssClasses=e.cssClasses=i.mixin({},a.defaultClasses,e.cssClasses||{}),this.cssClasses.prefix=e.cssClasses.formattedPrefix||i.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),t=i.bind(this._onSuggestionClick,this),n=i.bind(this._onSuggestionMouseEnter,this),s=i.bind(this._onSuggestionMouseLeave,this);var c=i.className(this.cssClasses.prefix,this.cssClasses.suggestion);this.$menu=r.element(e.menu).on("mouseenter.aa",c,n).on("mouseleave.aa",c,s).on("click.aa",c,t),this.$container=e.appendTo?e.wrapper:this.$menu,e.templates&&e.templates.header&&(this.templates.header=i.templatify(e.templates.header),this.$menu.prepend(this.templates.header())),e.templates&&e.templates.empty&&(this.templates.empty=i.templatify(e.templates.empty),this.$empty=r.element('<div class="'+i.className(this.cssClasses.prefix,this.cssClasses.empty,!0)+'"></div>'),this.$menu.append(this.$empty),this.$empty.hide()),this.datasets=i.map(e.datasets,function(t){var n,r,s;return n=o.$menu,r=t,s=e.cssClasses,new u.Dataset(i.mixin({$menu:n,cssClasses:s},r))}),i.each(this.datasets,function(e){var t=e.getRoot();t&&0===t.parent().length&&o.$menu.append(t),e.onSync("rendered",o._onRendered,o)}),e.templates&&e.templates.footer&&(this.templates.footer=i.templatify(e.templates.footer),this.$menu.append(this.templates.footer()));var l=this;r.element(window).resize(function(){l._redraw()})}i.mixin(u.prototype,s,{_onSuggestionClick:function(e){this.trigger("suggestionClicked",r.element(e.currentTarget))},_onSuggestionMouseEnter:function(e){var t=r.element(e.currentTarget);if(!t.hasClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0))){this._removeCursor();var n=this;setTimeout(function(){n._setCursor(t,!1)},0)}},_onSuggestionMouseLeave:function(e){e.relatedTarget&&r.element(e.relatedTarget).closest("."+i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).length>0||(this._removeCursor(),this.trigger("cursorRemoved"))},_onRendered:function(e,t){if(this.isEmpty=i.every(this.datasets,function(e){return e.isEmpty()}),this.isEmpty)if(t.length>=this.minLength&&this.trigger("empty"),this.$empty)if(t.length<this.minLength)this._hide();else{var n=this.templates.empty({query:this.datasets[0]&&this.datasets[0].query});this.$empty.html(n),this.$empty.show(),this._show()}else i.any(this.datasets,function(e){return e.templates&&e.templates.empty})?t.length<this.minLength?this._hide():this._show():this._hide();else this.isOpen&&(this.$empty&&(this.$empty.empty(),this.$empty.hide()),t.length>=this.minLength?this._show():this._hide());this.trigger("datasetRendered")},_hide:function(){this.$container.hide()},_show:function(){this.$container.css("display","block"),this._redraw(),this.trigger("shown")},_redraw:function(){this.isOpen&&this.appendTo&&this.trigger("redrawn")},_getSuggestions:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.suggestion))},_getCursor:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.cursor)).first()},_setCursor:function(e,t){e.first().addClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).attr("aria-selected","true"),this.trigger("cursorMoved",t)},_removeCursor:function(){this._getCursor().removeClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).removeAttr("aria-selected")},_moveCursor:function(e){var t,n,i,r;if(this.isOpen){if(n=this._getCursor(),t=this._getSuggestions(),this._removeCursor(),-1==(i=((i=t.index(n)+e)+1)%(t.length+1)-1))return void this.trigger("cursorRemoved");i<-1&&(i=t.length-1),this._setCursor(r=t.eq(i),!0),this._ensureVisible(r)}},_ensureVisible:function(e){var t,n,i,r;n=(t=e.position().top)+e.height()+parseInt(e.css("margin-top"),10)+parseInt(e.css("margin-bottom"),10),i=this.$menu.scrollTop(),r=this.$menu.height()+parseInt(this.$menu.css("padding-top"),10)+parseInt(this.$menu.css("padding-bottom"),10),t<0?this.$menu.scrollTop(i+t):r<n&&this.$menu.scrollTop(i+(n-r))},close:function(){this.isOpen&&(this.isOpen=!1,this._removeCursor(),this._hide(),this.trigger("closed"))},open:function(){this.isOpen||(this.isOpen=!0,this.isEmpty||this._show(),this.trigger("opened"))},setLanguageDirection:function(e){this.$menu.css("ltr"===e?this.css.ltr:this.css.rtl)},moveCursorUp:function(){this._moveCursor(-1)},moveCursorDown:function(){this._moveCursor(1)},getDatumForSuggestion:function(e){var t=null;return e.length&&(t={raw:o.extractDatum(e),value:o.extractValue(e),datasetName:o.extractDatasetName(e)}),t},getCurrentCursor:function(){return this._getCursor().first()},getDatumForCursor:function(){return this.getDatumForSuggestion(this._getCursor().first())},getDatumForTopSuggestion:function(){return this.getDatumForSuggestion(this._getSuggestions().first())},cursorTopSuggestion:function(){this._setCursor(this._getSuggestions().first(),!1)},update:function(e){i.each(this.datasets,function(t){t.update(e)})},empty:function(){i.each(this.datasets,function(e){e.clear()}),this.isEmpty=!0},isVisible:function(){return this.isOpen&&!this.isEmpty},destroy:function(){this.$menu.off(".aa"),this.$menu=null,i.each(this.datasets,function(e){e.destroy()})}}),u.Dataset=o,e.exports=u},5575:function(e,t,n){"use strict";var i=n(6514),r=n(2711);function s(e){e&&e.el||i.error("EventBus initialized without el"),this.$el=r.element(e.el)}i.mixin(s.prototype,{trigger:function(e,t,n,r){var s=i.Event("autocomplete:"+e);return this.$el.trigger(s,[t,n,r]),s}}),e.exports=s},1601:function(e,t,n){"use strict";var i=n(2539),r=/\s+/;function s(e,t,n,i){var s,o,a;if(!n)return this;for(t=t.split(r),n=i?(o=n,a=i,o.bind?o.bind(a):function(){o.apply(a,[].slice.call(arguments,0))}):n,this._callbacks=this._callbacks||{};s=t.shift();)this._callbacks[s]=this._callbacks[s]||{sync:[],async:[]},this._callbacks[s][e].push(n);return this}function o(e,t,n){return function(){for(var i,r=0,s=e.length;!i&&r<s;r+=1)i=!1===e[r].apply(t,n);return!i}}e.exports={onSync:function(e,t,n){return s.call(this,"sync",e,t,n)},onAsync:function(e,t,n){return s.call(this,"async",e,t,n)},off:function(e){var t;if(!this._callbacks)return this;for(e=e.split(r);t=e.shift();)delete this._callbacks[t];return this},trigger:function(e){var t,n,s,a,u;if(!this._callbacks)return this;for(e=e.split(r),s=[].slice.call(arguments,1);(t=e.shift())&&(n=this._callbacks[t]);)a=o(n.sync,this,[t].concat(s)),u=o(n.async,this,[t].concat(s)),a()&&i(u);return this}}},6557:function(e){"use strict";e.exports={wrapper:'<span class="%ROOT%"></span>',dropdown:'<span class="%PREFIX%%DROPDOWN_MENU%"></span>',dataset:'<div class="%PREFIX%%DATASET%-%CLASS%"></div>',suggestions:'<span class="%PREFIX%%SUGGESTIONS%"></span>',suggestion:'<div class="%PREFIX%%SUGGESTION%"></div>'}},8414:function(e,t,n){"use strict";var i={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"},r=n(6514),s=n(2711),o=n(1601);function a(e){var t,n,o,a,u,c=this;(e=e||{}).input||r.error("input is missing"),n=r.bind(this._onBlur,this),o=r.bind(this._onFocus,this),a=r.bind(this._onKeydown,this),u=r.bind(this._onInput,this),this.$hint=s.element(e.hint),this.$input=s.element(e.input).on("blur.aa",n).on("focus.aa",o).on("keydown.aa",a),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=r.noop),r.isMsie()?this.$input.on("keydown.aa keypress.aa cut.aa paste.aa",function(e){i[e.which||e.keyCode]||r.defer(r.bind(c._onInput,c,e))}):this.$input.on("input.aa",u),this.query=this.$input.val(),this.$overflowHelper=(t=this.$input,s.element('<pre aria-hidden="true"></pre>').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:t.css("font-family"),fontSize:t.css("font-size"),fontStyle:t.css("font-style"),fontVariant:t.css("font-variant"),fontWeight:t.css("font-weight"),wordSpacing:t.css("word-spacing"),letterSpacing:t.css("letter-spacing"),textIndent:t.css("text-indent"),textRendering:t.css("text-rendering"),textTransform:t.css("text-transform")}).insertAfter(t))}function u(e){return e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}a.normalizeQuery=function(e){return(e||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ")},r.mixin(a.prototype,o,{_onBlur:function(){this.resetInputValue(),this.$input.removeAttr("aria-activedescendant"),this.trigger("blurred")},_onFocus:function(){this.trigger("focused")},_onKeydown:function(e){var t=i[e.which||e.keyCode];this._managePreventDefault(t,e),t&&this._shouldTrigger(t,e)&&this.trigger(t+"Keyed",e)},_onInput:function(){this._checkInputValue()},_managePreventDefault:function(e,t){var n,i,r;switch(e){case"tab":i=this.getHint(),r=this.getInputValue(),n=i&&i!==r&&!u(t);break;case"up":case"down":n=!u(t);break;default:n=!1}n&&t.preventDefault()},_shouldTrigger:function(e,t){return"tab"!==e||!u(t)},_checkInputValue:function(){var e,t,n,i,r;n=(i=e=this.getInputValue(),r=this.query,!!(t=a.normalizeQuery(i)===a.normalizeQuery(r))&&!!this.query&&this.query.length!==e.length),this.query=e,t?n&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(e){this.query=e},getInputValue:function(){return this.$input.val()},setInputValue:function(e,t){void 0===e&&(e=this.query),this.$input.val(e),t?this.clearHint():this._checkInputValue()},expand:function(){this.$input.attr("aria-expanded","true")},collapse:function(){this.$input.attr("aria-expanded","false")},setActiveDescendant:function(e){this.$input.attr("aria-activedescendant",e)},removeActiveDescendant:function(){this.$input.removeAttr("aria-activedescendant")},resetInputValue:function(){this.setInputValue(this.query,!0)},getHint:function(){return this.$hint.val()},setHint:function(e){this.$hint.val(e)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var e,t,n;n=(e=this.getInputValue())!==(t=this.getHint())&&0===t.indexOf(e),""!==e&&n&&!this.hasOverflow()||this.clearHint()},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},hasOverflow:function(){var e=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=e},isCursorAtEnd:function(){var e,t,n;return(e=this.$input.val().length,t=this.$input[0].selectionStart,r.isNumber(t))?t===e:!document.selection||((n=document.selection.createRange()).moveStart("character",-e),e===n.text.length)},destroy:function(){this.$hint.off(".aa"),this.$input.off(".aa"),this.$hint=this.$input=this.$overflowHelper=null}}),e.exports=a},3416:function(e,t,n){"use strict";var i="aaAttrs",r=n(6514),s=n(2711),o=n(5575),a=n(8414),u=n(6521),c=n(6557),l=n(2845);function h(e){if((e=e||{}).input||r.error("missing input"),this.isActivated=!1,this.debug=!!e.debug,this.autoselect=!!e.autoselect,this.autoselectOnBlur=!!e.autoselectOnBlur,this.openOnFocus=!!e.openOnFocus,this.minLength=r.isNumber(e.minLength)?e.minLength:1,this.autoWidth=void 0===e.autoWidth||!!e.autoWidth,this.clearOnSelected=!!e.clearOnSelected,this.tabAutocomplete=void 0===e.tabAutocomplete||!!e.tabAutocomplete,e.hint=!!e.hint,e.hint&&e.appendTo)throw Error("[autocomplete.js] hint and appendTo options can't be used at the same time");this.css=e.css=r.mixin({},l,e.appendTo?l.appendTo:{}),this.cssClasses=e.cssClasses=r.mixin({},l.defaultClasses,e.cssClasses||{}),this.cssClasses.prefix=e.cssClasses.formattedPrefix=r.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),this.listboxId=e.listboxId=[this.cssClasses.root,"listbox",r.getUniqueId()].join("-");var t,n,a=function(e){n=s.element(e.input),o=s.element(c.wrapper.replace("%ROOT%",e.cssClasses.root)).css(e.css.wrapper),e.appendTo||"block"!==n.css("display")||"table"!==n.parent().css("display")||o.css("display","table-cell");var t,n,o,a,u,l=c.dropdown.replace("%PREFIX%",e.cssClasses.prefix).replace("%DROPDOWN_MENU%",e.cssClasses.dropdownMenu);a=s.element(l).css(e.css.dropdown).attr({role:"listbox",id:e.listboxId}),e.templates&&e.templates.dropdownMenu&&a.html(r.templatify(e.templates.dropdownMenu)()),(u=n.clone().css(e.css.hint).css({backgroundAttachment:(t=n).css("background-attachment"),backgroundClip:t.css("background-clip"),backgroundColor:t.css("background-color"),backgroundImage:t.css("background-image"),backgroundOrigin:t.css("background-origin"),backgroundPosition:t.css("background-position"),backgroundRepeat:t.css("background-repeat"),backgroundSize:t.css("background-size")})).val("").addClass(r.className(e.cssClasses.prefix,e.cssClasses.hint,!0)).removeAttr("id name placeholder required").prop("readonly",!0).attr({"aria-hidden":"true",autocomplete:"off",spellcheck:"false",tabindex:-1}),u.removeData&&u.removeData(),n.data(i,{"aria-autocomplete":n.attr("aria-autocomplete"),"aria-expanded":n.attr("aria-expanded"),"aria-owns":n.attr("aria-owns"),autocomplete:n.attr("autocomplete"),dir:n.attr("dir"),role:n.attr("role"),spellcheck:n.attr("spellcheck"),style:n.attr("style"),type:n.attr("type")}),n.addClass(r.className(e.cssClasses.prefix,e.cssClasses.input,!0)).attr({autocomplete:"off",spellcheck:!1,role:"combobox","aria-autocomplete":e.datasets&&e.datasets[0]&&e.datasets[0].displayKey?"both":"list","aria-expanded":"false","aria-label":e.ariaLabel,"aria-owns":e.listboxId}).css(e.hint?e.css.input:e.css.inputWithNoHint);try{n.attr("dir")||n.attr("dir","auto")}catch(e){}return(o=e.appendTo?o.appendTo(s.element(e.appendTo).eq(0)).eq(0):n.wrap(o).parent()).prepend(e.hint?u:null).append(a),{wrapper:o,input:n,hint:u,menu:a}}(e);this.$node=a.wrapper;var u=this.$input=a.input;t=a.menu,n=a.hint,e.dropdownMenuContainer&&s.element(e.dropdownMenuContainer).css("position","relative").append(t.css("top","0")),u.on("blur.aa",function(e){var n=document.activeElement;r.isMsie()&&(t[0]===n||t[0].contains(n))&&(e.preventDefault(),e.stopImmediatePropagation(),r.defer(function(){u.focus()}))}),t.on("mousedown.aa",function(e){e.preventDefault()}),this.eventBus=e.eventBus||new o({el:u}),this.dropdown=new h.Dropdown({appendTo:e.appendTo,wrapper:this.$node,menu:t,datasets:e.datasets,templates:e.templates,cssClasses:e.cssClasses,minLength:this.minLength}).onSync("suggestionClicked",this._onSuggestionClicked,this).onSync("cursorMoved",this._onCursorMoved,this).onSync("cursorRemoved",this._onCursorRemoved,this).onSync("opened",this._onOpened,this).onSync("closed",this._onClosed,this).onSync("shown",this._onShown,this).onSync("empty",this._onEmpty,this).onSync("redrawn",this._onRedrawn,this).onAsync("datasetRendered",this._onDatasetRendered,this),this.input=new h.Input({input:u,hint:n}).onSync("focused",this._onFocused,this).onSync("blurred",this._onBlurred,this).onSync("enterKeyed",this._onEnterKeyed,this).onSync("tabKeyed",this._onTabKeyed,this).onSync("escKeyed",this._onEscKeyed,this).onSync("upKeyed",this._onUpKeyed,this).onSync("downKeyed",this._onDownKeyed,this).onSync("leftKeyed",this._onLeftKeyed,this).onSync("rightKeyed",this._onRightKeyed,this).onSync("queryChanged",this._onQueryChanged,this).onSync("whitespaceChanged",this._onWhitespaceChanged,this),this._bindKeyboardShortcuts(e),this._setLanguageDirection()}r.mixin(h.prototype,{_bindKeyboardShortcuts:function(e){if(e.keyboardShortcuts){var t=this.$input,n=[];r.each(e.keyboardShortcuts,function(e){"string"==typeof e&&(e=e.toUpperCase().charCodeAt(0)),n.push(e)}),s.element(document).keydown(function(e){var i=e.target||e.srcElement,r=i.tagName;if(!i.isContentEditable&&"INPUT"!==r&&"SELECT"!==r&&"TEXTAREA"!==r){var s=e.which||e.keyCode;-1!==n.indexOf(s)&&(t.focus(),e.stopPropagation(),e.preventDefault())}})}},_onSuggestionClicked:function(e,t){var n;(n=this.dropdown.getDatumForSuggestion(t))&&this._select(n,{selectionMethod:"click"})},_onCursorMoved:function(e,t){var n=this.dropdown.getDatumForCursor(),i=this.dropdown.getCurrentCursor().attr("id");this.input.setActiveDescendant(i),n&&(t&&this.input.setInputValue(n.value,!0),this.eventBus.trigger("cursorchanged",n.raw,n.datasetName))},_onCursorRemoved:function(){this.input.resetInputValue(),this._updateHint(),this.eventBus.trigger("cursorremoved")},_onDatasetRendered:function(){this._updateHint(),this.eventBus.trigger("updated")},_onOpened:function(){this._updateHint(),this.input.expand(),this.eventBus.trigger("opened")},_onEmpty:function(){this.eventBus.trigger("empty")},_onRedrawn:function(){this.$node.css("top","0px"),this.$node.css("left","0px");var e=this.$input[0].getBoundingClientRect();this.autoWidth&&this.$node.css("width",e.width+"px");var t=this.$node[0].getBoundingClientRect(),n=e.bottom-t.top;this.$node.css("top",n+"px");var i=e.left-t.left;this.$node.css("left",i+"px"),this.eventBus.trigger("redrawn")},_onShown:function(){this.eventBus.trigger("shown"),this.autoselect&&this.dropdown.cursorTopSuggestion()},_onClosed:function(){this.input.clearHint(),this.input.removeActiveDescendant(),this.input.collapse(),this.eventBus.trigger("closed")},_onFocused:function(){if(this.isActivated=!0,this.openOnFocus){var e=this.input.getQuery();e.length>=this.minLength?this.dropdown.update(e):this.dropdown.empty(),this.dropdown.open()}},_onBlurred:function(){var e=this.dropdown.getDatumForCursor(),t=this.dropdown.getDatumForTopSuggestion(),n={selectionMethod:"blur"};this.debug||(this.autoselectOnBlur&&e?this._select(e,n):this.autoselectOnBlur&&t?this._select(t,n):(this.isActivated=!1,this.dropdown.empty(),this.dropdown.close()))},_onEnterKeyed:function(e,t){var n=this.dropdown.getDatumForCursor(),i=this.dropdown.getDatumForTopSuggestion(),r={selectionMethod:"enterKey"};n?(this._select(n,r),t.preventDefault()):this.autoselect&&i&&(this._select(i,r),t.preventDefault())},_onTabKeyed:function(e,t){var n;this.tabAutocomplete?(n=this.dropdown.getDatumForCursor())?(this._select(n,{selectionMethod:"tabKey"}),t.preventDefault()):this._autocomplete(!0):this.dropdown.close()},_onEscKeyed:function(){this.dropdown.close(),this.input.resetInputValue()},_onUpKeyed:function(){var e=this.input.getQuery();this.dropdown.isEmpty&&e.length>=this.minLength?this.dropdown.update(e):this.dropdown.moveCursorUp(),this.dropdown.open()},_onDownKeyed:function(){var e=this.input.getQuery();this.dropdown.isEmpty&&e.length>=this.minLength?this.dropdown.update(e):this.dropdown.moveCursorDown(),this.dropdown.open()},_onLeftKeyed:function(){"rtl"===this.dir&&this._autocomplete()},_onRightKeyed:function(){"ltr"===this.dir&&this._autocomplete()},_onQueryChanged:function(e,t){this.input.clearHintIfInvalid(),t.length>=this.minLength?this.dropdown.update(t):this.dropdown.empty(),this.dropdown.open(),this._setLanguageDirection()},_onWhitespaceChanged:function(){this._updateHint(),this.dropdown.open()},_setLanguageDirection:function(){var e=this.input.getLanguageDirection();this.dir!==e&&(this.dir=e,this.$node.css("direction",e),this.dropdown.setLanguageDirection(e))},_updateHint:function(){var e,t,n,i;(e=this.dropdown.getDatumForTopSuggestion())&&this.dropdown.isVisible()&&!this.input.hasOverflow()?(t=this.input.getInputValue(),n=a.normalizeQuery(t),(i=RegExp("^(?:"+r.escapeRegExChars(n)+")(.+$)","i").exec(e.value))?this.input.setHint(t+i[1]):this.input.clearHint()):this.input.clearHint()},_autocomplete:function(e){var t,n,i,r;t=this.input.getHint(),n=this.input.getQuery(),i=e||this.input.isCursorAtEnd(),t&&n!==t&&i&&((r=this.dropdown.getDatumForTopSuggestion())&&this.input.setInputValue(r.value),this.eventBus.trigger("autocompleted",r.raw,r.datasetName))},_select:function(e,t){void 0!==e.value&&this.input.setQuery(e.value),this.clearOnSelected?this.setVal(""):this.input.setInputValue(e.value,!0),this._setLanguageDirection(),!1===this.eventBus.trigger("selected",e.raw,e.datasetName,t).isDefaultPrevented()&&(this.dropdown.close(),r.defer(r.bind(this.dropdown.empty,this.dropdown)))},open:function(){if(!this.isActivated){var e=this.input.getInputValue();e.length>=this.minLength?this.dropdown.update(e):this.dropdown.empty()}this.dropdown.open()},close:function(){this.dropdown.close()},setVal:function(e){e=r.toStr(e),this.isActivated?this.input.setInputValue(e):(this.input.setQuery(e),this.input.setInputValue(e,!0)),this._setLanguageDirection()},getVal:function(){return this.input.getQuery()},destroy:function(){var e,t,n;this.input.destroy(),this.dropdown.destroy(),e=this.$node,t=this.cssClasses,n=e.find(r.className(t.prefix,t.input)),r.each(n.data(i),function(e,t){void 0===e?n.removeAttr(t):n.attr(t,e)}),n.detach().removeClass(r.className(t.prefix,t.input,!0)).insertAfter(e),n.removeData&&n.removeData(i),e.remove(),this.$node=null},getWrapper:function(){return this.dropdown.$container[0]}}),h.Dropdown=u,h.Input=a,h.sources=n(796),e.exports=h},2711:function(e){"use strict";e.exports={element:null}},1380:function(e){"use strict";e.exports=function(e){var t=e.match(/Algolia for JavaScript \((\d+\.)(\d+\.)(\d+)\)/)||e.match(/Algolia for vanilla JavaScript (\d+\.)(\d+\.)(\d+)/);if(t)return[t[1],t[2],t[3]]}},6514:function(e,t,n){"use strict";var i,r=n(2711);function s(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}e.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(e){if(void 0===e&&(e=navigator.userAgent),/(msie|trident)/i.test(e)){var t=e.match(/(msie |rv:)(\d+(.\d+)?)/i);if(t)return t[2]}return!1},escapeRegExChars:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(e){return"number"==typeof e},toStr:function(e){return null==e?"":e+""},cloneDeep:function(e){var t=this.mixin({},e),n=this;return this.each(t,function(e,i){e&&(n.isArray(e)?t[i]=[].concat(e):n.isObject(e)&&(t[i]=n.cloneDeep(e)))}),t},error:function(e){throw Error(e)},every:function(e,t){var n=!0;return e?(this.each(e,function(i,r){n&&(n=t.call(null,i,r,e)&&n)}),!!n):n},any:function(e,t){var n=!1;return e&&this.each(e,function(i,r){if(t.call(null,i,r,e))return n=!0,!1}),n},getUniqueId:(i=0,function(){return i++}),templatify:function(e){if(this.isFunction(e))return e;var t=r.element(e);return"SCRIPT"===t.prop("tagName")?function(){return t.text()}:function(){return String(e)}},defer:function(e){setTimeout(e,0)},noop:function(){},formatPrefix:function(e,t){return t?"":e+"-"},className:function(e,t,n){return(n?"":".")+e+t},escapeHighlightedString:function(e,t,n){t=t||"<em>";var i=document.createElement("div");i.appendChild(document.createTextNode(t)),n=n||"</em>";var r=document.createElement("div");r.appendChild(document.createTextNode(n));var o=document.createElement("div");return o.appendChild(document.createTextNode(e)),o.innerHTML.replace(RegExp(s(i.innerHTML),"g"),t).replace(RegExp(s(r.innerHTML),"g"),n)}}},1711:function(e,t,n){"use strict";var i=n(6514),r=n(9116),s=n(1380);e.exports=function(e,t){var n=s(e.as._ua);return n&&n[0]>=3&&n[1]>20&&((t=t||{}).additionalUA="autocomplete.js "+r),function(n,r){e.search(n,t,function(e,t){e?i.error(e.message):r(t.hits,t)})}}},796:function(e,t,n){"use strict";e.exports={hits:n(1711),popularIn:n(2982)}},2982:function(e,t,n){"use strict";var i=n(6514),r=n(9116),s=n(1380);e.exports=function(e,t,n,o){var a=s(e.as._ua);if(a&&a[0]>=3&&a[1]>20&&((t=t||{}).additionalUA="autocomplete.js "+r),!n.source)return i.error("Missing 'source' key");var u=i.isFunction(n.source)?n.source:function(e){return e[n.source]};if(!n.index)return i.error("Missing 'index' key");var c=n.index;return o=o||{},function(a,l){e.search(a,t,function(e,a){if(e)return void i.error(e.message);if(a.hits.length>0){var h=a.hits[0],p=i.mixin({hitsPerPage:0},n);delete p.source,delete p.index;var d=s(c.as._ua);d&&d[0]>=3&&d[1]>20&&(t.additionalUA="autocomplete.js "+r),c.search(u(h),p,function(e,t){if(e)return void i.error(e.message);var n=[];if(o.includeAll){var r=o.allTitle||"All departments";n.push(i.mixin({facet:{value:r,count:t.nbHits}},i.cloneDeep(h)))}i.each(t.facets,function(e,t){i.each(e,function(e,r){n.push(i.mixin({facet:{facet:t,value:r,count:e}},i.cloneDeep(h)))})});for(var s=1;s<a.hits.length;++s)n.push(a.hits[s]);l(n,a)});return}l([])})}}},8737:function(e,t,n){"use strict";var i=n(2522);n(2711).element=i;var r=n(6514);r.isArray=i.isArray,r.isFunction=i.isFunction,r.isObject=i.isPlainObject,r.bind=i.proxy,r.each=function(e,t){i.each(e,function(e,n){return t(n,e)})},r.map=i.map,r.mixin=i.extend,r.Event=i.Event;var s="aaAutocomplete",o=n(3416),a=n(5575);function u(e,t,n,u){n=r.isArray(n)?n:[].slice.call(arguments,2);var c=i(e).each(function(e,r){var c=i(r),l=new a({el:c}),h=u||new o({input:c,eventBus:l,dropdownMenuContainer:t.dropdownMenuContainer,hint:void 0===t.hint||!!t.hint,minLength:t.minLength,autoselect:t.autoselect,autoselectOnBlur:t.autoselectOnBlur,tabAutocomplete:t.tabAutocomplete,openOnFocus:t.openOnFocus,templates:t.templates,debug:t.debug,clearOnSelected:t.clearOnSelected,cssClasses:t.cssClasses,datasets:n,keyboardShortcuts:t.keyboardShortcuts,appendTo:t.appendTo,autoWidth:t.autoWidth,ariaLabel:t.ariaLabel||r.getAttribute("aria-label")});c.data(s,h)});return c.autocomplete={},r.each(["open","close","getVal","setVal","destroy","getWrapper"],function(e){c.autocomplete[e]=function(){var t,n=arguments;return c.each(function(r,o){var a=i(o).data(s);t=a[e].apply(a,n)}),t}}),c}u.sources=o.sources,u.escapeHighlightedString=r.escapeHighlightedString;var c="autocomplete"in window,l=window.autocomplete;u.noConflict=function(){return c?window.autocomplete=l:delete window.autocomplete,u},e.exports=u},9116:function(e){e.exports="0.37.1"},2522:function(e){var t,n,i,r;t=window,function(e){var n,i=1,r=Array.prototype.slice,s=e.isFunction,o=function(e){return"string"==typeof e},a={},u={},c="onfocusin"in t,l={focus:"focusin",blur:"focusout"},h={mouseenter:"mouseover",mouseleave:"mouseout"};function p(e){return e._zid||(e._zid=i++)}function d(e,t,n,i){if((t=f(t)).ns)var r=RegExp("(?:^| )"+t.ns.replace(" "," .* ?")+"(?: |$)");return(a[p(e)]||[]).filter(function(e){return e&&(!t.e||e.e==t.e)&&(!t.ns||r.test(e.ns))&&(!n||p(e.fn)===p(n))&&(!i||e.sel==i)})}function f(e){var t=(""+e).split(".");return{e:t[0],ns:t.slice(1).sort().join(" ")}}function g(e,t){return e.del&&!c&&e.e in l||!!t}function m(e){return h[e]||c&&l[e]||e}function v(t,i,r,s,o,u,c){var l=p(t),d=a[l]||(a[l]=[]);i.split(/\s/).forEach(function(i){if("ready"==i)return e(document).ready(r);var a=f(i);a.fn=r,a.sel=o,a.e in h&&(r=function(t){var n=t.relatedTarget;if(!n||n!==this&&!e.contains(this,n))return a.fn.apply(this,arguments)}),a.del=u;var l=u||r;a.proxy=function(e){if(!(e=C(e)).isImmediatePropagationStopped()){try{var i=Object.getOwnPropertyDescriptor(e,"data");(!i||i.writable)&&(e.data=s)}catch(e){}var r=l.apply(t,e._args==n?[e]:[e].concat(e._args));return!1===r&&(e.preventDefault(),e.stopPropagation()),r}},a.i=d.length,d.push(a),"addEventListener"in t&&t.addEventListener(m(a.e),a.proxy,g(a,c))})}function y(e,t,n,i,r){var s=p(e);(t||"").split(/\s/).forEach(function(t){d(e,t,n,i).forEach(function(t){delete a[s][t.i],"removeEventListener"in e&&e.removeEventListener(m(t.e),t.proxy,g(t,r))})})}u.click=u.mousedown=u.mouseup=u.mousemove="MouseEvents",e.event={add:v,remove:y},e.proxy=function(t,n){var i=2 in arguments&&r.call(arguments,2);if(s(t)){var a=function(){return t.apply(n,i?i.concat(r.call(arguments)):arguments)};return a._zid=p(t),a}if(o(n))if(i)return i.unshift(t[n],t),e.proxy.apply(null,i);else return e.proxy(t[n],t);throw TypeError("expected function")},e.fn.bind=function(e,t,n){return this.on(e,t,n)},e.fn.unbind=function(e,t){return this.off(e,t)},e.fn.one=function(e,t,n,i){return this.on(e,t,n,i,1)};var x=function(){return!0},b=function(){return!1},w=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,S={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};function C(t,i){if(i||!t.isDefaultPrevented){i||(i=t),e.each(S,function(e,n){var r=i[e];t[e]=function(){return this[n]=x,r&&r.apply(i,arguments)},t[n]=b});try{t.timeStamp||(t.timeStamp=Date.now())}catch(e){}(i.defaultPrevented!==n?i.defaultPrevented:"returnValue"in i?!1===i.returnValue:i.getPreventDefault&&i.getPreventDefault())&&(t.isDefaultPrevented=x)}return t}function E(e){var t,i={originalEvent:e};for(t in e)w.test(t)||e[t]===n||(i[t]=e[t]);return C(i,e)}e.fn.delegate=function(e,t,n){return this.on(t,e,n)},e.fn.undelegate=function(e,t,n){return this.off(t,e,n)},e.fn.live=function(t,n){return e(document.body).delegate(this.selector,t,n),this},e.fn.die=function(t,n){return e(document.body).undelegate(this.selector,t,n),this},e.fn.on=function(t,i,a,u,c){var l,h,p=this;return t&&!o(t)?(e.each(t,function(e,t){p.on(e,i,a,t,c)}),p):(o(i)||s(u)||!1===u||(u=a,a=i,i=n),(n===u||!1===a)&&(u=a,a=n),!1===u&&(u=b),p.each(function(n,s){c&&(l=function(e){return y(s,e.type,u),u.apply(this,arguments)}),i&&(h=function(t){var n,o=e(t.target).closest(i,s).get(0);if(o&&o!==s)return n=e.extend(E(t),{currentTarget:o,liveFired:s}),(l||u).apply(o,[n].concat(r.call(arguments,1)))}),v(s,t,u,a,i,h||l)}))},e.fn.off=function(t,i,r){var a=this;return t&&!o(t)?(e.each(t,function(e,t){a.off(e,i,t)}),a):(o(i)||s(r)||!1===r||(r=i,i=n),!1===r&&(r=b),a.each(function(){y(this,t,r,i)}))},e.fn.trigger=function(t,n){return(t=o(t)||e.isPlainObject(t)?e.Event(t):C(t))._args=n,this.each(function(){t.type in l&&"function"==typeof this[t.type]?this[t.type]():"dispatchEvent"in this?this.dispatchEvent(t):e(this).triggerHandler(t,n)})},e.fn.triggerHandler=function(t,n){var i,r;return this.each(function(s,a){(i=E(o(t)?e.Event(t):t))._args=n,i.target=a,e.each(d(a,t.type||t),function(e,t){if(r=t.proxy(i),i.isImmediatePropagationStopped())return!1})}),r},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(t){e.fn[t]=function(e){return 0 in arguments?this.bind(t,e):this.trigger(t)}}),e.Event=function(e,t){o(e)||(e=(t=e).type);var n=document.createEvent(u[e]||"Events"),i=!0;if(t)for(var r in t)"bubbles"==r?i=!!t[r]:n[r]=t[r];return n.initEvent(e,i,!0),C(n)}}(r=function(){var e,n,i,r,s,o,a=[],u=a.concat,c=a.filter,l=a.slice,h=t.document,p={},d={},f={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},g=/^\s*<(\w+|!)[^>]*>/,m=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,y=/^(?:body|html)$/i,x=/([A-Z])/g,b=["val","css","html","text","data","width","height","offset"],w=h.createElement("table"),S=h.createElement("tr"),C={tr:h.createElement("tbody"),tbody:w,thead:w,tfoot:w,td:S,th:S,"*":h.createElement("div")},E=/complete|loaded|interactive/,_=/^[\w-]*$/,k={},T=k.toString,O={},L=h.createElement("div"),A={tabindex:"tabIndex",readonly:"readOnly",for:"htmlFor",class:"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},$=Array.isArray||function(e){return e instanceof Array};function P(e){return null==e?String(e):k[T.call(e)]||"object"}function I(e){return"function"==P(e)}function Q(e){return null!=e&&e==e.window}function R(e){return null!=e&&e.nodeType==e.DOCUMENT_NODE}function N(e){return"object"==P(e)}function D(e){return N(e)&&!Q(e)&&Object.getPrototypeOf(e)==Object.prototype}function F(e){var t=!!e&&"length"in e&&e.length,n=i.type(e);return"function"!=n&&!Q(e)&&("array"==n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function j(e){return e.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function H(e){return e in d?d[e]:d[e]=RegExp("(^|\\s)"+e+"(\\s|$)")}function V(e,t){return"number"!=typeof t||f[j(e)]?t:t+"px"}function B(e){return"children"in e?l.call(e.children):i.map(e.childNodes,function(e){if(1==e.nodeType)return e})}function M(e,t){var n,i=e?e.length:0;for(n=0;n<i;n++)this[n]=e[n];this.length=i,this.selector=t||""}function q(e,t){return null==t?i(e):i(e).filter(t)}function z(e,t,n,i){return I(t)?t.call(e,n,i):t}function K(e,t,n){null==n?e.removeAttribute(t):e.setAttribute(t,n)}function W(t,n){var i=t.className||"",r=i&&i.baseVal!==e;if(e===n)return r?i.baseVal:i;r?i.baseVal=n:t.className=n}function U(e){try{return e?"true"==e||"false"!=e&&("null"==e?null:+e+""==e?+e:/^[\[\{]/.test(e)?i.parseJSON(e):e):e}catch(t){return e}}return O.matches=function(e,t){if(!t||!e||1!==e.nodeType)return!1;var n=e.matches||e.webkitMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.matchesSelector;if(n)return n.call(e,t);var i,r=e.parentNode,s=!r;return s&&(r=L).appendChild(e),i=~O.qsa(r,t).indexOf(e),s&&L.removeChild(e),i},s=function(e){return e.replace(/-+(.)?/g,function(e,t){return t?t.toUpperCase():""})},o=function(e){return c.call(e,function(t,n){return e.indexOf(t)==n})},O.fragment=function(t,n,r){var s,o,a;return m.test(t)&&(s=i(h.createElement(RegExp.$1))),s||(t.replace&&(t=t.replace(v,"<$1></$2>")),e===n&&(n=g.test(t)&&RegExp.$1),n in C||(n="*"),(a=C[n]).innerHTML=""+t,s=i.each(l.call(a.childNodes),function(){a.removeChild(this)})),D(r)&&(o=i(s),i.each(r,function(e,t){b.indexOf(e)>-1?o[e](t):o.attr(e,t)})),s},O.Z=function(e,t){return new M(e,t)},O.isZ=function(e){return e instanceof O.Z},O.init=function(t,n){var r,s;if(!t)return O.Z();if("string"==typeof t)if("<"==(t=t.trim())[0]&&g.test(t))r=O.fragment(t,RegExp.$1,n),t=null;else{if(e!==n)return i(n).find(t);r=O.qsa(h,t)}else if(I(t))return i(h).ready(t);else if(O.isZ(t))return t;else if($(t))s=t,r=c.call(s,function(e){return null!=e});else if(N(t))r=[t],t=null;else if(g.test(t))r=O.fragment(t.trim(),RegExp.$1,n),t=null;else{if(e!==n)return i(n).find(t);r=O.qsa(h,t)}return O.Z(r,t)},(i=function(e,t){return O.init(e,t)}).extend=function(t){var i,r=l.call(arguments,1);return"boolean"==typeof t&&(i=t,t=r.shift()),r.forEach(function(r){!function t(i,r,s){for(n in r)s&&(D(r[n])||$(r[n]))?(D(r[n])&&!D(i[n])&&(i[n]={}),$(r[n])&&!$(i[n])&&(i[n]=[]),t(i[n],r[n],s)):r[n]!==e&&(i[n]=r[n])}(t,r,i)}),t},O.qsa=function(e,t){var n,i="#"==t[0],r=!i&&"."==t[0],s=i||r?t.slice(1):t,o=_.test(s);return e.getElementById&&o&&i?(n=e.getElementById(s))?[n]:[]:1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType?[]:l.call(o&&!i&&e.getElementsByClassName?r?e.getElementsByClassName(s):e.getElementsByTagName(t):e.querySelectorAll(t))},i.contains=h.documentElement.contains?function(e,t){return e!==t&&e.contains(t)}:function(e,t){for(;t&&(t=t.parentNode);)if(t===e)return!0;return!1},i.type=P,i.isFunction=I,i.isWindow=Q,i.isArray=$,i.isPlainObject=D,i.isEmptyObject=function(e){var t;for(t in e)return!1;return!0},i.isNumeric=function(e){var t=Number(e),n=typeof e;return null!=e&&"boolean"!=n&&("string"!=n||e.length)&&!isNaN(t)&&isFinite(t)||!1},i.inArray=function(e,t,n){return a.indexOf.call(t,e,n)},i.camelCase=s,i.trim=function(e){return null==e?"":String.prototype.trim.call(e)},i.uuid=0,i.support={},i.expr={},i.noop=function(){},i.map=function(e,t){var n,r,s,o=[];if(F(e))for(r=0;r<e.length;r++)null!=(n=t(e[r],r))&&o.push(n);else for(s in e)null!=(n=t(e[s],s))&&o.push(n);return o.length>0?i.fn.concat.apply([],o):o},i.each=function(e,t){var n,i;if(F(e))for(n=0;n<e.length&&!1!==t.call(e[n],n,e[n]);n++);else for(i in e)if(!1===t.call(e[i],i,e[i]))break;return e},i.grep=function(e,t){return c.call(e,t)},t.JSON&&(i.parseJSON=JSON.parse),i.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){k["[object "+t+"]"]=t.toLowerCase()}),i.fn={constructor:O.Z,length:0,forEach:a.forEach,reduce:a.reduce,push:a.push,sort:a.sort,splice:a.splice,indexOf:a.indexOf,concat:function(){var e,t,n=[];for(e=0;e<arguments.length;e++)t=arguments[e],n[e]=O.isZ(t)?t.toArray():t;return u.apply(O.isZ(this)?this.toArray():this,n)},map:function(e){return i(i.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return i(l.apply(this,arguments))},ready:function(e){return E.test(h.readyState)&&h.body?e(i):h.addEventListener("DOMContentLoaded",function(){e(i)},!1),this},get:function(t){return e===t?l.call(this):this[t>=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(e){return a.every.call(this,function(t,n){return!1!==e.call(t,n,t)}),this},filter:function(e){return I(e)?this.not(this.not(e)):i(c.call(this,function(t){return O.matches(t,e)}))},add:function(e,t){return i(o(this.concat(i(e,t))))},is:function(e){return this.length>0&&O.matches(this[0],e)},not:function(t){var n=[];if(I(t)&&t.call!==e)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):F(t)&&I(t.item)?l.call(t):i(t);this.forEach(function(e){0>r.indexOf(e)&&n.push(e)})}return i(n)},has:function(e){return this.filter(function(){return N(e)?i.contains(this,e):i(this).find(e).size()})},eq:function(e){return -1===e?this.slice(e):this.slice(e,+e+1)},first:function(){var e=this[0];return e&&!N(e)?e:i(e)},last:function(){var e=this[this.length-1];return e&&!N(e)?e:i(e)},find:function(e){var t=this;return e?"object"==typeof e?i(e).filter(function(){var e=this;return a.some.call(t,function(t){return i.contains(t,e)})}):1==this.length?i(O.qsa(this[0],e)):this.map(function(){return O.qsa(this,e)}):i()},closest:function(e,t){var n=[],r="object"==typeof e&&i(e);return this.each(function(i,s){for(;s&&!(r?r.indexOf(s)>=0:O.matches(s,e));)s=s!==t&&!R(s)&&s.parentNode;s&&0>n.indexOf(s)&&n.push(s)}),i(n)},parents:function(e){for(var t=[],n=this;n.length>0;)n=i.map(n,function(e){if((e=e.parentNode)&&!R(e)&&0>t.indexOf(e))return t.push(e),e});return q(t,e)},parent:function(e){return q(o(this.pluck("parentNode")),e)},children:function(e){return q(this.map(function(){return B(this)}),e)},contents:function(){return this.map(function(){return this.contentDocument||l.call(this.childNodes)})},siblings:function(e){return q(this.map(function(e,t){return c.call(B(t.parentNode),function(e){return e!==t})}),e)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(e){return i.map(this,function(t){return t[e]})},show:function(){return this.each(function(){var e,t,n;"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=(p[e=this.nodeName]||(t=h.createElement(e),h.body.appendChild(t),n=getComputedStyle(t,"").getPropertyValue("display"),t.parentNode.removeChild(t),"none"==n&&(n="block"),p[e]=n),p[e]))})},replaceWith:function(e){return this.before(e).remove()},wrap:function(e){var t=I(e);if(this[0]&&!t)var n=i(e).get(0),r=n.parentNode||this.length>1;return this.each(function(s){i(this).wrapAll(t?e.call(this,s):r?n.cloneNode(!0):n)})},wrapAll:function(e){if(this[0]){var t;for(i(this[0]).before(e=i(e));(t=e.children()).length;)e=t.first();i(e).append(this)}return this},wrapInner:function(e){var t=I(e);return this.each(function(n){var r=i(this),s=r.contents(),o=t?e.call(this,n):e;s.length?s.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){i(this).replaceWith(i(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var n=i(this);(e===t?"none"==n.css("display"):t)?n.show():n.hide()})},prev:function(e){return i(this.pluck("previousElementSibling")).filter(e||"*")},next:function(e){return i(this.pluck("nextElementSibling")).filter(e||"*")},html:function(e){return 0 in arguments?this.each(function(t){var n=this.innerHTML;i(this).empty().append(z(this,e,t,n))}):0 in this?this[0].innerHTML:null},text:function(e){return 0 in arguments?this.each(function(t){var n=z(this,e,t,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,i){var r;return"string"!=typeof t||1 in arguments?this.each(function(e){if(1===this.nodeType)if(N(t))for(n in t)K(this,n,t[n]);else K(this,t,z(this,i,e,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(r=this[0].getAttribute(t))?r:e},removeAttr:function(e){return this.each(function(){1===this.nodeType&&e.split(" ").forEach(function(e){K(this,e)},this)})},prop:function(e,t){return e=A[e]||e,1 in arguments?this.each(function(n){this[e]=z(this,t,n,this[e])}):this[0]&&this[0][e]},removeProp:function(e){return e=A[e]||e,this.each(function(){delete this[e]})},data:function(t,n){var i="data-"+t.replace(x,"-$1").toLowerCase(),r=1 in arguments?this.attr(i,n):this.attr(i);return null!==r?U(r):e},val:function(e){return 0 in arguments?(null==e&&(e=""),this.each(function(t){this.value=z(this,e,t,this.value)})):this[0]&&(this[0].multiple?i(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(e){if(e)return this.each(function(t){var n=i(this),r=z(this,e,t,n.offset()),s=n.offsetParent().offset(),o={top:r.top-s.top,left:r.left-s.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(h.documentElement!==this[0]&&!i.contains(h.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+t.pageXOffset,top:n.top+t.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(e,t){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[s(e)]||getComputedStyle(r,"").getPropertyValue(e)}if($(e)){if(!r)return;var o={},a=getComputedStyle(r,"");return i.each(e,function(e,t){o[t]=r.style[s(t)]||a.getPropertyValue(t)}),o}}var u="";if("string"==P(e))t||0===t?u=j(e)+":"+V(e,t):this.each(function(){this.style.removeProperty(j(e))});else for(n in e)e[n]||0===e[n]?u+=j(n)+":"+V(n,e[n])+";":this.each(function(){this.style.removeProperty(j(n))});return this.each(function(){this.style.cssText+=";"+u})},index:function(e){return e?this.indexOf(i(e)[0]):this.parent().children().indexOf(this[0])},hasClass:function(e){return!!e&&a.some.call(this,function(e){return this.test(W(e))},H(e))},addClass:function(e){return e?this.each(function(t){if("className"in this){r=[];var n=W(this);z(this,e,t,n).split(/\s+/g).forEach(function(e){i(this).hasClass(e)||r.push(e)},this),r.length&&W(this,n+(n?" ":"")+r.join(" "))}}):this},removeClass:function(t){return this.each(function(n){if("className"in this){if(e===t)return W(this,"");z(this,t,n,r=W(this)).split(/\s+/g).forEach(function(e){r=r.replace(H(e)," ")}),W(this,r.trim())}})},toggleClass:function(t,n){return t?this.each(function(r){var s=i(this);z(this,t,r,W(this)).split(/\s+/g).forEach(function(t){(e===n?!s.hasClass(t):n)?s.addClass(t):s.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var n="scrollTop"in this[0];return e===t?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var n="scrollLeft"in this[0];return e===t?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var e=this[0],t=this.offsetParent(),n=this.offset(),r=y.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(i(e).css("margin-top"))||0,n.left-=parseFloat(i(e).css("margin-left"))||0,r.top+=parseFloat(i(t[0]).css("border-top-width"))||0,r.left+=parseFloat(i(t[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||h.body;e&&!y.test(e.nodeName)&&"static"==i(e).css("position");)e=e.offsetParent;return e})}},i.fn.detach=i.fn.remove,["width","height"].forEach(function(t){var n=t.replace(/./,function(e){return e[0].toUpperCase()});i.fn[t]=function(r){var s,o=this[0];return e===r?Q(o)?o["inner"+n]:R(o)?o.documentElement["scroll"+n]:(s=this.offset())&&s[t]:this.each(function(e){(o=i(this)).css(t,z(this,r,e,o[t]()))})}}),["after","prepend","before","append"].forEach(function(n,r){var s=r%2;i.fn[n]=function(){var n,o,a=i.map(arguments,function(t){var r=[];return"array"==(n=P(t))?(t.forEach(function(t){return t.nodeType!==e?r.push(t):i.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(O.fragment(t)))}),r):"object"==n||null==t?t:O.fragment(t)}),u=this.length>1;return a.length<1?this:this.each(function(e,n){o=s?n:n.parentNode,n=0==r?n.nextSibling:1==r?n.firstChild:2==r?n:null;var c=i.contains(h.documentElement,o);a.forEach(function(e){if(u)e=e.cloneNode(!0);else if(!o)return i(e).remove();o.insertBefore(e,n),c&&function e(t,n){n(t);for(var i=0,r=t.childNodes.length;i<r;i++)e(t.childNodes[i],n)}(e,function(e){if(null!=e.nodeName&&"SCRIPT"===e.nodeName.toUpperCase()&&(!e.type||"text/javascript"===e.type)&&!e.src){var n=e.ownerDocument?e.ownerDocument.defaultView:t;n.eval.call(n,e.innerHTML)}})})})},i.fn[s?n+"To":"insert"+(r?"Before":"After")]=function(e){return i(e)[n](this),this}}),O.Z.prototype=M.prototype=i.fn,O.uniq=o,O.deserializeValue=U,i.zepto=O,i}()),i=[],r.fn.remove=function(){return this.each(function(){this.parentNode&&("IMG"===this.tagName&&(i.push(this),this.src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",n&&clearTimeout(n),n=setTimeout(function(){i=[]},6e4)),this.parentNode.removeChild(this))})},function(e){var t={},n=e.fn.data,i=e.camelCase,r=e.expando="Zepto"+ +new Date,s=[];function o(n,o,a){var u,c,l=n[r]||(n[r]=++e.uuid),h=t[l]||(t[l]=(u=n,c={},e.each(u.attributes||s,function(t,n){0==n.name.indexOf("data-")&&(c[i(n.name.replace("data-",""))]=e.zepto.deserializeValue(n.value))}),c));return void 0!==o&&(h[i(o)]=a),h}e.fn.data=function(s,a){return void 0===a?e.isPlainObject(s)?this.each(function(t,n){e.each(s,function(e,t){o(n,e,t)})}):0 in this?function(s,a){var u=s[r],c=u&&t[u];if(void 0===a)return c||o(s);if(c){if(a in c)return c[a];var l=i(a);if(l in c)return c[l]}return n.call(e(s),a)}(this[0],s):void 0:this.each(function(){o(this,s,a)})},e.data=function(t,n,i){return e(t).data(n,i)},e.hasData=function(n){var i=n[r],s=i&&t[i];return!!s&&!e.isEmptyObject(s)},e.fn.removeData=function(n){return"string"==typeof n&&(n=n.split(/\s+/)),this.each(function(){var s=this[r],o=s&&t[s];o&&e.each(n||o,function(e){delete o[n?i(this):e]})})},["remove","empty"].forEach(function(t){var n=e.fn[t];e.fn[t]=function(){var e=this.find("*");return"remove"===t&&(e=e.add(this)),e.removeData(),n.call(this)}})}(r),e.exports=r},8513:function(e,t){!function(e){var t=/\S/,n=/\"/g,i=/\n/g,r=/\r/g,s=/\\/g,o=/\u2028/,a=/\u2029/;function u(e){return e.trim?e.trim():e.replace(/^\s*|\s*$/g,"")}function c(e,t,n){if(t.charAt(n)!=e.charAt(0))return!1;for(var i=1,r=e.length;i<r;i++)if(t.charAt(n+i)!=e.charAt(i))return!1;return!0}e.tags={"#":1,"^":2,"<":3,$:4,"/":5,"!":6,">":7,"=":8,_v:9,"{":10,"&":11,_t:12},e.scan=function(n,i){var r,s=n.length,o=0,a=null,l=null,h="",p=[],d=!1,f=0,g=0,m="{{",v="}}";function y(){h.length>0&&(p.push({tag:"_t",text:new String(h)}),h="")}function x(n,i){if(y(),n&&function(){for(var n=!0,i=g;i<p.length;i++)if(!(n=e.tags[p[i].tag]<e.tags._v||"_t"==p[i].tag&&null===p[i].text.match(t)))return!1;return n}())for(var r,s=g;s<p.length;s++)p[s].text&&((r=p[s+1])&&">"==r.tag&&(r.indent=p[s].text.toString()),p.splice(s,1));else i||p.push({tag:"\n"});d=!1,g=p.length}for(i&&(m=(i=i.split(" "))[0],v=i[1]),f=0;f<s;f++){0==o?c(m,n,f)?(--f,y(),o=1):"\n"==n.charAt(f)?x(d):h+=n.charAt(f):1==o?(f+=m.length-1,"="==(a=(l=e.tags[n.charAt(f+1)])?n.charAt(f+1):"_v")?(f=function(e,t){var n="="+v,i=e.indexOf(n,t),r=u(e.substring(e.indexOf("=",t)+1,i)).split(" ");return m=r[0],v=r[r.length-1],i+n.length-1}(n,f),o=0):(l&&f++,o=2),d=f):c(v,n,f)?(p.push({tag:a,n:u(h),otag:m,ctag:v,i:"/"==a?d-m.length:f+v.length}),h="",f+=v.length-1,o=0,"{"==a&&("}}"==v?f++:"}"===(r=p[p.length-1]).n.substr(r.n.length-1)&&(r.n=r.n.substring(0,r.n.length-1)))):h+=n.charAt(f)}return x(d,!0),p};var l={_t:!0,"\n":!0,$:!0,"/":!0};e.stringify=function(t,n,i){return"{code: function (c,p,i) { "+e.wrapMain(t.code)+" },"+function e(t){var n=[];for(var i in t.partials)n.push('"'+p(i)+'":{name:"'+p(t.partials[i].name)+'", '+e(t.partials[i])+"}");return"partials: {"+n.join(",")+"}, subs: "+function(e){var t=[];for(var n in e)t.push('"'+p(n)+'": function(c,p,t,i) {'+e[n]+"}");return"{ "+t.join(",")+" }"}(t.subs)}(t)+"}"};var h=0;function p(e){return e.replace(s,"\\\\").replace(n,'\\"').replace(i,"\\n").replace(r,"\\r").replace(o,"\\u2028").replace(a,"\\u2029")}function d(e){return~e.indexOf(".")?"d":"f"}function f(e,t){var n="<"+(t.prefix||"")+e.n+h++;return t.partials[n]={name:e.n,partials:{}},t.code+='t.b(t.rp("'+p(n)+'",c,p,"'+(e.indent||"")+'"));',n}function g(e,t){t.code+="t.b(t.t(t."+d(e.n)+'("'+p(e.n)+'",c,p,0)));'}function m(e){return"t.b("+e+");"}e.generate=function(t,n,i){h=0;var r={code:"",subs:{},partials:{}};return(e.walk(t,r),i.asString)?this.stringify(r,n,i):this.makeTemplate(r,n,i)},e.wrapMain=function(e){return'var t=this;t.b(i=i||"");'+e+"return t.fl();"},e.template=e.Template,e.makeTemplate=function(e,t,n){var i=this.makePartials(e);return i.code=Function("c","p","i",this.wrapMain(e.code)),new this.template(i,t,this,n)},e.makePartials=function(e){var t,n={subs:{},partials:e.partials,name:e.name};for(t in n.partials)n.partials[t]=this.makePartials(n.partials[t]);for(t in e.subs)n.subs[t]=Function("c","p","t","i",e.subs[t]);return n},e.codegen={"#":function(t,n){n.code+="if(t.s(t."+d(t.n)+'("'+p(t.n)+'",c,p,1),c,p,0,'+t.i+","+t.end+',"'+t.otag+" "+t.ctag+'")){t.rs(c,p,function(c,p,t){',e.walk(t.nodes,n),n.code+="});c.pop();}"},"^":function(t,n){n.code+="if(!t.s(t."+d(t.n)+'("'+p(t.n)+'",c,p,1),c,p,1,0,0,"")){',e.walk(t.nodes,n),n.code+="};"},">":f,"<":function(t,n){var i={partials:{},code:"",subs:{},inPartial:!0};e.walk(t.nodes,i);var r=n.partials[f(t,n)];r.subs=i.subs,r.partials=i.partials},$:function(t,n){var i={subs:{},code:"",partials:n.partials,prefix:t.n};e.walk(t.nodes,i),n.subs[t.n]=i.code,n.inPartial||(n.code+='t.sub("'+p(t.n)+'",c,p,i);')},"\n":function(e,t){t.code+=m('"\\n"'+(e.last?"":" + i"))},_v:function(e,t){t.code+="t.b(t.v(t."+d(e.n)+'("'+p(e.n)+'",c,p,0)));'},_t:function(e,t){t.code+=m('"'+p(e.text)+'"')},"{":g,"&":g},e.walk=function(t,n){for(var i,r=0,s=t.length;r<s;r++)(i=e.codegen[t[r].tag])&&i(t[r],n);return n},e.parse=function(t,n,i){return function t(n,i,r,s){var o=[],a=null,u=null,c=null;for(u=r[r.length-1];n.length>0;){if(c=n.shift(),u&&"<"==u.tag&&!(c.tag in l))throw Error("Illegal content in < super tag.");if(e.tags[c.tag]<=e.tags.$||function(e,t){for(var n=0,i=t.length;n<i;n++)if(t[n].o==e.n)return e.tag="#",!0}(c,s))r.push(c),c.nodes=t(n,c.tag,r,s);else if("/"==c.tag){if(0===r.length)throw Error("Closing tag without opener: /"+c.n);if(a=r.pop(),c.n!=a.n&&!function(e,t,n){for(var i=0,r=n.length;i<r;i++)if(n[i].c==e&&n[i].o==t)return!0}(c.n,a.n,s))throw Error("Nesting error: "+a.n+" vs. "+c.n);return a.end=c.i,o}else"\n"==c.tag&&(c.last=0==n.length||"\n"==n[0].tag);o.push(c)}if(r.length>0)throw Error("missing closing tag: "+r.pop().n);return o}(t,"",[],(i=i||{}).sectionTags||[])},e.cache={},e.cacheKey=function(e,t){return[e,!!t.asString,!!t.disableLambda,t.delimiters,!!t.modelGet].join("||")},e.compile=function(t,n){n=n||{};var i=e.cacheKey(t,n),r=this.cache[i];if(r){var s=r.partials;for(var o in s)delete s[o].instance;return r}return r=this.generate(this.parse(this.scan(t,n.delimiters),t,n),t,n),this.cache[i]=r}}(t)},5931:function(e,t,n){var i=n(8513);i.Template=n(1642).Template,i.template=i.Template,e.exports=i},1642:function(e,t){!function(e){function t(e,t,n){var i;return t&&"object"==typeof t&&(void 0!==t[e]?i=t[e]:n&&t.get&&"function"==typeof t.get&&(i=t.get(e))),i}e.Template=function(e,t,n,i){e=e||{},this.r=e.code||this.r,this.c=n,this.options=i||{},this.text=t||"",this.partials=e.partials||{},this.subs=e.subs||{},this.buf=""},e.Template.prototype={r:function(e,t,n){return""},v:function(e){return a.test(e=u(e))?e.replace(n,"&amp;").replace(i,"&lt;").replace(r,"&gt;").replace(s,"&#39;").replace(o,"&quot;"):e},t:u,render:function(e,t,n){return this.ri([e],t||{},n)},ri:function(e,t,n){return this.r(e,t,n)},ep:function(e,t){var n=this.partials[e],i=t[n.name];if(n.instance&&n.base==i)return n.instance;if("string"==typeof i){if(!this.c)throw Error("No compiler available.");i=this.c.compile(i,this.options)}if(!i)return null;if(this.partials[e].base=i,n.subs){for(key in t.stackText||(t.stackText={}),n.subs)t.stackText[key]||(t.stackText[key]=void 0!==this.activeSub&&t.stackText[this.activeSub]?t.stackText[this.activeSub]:this.text);i=function(e,t,n,i,r,s){function o(){}function a(){}o.prototype=e,a.prototype=e.subs;var u,c=new o;for(u in c.subs=new a,c.subsText={},c.buf="",c.stackSubs=i=i||{},c.subsText=s,t)i[u]||(i[u]=t[u]);for(u in i)c.subs[u]=i[u];for(u in c.stackPartials=r=r||{},n)r[u]||(r[u]=n[u]);for(u in r)c.partials[u]=r[u];return c}(i,n.subs,n.partials,this.stackSubs,this.stackPartials,t.stackText)}return this.partials[e].instance=i,i},rp:function(e,t,n,i){var r=this.ep(e,n);return r?r.ri(t,n,i):""},rs:function(e,t,n){var i=e[e.length-1];if(!c(i))return void n(e,t,this);for(var r=0;r<i.length;r++)e.push(i[r]),n(e,t,this),e.pop()},s:function(e,t,n,i,r,s,o){var a;return(!c(e)||0!==e.length)&&("function"==typeof e&&(e=this.ms(e,t,n,i,r,s,o)),a=!!e,!i&&a&&t&&t.push("object"==typeof e?e:t[t.length-1]),a)},d:function(e,n,i,r){var s,o=e.split("."),a=this.f(o[0],n,i,r),u=this.options.modelGet,l=null;if("."===e&&c(n[n.length-2]))a=n[n.length-1];else for(var h=1;h<o.length;h++)void 0!==(s=t(o[h],a,u))?(l=a,a=s):a="";return(!r||!!a)&&(r||"function"!=typeof a||(n.push(l),a=this.mv(a,n,i),n.pop()),a)},f:function(e,n,i,r){for(var s=!1,o=null,a=!1,u=this.options.modelGet,c=n.length-1;c>=0;c--)if(void 0!==(s=t(e,n[c],u))){a=!0;break}return a?(r||"function"!=typeof s||(s=this.mv(s,n,i)),s):!r&&""},ls:function(e,t,n,i,r){var s=this.options.delimiters;return this.options.delimiters=r,this.b(this.ct(u(e.call(t,i)),t,n)),this.options.delimiters=s,!1},ct:function(e,t,n){if(this.options.disableLambda)throw Error("Lambda features disabled.");return this.c.compile(e,this.options).render(t,n)},b:function(e){this.buf+=e},fl:function(){var e=this.buf;return this.buf="",e},ms:function(e,t,n,i,r,s,o){var a,u=t[t.length-1],c=e.call(u);if("function"==typeof c)if(i)return!0;else return a=this.activeSub&&this.subsText&&this.subsText[this.activeSub]?this.subsText[this.activeSub]:this.text,this.ls(c,u,n,a.substring(r,s),o);return c},mv:function(e,t,n){var i=t[t.length-1],r=e.call(i);return"function"==typeof r?this.ct(u(r.call(i)),i,n):r},sub:function(e,t,n,i){var r=this.subs[e];r&&(this.activeSub=e,r(t,n,this,i),this.activeSub=!1)}};var n=/&/g,i=/</g,r=/>/g,s=/\'/g,o=/\"/g,a=/[&<>\"\']/;function u(e){return String(null==e?"":e)}var c=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}}(t)},2539:function(e,t,n){"use strict";var i,r,s,o=[n(7236),n(291),n(7868),n(5785),n(3470),n(8472)],a=-1,u=[],c=!1;function l(){i&&r&&(i=!1,r.length?u=r.concat(u):a=-1,u.length&&h())}function h(){if(!i){c=!1,i=!0;for(var e=u.length,t=setTimeout(l);e;){for(r=u,u=[];r&&++a<e;)r[a].run();a=-1,e=u.length}r=null,a=-1,i=!1,clearTimeout(t)}}for(var p=-1,d=o.length;++p<d;)if(o[p]&&o[p].test&&o[p].test()){s=o[p].install(h);break}function f(e,t){this.fun=e,this.array=t}f.prototype.run=function(){var e=this.fun,t=this.array;switch(t.length){case 0:return e();case 1:return e(t[0]);case 2:return e(t[0],t[1]);case 3:return e(t[0],t[1],t[2]);default:return e.apply(null,t)}},e.exports=function(e){var t=Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];u.push(new f(e,t)),c||i||(c=!0,s())}},5785:function(e,t,n){"use strict";t.test=function(){return!n.g.setImmediate&&void 0!==n.g.MessageChannel},t.install=function(e){var t=new n.g.MessageChannel;return t.port1.onmessage=e,function(){t.port2.postMessage(0)}}},7868:function(e,t,n){"use strict";var i=n.g.MutationObserver||n.g.WebKitMutationObserver;t.test=function(){return i},t.install=function(e){var t=0,r=new i(e),s=n.g.document.createTextNode("");return r.observe(s,{characterData:!0}),function(){s.data=t=++t%2}}},291:function(e,t,n){"use strict";t.test=function(){return"function"==typeof n.g.queueMicrotask},t.install=function(e){return function(){n.g.queueMicrotask(e)}}},3470:function(e,t,n){"use strict";t.test=function(){return"document"in n.g&&"onreadystatechange"in n.g.document.createElement("script")},t.install=function(e){return function(){var t=n.g.document.createElement("script");return t.onreadystatechange=function(){e(),t.onreadystatechange=null,t.parentNode.removeChild(t),t=null},n.g.document.documentElement.appendChild(t),e}}},8472:function(e,t){"use strict";t.test=function(){return!0},t.install=function(e){return function(){setTimeout(e,0)}}},6430:function(e){!function(){var t,n,i,r,s,o,a,u,c,l,h,p,d,f,g,m,v,y,x,b,w,S,C,E,_,k,T,O,L,A,$=function(e){var t=new $.Builder;return t.pipeline.add($.trimmer,$.stopWordFilter,$.stemmer),t.searchPipeline.add($.stemmer),e.call(t,t),t.build()};$.version="2.3.9",$.utils={},$.utils.warn=(t=this,function(e){t.console&&console.warn&&console.warn(e)}),$.utils.asString=function(e){return null==e?"":e.toString()},$.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),i=0;i<n.length;i++){var r=n[i],s=e[r];if(Array.isArray(s)){t[r]=s.slice();continue}if("string"==typeof s||"number"==typeof s||"boolean"==typeof s){t[r]=s;continue}throw TypeError("clone is not deep and does not support nested objects")}return t},$.FieldRef=function(e,t,n){this.docRef=e,this.fieldName=t,this._stringValue=n},$.FieldRef.joiner="/",$.FieldRef.fromString=function(e){var t=e.indexOf($.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var n=e.slice(0,t),i=e.slice(t+1);return new $.FieldRef(i,n,e)},$.FieldRef.prototype.toString=function(){return void 0==this._stringValue&&(this._stringValue=this.fieldName+$.FieldRef.joiner+this.docRef),this._stringValue},$.Set=function(e){if(this.elements=Object.create(null),e){this.length=e.length;for(var t=0;t<this.length;t++)this.elements[e[t]]=!0}else this.length=0},$.Set.complete={intersect:function(e){return e},union:function(){return this},contains:function(){return!0}},$.Set.empty={intersect:function(){return this},union:function(e){return e},contains:function(){return!1}},$.Set.prototype.contains=function(e){return!!this.elements[e]},$.Set.prototype.intersect=function(e){var t,n,i,r=[];if(e===$.Set.complete)return this;if(e===$.Set.empty)return e;this.length<e.length?(t=this,n=e):(t=e,n=this),i=Object.keys(t.elements);for(var s=0;s<i.length;s++){var o=i[s];o in n.elements&&r.push(o)}return new $.Set(r)},$.Set.prototype.union=function(e){return e===$.Set.complete?$.Set.complete:e===$.Set.empty?this:new $.Set(Object.keys(this.elements).concat(Object.keys(e.elements)))},$.idf=function(e,t){var n=0;for(var i in e)"_index"!=i&&(n+=Object.keys(e[i]).length);return Math.log(1+Math.abs((t-n+.5)/(n+.5)))},$.Token=function(e,t){this.str=e||"",this.metadata=t||{}},$.Token.prototype.toString=function(){return this.str},$.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},$.Token.prototype.clone=function(e){return e=e||function(e){return e},new $.Token(e(this.str,this.metadata),this.metadata)},$.tokenizer=function(e,t){if(null==e||void 0==e)return[];if(Array.isArray(e))return e.map(function(e){return new $.Token($.utils.asString(e).toLowerCase(),$.utils.clone(t))});for(var n=e.toString().toLowerCase(),i=n.length,r=[],s=0,o=0;s<=i;s++){var a=n.charAt(s),u=s-o;if(a.match($.tokenizer.separator)||s==i){if(u>0){var c=$.utils.clone(t)||{};c.position=[o,u],c.index=r.length,r.push(new $.Token(n.slice(o,s),c))}o=s+1}}return r},$.tokenizer.separator=/[\s\-]+/,$.Pipeline=function(){this._stack=[]},$.Pipeline.registeredFunctions=Object.create(null),$.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&$.utils.warn("Overwriting existing registered function: "+t),e.label=t,$.Pipeline.registeredFunctions[e.label]=e},$.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||$.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},$.Pipeline.load=function(e){var t=new $.Pipeline;return e.forEach(function(e){var n=$.Pipeline.registeredFunctions[e];if(n)t.add(n);else throw Error("Cannot load unregistered function: "+e)}),t},$.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){$.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},$.Pipeline.prototype.after=function(e,t){$.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},$.Pipeline.prototype.before=function(e,t){$.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw Error("Cannot find existingFn");this._stack.splice(n,0,t)},$.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},$.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n<t;n++){for(var i=this._stack[n],r=[],s=0;s<e.length;s++){var o=i(e[s],s,e);if(null!=o&&""!==o)if(Array.isArray(o))for(var a=0;a<o.length;a++)r.push(o[a]);else r.push(o)}e=r}return e},$.Pipeline.prototype.runString=function(e,t){var n=new $.Token(e,t);return this.run([n]).map(function(e){return e.toString()})},$.Pipeline.prototype.reset=function(){this._stack=[]},$.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return $.Pipeline.warnIfFunctionNotRegistered(e),e.label})},$.Vector=function(e){this._magnitude=0,this.elements=e||[]},$.Vector.prototype.positionForIndex=function(e){if(0==this.elements.length)return 0;for(var t=0,n=this.elements.length/2,i=n-t,r=Math.floor(i/2),s=this.elements[2*r];i>1&&(s<e&&(t=r),s>e&&(n=r),s!=e);)i=n-t,r=t+Math.floor(i/2),s=this.elements[2*r];return s==e||s>e?2*r:s<e?(r+1)*2:void 0},$.Vector.prototype.insert=function(e,t){this.upsert(e,t,function(){throw"duplicate index"})},$.Vector.prototype.upsert=function(e,t,n){this._magnitude=0;var i=this.positionForIndex(e);this.elements[i]==e?this.elements[i+1]=n(this.elements[i+1],t):this.elements.splice(i,0,e,t)},$.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,t=this.elements.length,n=1;n<t;n+=2){var i=this.elements[n];e+=i*i}return this._magnitude=Math.sqrt(e)},$.Vector.prototype.dot=function(e){for(var t=0,n=this.elements,i=e.elements,r=n.length,s=i.length,o=0,a=0,u=0,c=0;u<r&&c<s;)(o=n[u])<(a=i[c])?u+=2:o>a?c+=2:o==a&&(t+=n[u+1]*i[c+1],u+=2,c+=2);return t},$.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},$.Vector.prototype.toArray=function(){for(var e=Array(this.elements.length/2),t=1,n=0;t<this.elements.length;t+=2,n++)e[n]=this.elements[t];return e},$.Vector.prototype.toJSON=function(){return this.elements},n={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},i={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},a="^("+(s="[^aeiou][^aeiouy]*")+")?"+(o=(r="[aeiouy]")+"[aeiou]*")+s+"("+o+")?$",u="^("+s+")?"+o+s+o+s,c=RegExp("^("+s+")?"+o+s),l=new RegExp(u),h=new RegExp(a),p=RegExp("^("+s+")?"+r),d=/^(.+?)(ss|i)es$/,f=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,v=/.$/,y=/(at|bl|iz)$/,x=RegExp("([^aeiouylsz])\\1$"),b=RegExp("^"+s+r+"[^aeiouwxy]$"),w=/^(.+?[^aeiou])y$/,S=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,C=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,E=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,k=/^(.+?)e$/,T=/ll$/,O=RegExp("^"+s+r+"[^aeiouwxy]$"),L=function(e){var t,r,s,o,a,u;if(e.length<3)return e;if("y"==(s=e.substr(0,1))&&(e=s.toUpperCase()+e.substr(1)),o=d,a=f,o.test(e)?e=e.replace(o,"$1$2"):a.test(e)&&(e=e.replace(a,"$1$2")),o=g,a=m,o.test(e)){var L=o.exec(e);(o=c).test(L[1])&&(o=v,e=e.replace(o,""))}else if(a.test(e)){var L=a.exec(e);t=L[1],(a=p).test(t)&&(e=t,a=y,u=x,a.test(e)?e+="e":u.test(e)?(o=v,e=e.replace(o,"")):b.test(e)&&(e+="e"))}if((o=w).test(e)){var L=o.exec(e);e=(t=L[1])+"i"}if((o=S).test(e)){var L=o.exec(e);t=L[1],r=L[2],(o=c).test(t)&&(e=t+n[r])}if((o=C).test(e)){var L=o.exec(e);t=L[1],r=L[2],(o=c).test(t)&&(e=t+i[r])}if(o=E,a=_,o.test(e)){var L=o.exec(e);t=L[1],(o=l).test(t)&&(e=t)}else if(a.test(e)){var L=a.exec(e);t=L[1]+L[2],(a=l).test(t)&&(e=t)}if((o=k).test(e)){var L=o.exec(e);t=L[1],o=l,a=h,u=O,(o.test(t)||a.test(t)&&!u.test(t))&&(e=t)}return o=T,a=l,o.test(e)&&a.test(e)&&(o=v,e=e.replace(o,"")),"y"==s&&(e=s.toLowerCase()+e.substr(1)),e},$.stemmer=function(e){return e.update(L)},$.Pipeline.registerFunction($.stemmer,"stemmer"),$.generateStopWordFilter=function(e){var t=e.reduce(function(e,t){return e[t]=t,e},{});return function(e){if(e&&t[e.toString()]!==e.toString())return e}},$.stopWordFilter=$.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),$.Pipeline.registerFunction($.stopWordFilter,"stopWordFilter"),$.trimmer=function(e){return e.update(function(e){return e.replace(/^\W+/,"").replace(/\W+$/,"")})},$.Pipeline.registerFunction($.trimmer,"trimmer"),$.TokenSet=function(){this.final=!1,this.edges={},this.id=$.TokenSet._nextId,$.TokenSet._nextId+=1},$.TokenSet._nextId=1,$.TokenSet.fromArray=function(e){for(var t=new $.TokenSet.Builder,n=0,i=e.length;n<i;n++)t.insert(e[n]);return t.finish(),t.root},$.TokenSet.fromClause=function(e){return"editDistance"in e?$.TokenSet.fromFuzzyString(e.term,e.editDistance):$.TokenSet.fromString(e.term)},$.TokenSet.fromFuzzyString=function(e,t){for(var n=new $.TokenSet,i=[{node:n,editsRemaining:t,str:e}];i.length;){var r=i.pop();if(r.str.length>0){var s,o=r.str.charAt(0);o in r.node.edges?s=r.node.edges[o]:(s=new $.TokenSet,r.node.edges[o]=s),1==r.str.length&&(s.final=!0),i.push({node:s,editsRemaining:r.editsRemaining,str:r.str.slice(1)})}if(0!=r.editsRemaining){if("*"in r.node.edges)var a=r.node.edges["*"];else{var a=new $.TokenSet;r.node.edges["*"]=a}if(0==r.str.length&&(a.final=!0),i.push({node:a,editsRemaining:r.editsRemaining-1,str:r.str}),r.str.length>1&&i.push({node:r.node,editsRemaining:r.editsRemaining-1,str:r.str.slice(1)}),1==r.str.length&&(r.node.final=!0),r.str.length>=1){if("*"in r.node.edges)var u=r.node.edges["*"];else{var u=new $.TokenSet;r.node.edges["*"]=u}1==r.str.length&&(u.final=!0),i.push({node:u,editsRemaining:r.editsRemaining-1,str:r.str.slice(1)})}if(r.str.length>1){var c,l=r.str.charAt(0),h=r.str.charAt(1);h in r.node.edges?c=r.node.edges[h]:(c=new $.TokenSet,r.node.edges[h]=c),1==r.str.length&&(c.final=!0),i.push({node:c,editsRemaining:r.editsRemaining-1,str:l+r.str.slice(2)})}}}return n},$.TokenSet.fromString=function(e){for(var t=new $.TokenSet,n=t,i=0,r=e.length;i<r;i++){var s=e[i],o=i==r-1;if("*"==s)t.edges[s]=t,t.final=o;else{var a=new $.TokenSet;a.final=o,t.edges[s]=a,t=a}}return n},$.TokenSet.prototype.toArray=function(){for(var e=[],t=[{prefix:"",node:this}];t.length;){var n=t.pop(),i=Object.keys(n.node.edges),r=i.length;n.node.final&&(n.prefix.charAt(0),e.push(n.prefix));for(var s=0;s<r;s++){var o=i[s];t.push({prefix:n.prefix.concat(o),node:n.node.edges[o]})}}return e},$.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",t=Object.keys(this.edges).sort(),n=t.length,i=0;i<n;i++){var r=t[i],s=this.edges[r];e=e+r+s.id}return e},$.TokenSet.prototype.intersect=function(e){for(var t=new $.TokenSet,n=void 0,i=[{qNode:e,output:t,node:this}];i.length;)for(var r=Object.keys((n=i.pop()).qNode.edges),s=r.length,o=Object.keys(n.node.edges),a=o.length,u=0;u<s;u++)for(var c=r[u],l=0;l<a;l++){var h=o[l];if(h==c||"*"==c){var p=n.node.edges[h],d=n.qNode.edges[c],f=p.final&&d.final,g=void 0;h in n.output.edges?(g=n.output.edges[h]).final=g.final||f:((g=new $.TokenSet).final=f,n.output.edges[h]=g),i.push({qNode:d,output:g,node:p})}}return t},$.TokenSet.Builder=function(){this.previousWord="",this.root=new $.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},$.TokenSet.Builder.prototype.insert=function(e){var t,n=0;if(e<this.previousWord)throw Error("Out of order word insertion");for(var i=0;i<e.length&&i<this.previousWord.length&&e[i]==this.previousWord[i];i++)n++;this.minimize(n),t=0==this.uncheckedNodes.length?this.root:this.uncheckedNodes[this.uncheckedNodes.length-1].child;for(var i=n;i<e.length;i++){var r=new $.TokenSet,s=e[i];t.edges[s]=r,this.uncheckedNodes.push({parent:t,char:s,child:r}),t=r}t.final=!0,this.previousWord=e},$.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},$.TokenSet.Builder.prototype.minimize=function(e){for(var t=this.uncheckedNodes.length-1;t>=e;t--){var n=this.uncheckedNodes[t],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}},$.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},$.Index.prototype.search=function(e){return this.query(function(t){new $.QueryParser(e,t).parse()})},$.Index.prototype.query=function(e){for(var t=new $.Query(this.fields),n=Object.create(null),i=Object.create(null),r=Object.create(null),s=Object.create(null),o=Object.create(null),a=0;a<this.fields.length;a++)i[this.fields[a]]=new $.Vector;e.call(t,t);for(var a=0;a<t.clauses.length;a++){var u=t.clauses[a],c=null,l=$.Set.empty;c=u.usePipeline?this.pipeline.runString(u.term,{fields:u.fields}):[u.term];for(var h=0;h<c.length;h++){u.term=c[h];var p=$.TokenSet.fromClause(u),d=this.tokenSet.intersect(p).toArray();if(0===d.length&&u.presence===$.Query.presence.REQUIRED){for(var f=0;f<u.fields.length;f++){var g=u.fields[f];s[g]=$.Set.empty}break}for(var m=0;m<d.length;m++)for(var v=d[m],y=this.invertedIndex[v],x=y._index,f=0;f<u.fields.length;f++){var g=u.fields[f],b=y[g],w=Object.keys(b),S=v+"/"+g,C=new $.Set(w);if(u.presence==$.Query.presence.REQUIRED&&(l=l.union(C),void 0===s[g]&&(s[g]=$.Set.complete)),u.presence==$.Query.presence.PROHIBITED){void 0===o[g]&&(o[g]=$.Set.empty),o[g]=o[g].union(C);continue}if(i[g].upsert(x,u.boost,function(e,t){return e+t}),!r[S]){for(var E=0;E<w.length;E++){var _,k=w[E],T=new $.FieldRef(k,g),O=b[k];void 0===(_=n[T])?n[T]=new $.MatchData(v,g,O):_.add(v,g,O)}r[S]=!0}}}if(u.presence===$.Query.presence.REQUIRED)for(var f=0;f<u.fields.length;f++){var g=u.fields[f];s[g]=s[g].intersect(l)}}for(var L=$.Set.complete,A=$.Set.empty,a=0;a<this.fields.length;a++){var g=this.fields[a];s[g]&&(L=L.intersect(s[g])),o[g]&&(A=A.union(o[g]))}var P=Object.keys(n),I=[],Q=Object.create(null);if(t.isNegated()){P=Object.keys(this.fieldVectors);for(var a=0;a<P.length;a++){var T=P[a],R=$.FieldRef.fromString(T);n[T]=new $.MatchData}}for(var a=0;a<P.length;a++){var R=$.FieldRef.fromString(P[a]),N=R.docRef;if(L.contains(N)&&!A.contains(N)){var D,F=this.fieldVectors[R],j=i[R.fieldName].similarity(F);if(void 0!==(D=Q[N]))D.score+=j,D.matchData.combine(n[R]);else{var H={ref:N,score:j,matchData:n[R]};Q[N]=H,I.push(H)}}}return I.sort(function(e,t){return t.score-e.score})},$.Index.prototype.toJSON=function(){var e=Object.keys(this.invertedIndex).sort().map(function(e){return[e,this.invertedIndex[e]]},this),t=Object.keys(this.fieldVectors).map(function(e){return[e,this.fieldVectors[e].toJSON()]},this);return{version:$.version,fields:this.fields,fieldVectors:t,invertedIndex:e,pipeline:this.pipeline.toJSON()}},$.Index.load=function(e){var t={},n={},i=e.fieldVectors,r=Object.create(null),s=e.invertedIndex,o=new $.TokenSet.Builder,a=$.Pipeline.load(e.pipeline);e.version!=$.version&&$.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+$.version+"' does not match serialized index '"+e.version+"'");for(var u=0;u<i.length;u++){var c=i[u],l=c[0],h=c[1];n[l]=new $.Vector(h)}for(var u=0;u<s.length;u++){var c=s[u],p=c[0],d=c[1];o.insert(p),r[p]=d}return o.finish(),t.fields=e.fields,t.fieldVectors=n,t.invertedIndex=r,t.tokenSet=o.root,t.pipeline=a,new $.Index(t)},$.Builder=function(){this._ref="id",this._fields=Object.create(null),this._documents=Object.create(null),this.invertedIndex=Object.create(null),this.fieldTermFrequencies={},this.fieldLengths={},this.tokenizer=$.tokenizer,this.pipeline=new $.Pipeline,this.searchPipeline=new $.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},$.Builder.prototype.ref=function(e){this._ref=e},$.Builder.prototype.field=function(e,t){if(/\//.test(e))throw RangeError("Field '"+e+"' contains illegal character '/'");this._fields[e]=t||{}},$.Builder.prototype.b=function(e){e<0?this._b=0:e>1?this._b=1:this._b=e},$.Builder.prototype.k1=function(e){this._k1=e},$.Builder.prototype.add=function(e,t){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var r=0;r<i.length;r++){var s=i[r],o=this._fields[s].extractor,a=o?o(e):e[s],u=this.tokenizer(a,{fields:[s]}),c=this.pipeline.run(u),l=new $.FieldRef(n,s),h=Object.create(null);this.fieldTermFrequencies[l]=h,this.fieldLengths[l]=0,this.fieldLengths[l]+=c.length;for(var p=0;p<c.length;p++){var d=c[p];if(void 0==h[d]&&(h[d]=0),h[d]+=1,void 0==this.invertedIndex[d]){var f=Object.create(null);f._index=this.termIndex,this.termIndex+=1;for(var g=0;g<i.length;g++)f[i[g]]=Object.create(null);this.invertedIndex[d]=f}void 0==this.invertedIndex[d][s][n]&&(this.invertedIndex[d][s][n]=Object.create(null));for(var m=0;m<this.metadataWhitelist.length;m++){var v=this.metadataWhitelist[m],y=d.metadata[v];void 0==this.invertedIndex[d][s][n][v]&&(this.invertedIndex[d][s][n][v]=[]),this.invertedIndex[d][s][n][v].push(y)}}}},$.Builder.prototype.calculateAverageFieldLengths=function(){for(var e=Object.keys(this.fieldLengths),t=e.length,n={},i={},r=0;r<t;r++){var s=$.FieldRef.fromString(e[r]),o=s.fieldName;i[o]||(i[o]=0),i[o]+=1,n[o]||(n[o]=0),n[o]+=this.fieldLengths[s]}for(var a=Object.keys(this._fields),r=0;r<a.length;r++){var u=a[r];n[u]=n[u]/i[u]}this.averageFieldLength=n},$.Builder.prototype.createFieldVectors=function(){for(var e={},t=Object.keys(this.fieldTermFrequencies),n=t.length,i=Object.create(null),r=0;r<n;r++){for(var s=$.FieldRef.fromString(t[r]),o=s.fieldName,a=this.fieldLengths[s],u=new $.Vector,c=this.fieldTermFrequencies[s],l=Object.keys(c),h=l.length,p=this._fields[o].boost||1,d=this._documents[s.docRef].boost||1,f=0;f<h;f++){var g,m,v=l[f],y=c[v],x=this.invertedIndex[v]._index;void 0===i[v]?(g=$.idf(this.invertedIndex[v],this.documentCount),i[v]=g):g=i[v],m=Math.round(1e3*(g*((this._k1+1)*y)/(this._k1*(1-this._b+this._b*(a/this.averageFieldLength[o]))+y)*p*d))/1e3,u.insert(x,m)}e[s]=u}this.fieldVectors=e},$.Builder.prototype.createTokenSet=function(){this.tokenSet=$.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},$.Builder.prototype.build=function(){return this.calculateAverageFieldLengths(),this.createFieldVectors(),this.createTokenSet(),new $.Index({invertedIndex:this.invertedIndex,fieldVectors:this.fieldVectors,tokenSet:this.tokenSet,fields:Object.keys(this._fields),pipeline:this.searchPipeline})},$.Builder.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},$.MatchData=function(e,t,n){for(var i=Object.create(null),r=Object.keys(n||{}),s=0;s<r.length;s++){var o=r[s];i[o]=n[o].slice()}this.metadata=Object.create(null),void 0!==e&&(this.metadata[e]=Object.create(null),this.metadata[e][t]=i)},$.MatchData.prototype.combine=function(e){for(var t=Object.keys(e.metadata),n=0;n<t.length;n++){var i=t[n],r=Object.keys(e.metadata[i]);void 0==this.metadata[i]&&(this.metadata[i]=Object.create(null));for(var s=0;s<r.length;s++){var o=r[s],a=Object.keys(e.metadata[i][o]);void 0==this.metadata[i][o]&&(this.metadata[i][o]=Object.create(null));for(var u=0;u<a.length;u++){var c=a[u];void 0==this.metadata[i][o][c]?this.metadata[i][o][c]=e.metadata[i][o][c]:this.metadata[i][o][c]=this.metadata[i][o][c].concat(e.metadata[i][o][c])}}}},$.MatchData.prototype.add=function(e,t,n){if(!(e in this.metadata)){this.metadata[e]=Object.create(null),this.metadata[e][t]=n;return}if(!(t in this.metadata[e])){this.metadata[e][t]=n;return}for(var i=Object.keys(n),r=0;r<i.length;r++){var s=i[r];s in this.metadata[e][t]?this.metadata[e][t][s]=this.metadata[e][t][s].concat(n[s]):this.metadata[e][t][s]=n[s]}},$.Query=function(e){this.clauses=[],this.allFields=e},$.Query.wildcard=new String("*"),$.Query.wildcard.NONE=0,$.Query.wildcard.LEADING=1,$.Query.wildcard.TRAILING=2,$.Query.presence={OPTIONAL:1,REQUIRED:2,PROHIBITED:3},$.Query.prototype.clause=function(e){return"fields"in e||(e.fields=this.allFields),"boost"in e||(e.boost=1),"usePipeline"in e||(e.usePipeline=!0),"wildcard"in e||(e.wildcard=$.Query.wildcard.NONE),e.wildcard&$.Query.wildcard.LEADING&&e.term.charAt(0)!=$.Query.wildcard&&(e.term="*"+e.term),e.wildcard&$.Query.wildcard.TRAILING&&e.term.slice(-1)!=$.Query.wildcard&&(e.term=""+e.term+"*"),"presence"in e||(e.presence=$.Query.presence.OPTIONAL),this.clauses.push(e),this},$.Query.prototype.isNegated=function(){for(var e=0;e<this.clauses.length;e++)if(this.clauses[e].presence!=$.Query.presence.PROHIBITED)return!1;return!0},$.Query.prototype.term=function(e,t){if(Array.isArray(e))return e.forEach(function(e){this.term(e,$.utils.clone(t))},this),this;var n=t||{};return n.term=e.toString(),this.clause(n),this},$.QueryParseError=function(e,t,n){this.name="QueryParseError",this.message=e,this.start=t,this.end=n},$.QueryParseError.prototype=Error(),$.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0,this.escapeCharPositions=[]},$.QueryLexer.prototype.run=function(){for(var e=$.QueryLexer.lexText;e;)e=e(this)},$.QueryLexer.prototype.sliceString=function(){for(var e=[],t=this.start,n=this.pos,i=0;i<this.escapeCharPositions.length;i++)n=this.escapeCharPositions[i],e.push(this.str.slice(t,n)),t=n+1;return e.push(this.str.slice(t,this.pos)),this.escapeCharPositions.length=0,e.join("")},$.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.sliceString(),start:this.start,end:this.pos}),this.start=this.pos},$.QueryLexer.prototype.escapeCharacter=function(){this.escapeCharPositions.push(this.pos-1),this.pos+=1},$.QueryLexer.prototype.next=function(){if(this.pos>=this.length)return $.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},$.QueryLexer.prototype.width=function(){return this.pos-this.start},$.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},$.QueryLexer.prototype.backup=function(){this.pos-=1},$.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do t=(e=this.next()).charCodeAt(0);while(t>47&&t<58)e!=$.QueryLexer.EOS&&this.backup()},$.QueryLexer.prototype.more=function(){return this.pos<this.length},$.QueryLexer.EOS="EOS",$.QueryLexer.FIELD="FIELD",$.QueryLexer.TERM="TERM",$.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",$.QueryLexer.BOOST="BOOST",$.QueryLexer.PRESENCE="PRESENCE",$.QueryLexer.lexField=function(e){return e.backup(),e.emit($.QueryLexer.FIELD),e.ignore(),$.QueryLexer.lexText},$.QueryLexer.lexTerm=function(e){if(e.width()>1&&(e.backup(),e.emit($.QueryLexer.TERM)),e.ignore(),e.more())return $.QueryLexer.lexText},$.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit($.QueryLexer.EDIT_DISTANCE),$.QueryLexer.lexText},$.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit($.QueryLexer.BOOST),$.QueryLexer.lexText},$.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit($.QueryLexer.TERM)},$.QueryLexer.termSeparator=$.tokenizer.separator,$.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==$.QueryLexer.EOS)return $.QueryLexer.lexEOS;if(92==t.charCodeAt(0)){e.escapeCharacter();continue}if(":"==t)return $.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit($.QueryLexer.TERM),$.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit($.QueryLexer.TERM),$.QueryLexer.lexBoost;if("+"==t&&1===e.width()||"-"==t&&1===e.width())return e.emit($.QueryLexer.PRESENCE),$.QueryLexer.lexText;if(t.match($.QueryLexer.termSeparator))return $.QueryLexer.lexTerm}},$.QueryParser=function(e,t){this.lexer=new $.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},$.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=$.QueryParser.parseClause;e;)e=e(this);return this.query},$.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},$.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},$.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},$.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(void 0!=t)switch(t.type){case $.QueryLexer.PRESENCE:return $.QueryParser.parsePresence;case $.QueryLexer.FIELD:return $.QueryParser.parseField;case $.QueryLexer.TERM:return $.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new $.QueryParseError(n,t.start,t.end)}},$.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(void 0!=t){switch(t.str){case"-":e.currentClause.presence=$.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=$.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new $.QueryParseError(n,t.start,t.end)}var i=e.peekLexeme();if(void 0==i){var n="expecting term or field, found nothing";throw new $.QueryParseError(n,t.start,t.end)}switch(i.type){case $.QueryLexer.FIELD:return $.QueryParser.parseField;case $.QueryLexer.TERM:return $.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new $.QueryParseError(n,i.start,i.end)}}},$.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(void 0!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),i="unrecognised field '"+t.str+"', possible fields: "+n;throw new $.QueryParseError(i,t.start,t.end)}e.currentClause.fields=[t.str];var r=e.peekLexeme();if(void 0==r){var i="expecting term, found nothing";throw new $.QueryParseError(i,t.start,t.end)}if(r.type===$.QueryLexer.TERM)return $.QueryParser.parseTerm;var i="expecting term, found '"+r.type+"'";throw new $.QueryParseError(i,r.start,r.end)}},$.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(void 0!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(void 0==n)return void e.nextClause();switch(n.type){case $.QueryLexer.TERM:return e.nextClause(),$.QueryParser.parseTerm;case $.QueryLexer.FIELD:return e.nextClause(),$.QueryParser.parseField;case $.QueryLexer.EDIT_DISTANCE:return $.QueryParser.parseEditDistance;case $.QueryLexer.BOOST:return $.QueryParser.parseBoost;case $.QueryLexer.PRESENCE:return e.nextClause(),$.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new $.QueryParseError(i,n.start,n.end)}}},$.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new $.QueryParseError(i,t.start,t.end)}e.currentClause.editDistance=n;var r=e.peekLexeme();if(void 0==r)return void e.nextClause();switch(r.type){case $.QueryLexer.TERM:return e.nextClause(),$.QueryParser.parseTerm;case $.QueryLexer.FIELD:return e.nextClause(),$.QueryParser.parseField;case $.QueryLexer.EDIT_DISTANCE:return $.QueryParser.parseEditDistance;case $.QueryLexer.BOOST:return $.QueryParser.parseBoost;case $.QueryLexer.PRESENCE:return e.nextClause(),$.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new $.QueryParseError(i,r.start,r.end)}}},$.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var i="boost must be numeric";throw new $.QueryParseError(i,t.start,t.end)}e.currentClause.boost=n;var r=e.peekLexeme();if(void 0==r)return void e.nextClause();switch(r.type){case $.QueryLexer.TERM:return e.nextClause(),$.QueryParser.parseTerm;case $.QueryLexer.FIELD:return e.nextClause(),$.QueryParser.parseField;case $.QueryLexer.EDIT_DISTANCE:return $.QueryParser.parseEditDistance;case $.QueryLexer.BOOST:return $.QueryParser.parseBoost;case $.QueryLexer.PRESENCE:return e.nextClause(),$.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new $.QueryParseError(i,r.start,r.end)}}},A=function(){return $},"function"==typeof define&&define.amd?define(A):e.exports=A()}()},9317:function(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>v});var i=n(5931),r=n.n(i),s=n(6718);s.A.tokenizer.separator=/[\s\-/]+/;let o=class{constructor(e,t,n="/",i){this.searchDocs=e,this.lunrIndex=s.A.Index.load(t),this.baseUrl=n,this.maxHits=i}getLunrResult(e){return this.lunrIndex.query(function(t){let n=s.A.tokenizer(e);t.term(n,{boost:10}),t.term(n,{wildcard:s.A.Query.wildcard.TRAILING})})}getHit(e,t,n){return{hierarchy:{lvl0:e.pageTitle||e.title,lvl1:0===e.type?null:e.title},url:e.url,version:e.version,_snippetResult:n?{content:{value:n,matchLevel:"full"}}:null,_highlightResult:{hierarchy:{lvl0:{value:0===e.type?t||e.title:e.pageTitle},lvl1:0===e.type?null:{value:t||e.title}}}}}getTitleHit(e,t,n){let i=t[0],r=t[0]+n,s=e.title.substring(0,i)+'<span class="algolia-docsearch-suggestion--highlight">'+e.title.substring(i,r)+"</span>"+e.title.substring(r,e.title.length);return this.getHit(e,s)}getKeywordHit(e,t,n){let i=t[0],r=t[0]+n,s=e.title+"<br /><i>Keywords: "+e.keywords.substring(0,i)+'<span class="algolia-docsearch-suggestion--highlight">'+e.keywords.substring(i,r)+"</span>"+e.keywords.substring(r,e.keywords.length)+"</i>";return this.getHit(e,s)}getContentHit(e,t){let n=t[0],i=t[0]+t[1],r=n,s=i,o=!0,a=!0;for(let t=0;t<3;t++){let t=e.content.lastIndexOf(" ",r-2),n=e.content.lastIndexOf(".",r-2);if(n>0&&n>t){r=n+1,o=!1;break}if(t<0){r=0,o=!1;break}r=t+1}for(let t=0;t<10;t++){let t=e.content.indexOf(" ",s+1),n=e.content.indexOf(".",s+1);if(n>0&&n<t){s=n,a=!1;break}if(t<0){s=e.content.length,a=!1;break}s=t}let u=e.content.substring(r,n);return o&&(u="... "+u),u+='<span class="algolia-docsearch-suggestion--highlight">'+e.content.substring(n,i)+"</span>",u+=e.content.substring(i,s),a&&(u+=" ..."),this.getHit(e,null,u)}search(e){return new Promise((t,n)=>{let i=this.getLunrResult(e),r=[];i.length>this.maxHits&&(i.length=this.maxHits),this.titleHitsRes=[],this.contentHitsRes=[],i.forEach(t=>{let n=this.searchDocs[t.ref],{metadata:i}=t.matchData;for(let s in i)if(i[s].title){if(!this.titleHitsRes.includes(t.ref)){let o=i[s].title.position[0];r.push(this.getTitleHit(n,o,e.length)),this.titleHitsRes.push(t.ref)}}else if(i[s].content){let e=i[s].content.position[0];r.push(this.getContentHit(n,e))}else if(i[s].keywords){let o=i[s].keywords.position[0];r.push(this.getKeywordHit(n,o,e.length)),this.titleHitsRes.push(t.ref)}}),r.length>this.maxHits&&(r.length=this.maxHits),t(r)})}};var a=n(8224),u=n.n(a);let c="algolia-docsearch",l=`${c}-suggestion`,h=`${c}-footer`,p={suggestion:`
2
+ <a class="${l}
3
+ {{#isCategoryHeader}}${l}__main{{/isCategoryHeader}}
4
+ {{#isSubCategoryHeader}}${l}__secondary{{/isSubCategoryHeader}}
5
+ "
6
+ aria-label="Link to the result"
7
+ href="{{{url}}}"
8
+ >
9
+ <div class="${l}--category-header">
10
+ <span class="${l}--category-header-lvl0">{{{category}}}</span>
11
+ </div>
12
+ <div class="${l}--wrapper">
13
+ <div class="${l}--subcategory-column">
14
+ <span class="${l}--subcategory-column-text">{{{subcategory}}}</span>
15
+ </div>
16
+ {{#isTextOrSubcategoryNonEmpty}}
17
+ <div class="${l}--content">
18
+ <div class="${l}--subcategory-inline">{{{subcategory}}}</div>
19
+ <div class="${l}--title">{{{title}}}</div>
20
+ {{#text}}<div class="${l}--text">{{{text}}}</div>{{/text}}
21
+ {{#version}}<div class="${l}--version">{{version}}</div>{{/version}}
22
+ </div>
23
+ {{/isTextOrSubcategoryNonEmpty}}
24
+ </div>
25
+ </a>
26
+ `,suggestionSimple:`
27
+ <div class="${l}
28
+ {{#isCategoryHeader}}${l}__main{{/isCategoryHeader}}
29
+ {{#isSubCategoryHeader}}${l}__secondary{{/isSubCategoryHeader}}
30
+ suggestion-layout-simple
31
+ ">
32
+ <div class="${l}--category-header">
33
+ {{^isLvl0}}
34
+ <span class="${l}--category-header-lvl0 ${l}--category-header-item">{{{category}}}</span>
35
+ {{^isLvl1}}
36
+ {{^isLvl1EmptyOrDuplicate}}
37
+ <span class="${l}--category-header-lvl1 ${l}--category-header-item">
38
+ {{{subcategory}}}
39
+ </span>
40
+ {{/isLvl1EmptyOrDuplicate}}
41
+ {{/isLvl1}}
42
+ {{/isLvl0}}
43
+ <div class="${l}--title ${l}--category-header-item">
44
+ {{#isLvl2}}
45
+ {{{title}}}
46
+ {{/isLvl2}}
47
+ {{#isLvl1}}
48
+ {{{subcategory}}}
49
+ {{/isLvl1}}
50
+ {{#isLvl0}}
51
+ {{{category}}}
52
+ {{/isLvl0}}
53
+ </div>
54
+ </div>
55
+ <div class="${l}--wrapper">
56
+ {{#text}}
57
+ <div class="${l}--content">
58
+ <div class="${l}--text">{{{text}}}</div>
59
+ </div>
60
+ {{/text}}
61
+ </div>
62
+ </div>
63
+ `,footer:`
64
+ <div class="${h}">
65
+ </div>
66
+ `,empty:`
67
+ <div class="${l}">
68
+ <div class="${l}--wrapper">
69
+ <div class="${l}--content ${l}--no-results">
70
+ <div class="${l}--title">
71
+ <div class="${l}--text">
72
+ No results found for query <b>"{{query}}"</b>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ `,searchBox:`
79
+ <form novalidate="novalidate" onsubmit="return false;" class="searchbox">
80
+ <div role="search" class="searchbox__wrapper">
81
+ <input id="docsearch" type="search" name="search" placeholder="Search the docs" autocomplete="off" required="required" class="searchbox__input"/>
82
+ <button type="submit" title="Submit your search query." class="searchbox__submit" >
83
+ <svg width=12 height=12 role="img" aria-label="Search">
84
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sbx-icon-search-13"></use>
85
+ </svg>
86
+ </button>
87
+ <button type="reset" title="Clear the search query." class="searchbox__reset hide">
88
+ <svg width=12 height=12 role="img" aria-label="Reset">
89
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sbx-icon-clear-3"></use>
90
+ </svg>
91
+ </button>
92
+ </div>
93
+ </form>
94
+
95
+ <div class="svg-icons" style="height: 0; width: 0; position: absolute; visibility: hidden">
96
+ <svg xmlns="http://www.w3.org/2000/svg">
97
+ <symbol id="sbx-icon-clear-3" viewBox="0 0 40 40"><path d="M16.228 20L1.886 5.657 0 3.772 3.772 0l1.885 1.886L20 16.228 34.343 1.886 36.228 0 40 3.772l-1.886 1.885L23.772 20l14.342 14.343L40 36.228 36.228 40l-1.885-1.886L20 23.772 5.657 38.114 3.772 40 0 36.228l1.886-1.885L16.228 20z" fill-rule="evenodd"></symbol>
98
+ <symbol id="sbx-icon-search-13" viewBox="0 0 40 40"><path d="M26.806 29.012a16.312 16.312 0 0 1-10.427 3.746C7.332 32.758 0 25.425 0 16.378 0 7.334 7.333 0 16.38 0c9.045 0 16.378 7.333 16.378 16.38 0 3.96-1.406 7.593-3.746 10.426L39.547 37.34c.607.608.61 1.59-.004 2.203a1.56 1.56 0 0 1-2.202.004L26.807 29.012zm-10.427.627c7.322 0 13.26-5.938 13.26-13.26 0-7.324-5.938-13.26-13.26-13.26-7.324 0-13.26 5.936-13.26 13.26 0 7.322 5.936 13.26 13.26 13.26z" fill-rule="evenodd"></symbol>
99
+ </svg>
100
+ </div>
101
+ `};var d=n(2522),f=n.n(d);let g={mergeKeyWithParent(e,t){if(void 0===e[t]||"object"!=typeof e[t])return e;let n=f().extend({},e,e[t]);return delete n[t],n},groupBy(e,t){let n={};return f().each(e,(e,i)=>{if(void 0===i[t])throw Error(`[groupBy]: Object has no key ${t}`);let r=i[t];"string"==typeof r&&(r=r.toLowerCase()),Object.prototype.hasOwnProperty.call(n,r)||(n[r]=[]),n[r].push(i)}),n},values:e=>Object.keys(e).map(t=>e[t]),flatten(e){let t=[];return e.forEach(e=>{Array.isArray(e)?e.forEach(e=>{t.push(e)}):t.push(e)}),t},flattenAndFlagFirst(e,t){let n=this.values(e).map(e=>e.map((e,n)=>(e[t]=0===n,e)));return this.flatten(n)},compact(e){let t=[];return e.forEach(e=>{e&&t.push(e)}),t},getHighlightedValue:(e,t)=>e._highlightResult&&e._highlightResult.hierarchy_camel&&e._highlightResult.hierarchy_camel[t]&&e._highlightResult.hierarchy_camel[t].matchLevel&&"none"!==e._highlightResult.hierarchy_camel[t].matchLevel&&e._highlightResult.hierarchy_camel[t].value?e._highlightResult.hierarchy_camel[t].value:e._highlightResult&&e._highlightResult&&e._highlightResult[t]&&e._highlightResult[t].value?e._highlightResult[t].value:e[t],getSnippetedValue(e,t){if(!e._snippetResult||!e._snippetResult[t]||!e._snippetResult[t].value)return e[t];let n=e._snippetResult[t].value;return n[0]!==n[0].toUpperCase()&&(n=`\u{2026}${n}`),-1===[".","!","?"].indexOf(n[n.length-1])&&(n=`${n}\u{2026}`),n},deepClone:e=>JSON.parse(JSON.stringify(e))};class m{constructor({searchDocs:e,searchIndex:t,inputSelector:n,debug:i=!1,baseUrl:r="/",queryDataCallback:s=null,autocompleteOptions:a={debug:!1,hint:!1,autoselect:!0},transformData:c=!1,queryHook:l=!1,handleSelected:h=!1,enhancedSearchInput:d=!1,layout:g="column",maxHits:v=5}){this.input=m.getInputFromSelector(n),this.queryDataCallback=s||null;let y=!!a&&!!a.debug&&a.debug;a.debug=i||y,this.autocompleteOptions=a,this.autocompleteOptions.cssClasses=this.autocompleteOptions.cssClasses||{},this.autocompleteOptions.cssClasses.prefix=this.autocompleteOptions.cssClasses.prefix||"ds";let x=this.input&&"function"==typeof this.input.attr&&this.input.attr("aria-label");this.autocompleteOptions.ariaLabel=this.autocompleteOptions.ariaLabel||x||"search input",this.isSimpleLayout="simple"===g,this.client=new o(e,t,r,v),d&&(this.input=m.injectSearchBox(this.input)),this.autocomplete=u()(this.input,a,[{source:this.getAutocompleteSource(c,l),templates:{suggestion:m.getSuggestionTemplate(this.isSimpleLayout),footer:p.footer,empty:m.getEmptyTemplate()}}]),this.handleSelected=h||this.handleSelected,h&&f()(".algolia-autocomplete").on("click",".ds-suggestions a",e=>{e.preventDefault()}),this.autocomplete.on("autocomplete:selected",this.handleSelected.bind(null,this.autocomplete.autocomplete)),this.autocomplete.on("autocomplete:shown",this.handleShown.bind(null,this.input)),d&&m.bindSearchBoxEvent(),document.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&"k"==e.key&&(this.input.focus(),e.preventDefault())})}static injectSearchBox(e){e.before(p.searchBox);let t=e.prev().prev().find("input");return e.remove(),t}static bindSearchBoxEvent(){f()('.searchbox [type="reset"]').on("click",function(){f()("input#docsearch").focus(),f()(this).addClass("hide"),u().autocomplete.setVal("")}),f()("input#docsearch").on("keyup",()=>{let e=document.querySelector("input#docsearch"),t=document.querySelector('.searchbox [type="reset"]');t.className="searchbox__reset",0===e.value.length&&(t.className+=" hide")})}static getInputFromSelector(e){let t=f()(e).filter("input");return t.length?f()(t[0]):null}getAutocompleteSource(e,t){return(n,i)=>{t&&(n=t(n)||n),this.client.search(n).then(t=>{this.queryDataCallback&&"function"==typeof this.queryDataCallback&&this.queryDataCallback(t),e&&(t=e(t)||t),i(m.formatHits(t))})}}static formatHits(e){let t=g.deepClone(e).map(e=>(e._highlightResult&&(e._highlightResult=g.mergeKeyWithParent(e._highlightResult,"hierarchy")),g.mergeKeyWithParent(e,"hierarchy"))),n=g.groupBy(t,"lvl0");return f().each(n,(e,t)=>{let i=g.groupBy(t,"lvl1"),r=g.flattenAndFlagFirst(i,"isSubCategoryHeader");n[e]=r}),(n=g.flattenAndFlagFirst(n,"isCategoryHeader")).map(e=>{let t=m.formatURL(e),n=g.getHighlightedValue(e,"lvl0"),i=g.getHighlightedValue(e,"lvl1")||n,r=g.compact([g.getHighlightedValue(e,"lvl2")||i,g.getHighlightedValue(e,"lvl3"),g.getHighlightedValue(e,"lvl4"),g.getHighlightedValue(e,"lvl5"),g.getHighlightedValue(e,"lvl6")]).join('<span class="aa-suggestion-title-separator" aria-hidden="true"> \u203A </span>'),s=g.getSnippetedValue(e,"content"),o=i&&""!==i||r&&""!==r,a=!i||""===i||i===n,u=r&&""!==r&&r!==i,c=!u&&i&&""!==i&&i!==n,l=e.version;return{isLvl0:!c&&!u,isLvl1:c,isLvl2:u,isLvl1EmptyOrDuplicate:a,isCategoryHeader:e.isCategoryHeader,isSubCategoryHeader:e.isSubCategoryHeader,isTextOrSubcategoryNonEmpty:o,category:n,subcategory:i,title:r,text:s,url:t,version:l}})}static formatURL(e){let{url:t,anchor:n}=e;if(t){if(-1!==t.indexOf("#"));else if(n)return`${e.url}#${e.anchor}`;return t}return n?`#${e.anchor}`:(console.warn("no anchor nor url for : ",JSON.stringify(e)),null)}static getEmptyTemplate(){return e=>r().compile(p.empty).render(e)}static getSuggestionTemplate(e){let t=e?p.suggestionSimple:p.suggestion,n=r().compile(t);return e=>n.render(e)}handleSelected(e,t,n,i,r={}){"click"!==r.selectionMethod&&(e.setVal(""),window.location.assign(n.url))}handleShown(e){let t=e.offset().left+e.width()/2,n=f()(document).width()/2;isNaN(n)&&(n=900);let i=t-n>=0?"algolia-autocomplete-right":"algolia-autocomplete-left",r=t-n<0?"algolia-autocomplete-right":"algolia-autocomplete-left",s=f()(".algolia-autocomplete");s.hasClass(i)||s.addClass(i),s.hasClass(r)&&s.removeClass(r)}}let v=m}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["2553"],{4787:function(e,s,r){r.r(s),r.d(s,{frontMatter:()=>i,toc:()=>l,default:()=>h,metadata:()=>o,assets:()=>a,contentTitle:()=>c});var o=JSON.parse('{"id":"configuration/processors","title":"Processors","description":"Processors execute code every time a packet is received to calculate values","source":"@site/docs/configuration/processors.md","sourceDirName":"configuration","slug":"/configuration/processors","permalink":"/tools/staticdocs/docs/configuration/processors","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/configuration/processors.md","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"sidebar_position":10,"title":"Processors","description":"Processors execute code every time a packet is received to calculate values","sidebar_custom_props":{"myEmoji":"\u{1F9EE}"}},"sidebar":"defaultSidebar","previous":{"title":"Conversions","permalink":"/tools/staticdocs/docs/configuration/conversions"},"next":{"title":"Limits Response","permalink":"/tools/staticdocs/docs/configuration/limits-response"}}'),n=r(7259),t=r(677);let i={sidebar_position:10,title:"Processors",description:"Processors execute code every time a packet is received to calculate values",sidebar_custom_props:{myEmoji:"\u{1F9EE}"}},c="Overview",a={},l=[{value:"Custom Processors",id:"custom-processors",level:2},{value:"<strong>init</strong>",id:"init",level:3},{value:"call",id:"call",level:3},{value:"reset",id:"reset",level:3},{value:"Instantiate Processor",id:"instantiate-processor",level:3},{value:"WATERMARK_PROCESSOR",id:"watermark_processor",level:2},{value:"STATISTICS_PROCESSOR",id:"statistics_processor",level:2}];function d(e){let s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components},{TabItem:r,Tabs:o}=s;return r||p("TabItem",!0),o||p("Tabs",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"overview",children:"Overview"})}),"\n",(0,n.jsxs)(s.p,{children:["Processors execute code every time a packet is received to calculate values that can be retrieved by a ",(0,n.jsx)(s.a,{href:"/docs/configuration/conversions#processor_conversion",children:"ProcessorConversion"}),". Processors are applied using the ",(0,n.jsx)(s.a,{href:"/docs/configuration/telemetry#processor",children:"PROCESSOR"})," keyword and generate values unique to the processor."]}),"\n",(0,n.jsxs)(s.p,{children:["If you only want to perform calculations using a single packet to modify a telemetry value you probably want to use a ",(0,n.jsx)(s.a,{href:"/docs/configuration/conversions",children:"Conversion"}),". Processors are used when you're deriving a number of values from a single telemetry item."]}),"\n",(0,n.jsx)(s.h2,{id:"custom-processors",children:"Custom Processors"}),"\n",(0,n.jsxs)(s.p,{children:["You can easily create your own custom processors by using the ",(0,n.jsx)(s.a,{href:"/docs/getting-started/generators#processor-generator",children:"Processor Code Generator"}),". To generate a process you must be inside an existing COSMOS plugin. The generator takes both a target name and the processor name. For example if your plugin is called ",(0,n.jsx)(s.code,{children:"openc3-cosmos-gse"})," and you have an existing target named ",(0,n.jsx)(s.code,{children:"GSE"}),":"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"openc3-cosmos-gse % openc3.sh cli generate processor GSE slope --python\nProcessor targets/GSE/lib/slope_processor.py successfully generated!\nTo use the processor add the following to a telemetry packet:\n PROCESSOR SLOPE slope_processor.py <PARAMS...>\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Note: To create a Ruby processor simply replace ",(0,n.jsx)(s.code,{children:"--python"})," with ",(0,n.jsx)(s.code,{children:"--ruby"}),"."]}),"\n",(0,n.jsxs)(s.p,{children:["The above command creates a processor called ",(0,n.jsx)(s.code,{children:"slope_processor.py"})," at ",(0,n.jsx)(s.code,{children:"targets/GSE/lib/slope_processor.py"}),". The code which is generated looks like the following:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-python",children:"import math\nfrom openc3.processors.processor import Processor\n\n# Custom processor class\n# See https://docs.openc3.com/docs/configuration/processors\nclass SlopeProcessor(Processor):\n def __init__(self, item_name, num_samples, value_type='CONVERTED'):\n super().__init__(value_type)\n self.item_name = item_name.upper()\n self.num_samples = int(num_samples)\n self.reset()\n\n def call(self, value, packet, buffer):\n value = packet.read(self.item_name, self.value_type, buffer)\n # Don't process NaN or Infinite values\n if math.isnan(value) or math.isinf(value):\n return\n\n self.samples.append(value)\n if len(self.samples) > self.num_samples:\n self.samples = self.samples[-self.num_samples :]\n\n if len(self.samples) > 1:\n self.results['RATE_OF_CHANGE'] = (self.samples[-1] - self.samples[0]) / (len(self.samples) - 1)\n else:\n self.results['RATE_OF_CHANGE'] = None\n\n def reset(self):\n self.samples = []\n self.results['RATE_OF_CHANGE'] = None\n"})}),"\n",(0,n.jsx)(s.h3,{id:"init",children:(0,n.jsx)(s.strong,{children:"init"})}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.strong,{children:"init"})," method is where the processor is initialized. The parameters specified are the parameters given in the configuration file when creating the processor. So for our example, the telemetry configuration file will look like:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{children:"# Calculate the slope of TEMP1 over the last 60 samples (1 minute)\nPROCESSOR SLOPE slope_processor.py TEMP1 60\n"})}),"\n",(0,n.jsx)(s.h3,{id:"call",children:"call"}),"\n",(0,n.jsxs)(s.p,{children:["The call method is where the actual processor logic is implemented. In our case we want to calculate the rate of change from the first sample to the last sample. There are certainly more efficient ways to calculate a single rate of change value (you really only need 2 values) but this example shows how to keep a running list of values. Also note that if you're only performing a single calculation you might be better off using a ",(0,n.jsx)(s.a,{href:"/docs/configuration/conversions",children:"Conversion"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"reset",children:"reset"}),"\n",(0,n.jsxs)(s.p,{children:["The reset method initializes the samples and clears any state by setting the results to ",(0,n.jsx)(s.code,{children:"None"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"instantiate-processor",children:"Instantiate Processor"}),"\n",(0,n.jsxs)(s.p,{children:["Now that we have implemented the processor logic we need to create the processor by adding it to a telemetry packet with the line ",(0,n.jsx)(s.code,{children:"PROCESSOR SLOPE slope_processor.py"})," in the ",(0,n.jsx)(s.a,{href:"/docs/configuration/telemetry",children:"telemetry"})," definition file. We also need a ",(0,n.jsx)(s.a,{href:"/docs/configuration/conversions#processor_conversion",children:"ProcessorConversion"})," to pull the calculated values out of the processor and into a ",(0,n.jsx)(s.a,{href:"/docs/configuration/telemetry#derived-items",children:"derived"})," telemetry item. This could look something like this:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:'TELEMETRY GSE DATA BIG_ENDIAN "Data packet"\n ... # Telemetry items\n ITEM TEMP1SLOPE 0 0 DERIVED "Rate of change for the last 60 samples of TEMP1"\n READ_CONVERSION openc3/conversions/processor_conversion.py SLOPE RATE_OF_CHANGE\n # Calculate the slope of TEMP1 over the last 60 samples (1 minute)\n PROCESSOR SLOPE slope_processor.py TEMP1 60\n'})}),"\n",(0,n.jsx)(s.p,{children:"If you have multiple values you're calculating you simply add additional ITEMs with READ_COVERSIONs and read the various values the processor calculates in the results."}),"\n",(0,n.jsx)(s.h1,{id:"built-in-processors",children:"Built-in Processors"}),"\n",(0,n.jsx)(s.h2,{id:"watermark_processor",children:"WATERMARK_PROCESSOR"}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Calculates high and low values for a given item"})}),"\n",(0,n.jsxs)(s.p,{children:["Stores high and low values for a given item as HIGH_WATER and LOW_WATER.\nValues are retrieved using a ",(0,n.jsx)(s.a,{href:"/docs/configuration/conversions#processor_conversion",children:"ProcessorConversion"}),"."]}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Parameter"}),(0,n.jsx)(s.th,{children:"Description"}),(0,n.jsx)(s.th,{children:"Required"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Item Name"}),(0,n.jsx)(s.td,{children:"The item name to calculate high and low values for"}),(0,n.jsx)(s.td,{children:"True"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Value Type"}),(0,n.jsxs)(s.td,{children:["The type of the value to display. Default is CONVERTED.",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),"Valid Values: ",(0,n.jsx)("span",{class:"values",children:"RAW, CONVERTED"})]}),(0,n.jsx)(s.td,{children:"False"})]})]})]}),"\n",(0,n.jsxs)(o,{groupId:"script-language",children:[(0,n.jsx)(r,{value:"python",label:"Python",children:(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-python",children:'PROCESSOR TEMP1WATER openc3/conversions/watermark_processor.py TEMP1\nITEM TEMP1HIGH 0 0 DERIVED "High-water mark for TEMP1"\n READ_CONVERSION openc3/conversions/processor_conversion.py TEMP1WATER HIGH_WATER\n'})})}),(0,n.jsx)(r,{value:"ruby",label:"Ruby",children:(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ruby",children:'PROCESSOR TEMP1WATER watermark_processor.rb TEMP1\nITEM TEMP1HIGH 0 0 DERIVED "High-water mark for TEMP1"\n READ_CONVERSION processor_conversion.rb TEMP1WATER HIGH_WATER\n'})})})]}),"\n",(0,n.jsx)(s.h2,{id:"statistics_processor",children:"STATISTICS_PROCESSOR"}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"Calculates statistics for a given item"})}),"\n",(0,n.jsxs)(s.p,{children:["This processor calculates statistics for a given item as MIN, MAX, MEAN, and STDDEV\nover a specified number of samples. Values are retrieved using a ",(0,n.jsx)(s.a,{href:"/docs/configuration/conversions#processor_conversion",children:"ProcessorConversion"}),"."]}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Parameter"}),(0,n.jsx)(s.th,{children:"Description"}),(0,n.jsx)(s.th,{children:"Required"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Item Name"}),(0,n.jsx)(s.td,{children:"The item name to calculate statistics for"}),(0,n.jsx)(s.td,{children:"True"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Samples to Average"}),(0,n.jsx)(s.td,{children:"The number of samples to average for statistics"}),(0,n.jsx)(s.td,{children:"True"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Value Type"}),(0,n.jsxs)(s.td,{children:["The type of the value to display. Default is CONVERTED.",(0,n.jsx)("br",{}),(0,n.jsx)("br",{}),"Valid Values: ",(0,n.jsx)("span",{class:"values",children:"RAW, CONVERTED"})]}),(0,n.jsx)(s.td,{children:"False"})]})]})]}),"\n",(0,n.jsxs)(o,{groupId:"script-language",children:[(0,n.jsx)(r,{value:"python",label:"Python",children:(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-python",children:'PROCESSOR TEMP1STAT openc3/conversions/statistics_processor.py TEMP1 100\nITEM TEMP1STDDEV 0 0 DERIVED "Stddev of most recent 100 samples for TEMP1"\n READ_CONVERSION openc3/conversions/processor_conversion.py TEMP1STAT STDDEV FLOAT 64\n'})})}),(0,n.jsx)(r,{value:"ruby",label:"Ruby",children:(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-ruby",children:'PROCESSOR TEMP1STAT statistics_processor.rb TEMP1 100\nITEM TEMP1STDDEV 0 0 DERIVED "Stddev of most recent 100 samples for TEMP1"\n READ_CONVERSION processor_conversion.rb TEMP1STAT STDDEV FLOAT 64\n'})})})]})]})}function h(e={}){let{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}function p(e,s){throw Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},677:function(e,s,r){r.d(s,{R:()=>i,x:()=>c});var o=r(6363);let n={},t=o.createContext(n);function i(e){let s=o.useContext(t);return o.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),o.createElement(t.Provider,{value:s},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["4189"],{4655:function(e,n,s){s.r(n),s.d(n,{frontMatter:()=>l,toc:()=>c,default:()=>d,metadata:()=>o,assets:()=>a,contentTitle:()=>r});var o=JSON.parse('{"id":"meta/licenses","title":"Licenses","description":"COSMOS licenses including the AGPLv3 vs Commercial","source":"@site/docs/meta/licenses.md","sourceDirName":"meta","slug":"/meta/licenses","permalink":"/tools/staticdocs/docs/meta/licenses","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/meta/licenses.md","tags":[],"version":"current","frontMatter":{"title":"Licenses","description":"COSMOS licenses including the AGPLv3 vs Commercial","sidebar_custom_props":{"myEmoji":"\u{1F575}\uFE0F"}},"sidebar":"defaultSidebar","previous":{"title":"Contributing","permalink":"/tools/staticdocs/docs/meta/contributing"},"next":{"title":"Philosophy","permalink":"/tools/staticdocs/docs/meta/philosophy"}}'),i=s(7259),t=s(677);let l={title:"Licenses",description:"COSMOS licenses including the AGPLv3 vs Commercial",sidebar_custom_props:{myEmoji:"\u{1F575}\uFE0F"}},r,a={},c=[{value:"AGPLv3",id:"agplv3",level:2},{value:"Evaluation and Education Use Only",id:"evaluation-and-education-use-only",level:2},{value:"Commercial License",id:"commercial-license",level:2},{value:"Why you should buy a Commercial License",id:"why-you-should-buy-a-commercial-license",level:3},{value:"FAQs",id:"faqs",level:2}];function h(e){let n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"OpenC3 COSMOS is offered under a tri-licensing model allowing users to choose between the following three options:"}),"\n",(0,i.jsx)(n.h2,{id:"agplv3",children:"AGPLv3"}),"\n",(0,i.jsxs)(n.p,{children:["This is our default open source license and the license that most free users use. The AGPLv3 is a modification of the GPLv3 which is what is known as a copy-left license or a viral license. You can read the whole thing here: ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/blob/main/LICENSE.txt",children:"OpenC3 AGPLv3"})]}),"\n",(0,i.jsx)(n.p,{children:"Obviously, the actual license text applies, but here is a short summary:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"The AGPL allows users to use the code however they want: For business, personal, etc., as long as they follow the other terms:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Users are anyone who could access the web-app. On the public internet, that is the whole world. On a private network, it is anyone with access to that network."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"The software is provided as-is, no warranty"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Users must be given access to all the source code and are also allowed to use it however they want under the same terms of the AGPLv3. This includes any modifications made, anything added, and all plugins."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"For web applications (like COSMOS), a link must be provided to all of the source code."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"There are some key implications of the above:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You cannot keep anything proprietary from your users. They have the rights to take the code (and configuration) and do anything they want with it. You CANNOT impede these rights or you are violating the AGPLv3 and YOU lose the rights to use our software."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You must provide a digital link to all source code for your users, including plugins."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"All plugins must be licensed in an AGPLv3 compatible fashion. We recommend the MIT license because that allows your plugins to be compatible with the AGPLv3 and our commercial license. You can also use a dual license similar to what we do indicating the AGPLv3 or a purchased OpenC3 Commercial license."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The AGPLv3 license is often chosen because it works well for open core products like COSMOS. Competitors cannot take the open source product and license it under different terms. They would be forever locked into the AGPLv3 which is difficult to monetize, because your customers can take any code you provide and publish it on the internet for free use by everyone."}),"\n",(0,i.jsx)(n.p,{children:"As the copyright holder, OpenC3 is able to license the product and derivatives commercially. No-one else can do this. (OpenC3 is also able to license legacy Ball Aerospace COSMOS code under IP agreement)"}),"\n",(0,i.jsx)(n.h2,{id:"evaluation-and-education-use-only",children:"Evaluation and Education Use Only"}),"\n",(0,i.jsxs)(n.p,{children:["This license takes effect as soon as you use any plugin we publish under Evaluation and Education terms. Currently the only plugin we use for this is our CCSDS CFDP plugin: ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/openc3-cosmos-cfdp",children:"CFDP Plugin"})]}),"\n",(0,i.jsx)(n.p,{children:"You can read the whole license here:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'# OpenC3 Evaluation and Educational License\n#\n# Copyright 2023 OpenC3, Inc.\n#\n# This work is licensed for evaluation and educational purposes only.\n# It may NOT be used for formal development, integration and test, operations\n# or any other commercial purpose without the purchase of a commercial license\n# from OpenC3, Inc.\n#\n# The above copyright notice and this permission notice shall be included in all copies\n# or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n'})}),"\n",(0,i.jsx)(n.p,{children:"This license is pretty straight forward, but the key is you can't use this code for any real work leading to a product (Formal Development, Integration and Test, or Operations) unless you switch to purchasing a commercial license."}),"\n",(0,i.jsx)(n.h2,{id:"commercial-license",children:"Commercial License"}),"\n",(0,i.jsx)(n.p,{children:"This license is a signed contract with OpenC3. It allows use of our code for a program under contractual terms where you do not have to follow the AGPLv3."}),"\n",(0,i.jsx)(n.p,{children:"Generally we license to a specific project with terms that allow for unlimited users, and installs as needed by that project. Any code and plugins that you develop under the commercial license can be kept proprietary."}),"\n",(0,i.jsx)(n.p,{children:"These licenses are sold as yearly subscriptions, or as a non-expiring perpetual license. We also offer site licenses, and licenses to support unlimited missions on a government framework architecture."}),"\n",(0,i.jsx)(n.p,{children:"Of course with our commercial license, you also get all the extra functionality of our Enterprise product."}),"\n",(0,i.jsx)(n.h3,{id:"why-you-should-buy-a-commercial-license",children:"Why you should buy a Commercial License"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You want to save years and tens of millions of dollars developing the same functionality yourself."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You want all of the Enterprise functionality of COSMOS Enterprise"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"User Accounts"}),"\n",(0,i.jsx)(n.li,{children:"Role Based Access Control"}),"\n",(0,i.jsx)(n.li,{children:"LDAP Support"}),"\n",(0,i.jsx)(n.li,{children:"Kubernetes Support"}),"\n",(0,i.jsx)(n.li,{children:"Cloud Deployment Configurations"}),"\n",(0,i.jsx)(n.li,{children:"The right to use CFDP and other Enterprise Only plugins"}),"\n",(0,i.jsx)(n.li,{children:"Grafana Support"}),"\n",(0,i.jsx)(n.li,{children:"Support from the COSMOS Developers"}),"\n",(0,i.jsxs)(n.li,{children:["Lots more - See our ",(0,i.jsx)(n.a,{href:"https://openc3.com/enterprise",children:"Enterprise"})," page"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You don't want to follow the AGPLv3"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"You want to keep the code and plugins you develop proprietary"}),"\n",(0,i.jsx)(n.li,{children:"You don't want to publish an accessible link to your source code"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You want to support the continued development and innovation of the COSMOS product"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:(0,i.jsx)(n.em,{children:"We appreciate all of our commercial customers. You make OpenC3 possible. Thank you."})})}),"\n",(0,i.jsx)(n.h2,{id:"faqs",children:"FAQs"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"I see both Ball Aerospace & Technologies Corp as well as OpenC3, Inc in the copyright headers. What does this mean?"}),"\n",(0,i.jsx)(n.p,{children:"OpenC3, Inc has an intellectual property agreement with BAE (formerly Ball Aerospace & Technologies Corp) which gives us the rights to commercialize the original work that we built at Ball Aerospace. Customers only need to purchase a commercial license from OpenC3."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"What are the limits of the COSMOS Enterprise? How many users can we have? How many times can it be installed?"}),"\n",(0,i.jsx)(n.p,{children:"The COSMOS Enterprise license has no user or installation limits."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"How is the COSMOS Enterprise license enforced?"}),"\n",(0,i.jsx)(n.p,{children:"The COSMOS Enterprise license is enforced through contract only without license managers or additional software controls."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"How is the COSMOS Enterprise license applied? Per company? Per program?"}),"\n",(0,i.jsxs)(n.p,{children:["COSMOS Enterprise is typically licensed to a named mission or group. We also have site licenses, company licenses, and mission ops center licenses. Please contact us at ",(0,i.jsx)(n.a,{href:"mailto:sales@openc3.com",children:"sales@openc3.com"})," for more information."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Do you license to foreign companies? How do you handle ITAR or the EAR?"}),"\n",(0,i.jsxs)(n.p,{children:["We have several international customers and are not subject to ITAR export controls. We are export controlled under the EAR via ECCN 5D002c1. We have a detailed writeup explaining this justification as well as a commodity classification document from the Department of Commerce. Please contact us at ",(0,i.jsx)(n.a,{href:"mailto:sales@openc3.com",children:"sales@openc3.com"})," for more information."]}),"\n"]}),"\n"]})]})}function d(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},677:function(e,n,s){s.d(n,{R:()=>l,x:()=>r});var o=s(6363);let i={},t=o.createContext(i);function l(e){let n=o.useContext(t);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["7451"],{4898:function(e,n,s){s.r(n),s.d(n,{frontMatter:()=>a,toc:()=>c,default:()=>h,metadata:()=>o,assets:()=>l,contentTitle:()=>r});var o=JSON.parse('{"id":"getting-started/podman","title":"Podman","description":"Installing and running COSMOS with Podman","source":"@site/docs/getting-started/podman.md","sourceDirName":"getting-started","slug":"/getting-started/podman","permalink":"/tools/staticdocs/docs/getting-started/podman","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/getting-started/podman.md","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"sidebar_position":7,"title":"Podman","description":"Installing and running COSMOS with Podman","sidebar_custom_props":{"myEmoji":"\u{1FADB}"}},"sidebar":"defaultSidebar","previous":{"title":"Code Generators","permalink":"/tools/staticdocs/docs/getting-started/generators"},"next":{"title":"Requirements and Design","permalink":"/tools/staticdocs/docs/getting-started/requirements"}}'),t=s(7259),i=s(677);let a={sidebar_position:7,title:"Podman",description:"Installing and running COSMOS with Podman",sidebar_custom_props:{myEmoji:"\u{1FADB}"}},r,l={},c=[{value:"OpenC3 COSMOS Using Rootless Podman and Docker-Compose",id:"openc3-cosmos-using-rootless-podman-and-docker-compose",level:3},{value:"MacOS Instructions",id:"macos-instructions",level:2}];function d(e){let n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h3,{id:"openc3-cosmos-using-rootless-podman-and-docker-compose",children:"OpenC3 COSMOS Using Rootless Podman and Docker-Compose"}),"\n",(0,t.jsx)(n.admonition,{title:"Optional Installation Option",type:"info",children:(0,t.jsx)(n.p,{children:"These directions are for installing and running COSMOS using Podman instead of Docker. If you have Docker available, that is a simpler method."})}),"\n",(0,t.jsx)(n.p,{children:"Podman is an alternative container technology to Docker that is actively promoted by RedHat. The key benefit is that Podman can run without a root-level daemon service, making it significantly more secure by design, over standard Docker. However, it is a little more complicated to use. These directions will get you up and running with Podman. The following directions have been tested against RHEL 8.8, and RHEL 9.2, but should be similar on other operating systems."}),"\n",(0,t.jsx)(n.admonition,{title:"Rootless Podman Does Not Work (Directly) with NFS Home Directories",type:"warning",children:(0,t.jsxs)(n.p,{children:["NFS does not work for holding container storage due to issues with user ids and group ids. There are workarounds available but they all involve moving container storage to another location: either a different partition on the host local disk, or into a special mounted disk image. See: [",(0,t.jsx)(n.a,{href:"https://www.redhat.com/sysadmin/rootless-podman-nfs",children:"https://www.redhat.com/sysadmin/rootless-podman-nfs"}),"]",(0,t.jsx)(n.a,{href:"https://www.redhat.com/sysadmin/rootless-podman-nfs",children:"https://www.redhat.com/sysadmin/rootless-podman-nfs"}),"). Note that there is also a newish Podman setting that allows you to more easily change where the storage location is in /etc/containers/storage.conf called rootless_storage_path. See ",(0,t.jsx)(n.a,{href:"https://www.redhat.com/sysadmin/nfs-rootless-podman",children:"https://www.redhat.com/sysadmin/nfs-rootless-podman"})]})}),"\n",(0,t.jsx)(n.h1,{id:"redhat-88-and-92-instructions",children:"Redhat 8.8 and 9.2 Instructions"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Install Prerequisite Packages"}),"\n",(0,t.jsx)(n.p,{children:"Note: This downloads and installs docker-compose from the latest 2.x release on Github. If your operating system has a docker-compose package, it will be easier to install using that instead. RHEL8 does not have a docker-compose package."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo yum update\nsudo yum install git podman-docker netavark\ncurl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o docker-compose\nsudo mv docker-compose /usr/local/bin/docker-compose\nsudo chmod +x /usr/local/bin/docker-compose\nsudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Configure Host OS for Redis"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo su\necho never > /sys/kernel/mm/transparent_hugepage/enabled\necho never > /sys/kernel/mm/transparent_hugepage/defrag\nsysctl -w vm.max_map_count=262144\nexit\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Configure Podman to increase the PID limit"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo cp /usr/share/containers/containers.conf /etc/containers/.\nsudo vi /etc/containers/containers.conf\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Then edit the ",(0,t.jsx)(n.code,{children:"pids_limit"})," value to -1 (unlimited)"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Configure Podman to use Netavark for DNS"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo sh -c 'echo ip_tables > /etc/modules-load.d/ip_tables.conf'\nsudo vi /etc/containers/containers.conf\n"})}),"\n",(0,t.jsx)(n.p,{children:'Then edit the network_backend line to be "netavark" instead of "cni"'}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{title:"Netavark needs the ip_tables module",type:"warning",children:(0,t.jsx)(n.p,{children:'The above "echo ip_tables" line is added because RHEL 9.x uses nftables by default. The legacy ip_tables kernel module is not guaranteed to be loaded at boot \u2014 particularly on cloud images such as AWS EC2. However, netavark still requires ip_tables to implement NAT and forwarding for rootless Podman containers. Rootless users cannot load kernel modules, so if ip_tables is missing, netavark networking fails silently. If using rootless Podman with netavark ensure the ip_tables kernel module is preload.'})}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start rootless podman socket service"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"systemctl enable --now --user podman.socket\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Put the following into your .bashrc file (or .bash_profile or whatever)"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'export DOCKER_HOST="unix://$XDG_RUNTIME_DIR/podman/podman.sock"\n'})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Source the profile file for your current terminal"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"source .bashrc\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Get COSMOS - A release or the current main branch (main branch shown)"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/OpenC3/cosmos.git\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Optional - Set Default Container Registry"}),"\n",(0,t.jsx)(n.p,{children:"If you don't want podman to keep querying you for which registry to use, you can create a $HOME/.config/containers/registries.conf and modify to just have the main docker registry (or modify the /etc/containers/registries.conf file directly)"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mkdir -p $HOME/.config/containers\ncp /etc/containers/registries.conf $HOME/.config/containers/.\nvi $HOME/.config/containers/registries.conf\n"})}),"\n",(0,t.jsx)(n.p,{children:"Then edit the unqualified-search-registries = line to just have the registry you care about (probably docker.io)"}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Edit cosmos/compose.yaml"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd cosmos\nvi compose.yaml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Edit compose.yaml and uncomment the user: 0:0 lines and comment the user: ",(0,t.jsx)(n.code,{children:'"${OPENC3_USER_ID}:${OPENC3_GROUP_ID}"'})," lines.\nYou may also want to update the traefik configuration to allow access from the internet by removing 127.0.0.1 and probably switching to either an SSL config file, or the allow http one. Also make sure your firewall allows\nwhatever port you choose to use in. Rootless podman will need to use a higher numbered port (not 1-1023)."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Run COSMOS"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"./openc3.sh run\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Wait until everything is built and running and then goto ",(0,t.jsx)(n.a,{href:"http://localhost:2900",children:"http://localhost:2900"})," in your browser"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{title:"Podman on MacOS",type:"info",children:(0,t.jsx)(n.p,{children:"Podman can also be used on MacOS, though we still generally recommend Docker Desktop"})}),"\n",(0,t.jsx)(n.h2,{id:"macos-instructions",children:"MacOS Instructions"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Install podman"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"brew install podman\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the podman virtual machine"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"podman machine init\npodman machine start\n# Note: update to your username in the next line or copy paste from what 'podman machine start' says\nexport DOCKER_HOST='unix:///Users/ryanmelt/.local/share/containers/podman/machine/qemu/podman.sock'\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Install docker-compose"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"brew install docker-compose # Optional if you already have Docker Desktop\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Edit cosmos/compose.yaml"}),"\n",(0,t.jsxs)(n.p,{children:["Edit compose.yaml and uncomment the user: 0:0 lines and comment the user: ",(0,t.jsx)(n.code,{children:'"${OPENC3_USER_ID}:${OPENC3_GROUP_ID}"'})," lines."]}),"\n",(0,t.jsxs)(n.p,{children:["Important: on MacOS you must also remove all ",":z"," from the volume mount lines"]}),"\n",(0,t.jsx)(n.p,{children:"You may also want to update the traefik configuration to allow access from the internet."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Run COSMOS"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd cosmos\n./openc3.sh run\n"})}),"\n"]}),"\n"]})]})}function h(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},677:function(e,n,s){s.d(n,{R:()=>a,x:()=>r});var o=s(6363);let t={},i=o.createContext(t);function a(e){let n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["9621"],{1789:function(e,n,t){t.r(n),t.d(n,{frontMatter:()=>r,toc:()=>d,default:()=>h,metadata:()=>i,assets:()=>c,contentTitle:()=>o});var i=JSON.parse('{"id":"development/streaming-api","title":"Streaming API","description":"Using the websocket streaming API to retrieve data","source":"@site/docs/development/streaming-api.md","sourceDirName":"development","slug":"/development/streaming-api","permalink":"/tools/staticdocs/docs/development/streaming-api","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/development/streaming-api.md","tags":[],"version":"current","frontMatter":{"title":"Streaming API","description":"Using the websocket streaming API to retrieve data","sidebar_custom_props":{"myEmoji":"\u{1F4DD}"}},"sidebar":"defaultSidebar","previous":{"title":"Roadmap","permalink":"/tools/staticdocs/docs/development/roadmap"},"next":{"title":"Testing COSMOS","permalink":"/tools/staticdocs/docs/development/testing"}}'),a=t(7259),s=t(677);let r={title:"Streaming API",description:"Using the websocket streaming API to retrieve data",sidebar_custom_props:{myEmoji:"\u{1F4DD}"}},o,c={},d=[{value:"Ruby Example",id:"ruby-example",level:2},{value:"StreamingApi Architecture",id:"streamingapi-architecture",level:2},{value:"Architecture Overview",id:"architecture-overview",level:3},{value:"Key Components",id:"key-components",level:3},{value:"StreamingApi",id:"streamingapi",level:4},{value:"StreamingThread",id:"streamingthread",level:4},{value:"RealtimeStreamingThread",id:"realtimestreamingthread",level:4},{value:"LoggedStreamingThread",id:"loggedstreamingthread",level:4},{value:"StreamingObject",id:"streamingobject",level:4},{value:"StreamingObjectCollection",id:"streamingobjectcollection",level:4},{value:"Data Flow",id:"data-flow",level:3},{value:"Performance Considerations",id:"performance-considerations",level:3},{value:"Security",id:"security",level:3}];function l(e){let n={admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.admonition,{title:"This documentation is for COSMOS Developers",type:"note",children:(0,a.jsx)(n.p,{children:"This information is just generally used behind the scenes in COSMOS tools"})}),"\n",(0,a.jsx)(n.p,{children:"The COSMOS 5 Streaming Api is the primary interface to receive a stream of the telemetry packets and/or command packets that have passed through the COSMOS system, both logged and continuously in realtime. Either raw binary packets or decommutated JSON packets can be requested."}),"\n",(0,a.jsx)(n.p,{children:"This API is implemented over Websockets using the Rails ActionCable framework. Actioncable client libraries are known to exist for at least Javascript, Ruby, and Python. Other languages may exist or could be created. Websockets allow for easy interaction with the new COSMOS 5 Javascript based frontend."}),"\n",(0,a.jsx)(n.p,{children:"The following interactions are all shown in Javascript, but would be very similar in any language.\nConnecting to this API begins by initiating an ActionCable connection."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"cable = ActionCable.createConsumer('/openc3-api/cable')\n"})}),"\n",(0,a.jsx)(n.p,{children:"This call opens the HTTP connection to the given URL and upgrades it to a websocket connection. This connection can then be shared with multiple \u201Csubscriptions\u201D."}),"\n",(0,a.jsx)(n.p,{children:"A subscription describes a set of data that you want the API to stream to you. Creating a subscription looks like this:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-javascript",children:'subscription = cable.subscriptions.create(\n {\n channel: "StreamingChannel",\n scope: "DEFAULT",\n token: token,\n },\n {\n received: (data) => {\n // Handle received data\n },\n connected: () => {\n // First chance to add what you want to stream here\n },\n disconnected: () => {\n // Handle the subscription being disconnected\n },\n rejected: () => {\n // Handle the subscription being rejected\n },\n }\n);\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Subscribing to the StreamingApi requires passing a channel name set to \u201CStreamingChannel\u201D, a scope which is typically \u201CDEFAULT\u201D, and an access token (a password in COSMOS Core). In Javascript you also pass a set of callback functions that run at various lifecycle points in the subscription. The most important of these are ",(0,a.jsx)(n.code,{children:"connected"})," and ",(0,a.jsx)(n.code,{children:"received"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"connected"})," runs when the subscription is accepted by the StreamApi. This callback is the first opportunity to request specific data that you would like streamed. Data can also be added or removed at any time while the subscription is open."]}),"\n",(0,a.jsx)(n.p,{children:"Data can be added to the stream by requesting individual items from a packet or by requesting the entire packet."}),"\n",(0,a.jsx)(n.p,{children:"Adding items to stream is done as follows:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-javascript",children:'var items = [\n ["DECOM__TLM__INST__ADCS__Q1__RAW", "0"],\n ["DECOM__CMD__INST__COLLECT__DURATION__WITH_UNITS", "1"],\n];\nOpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity).then(() => {\n this.subscription.perform("add", {\n scope: window.openc3Scope,\n token: localStorage.openc3Token,\n items: items,\n start_time: this.startDateTime,\n end_time: this.endDateTime,\n });\n});\n'})}),"\n",(0,a.jsxs)(n.p,{children:["The values in the item name are separated by double underscores, e.g. ",(0,a.jsx)(n.code,{children:"<MODE>__<CMD or TLM>__<TARGET NAME>__<PACKET NAME>__<ITEM NAME>__<VALUE TYPE>__<REDUCED TYPE>"}),". Mode is either RAW, DECOM, REDUCED_MINUTE, REDUCED_HOUR, or REDUCED_DAY. The next parameter is CMD or TLM followed by the target, packet and item names. The Value Type is one of RAW, CONVERTED, FORMATTED, or WITH_UNITS. The last parameter is optional if you want to use the reduced data types. Reduced Type is one of SAMPLE, MIN, MAX, AVG, or STDDEV."]}),"\n",(0,a.jsx)(n.p,{children:"Adding packets to stream is done as follows:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-javascript",children:'var packets = [\n ["RAW__TLM__INST__ADCS", "0"],\n ["DECOM__TLM__INST__HEALTH_STATUS__FORMATTED", "1"],\n];\nOpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity).then(() => {\n this.subscription.perform("add", {\n scope: window.openc3Scope,\n token: localStorage.openc3Token,\n packets: packets,\n start_time: this.startDateTime,\n end_time: this.endDateTime,\n });\n});\n'})}),"\n",(0,a.jsxs)(n.p,{children:["The values in the packet name are separated by double underscores, e.g. ",(0,a.jsx)(n.code,{children:"<MODE>__<CMD or TLM>__<TARGET NAME>__<PACKET NAME>__<VALUE TYPE>"}),". Mode is either RAW or DECOM. The next parameter is CMD or TLM followed by the target and packet names. The Value Type is one of RAW, CONVERTED, FORMATTED, or WITH_UNITS."]}),"\n",(0,a.jsx)(n.p,{children:"For Raw mode, VALUE TYPE should be set to RAW or omitted (e.g. TLM__INST__ADCS__RAW or TLM__INST__ADCS).\nstart_time and end_time are standard COSMOS 64-bit integer timestamps in nanoseconds since the Unix Epoch (midnight January 1st, 1970). If start_time is null, that indicates to start streaming from the current time in realtime, indefinitely until items are removed, or the subscription is unsubscribed. end_time is ignored if start_time is null. If start_time is given and end_time is null, that indicates to playback from the given starttime and then continue indefinitely in realtime. If both start_time and end_time are given, then that indicates a temporary playback of historical data."}),"\n",(0,a.jsx)(n.p,{children:"Data returned by the streaming API is handled by the received callback in Javascript. Data is returned as a JSON Array, with a JSON object in the array for each packet returned. Results are batched, and the current implementation will return up to 100 packets in each batch (the array will have 100 entries). 100 packets per batch is not guaranteed, and batches may take on varying sizes based on the size of the data returned, or other factors. An empty array indicates that all data has been sent for a purely historical query and can be used as an end of data indicator."}),"\n",(0,a.jsx)(n.p,{children:"For decommutated items, each packet is represented as a JSON object with a 'time' field holding the COSMOS nanosecond timestamp of the packet, and then each of the requested item keys with their corresponding value from the packet."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json",children:'[\n {\n "time": 1234657585858,\n "TLM__INST__ADCS__Q1__RAW": 50.0,\n "TLM__INST__ADCS__Q2__RAW": 100.0\n },\n {\n "time": 1234657585859,\n "TLM__INST__ADCS__Q1__RAW": 60.0,\n "TLM__INST__ADCS__Q2__RAW": 110.0\n }\n]\n'})}),"\n",(0,a.jsx)(n.p,{children:"For raw packets, each packet is represented as a JSON object with a time field holding the COSMOS nanosecond timestamp of the packet, a packet field holding the topic the packet was read from in the form of SCOPE__TELEMETRY__TARGETNAME__PACKETNAME, and a buffer field holding a BASE64 encoded copy of the packet data."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json",children:'[\n {\n "time": 1234657585858,\n "packet": "DEFAULT__TELEMETRY__INST__ADCS",\n "buffer": "SkdfjGodkdfjdfoekfsg"\n },\n {\n "time": 1234657585859,\n "packet": "DEFAULT__TELEMETRY__INST__ADCS",\n "buffer": "3i5n49dmnfg9fl32k3"\n }\n]\n'})}),"\n",(0,a.jsx)(n.h2,{id:"ruby-example",children:"Ruby Example"}),"\n",(0,a.jsx)(n.p,{children:"Below is a simple Ruby example for using the streaming API to retrieve telemetry data:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-ruby",children:"require 'openc3'\nrequire 'openc3/script/web_socket_api'\n\n$openc3_scope = 'DEFAULT'\nENV['OPENC3_API_HOSTNAME'] = '127.0.0.1'\nENV['OPENC3_API_PORT'] = '2900'\nENV['OPENC3_API_PASSWORD'] = 'password'\n# The following are needed for Enterprise (change user/pass as necessary)\n#ENV['OPENC3_API_USER'] = 'operator'\n#ENV['OPENC3_API_PASSWORD'] = 'operator'\n#ENV['OPENC3_KEYCLOAK_REALM'] = 'openc3'\n#ENV['OPENC3_KEYCLOAK_URL'] = 'http://127.0.0.1:2900/auth'\n\n# Open a file to write CSV data\ncsv = File.open('telemetry_data.csv', 'w')\n\n# Connect to the streaming API\nOpenC3::StreamingWebSocketApi.new() do |api|\n # Add items to stream - request data from yesterday to 1 minute ago\n api.add(items: [\n 'DECOM__TLM__INST__HEALTH_STATUS__TEMP1__CONVERTED',\n 'DECOM__TLM__INST__HEALTH_STATUS__TEMP2__CONVERTED'\n ],\n start_time: (Time.now - 86400).to_nsec_from_epoch, # 24 hours ago\n end_time: (Time.now - 60).to_nsec_from_epoch) # 1 minute ago\n\n # Write CSV header\n csv.puts \"Time,TEMP1,TEMP2\"\n\n # Read all data from the stream\n data = api.read\n\n # Process each data point\n data.each do |item|\n csv.puts \"#{item['__time']/1_000_000_000.0},#{item['DECOM__TLM__INST__HEALTH_STATUS__TEMP1__CONVERTED']},#{item['DECOM__TLM__INST__HEALTH_STATUS__TEMP2__CONVERTED']}\"\n end\nend\ncsv.close()\n"})}),"\n",(0,a.jsx)(n.h2,{id:"streamingapi-architecture",children:"StreamingApi Architecture"}),"\n",(0,a.jsx)(n.p,{children:"The StreamingApi is a core component of COSMOS that provides real-time and historical data streaming capabilities. Below is an overview of its architecture and design."}),"\n",(0,a.jsx)(n.h3,{id:"architecture-overview",children:"Architecture Overview"}),"\n",(0,a.jsx)(n.p,{children:"The StreamingApi uses a modular architecture with several key components:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"StreamingApi\n\u251C\u2500\u2500 StreamingThread (abstract)\n\u2502 \u251C\u2500\u2500 RealtimeStreamingThread\n\u2502 \u2514\u2500\u2500 LoggedStreamingThread\n\u2514\u2500\u2500 StreamingObjectCollection\n \u2514\u2500\u2500 StreamingObject\n"})}),"\n",(0,a.jsx)(n.h3,{id:"key-components",children:"Key Components"}),"\n",(0,a.jsx)(n.h4,{id:"streamingapi",children:"StreamingApi"}),"\n",(0,a.jsx)(n.p,{children:"The main class that manages streaming connections and handles client requests:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Initializes with a client UUID, channel, and scope"}),"\n",(0,a.jsx)(n.li,{children:"Manages thread lifecycle for both real-time and historical data"}),"\n",(0,a.jsx)(n.li,{children:"Processes client requests to add or remove data streams"}),"\n",(0,a.jsx)(n.li,{children:"Coordinates handoff from historical to real-time streaming"}),"\n",(0,a.jsx)(n.li,{children:"Sends batched data back to clients via ActionCable"}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"streamingthread",children:"StreamingThread"}),"\n",(0,a.jsx)(n.p,{children:"Abstract base class that defines common thread functionality:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Manages thread lifecycle (start, stop)"}),"\n",(0,a.jsx)(n.li,{children:"Processes data from various sources"}),"\n",(0,a.jsx)(n.li,{children:"Handles batching and transmission of results"}),"\n",(0,a.jsx)(n.li,{children:"Determines when streaming is complete"}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"realtimestreamingthread",children:"RealtimeStreamingThread"}),"\n",(0,a.jsx)(n.p,{children:"Specialized thread for real-time data:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Subscribes to Redis topics"}),"\n",(0,a.jsx)(n.li,{children:"Processes incoming messages in real-time"}),"\n",(0,a.jsx)(n.li,{children:"Continuous streaming from current time"}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"loggedstreamingthread",children:"LoggedStreamingThread"}),"\n",(0,a.jsx)(n.p,{children:"Specialized thread for historical data:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Reads from archived log files"}),"\n",(0,a.jsx)(n.li,{children:"Handles time-based sorting of data"}),"\n",(0,a.jsx)(n.li,{children:"Transitions to real-time streaming when historical data is exhausted"}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"streamingobject",children:"StreamingObject"}),"\n",(0,a.jsx)(n.p,{children:"Represents a single subscription item:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Parses and validates stream keys"}),"\n",(0,a.jsx)(n.li,{children:"Stores metadata about the stream (mode, target, packet, item)"}),"\n",(0,a.jsx)(n.li,{children:"Tracks timestamps and offsets"}),"\n",(0,a.jsx)(n.li,{children:"Handles authorization"}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"streamingobjectcollection",children:"StreamingObjectCollection"}),"\n",(0,a.jsx)(n.p,{children:"Manages groups of StreamingObjects:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Organizes objects by topic"}),"\n",(0,a.jsx)(n.li,{children:"Tracks collective state"}),"\n",(0,a.jsx)(n.li,{children:"Provides efficient lookups"}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"data-flow",children:"Data Flow"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsx)(n.li,{children:"Client connects to ActionCable and subscribes to StreamingChannel"}),"\n",(0,a.jsx)(n.li,{children:"Client sends 'add' request with items/packets to stream"}),"\n",(0,a.jsx)(n.li,{children:"StreamingApi creates appropriate StreamingObjects with authorization"}),"\n",(0,a.jsxs)(n.li,{children:["For historical requests:","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"LoggedStreamingThread reads from log files"}),"\n",(0,a.jsx)(n.li,{children:"Data is sent in batches to client"}),"\n",(0,a.jsx)(n.li,{children:"When historical data is exhausted, handoff to real-time"}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["For real-time requests:","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"RealtimeStreamingThread subscribes to Redis topics"}),"\n",(0,a.jsx)(n.li,{children:"Data is sent to client as it arrives"}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.li,{children:"Client can add/remove items at any time"}),"\n",(0,a.jsx)(n.li,{children:"When client disconnects, all threads are terminated"}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"performance-considerations",children:"Performance Considerations"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Uses thread-per-request model for historical data"}),"\n",(0,a.jsx)(n.li,{children:"Maintains a single thread for real-time data"}),"\n",(0,a.jsx)(n.li,{children:"Batches results to reduce network overhead (up to 100 items per batch)"}),"\n",(0,a.jsx)(n.li,{children:"File caching for efficient historical data access"}),"\n",(0,a.jsx)(n.li,{children:"Seamless transition from historical to real-time data"}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"security",children:"Security"}),"\n",(0,a.jsx)(n.p,{children:"Every StreamingObject verifies authorization for the specific target and packet being requested, ensuring users only access data they have permission to view."})]})}function h(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},677:function(e,n,t){t.d(n,{R:()=>r,x:()=>o});var i=t(6363);let a={},s=i.createContext(a);function r(e){let n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["2452"],{5879:function(e,a,s){s.r(a),s.d(a,{default:()=>x});var c=s(7259);s(6363);var t=s(4014),l=s(5062),n=s(8289),i=s(1030),d=s(7337),o=s(7650),r=s(5411),m=s(302);function x(e){let{content:a}=e,{metadata:s,assets:x}=a,{title:g,editUrl:p,description:h,frontMatter:A,lastUpdatedBy:_,lastUpdatedAt:j}=s,{keywords:v,wrapperClassName:u,hide_table_of_contents:f}=A,N=x.image??A.image,b=!!(p||j||_);return(0,c.jsx)(l.e3,{className:(0,t.A)(u??n.G.wrapper.mdxPages,n.G.page.mdxPage),children:(0,c.jsxs)(i.A,{children:[(0,c.jsx)(l.be,{title:g,description:h,keywords:v,image:N}),(0,c.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,c.jsxs)("div",{className:(0,t.A)("row","mdxPageWrapper_E3BN"),children:[(0,c.jsxs)("div",{className:(0,t.A)("col",!f&&"col--8"),children:[(0,c.jsx)(r.A,{metadata:s}),(0,c.jsx)("article",{children:(0,c.jsx)(d.A,{children:(0,c.jsx)(a,{})})}),b&&(0,c.jsx)(m.A,{className:(0,t.A)("margin-top--sm",n.G.pages.pageFooterEditMetaRow),editUrl:p,lastUpdatedAt:j,lastUpdatedBy:_})]}),!f&&a.toc.length>0&&(0,c.jsx)("div",{className:"col col--2",children:(0,c.jsx)(o.A,{toc:a.toc,minHeadingLevel:A.toc_min_heading_level,maxHeadingLevel:A.toc_max_heading_level})})]})})]})})}},4057:function(e,a,s){s.d(a,{A:()=>n});var c=s(917),t=s(7983),l=s(79);let n={...c.A,Tabs:t.A,TabItem:l.A}}}]);