@openmouse/protocol 0.1.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 (547) hide show
  1. package/CONTRIBUTING.md +167 -0
  2. package/README.md +89 -0
  3. package/dist/asus/index.d.ts +52 -0
  4. package/dist/asus/index.d.ts.map +1 -0
  5. package/dist/asus/index.js +248 -0
  6. package/dist/asus/index.js.map +1 -0
  7. package/dist/atk/index.d.ts +200 -0
  8. package/dist/atk/index.d.ts.map +1 -0
  9. package/dist/atk/index.js +480 -0
  10. package/dist/atk/index.js.map +1 -0
  11. package/dist/bitmouse/index.d.ts +284 -0
  12. package/dist/bitmouse/index.d.ts.map +1 -0
  13. package/dist/bitmouse/index.js +396 -0
  14. package/dist/bitmouse/index.js.map +1 -0
  15. package/dist/compx/codec.d.ts +31 -0
  16. package/dist/compx/codec.d.ts.map +1 -0
  17. package/dist/compx/codec.js +50 -0
  18. package/dist/compx/codec.js.map +1 -0
  19. package/dist/corsair/index.d.ts +147 -0
  20. package/dist/corsair/index.d.ts.map +1 -0
  21. package/dist/corsair/index.js +223 -0
  22. package/dist/corsair/index.js.map +1 -0
  23. package/dist/dareu/index.d.ts +136 -0
  24. package/dist/dareu/index.d.ts.map +1 -0
  25. package/dist/dareu/index.js +344 -0
  26. package/dist/dareu/index.js.map +1 -0
  27. package/dist/drivers/asus/hid.d.ts +29 -0
  28. package/dist/drivers/asus/hid.d.ts.map +1 -0
  29. package/dist/drivers/asus/hid.js +419 -0
  30. package/dist/drivers/asus/hid.js.map +1 -0
  31. package/dist/drivers/atk/bitmouse-hid.d.ts +80 -0
  32. package/dist/drivers/atk/bitmouse-hid.d.ts.map +1 -0
  33. package/dist/drivers/atk/bitmouse-hid.js +501 -0
  34. package/dist/drivers/atk/bitmouse-hid.js.map +1 -0
  35. package/dist/drivers/atk/hid.d.ts +163 -0
  36. package/dist/drivers/atk/hid.d.ts.map +1 -0
  37. package/dist/drivers/atk/hid.js +1368 -0
  38. package/dist/drivers/atk/hid.js.map +1 -0
  39. package/dist/drivers/atk/products.d.ts +13 -0
  40. package/dist/drivers/atk/products.d.ts.map +1 -0
  41. package/dist/drivers/atk/products.js +13 -0
  42. package/dist/drivers/atk/products.js.map +1 -0
  43. package/dist/drivers/attackshark/dpi.d.ts +41 -0
  44. package/dist/drivers/attackshark/dpi.d.ts.map +1 -0
  45. package/dist/drivers/attackshark/dpi.js +215 -0
  46. package/dist/drivers/attackshark/dpi.js.map +1 -0
  47. package/dist/drivers/attackshark/hid.d.ts +124 -0
  48. package/dist/drivers/attackshark/hid.d.ts.map +1 -0
  49. package/dist/drivers/attackshark/hid.js +728 -0
  50. package/dist/drivers/attackshark/hid.js.map +1 -0
  51. package/dist/drivers/corsair/hid.d.ts +70 -0
  52. package/dist/drivers/corsair/hid.d.ts.map +1 -0
  53. package/dist/drivers/corsair/hid.js +414 -0
  54. package/dist/drivers/corsair/hid.js.map +1 -0
  55. package/dist/drivers/dareu/hid.d.ts +59 -0
  56. package/dist/drivers/dareu/hid.d.ts.map +1 -0
  57. package/dist/drivers/dareu/hid.js +478 -0
  58. package/dist/drivers/dareu/hid.js.map +1 -0
  59. package/dist/drivers/endgame/egg-op1-hid.d.ts +107 -0
  60. package/dist/drivers/endgame/egg-op1-hid.d.ts.map +1 -0
  61. package/dist/drivers/endgame/egg-op1-hid.js +605 -0
  62. package/dist/drivers/endgame/egg-op1-hid.js.map +1 -0
  63. package/dist/drivers/endgame/egg-we-control.d.ts +42 -0
  64. package/dist/drivers/endgame/egg-we-control.d.ts.map +1 -0
  65. package/dist/drivers/endgame/egg-we-control.js +87 -0
  66. package/dist/drivers/endgame/egg-we-control.js.map +1 -0
  67. package/dist/drivers/endgame/egg-we-hid.d.ts +58 -0
  68. package/dist/drivers/endgame/egg-we-hid.d.ts.map +1 -0
  69. package/dist/drivers/endgame/egg-we-hid.js +514 -0
  70. package/dist/drivers/endgame/egg-we-hid.js.map +1 -0
  71. package/dist/drivers/fantech/hid.d.ts +106 -0
  72. package/dist/drivers/fantech/hid.d.ts.map +1 -0
  73. package/dist/drivers/fantech/hid.js +295 -0
  74. package/dist/drivers/fantech/hid.js.map +1 -0
  75. package/dist/drivers/finalmouse/hid.d.ts +31 -0
  76. package/dist/drivers/finalmouse/hid.d.ts.map +1 -0
  77. package/dist/drivers/finalmouse/hid.js +181 -0
  78. package/dist/drivers/finalmouse/hid.js.map +1 -0
  79. package/dist/drivers/gearhub/hid.d.ts +191 -0
  80. package/dist/drivers/gearhub/hid.d.ts.map +1 -0
  81. package/dist/drivers/gearhub/hid.js +542 -0
  82. package/dist/drivers/gearhub/hid.js.map +1 -0
  83. package/dist/drivers/glorious/classic-hid.d.ts +62 -0
  84. package/dist/drivers/glorious/classic-hid.d.ts.map +1 -0
  85. package/dist/drivers/glorious/classic-hid.js +326 -0
  86. package/dist/drivers/glorious/classic-hid.js.map +1 -0
  87. package/dist/drivers/glorious/hid.d.ts +39 -0
  88. package/dist/drivers/glorious/hid.d.ts.map +1 -0
  89. package/dist/drivers/glorious/hid.js +203 -0
  90. package/dist/drivers/glorious/hid.js.map +1 -0
  91. package/dist/drivers/gwolves/hid.d.ts +27 -0
  92. package/dist/drivers/gwolves/hid.d.ts.map +1 -0
  93. package/dist/drivers/gwolves/hid.js +225 -0
  94. package/dist/drivers/gwolves/hid.js.map +1 -0
  95. package/dist/drivers/gwolves/products.d.ts +17 -0
  96. package/dist/drivers/gwolves/products.d.ts.map +1 -0
  97. package/dist/drivers/gwolves/products.js +58 -0
  98. package/dist/drivers/gwolves/products.js.map +1 -0
  99. package/dist/drivers/hyperx/hid.d.ts +59 -0
  100. package/dist/drivers/hyperx/hid.d.ts.map +1 -0
  101. package/dist/drivers/hyperx/hid.js +229 -0
  102. package/dist/drivers/hyperx/hid.js.map +1 -0
  103. package/dist/drivers/incott/hid.d.ts +513 -0
  104. package/dist/drivers/incott/hid.d.ts.map +1 -0
  105. package/dist/drivers/incott/hid.js +1173 -0
  106. package/dist/drivers/incott/hid.js.map +1 -0
  107. package/dist/drivers/index.d.ts +5 -0
  108. package/dist/drivers/index.d.ts.map +1 -0
  109. package/dist/drivers/index.js +5 -0
  110. package/dist/drivers/index.js.map +1 -0
  111. package/dist/drivers/keychron/m6-hid.d.ts +81 -0
  112. package/dist/drivers/keychron/m6-hid.d.ts.map +1 -0
  113. package/dist/drivers/keychron/m6-hid.js +486 -0
  114. package/dist/drivers/keychron/m6-hid.js.map +1 -0
  115. package/dist/drivers/keychron/nape-hid.d.ts +60 -0
  116. package/dist/drivers/keychron/nape-hid.d.ts.map +1 -0
  117. package/dist/drivers/keychron/nape-hid.js +432 -0
  118. package/dist/drivers/keychron/nape-hid.js.map +1 -0
  119. package/dist/drivers/ksnake/hid.d.ts +74 -0
  120. package/dist/drivers/ksnake/hid.d.ts.map +1 -0
  121. package/dist/drivers/ksnake/hid.js +368 -0
  122. package/dist/drivers/ksnake/hid.js.map +1 -0
  123. package/dist/drivers/lamzu/hid.d.ts +58 -0
  124. package/dist/drivers/lamzu/hid.d.ts.map +1 -0
  125. package/dist/drivers/lamzu/hid.js +414 -0
  126. package/dist/drivers/lamzu/hid.js.map +1 -0
  127. package/dist/drivers/lamzu-atlantis/hid.d.ts +148 -0
  128. package/dist/drivers/lamzu-atlantis/hid.d.ts.map +1 -0
  129. package/dist/drivers/lamzu-atlantis/hid.js +587 -0
  130. package/dist/drivers/lamzu-atlantis/hid.js.map +1 -0
  131. package/dist/drivers/logitech/bolt.d.ts +41 -0
  132. package/dist/drivers/logitech/bolt.d.ts.map +1 -0
  133. package/dist/drivers/logitech/bolt.js +105 -0
  134. package/dist/drivers/logitech/bolt.js.map +1 -0
  135. package/dist/drivers/logitech/hidpp.d.ts +525 -0
  136. package/dist/drivers/logitech/hidpp.d.ts.map +1 -0
  137. package/dist/drivers/logitech/hidpp.js +2774 -0
  138. package/dist/drivers/logitech/hidpp.js.map +1 -0
  139. package/dist/drivers/logitech/mode-status.d.ts +53 -0
  140. package/dist/drivers/logitech/mode-status.d.ts.map +1 -0
  141. package/dist/drivers/logitech/mode-status.js +52 -0
  142. package/dist/drivers/logitech/mode-status.js.map +1 -0
  143. package/dist/drivers/logitech/onboard-profiles.d.ts +298 -0
  144. package/dist/drivers/logitech/onboard-profiles.d.ts.map +1 -0
  145. package/dist/drivers/logitech/onboard-profiles.js +965 -0
  146. package/dist/drivers/logitech/onboard-profiles.js.map +1 -0
  147. package/dist/drivers/logitech/rgb-effects.d.ts +20 -0
  148. package/dist/drivers/logitech/rgb-effects.d.ts.map +1 -0
  149. package/dist/drivers/logitech/rgb-effects.js +93 -0
  150. package/dist/drivers/logitech/rgb-effects.js.map +1 -0
  151. package/dist/drivers/mchose/a5-gen1-hid.d.ts +36 -0
  152. package/dist/drivers/mchose/a5-gen1-hid.d.ts.map +1 -0
  153. package/dist/drivers/mchose/a5-gen1-hid.js +219 -0
  154. package/dist/drivers/mchose/a5-gen1-hid.js.map +1 -0
  155. package/dist/drivers/mchose/dock-hid.d.ts +26 -0
  156. package/dist/drivers/mchose/dock-hid.d.ts.map +1 -0
  157. package/dist/drivers/mchose/dock-hid.js +176 -0
  158. package/dist/drivers/mchose/dock-hid.js.map +1 -0
  159. package/dist/drivers/mchose/hid.d.ts +118 -0
  160. package/dist/drivers/mchose/hid.d.ts.map +1 -0
  161. package/dist/drivers/mchose/hid.js +550 -0
  162. package/dist/drivers/mchose/hid.js.map +1 -0
  163. package/dist/drivers/mchose/v3-hid.d.ts +109 -0
  164. package/dist/drivers/mchose/v3-hid.d.ts.map +1 -0
  165. package/dist/drivers/mchose/v3-hid.js +572 -0
  166. package/dist/drivers/mchose/v3-hid.js.map +1 -0
  167. package/dist/drivers/microsoft/hid.d.ts +25 -0
  168. package/dist/drivers/microsoft/hid.d.ts.map +1 -0
  169. package/dist/drivers/microsoft/hid.js +247 -0
  170. package/dist/drivers/microsoft/hid.js.map +1 -0
  171. package/dist/drivers/moddo/hid.d.ts +31 -0
  172. package/dist/drivers/moddo/hid.d.ts.map +1 -0
  173. package/dist/drivers/moddo/hid.js +154 -0
  174. package/dist/drivers/moddo/hid.js.map +1 -0
  175. package/dist/drivers/mouse-types.d.ts +388 -0
  176. package/dist/drivers/mouse-types.d.ts.map +1 -0
  177. package/dist/drivers/mouse-types.js +2 -0
  178. package/dist/drivers/mouse-types.js.map +1 -0
  179. package/dist/drivers/ninjutso/hid.d.ts +62 -0
  180. package/dist/drivers/ninjutso/hid.d.ts.map +1 -0
  181. package/dist/drivers/ninjutso/hid.js +680 -0
  182. package/dist/drivers/ninjutso/hid.js.map +1 -0
  183. package/dist/drivers/orbital/hid.d.ts +24 -0
  184. package/dist/drivers/orbital/hid.d.ts.map +1 -0
  185. package/dist/drivers/orbital/hid.js +85 -0
  186. package/dist/drivers/orbital/hid.js.map +1 -0
  187. package/dist/drivers/orbital/host-protocol.d.ts +59 -0
  188. package/dist/drivers/orbital/host-protocol.d.ts.map +1 -0
  189. package/dist/drivers/orbital/host-protocol.js +884 -0
  190. package/dist/drivers/orbital/host-protocol.js.map +1 -0
  191. package/dist/drivers/pulsar/pulsar-hid.d.ts +63 -0
  192. package/dist/drivers/pulsar/pulsar-hid.d.ts.map +1 -0
  193. package/dist/drivers/pulsar/pulsar-hid.js +381 -0
  194. package/dist/drivers/pulsar/pulsar-hid.js.map +1 -0
  195. package/dist/drivers/pulsar/pulsar-pro-hid.d.ts +46 -0
  196. package/dist/drivers/pulsar/pulsar-pro-hid.d.ts.map +1 -0
  197. package/dist/drivers/pulsar/pulsar-pro-hid.js +343 -0
  198. package/dist/drivers/pulsar/pulsar-pro-hid.js.map +1 -0
  199. package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts +40 -0
  200. package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts.map +1 -0
  201. package/dist/drivers/pulsar/pulsar-xs1-hid.js +251 -0
  202. package/dist/drivers/pulsar/pulsar-xs1-hid.js.map +1 -0
  203. package/dist/drivers/rawm/hid.d.ts +29 -0
  204. package/dist/drivers/rawm/hid.d.ts.map +1 -0
  205. package/dist/drivers/rawm/hid.js +210 -0
  206. package/dist/drivers/rawm/hid.js.map +1 -0
  207. package/dist/drivers/razer/cobra-hid.d.ts +63 -0
  208. package/dist/drivers/razer/cobra-hid.d.ts.map +1 -0
  209. package/dist/drivers/razer/cobra-hid.js +282 -0
  210. package/dist/drivers/razer/cobra-hid.js.map +1 -0
  211. package/dist/drivers/razer/hid-open.d.ts +13 -0
  212. package/dist/drivers/razer/hid-open.d.ts.map +1 -0
  213. package/dist/drivers/razer/hid-open.js +29 -0
  214. package/dist/drivers/razer/hid-open.js.map +1 -0
  215. package/dist/drivers/razer/hid.d.ts +231 -0
  216. package/dist/drivers/razer/hid.d.ts.map +1 -0
  217. package/dist/drivers/razer/hid.js +772 -0
  218. package/dist/drivers/razer/hid.js.map +1 -0
  219. package/dist/drivers/razer/viper-hid.d.ts +33 -0
  220. package/dist/drivers/razer/viper-hid.d.ts.map +1 -0
  221. package/dist/drivers/razer/viper-hid.js +177 -0
  222. package/dist/drivers/razer/viper-hid.js.map +1 -0
  223. package/dist/drivers/razer/viper-mini-hid.d.ts +58 -0
  224. package/dist/drivers/razer/viper-mini-hid.d.ts.map +1 -0
  225. package/dist/drivers/razer/viper-mini-hid.js +273 -0
  226. package/dist/drivers/razer/viper-mini-hid.js.map +1 -0
  227. package/dist/drivers/razer/viper-v4-pro-hid.d.ts +26 -0
  228. package/dist/drivers/razer/viper-v4-pro-hid.d.ts.map +1 -0
  229. package/dist/drivers/razer/viper-v4-pro-hid.js +154 -0
  230. package/dist/drivers/razer/viper-v4-pro-hid.js.map +1 -0
  231. package/dist/drivers/registry.d.ts +70 -0
  232. package/dist/drivers/registry.d.ts.map +1 -0
  233. package/dist/drivers/registry.js +146 -0
  234. package/dist/drivers/registry.js.map +1 -0
  235. package/dist/drivers/steelseries/aerox3-hid.d.ts +53 -0
  236. package/dist/drivers/steelseries/aerox3-hid.d.ts.map +1 -0
  237. package/dist/drivers/steelseries/aerox3-hid.js +172 -0
  238. package/dist/drivers/steelseries/aerox3-hid.js.map +1 -0
  239. package/dist/drivers/steelseries/aerox5-hid.d.ts +54 -0
  240. package/dist/drivers/steelseries/aerox5-hid.d.ts.map +1 -0
  241. package/dist/drivers/steelseries/aerox5-hid.js +173 -0
  242. package/dist/drivers/steelseries/aerox5-hid.js.map +1 -0
  243. package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts +69 -0
  244. package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts.map +1 -0
  245. package/dist/drivers/steelseries/aerox5-wireless-hid.js +234 -0
  246. package/dist/drivers/steelseries/aerox5-wireless-hid.js.map +1 -0
  247. package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts +70 -0
  248. package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts.map +1 -0
  249. package/dist/drivers/steelseries/aerox9-wireless-hid.js +227 -0
  250. package/dist/drivers/steelseries/aerox9-wireless-hid.js.map +1 -0
  251. package/dist/drivers/steelseries/hid.d.ts +48 -0
  252. package/dist/drivers/steelseries/hid.d.ts.map +1 -0
  253. package/dist/drivers/steelseries/hid.js +157 -0
  254. package/dist/drivers/steelseries/hid.js.map +1 -0
  255. package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts +62 -0
  256. package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts.map +1 -0
  257. package/dist/drivers/steelseries/prime-mini-wireless-hid.js +215 -0
  258. package/dist/drivers/steelseries/prime-mini-wireless-hid.js.map +1 -0
  259. package/dist/drivers/steelseries/prime-plus-hid.d.ts +51 -0
  260. package/dist/drivers/steelseries/prime-plus-hid.d.ts.map +1 -0
  261. package/dist/drivers/steelseries/prime-plus-hid.js +150 -0
  262. package/dist/drivers/steelseries/prime-plus-hid.js.map +1 -0
  263. package/dist/drivers/steelseries/rival3-wireless-hid.d.ts +61 -0
  264. package/dist/drivers/steelseries/rival3-wireless-hid.d.ts.map +1 -0
  265. package/dist/drivers/steelseries/rival3-wireless-hid.js +185 -0
  266. package/dist/drivers/steelseries/rival3-wireless-hid.js.map +1 -0
  267. package/dist/drivers/steelseries/rival310-hid.d.ts +59 -0
  268. package/dist/drivers/steelseries/rival310-hid.d.ts.map +1 -0
  269. package/dist/drivers/steelseries/rival310-hid.js +182 -0
  270. package/dist/drivers/steelseries/rival310-hid.js.map +1 -0
  271. package/dist/drivers/steelseries/rival650-hid.d.ts +68 -0
  272. package/dist/drivers/steelseries/rival650-hid.d.ts.map +1 -0
  273. package/dist/drivers/steelseries/rival650-hid.js +209 -0
  274. package/dist/drivers/steelseries/rival650-hid.js.map +1 -0
  275. package/dist/drivers/steelseries/sensei-ten-hid.d.ts +62 -0
  276. package/dist/drivers/steelseries/sensei-ten-hid.d.ts.map +1 -0
  277. package/dist/drivers/steelseries/sensei-ten-hid.js +186 -0
  278. package/dist/drivers/steelseries/sensei-ten-hid.js.map +1 -0
  279. package/dist/drivers/teevolution/hid.d.ts +82 -0
  280. package/dist/drivers/teevolution/hid.d.ts.map +1 -0
  281. package/dist/drivers/teevolution/hid.js +607 -0
  282. package/dist/drivers/teevolution/hid.js.map +1 -0
  283. package/dist/drivers/vendors.d.ts +254 -0
  284. package/dist/drivers/vendors.d.ts.map +1 -0
  285. package/dist/drivers/vendors.js +587 -0
  286. package/dist/drivers/vendors.js.map +1 -0
  287. package/dist/drivers/vgn/hid.d.ts +33 -0
  288. package/dist/drivers/vgn/hid.d.ts.map +1 -0
  289. package/dist/drivers/vgn/hid.js +213 -0
  290. package/dist/drivers/vgn/hid.js.map +1 -0
  291. package/dist/drivers/wallhack/keyboard-hid.d.ts +28 -0
  292. package/dist/drivers/wallhack/keyboard-hid.d.ts.map +1 -0
  293. package/dist/drivers/wallhack/keyboard-hid.js +80 -0
  294. package/dist/drivers/wallhack/keyboard-hid.js.map +1 -0
  295. package/dist/drivers/wallhack/mouse-hid.d.ts +45 -0
  296. package/dist/drivers/wallhack/mouse-hid.d.ts.map +1 -0
  297. package/dist/drivers/wallhack/mouse-hid.js +288 -0
  298. package/dist/drivers/wallhack/mouse-hid.js.map +1 -0
  299. package/dist/drivers/webhid.d.ts +59 -0
  300. package/dist/drivers/webhid.d.ts.map +1 -0
  301. package/dist/drivers/webhid.js +2 -0
  302. package/dist/drivers/webhid.js.map +1 -0
  303. package/dist/drivers/wlmouse/hid.d.ts +81 -0
  304. package/dist/drivers/wlmouse/hid.d.ts.map +1 -0
  305. package/dist/drivers/wlmouse/hid.js +576 -0
  306. package/dist/drivers/wlmouse/hid.js.map +1 -0
  307. package/dist/drivers/wooting/hid.d.ts +86 -0
  308. package/dist/drivers/wooting/hid.d.ts.map +1 -0
  309. package/dist/drivers/wooting/hid.js +320 -0
  310. package/dist/drivers/wooting/hid.js.map +1 -0
  311. package/dist/drivers/zaunkoenig/hid.d.ts +31 -0
  312. package/dist/drivers/zaunkoenig/hid.d.ts.map +1 -0
  313. package/dist/drivers/zaunkoenig/hid.js +162 -0
  314. package/dist/drivers/zaunkoenig/hid.js.map +1 -0
  315. package/dist/endgame-gear/op1.d.ts +165 -0
  316. package/dist/endgame-gear/op1.d.ts.map +1 -0
  317. package/dist/endgame-gear/op1.js +384 -0
  318. package/dist/endgame-gear/op1.js.map +1 -0
  319. package/dist/endgame-gear/wireless.d.ts +93 -0
  320. package/dist/endgame-gear/wireless.d.ts.map +1 -0
  321. package/dist/endgame-gear/wireless.js +242 -0
  322. package/dist/endgame-gear/wireless.js.map +1 -0
  323. package/dist/fantech/index.d.ts +9 -0
  324. package/dist/fantech/index.d.ts.map +1 -0
  325. package/dist/fantech/index.js +11 -0
  326. package/dist/fantech/index.js.map +1 -0
  327. package/dist/finalmouse/index.d.ts +41 -0
  328. package/dist/finalmouse/index.d.ts.map +1 -0
  329. package/dist/finalmouse/index.js +106 -0
  330. package/dist/finalmouse/index.js.map +1 -0
  331. package/dist/gearhub/index.d.ts +210 -0
  332. package/dist/gearhub/index.d.ts.map +1 -0
  333. package/dist/gearhub/index.js +282 -0
  334. package/dist/gearhub/index.js.map +1 -0
  335. package/dist/glorious/index.d.ts +89 -0
  336. package/dist/glorious/index.d.ts.map +1 -0
  337. package/dist/glorious/index.js +236 -0
  338. package/dist/glorious/index.js.map +1 -0
  339. package/dist/glorious-classic/index.d.ts +103 -0
  340. package/dist/glorious-classic/index.d.ts.map +1 -0
  341. package/dist/glorious-classic/index.js +304 -0
  342. package/dist/glorious-classic/index.js.map +1 -0
  343. package/dist/gwolves/index.d.ts +82 -0
  344. package/dist/gwolves/index.d.ts.map +1 -0
  345. package/dist/gwolves/index.js +197 -0
  346. package/dist/gwolves/index.js.map +1 -0
  347. package/dist/hyperx/index.d.ts +181 -0
  348. package/dist/hyperx/index.d.ts.map +1 -0
  349. package/dist/hyperx/index.js +303 -0
  350. package/dist/hyperx/index.js.map +1 -0
  351. package/dist/incott/index.d.ts +1067 -0
  352. package/dist/incott/index.d.ts.map +1 -0
  353. package/dist/incott/index.js +1482 -0
  354. package/dist/incott/index.js.map +1 -0
  355. package/dist/index.d.ts +30 -0
  356. package/dist/index.d.ts.map +1 -0
  357. package/dist/index.js +30 -0
  358. package/dist/index.js.map +1 -0
  359. package/dist/keychron/index.d.ts +194 -0
  360. package/dist/keychron/index.d.ts.map +1 -0
  361. package/dist/keychron/index.js +341 -0
  362. package/dist/keychron/index.js.map +1 -0
  363. package/dist/ksnake/index.d.ts +157 -0
  364. package/dist/ksnake/index.d.ts.map +1 -0
  365. package/dist/ksnake/index.js +314 -0
  366. package/dist/ksnake/index.js.map +1 -0
  367. package/dist/lamzu/atlantis.d.ts +237 -0
  368. package/dist/lamzu/atlantis.d.ts.map +1 -0
  369. package/dist/lamzu/atlantis.js +263 -0
  370. package/dist/lamzu/atlantis.js.map +1 -0
  371. package/dist/lamzu/index.d.ts +60 -0
  372. package/dist/lamzu/index.d.ts.map +1 -0
  373. package/dist/lamzu/index.js +86 -0
  374. package/dist/lamzu/index.js.map +1 -0
  375. package/dist/logitech/controls.d.ts +138 -0
  376. package/dist/logitech/controls.d.ts.map +1 -0
  377. package/dist/logitech/controls.js +184 -0
  378. package/dist/logitech/controls.js.map +1 -0
  379. package/dist/logitech/friendly-name.d.ts +50 -0
  380. package/dist/logitech/friendly-name.d.ts.map +1 -0
  381. package/dist/logitech/friendly-name.js +74 -0
  382. package/dist/logitech/friendly-name.js.map +1 -0
  383. package/dist/logitech/haptics.d.ts +97 -0
  384. package/dist/logitech/haptics.d.ts.map +1 -0
  385. package/dist/logitech/haptics.js +116 -0
  386. package/dist/logitech/haptics.js.map +1 -0
  387. package/dist/logitech/hosts.d.ts +55 -0
  388. package/dist/logitech/hosts.d.ts.map +1 -0
  389. package/dist/logitech/hosts.js +80 -0
  390. package/dist/logitech/hosts.js.map +1 -0
  391. package/dist/logitech/index.d.ts +127 -0
  392. package/dist/logitech/index.d.ts.map +1 -0
  393. package/dist/logitech/index.js +233 -0
  394. package/dist/logitech/index.js.map +1 -0
  395. package/dist/logitech/wheel.d.ts +117 -0
  396. package/dist/logitech/wheel.d.ts.map +1 -0
  397. package/dist/logitech/wheel.js +133 -0
  398. package/dist/logitech/wheel.js.map +1 -0
  399. package/dist/mchose/a5-gen1.d.ts +38 -0
  400. package/dist/mchose/a5-gen1.d.ts.map +1 -0
  401. package/dist/mchose/a5-gen1.js +60 -0
  402. package/dist/mchose/a5-gen1.js.map +1 -0
  403. package/dist/mchose/buttons.d.ts +66 -0
  404. package/dist/mchose/buttons.d.ts.map +1 -0
  405. package/dist/mchose/buttons.js +184 -0
  406. package/dist/mchose/buttons.js.map +1 -0
  407. package/dist/mchose/dock.d.ts +77 -0
  408. package/dist/mchose/dock.d.ts.map +1 -0
  409. package/dist/mchose/dock.js +133 -0
  410. package/dist/mchose/dock.js.map +1 -0
  411. package/dist/mchose/index.d.ts +299 -0
  412. package/dist/mchose/index.d.ts.map +1 -0
  413. package/dist/mchose/index.js +429 -0
  414. package/dist/mchose/index.js.map +1 -0
  415. package/dist/mchose/v3-buttons.d.ts +64 -0
  416. package/dist/mchose/v3-buttons.d.ts.map +1 -0
  417. package/dist/mchose/v3-buttons.js +258 -0
  418. package/dist/mchose/v3-buttons.js.map +1 -0
  419. package/dist/mchose/v3.d.ts +380 -0
  420. package/dist/mchose/v3.d.ts.map +1 -0
  421. package/dist/mchose/v3.js +608 -0
  422. package/dist/mchose/v3.js.map +1 -0
  423. package/dist/microsoft/index.d.ts +19 -0
  424. package/dist/microsoft/index.d.ts.map +1 -0
  425. package/dist/microsoft/index.js +22 -0
  426. package/dist/microsoft/index.js.map +1 -0
  427. package/dist/moddo/index.d.ts +72 -0
  428. package/dist/moddo/index.d.ts.map +1 -0
  429. package/dist/moddo/index.js +147 -0
  430. package/dist/moddo/index.js.map +1 -0
  431. package/dist/ninjutso/index.d.ts +74 -0
  432. package/dist/ninjutso/index.d.ts.map +1 -0
  433. package/dist/ninjutso/index.js +133 -0
  434. package/dist/ninjutso/index.js.map +1 -0
  435. package/dist/orbital/index.d.ts +14 -0
  436. package/dist/orbital/index.d.ts.map +1 -0
  437. package/dist/orbital/index.js +19 -0
  438. package/dist/orbital/index.js.map +1 -0
  439. package/dist/pulsar/index.d.ts +81 -0
  440. package/dist/pulsar/index.d.ts.map +1 -0
  441. package/dist/pulsar/index.js +185 -0
  442. package/dist/pulsar/index.js.map +1 -0
  443. package/dist/rawm/index.d.ts +55 -0
  444. package/dist/rawm/index.d.ts.map +1 -0
  445. package/dist/rawm/index.js +229 -0
  446. package/dist/rawm/index.js.map +1 -0
  447. package/dist/razer/codec.d.ts +504 -0
  448. package/dist/razer/codec.d.ts.map +1 -0
  449. package/dist/razer/codec.js +648 -0
  450. package/dist/razer/codec.js.map +1 -0
  451. package/dist/razer/devices.d.ts +156 -0
  452. package/dist/razer/devices.d.ts.map +1 -0
  453. package/dist/razer/devices.js +540 -0
  454. package/dist/razer/devices.js.map +1 -0
  455. package/dist/razer/index.d.ts +2 -0
  456. package/dist/razer/index.d.ts.map +1 -0
  457. package/dist/razer/index.js +2 -0
  458. package/dist/razer/index.js.map +1 -0
  459. package/dist/razer/v4.d.ts +19 -0
  460. package/dist/razer/v4.d.ts.map +1 -0
  461. package/dist/razer/v4.js +51 -0
  462. package/dist/razer/v4.js.map +1 -0
  463. package/dist/steelseries/aerox3.d.ts +236 -0
  464. package/dist/steelseries/aerox3.d.ts.map +1 -0
  465. package/dist/steelseries/aerox3.js +311 -0
  466. package/dist/steelseries/aerox3.js.map +1 -0
  467. package/dist/steelseries/aerox5-wireless.d.ts +300 -0
  468. package/dist/steelseries/aerox5-wireless.d.ts.map +1 -0
  469. package/dist/steelseries/aerox5-wireless.js +389 -0
  470. package/dist/steelseries/aerox5-wireless.js.map +1 -0
  471. package/dist/steelseries/aerox5.d.ts +228 -0
  472. package/dist/steelseries/aerox5.d.ts.map +1 -0
  473. package/dist/steelseries/aerox5.js +294 -0
  474. package/dist/steelseries/aerox5.js.map +1 -0
  475. package/dist/steelseries/aerox9-wireless.d.ts +213 -0
  476. package/dist/steelseries/aerox9-wireless.d.ts.map +1 -0
  477. package/dist/steelseries/aerox9-wireless.js +305 -0
  478. package/dist/steelseries/aerox9-wireless.js.map +1 -0
  479. package/dist/steelseries/devices.d.ts +82 -0
  480. package/dist/steelseries/devices.d.ts.map +1 -0
  481. package/dist/steelseries/devices.js +310 -0
  482. package/dist/steelseries/devices.js.map +1 -0
  483. package/dist/steelseries/index.d.ts +13 -0
  484. package/dist/steelseries/index.d.ts.map +1 -0
  485. package/dist/steelseries/index.js +13 -0
  486. package/dist/steelseries/index.js.map +1 -0
  487. package/dist/steelseries/prime-mini-wireless.d.ts +253 -0
  488. package/dist/steelseries/prime-mini-wireless.d.ts.map +1 -0
  489. package/dist/steelseries/prime-mini-wireless.js +351 -0
  490. package/dist/steelseries/prime-mini-wireless.js.map +1 -0
  491. package/dist/steelseries/prime-plus.d.ts +179 -0
  492. package/dist/steelseries/prime-plus.d.ts.map +1 -0
  493. package/dist/steelseries/prime-plus.js +275 -0
  494. package/dist/steelseries/prime-plus.js.map +1 -0
  495. package/dist/steelseries/rival3-wireless.d.ts +222 -0
  496. package/dist/steelseries/rival3-wireless.d.ts.map +1 -0
  497. package/dist/steelseries/rival3-wireless.js +308 -0
  498. package/dist/steelseries/rival3-wireless.js.map +1 -0
  499. package/dist/steelseries/rival3.d.ts +99 -0
  500. package/dist/steelseries/rival3.d.ts.map +1 -0
  501. package/dist/steelseries/rival3.js +147 -0
  502. package/dist/steelseries/rival3.js.map +1 -0
  503. package/dist/steelseries/rival310.d.ts +230 -0
  504. package/dist/steelseries/rival310.d.ts.map +1 -0
  505. package/dist/steelseries/rival310.js +322 -0
  506. package/dist/steelseries/rival310.js.map +1 -0
  507. package/dist/steelseries/rival650.d.ts +215 -0
  508. package/dist/steelseries/rival650.d.ts.map +1 -0
  509. package/dist/steelseries/rival650.js +284 -0
  510. package/dist/steelseries/rival650.js.map +1 -0
  511. package/dist/steelseries/sensei-ten.d.ts +283 -0
  512. package/dist/steelseries/sensei-ten.d.ts.map +1 -0
  513. package/dist/steelseries/sensei-ten.js +389 -0
  514. package/dist/steelseries/sensei-ten.js.map +1 -0
  515. package/dist/teevolution/index.d.ts +211 -0
  516. package/dist/teevolution/index.d.ts.map +1 -0
  517. package/dist/teevolution/index.js +458 -0
  518. package/dist/teevolution/index.js.map +1 -0
  519. package/dist/valkyrie/index.d.ts +19 -0
  520. package/dist/valkyrie/index.d.ts.map +1 -0
  521. package/dist/valkyrie/index.js +43 -0
  522. package/dist/valkyrie/index.js.map +1 -0
  523. package/dist/valkyrie/settings.d.ts +28 -0
  524. package/dist/valkyrie/settings.d.ts.map +1 -0
  525. package/dist/valkyrie/settings.js +84 -0
  526. package/dist/valkyrie/settings.js.map +1 -0
  527. package/dist/vgn/index.d.ts +59 -0
  528. package/dist/vgn/index.d.ts.map +1 -0
  529. package/dist/vgn/index.js +165 -0
  530. package/dist/vgn/index.js.map +1 -0
  531. package/dist/wallhack/index.d.ts +165 -0
  532. package/dist/wallhack/index.d.ts.map +1 -0
  533. package/dist/wallhack/index.js +226 -0
  534. package/dist/wallhack/index.js.map +1 -0
  535. package/dist/wlmouse/index.d.ts +4 -0
  536. package/dist/wlmouse/index.d.ts.map +1 -0
  537. package/dist/wlmouse/index.js +7 -0
  538. package/dist/wlmouse/index.js.map +1 -0
  539. package/dist/wooting/index.d.ts +225 -0
  540. package/dist/wooting/index.d.ts.map +1 -0
  541. package/dist/wooting/index.js +296 -0
  542. package/dist/wooting/index.js.map +1 -0
  543. package/dist/zaunkoenig/index.d.ts +49 -0
  544. package/dist/zaunkoenig/index.d.ts.map +1 -0
  545. package/dist/zaunkoenig/index.js +127 -0
  546. package/dist/zaunkoenig/index.js.map +1 -0
  547. package/package.json +193 -0
@@ -0,0 +1,275 @@
1
+ /**
2
+ * SteelSeries Prime+ configuration protocol — pure encode/decode helpers.
3
+ *
4
+ * Reconstructed from public open-source implementations, not vendor software:
5
+ *
6
+ * - rivalcfg `rivalcfg/devices/prime_plus.py` — the primary source for every
7
+ * command byte and default here. `1038:182C`, endpoint 0.
8
+ * - rivalcfg `rivalcfg/devices/prime.py` (plain Prime, `1038:182E` plus two
9
+ * limited-edition PIDs) was read only to confirm Prime+ genuinely warrants
10
+ * its own module rather than reusing Prime's. **Surprising finding: it does
11
+ * not, protocol-wise.** `prime.py` and `prime_plus.py` are byte-identical
12
+ * in every setting (sensitivity `0x61`, polling `0x5D`, color `0x62 0x01`,
13
+ * brightness `0x5F`, buttons `0x5B`, save `0x59`) — the only diff is the
14
+ * model name/PID list. **rivalcfg's Prime+ profile has no OLED/display
15
+ * setting**, contrary to this rollout's assumption that Prime+ has one
16
+ * because the physical mouse has an OLED status screen. Neither rivalcfg,
17
+ * libratbag, nor the OpenRGB SteelSeries controller sources reachable from
18
+ * this environment (see corroboration gap below) expose any command for it.
19
+ * Prime+ is still implemented as its own module/PID/family rather than
20
+ * folded into a shared "Prime" module, per this rollout's instruction to
21
+ * add Prime+ only and not touch plain Prime — but the wire protocol
22
+ * implemented here is not distinguishable from plain Prime's, and a reader
23
+ * should not infer an OLED command exists just because this module exists.
24
+ * - rivalcfg `rivalcfg/handlers/multidpi_range.py` (DPI presets: `merge_bytes(
25
+ * count, selected_preset, ...values)`, `count_mode: "number"`, 2-byte
26
+ * little-endian DPI values here vs. Aerox 3's 1-byte) and
27
+ * `rivalcfg/handlers/range.py` (the range→range linear rounding both
28
+ * `multidpi_range` and `range` build on).
29
+ * - rivalcfg `rivalcfg/handlers/rgbcolor.py` — RGB value encoding (`[r,g,b]`).
30
+ * - rivalcfg `rivalcfg/handlers/range.py` (again, for `led_brightness`: a
31
+ * 0–256 linear passthrough, 2-byte little-endian — note the input range's
32
+ * upper bound is genuinely `256`, not `255`, in `prime_plus.py`; not a typo
33
+ * introduced here).
34
+ * - rivalcfg `rivalcfg/handlers/buttons/buttons.py` — the fixed-width button
35
+ * field layout (5 bytes/button, zero-filled, `offset`/`id` per button),
36
+ * same shape as Aerox 3's but only 6 buttons/slots (no scroll-wheel source
37
+ * entries — `prime_plus.py`'s `buttons_mapping.buttons` table lists only
38
+ * `Button1`..`Button6`).
39
+ * - rivalcfg `rivalcfg/mouse.py` (`_exec_command`) — confirms wire assembly
40
+ * order is `command ++ process_value(value) ++ command_suffix`, which is
41
+ * how the color command's 16-byte suffix (15 zero bytes then `0xFF`)
42
+ * attaches after the `[r,g,b]` triple.
43
+ *
44
+ * ## Corroboration gap (must read before trusting this file)
45
+ *
46
+ * libratbag's `src/driver-steelseries.c` (fetched from
47
+ * `libratbag/libratbag@master`) contains **no reference at all** to Prime,
48
+ * Prime+, PID `0x182C`, or any OLED/display command — it does not implement
49
+ * this device family. The OpenRGB SteelSeries controller sources could not be
50
+ * located at their expected path in this environment (404) and a GitHub code
51
+ * search for "Prime+", `0x182C`, and "SteelSeriesPrime" against
52
+ * `CalcProgrammer1/OpenRGB` returned zero results, so OpenRGB could not be
53
+ * checked either. **rivalcfg is therefore the only source this module is
54
+ * corroborated against.** Nothing here has been verified on physical Prime+
55
+ * hardware by this project.
56
+ *
57
+ * Every command is an HID **output report** with report id 0x00 (`"endpoint":
58
+ * 0` in `prime_plus.py`, the vendor configuration interface). The functions
59
+ * here build the report *payload* — the bytes after the report id — unpadded,
60
+ * matching rivalcfg's `usbhid.py` writes.
61
+ *
62
+ * **This device is write-only.** `prime_plus.py` defines no getter for any
63
+ * setting and no firmware-query command, so there is nothing to probe the
64
+ * mouse with beyond a successful `open()` — same honesty policy as Aerox 3:
65
+ * session state must be tracked client-side with `valuesVerified: false`.
66
+ *
67
+ * Settings apply immediately; the save command (`0x59`, a single byte with
68
+ * **no** `0x00` suffix — distinct from Aerox 3's `11 00` and Rival 3 Gen 1's
69
+ * `09 00`; do not confuse the three) persists them to onboard flash.
70
+ *
71
+ * ## Button mapping — deliberately reduced scope
72
+ *
73
+ * Same scope line drawn in `./aerox3.ts`: this module implements the exact
74
+ * 5-byte/button, zero-filled packet shape and the mouse-button/disable/
75
+ * DPI-switch/scroll-wheel special actions, but does not re-implement
76
+ * rivalcfg's QWERTY or multimedia key-name tables — keyboard and multimedia
77
+ * targets are taken here as raw `{ type: "keyboard" | "multimedia", code }`
78
+ * scan-code bytes, matching `button_keyboard: 0x51` / `button_multimedia:
79
+ * 0x61` verbatim. Unlike Aerox 3, Prime+'s `buttons` table has no `ScrollUp`/
80
+ * `ScrollDown` *source* button entries (only 6 physical buttons are mapped),
81
+ * but `button_scroll_up: 0x31` / `button_scroll_down: 0x32` are still valid
82
+ * *target* special actions for any of the 6 buttons, exposed here as
83
+ * `{ type: "scrollUp" }` / `{ type: "scrollDown" }`.
84
+ */
85
+ export const PRIME_PLUS_REPORT_ID = 0x00;
86
+ /** One-byte command prefixes; the payload is the prefix plus its arguments. */
87
+ export const PRIME_PLUS_COMMAND = {
88
+ sensitivity: [0x61],
89
+ pollingRate: [0x5d],
90
+ color: [0x62, 0x01],
91
+ ledBrightness: [0x5f],
92
+ buttonsMapping: [0x5b],
93
+ };
94
+ /** `0x62 0x01 <r> <g> <b>` followed by this fixed 16-byte suffix (`command_suffix` in `prime_plus.py`). */
95
+ const COLOR_SUFFIX = [
96
+ 0x00, 0x00, 0x00,
97
+ 0x00, 0x00, 0x00,
98
+ 0x00, 0x00, 0x00,
99
+ 0x00, 0x00, 0x00,
100
+ 0x00, 0x00, 0x00,
101
+ 0xff,
102
+ ];
103
+ /** `0x59` — a single byte, no `0x00` suffix. Distinct from Aerox 3's `11 00`. */
104
+ export const PRIME_PLUS_SAVE_COMMAND = [0x59];
105
+ export const PRIME_PLUS_POLLING_RATES = [125, 250, 500, 1000];
106
+ const POLLING_RATE_TO_BYTE = new Map([
107
+ [1000, 0x01],
108
+ [500, 0x02],
109
+ [250, 0x03],
110
+ [125, 0x04],
111
+ ]);
112
+ export const PRIME_PLUS_DPI_MIN = 50;
113
+ export const PRIME_PLUS_DPI_MAX = 18000;
114
+ export const PRIME_PLUS_DPI_STEP = 50;
115
+ export const PRIME_PLUS_MAX_DPI_PRESETS = 5;
116
+ export const PRIME_PLUS_LED_BRIGHTNESS_MAX = 256;
117
+ export class PrimePlusProtocolError extends Error {
118
+ }
119
+ /**
120
+ * `prime_plus.py`'s `input_range`/`output_range` for `sensitivity` are both
121
+ * `[50, 18000, 50]` / `[1, 0x0168, 1]` — 360 steps mapped 1:1 in ascending
122
+ * order, so the output byte is simply `(dpi - 50) / 50 + 1`. Unlike Aerox 3's
123
+ * TrueMove Core table, no lookup table is needed or possible to corroborate
124
+ * from `range.py`'s generic range-to-range formula.
125
+ */
126
+ function dpiToWireValue(dpi) {
127
+ if (!Number.isInteger(dpi) || dpi < PRIME_PLUS_DPI_MIN || dpi > PRIME_PLUS_DPI_MAX || (dpi - PRIME_PLUS_DPI_MIN) % PRIME_PLUS_DPI_STEP !== 0) {
128
+ throw new PrimePlusProtocolError(`SteelSeries Prime+ DPI must be ${PRIME_PLUS_DPI_MIN}–${PRIME_PLUS_DPI_MAX.toLocaleString()} in ${PRIME_PLUS_DPI_STEP} DPI steps.`);
129
+ }
130
+ return (dpi - PRIME_PLUS_DPI_MIN) / PRIME_PLUS_DPI_STEP + 1;
131
+ }
132
+ /** The 360 DPI values the linear `sensitivity` range can express, ascending. */
133
+ export function steelseriesPrimePlusDpiOptions() {
134
+ const options = [];
135
+ for (let dpi = PRIME_PLUS_DPI_MIN; dpi <= PRIME_PLUS_DPI_MAX; dpi += PRIME_PLUS_DPI_STEP) {
136
+ options.push(dpi);
137
+ }
138
+ return options;
139
+ }
140
+ /**
141
+ * `61 <count> <selectedPreset> <v1_lo> <v1_hi> … <vN_lo> <vN_hi>` — replaces
142
+ * the mouse's whole preset table. Two bytes per DPI, little-endian
143
+ * (`dpi_length_byte: 2`); `selectedIndex` is 0-based both here and on the
144
+ * wire (`first_preset: 0`, unlike Aerox 3's `first_preset: 1`).
145
+ */
146
+ export function steelseriesPrimePlusEncodeDpiPresets(presets, selectedIndex) {
147
+ if (presets.length < 1 || presets.length > PRIME_PLUS_MAX_DPI_PRESETS) {
148
+ throw new PrimePlusProtocolError(`SteelSeries Prime+ supports 1–${PRIME_PLUS_MAX_DPI_PRESETS} DPI presets.`);
149
+ }
150
+ if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex >= presets.length) {
151
+ throw new PrimePlusProtocolError(`Selected DPI preset must be an index into the ${presets.length} presets being written.`);
152
+ }
153
+ const encoded = [];
154
+ for (const dpi of presets) {
155
+ const value = dpiToWireValue(dpi);
156
+ encoded.push(value & 0xff, (value >> 8) & 0xff);
157
+ }
158
+ return new Uint8Array([...PRIME_PLUS_COMMAND.sensitivity, presets.length, selectedIndex, ...encoded]);
159
+ }
160
+ /** `5D <v>` with 1000→0x01, 500→0x02, 250→0x03, 125→0x04. */
161
+ export function steelseriesPrimePlusEncodePollingRate(pollingRateHz) {
162
+ const byte = POLLING_RATE_TO_BYTE.get(pollingRateHz);
163
+ if (byte === undefined) {
164
+ throw new PrimePlusProtocolError("SteelSeries Prime+ supports 125, 250, 500, or 1000 Hz polling.");
165
+ }
166
+ return new Uint8Array([...PRIME_PLUS_COMMAND.pollingRate, byte]);
167
+ }
168
+ function encodeRgb(r, g, b) {
169
+ for (const channel of [r, g, b]) {
170
+ if (!Number.isInteger(channel) || channel < 0 || channel > 255) {
171
+ throw new PrimePlusProtocolError("RGB channels must be integers 0–255.");
172
+ }
173
+ }
174
+ return [r, g, b];
175
+ }
176
+ /** `62 01 <r> <g> <b>` plus the fixed 16-byte suffix — the scroll-wheel LED color. */
177
+ export function steelseriesPrimePlusEncodeColor(r, g, b) {
178
+ const [red, green, blue] = encodeRgb(r, g, b);
179
+ return new Uint8Array([...PRIME_PLUS_COMMAND.color, red, green, blue, ...COLOR_SUFFIX]);
180
+ }
181
+ /**
182
+ * `5F <v_lo> <v_hi>` — linear 0–256 passthrough, 2-byte little-endian
183
+ * (`range_length_byte: 2`). Note the upper bound is genuinely 256, matching
184
+ * `prime_plus.py`'s `input_range`/`output_range`.
185
+ */
186
+ export function steelseriesPrimePlusEncodeLedBrightness(level) {
187
+ if (!Number.isInteger(level) || level < 0 || level > PRIME_PLUS_LED_BRIGHTNESS_MAX) {
188
+ throw new PrimePlusProtocolError(`SteelSeries Prime+ LED brightness must be an integer 0–${PRIME_PLUS_LED_BRIGHTNESS_MAX}.`);
189
+ }
190
+ return new Uint8Array([...PRIME_PLUS_COMMAND.ledBrightness, level & 0xff, (level >> 8) & 0xff]);
191
+ }
192
+ /** `59` — commit the current settings to onboard flash. */
193
+ export function steelseriesPrimePlusSaveCommand() {
194
+ return new Uint8Array(PRIME_PLUS_SAVE_COMMAND);
195
+ }
196
+ /** `buttons_mapping.buttons` from `prime_plus.py`, id + byte offset into the packet. */
197
+ export const PRIME_PLUS_BUTTONS = {
198
+ button1: { id: 0x01, offset: 0x00 },
199
+ button2: { id: 0x02, offset: 0x05 },
200
+ button3: { id: 0x03, offset: 0x0a },
201
+ button4: { id: 0x04, offset: 0x0f },
202
+ button5: { id: 0x05, offset: 0x14 },
203
+ button6: { id: 0x06, offset: 0x19 },
204
+ };
205
+ const PRIME_PLUS_BUTTON_FIELD_LENGTH = 5;
206
+ const PRIME_PLUS_BUTTON_DISABLE = 0x00;
207
+ const PRIME_PLUS_BUTTON_DPI_SWITCH = 0x30;
208
+ const PRIME_PLUS_BUTTON_SCROLL_UP = 0x31;
209
+ const PRIME_PLUS_BUTTON_SCROLL_DOWN = 0x32;
210
+ const PRIME_PLUS_BUTTON_KEYBOARD = 0x51;
211
+ const PRIME_PLUS_BUTTON_MULTIMEDIA = 0x61;
212
+ /**
213
+ * `5B` + one 30-byte (`6 buttons × 5-byte field length`) packet, zero-filled
214
+ * except where a mapping is given. Unmapped buttons are left as all-zero
215
+ * fields — pass every button explicitly for parity with rivalcfg's default
216
+ * profile, same policy as `./aerox3.ts`.
217
+ */
218
+ export function steelseriesPrimePlusEncodeButtonsMapping(mapping) {
219
+ const names = Object.keys(PRIME_PLUS_BUTTONS);
220
+ const packet = new Array(names.length * PRIME_PLUS_BUTTON_FIELD_LENGTH).fill(0x00);
221
+ for (const [name, action] of Object.entries(mapping)) {
222
+ const slot = PRIME_PLUS_BUTTONS[name];
223
+ if (!slot) {
224
+ throw new PrimePlusProtocolError(`Unknown SteelSeries Prime+ button "${name}".`);
225
+ }
226
+ const { offset } = slot;
227
+ switch (action.type) {
228
+ case "button": {
229
+ const target = PRIME_PLUS_BUTTONS[action.target];
230
+ if (!target) {
231
+ throw new PrimePlusProtocolError(`Unknown SteelSeries Prime+ button target "${action.target}".`);
232
+ }
233
+ packet[offset] = target.id;
234
+ break;
235
+ }
236
+ case "disabled": {
237
+ packet[offset] = PRIME_PLUS_BUTTON_DISABLE;
238
+ break;
239
+ }
240
+ case "dpiSwitch": {
241
+ packet[offset] = PRIME_PLUS_BUTTON_DPI_SWITCH;
242
+ break;
243
+ }
244
+ case "scrollUp": {
245
+ packet[offset] = PRIME_PLUS_BUTTON_SCROLL_UP;
246
+ break;
247
+ }
248
+ case "scrollDown": {
249
+ packet[offset] = PRIME_PLUS_BUTTON_SCROLL_DOWN;
250
+ break;
251
+ }
252
+ case "keyboard": {
253
+ if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
254
+ throw new PrimePlusProtocolError("Keyboard scan codes must be integers 0–255.");
255
+ }
256
+ packet[offset] = PRIME_PLUS_BUTTON_KEYBOARD;
257
+ packet[offset + 1] = action.code;
258
+ break;
259
+ }
260
+ case "multimedia": {
261
+ if (!Number.isInteger(action.code) || action.code < 0 || action.code > 255) {
262
+ throw new PrimePlusProtocolError("Multimedia key codes must be integers 0–255.");
263
+ }
264
+ packet[offset] = PRIME_PLUS_BUTTON_MULTIMEDIA;
265
+ packet[offset + 1] = action.code;
266
+ break;
267
+ }
268
+ default: {
269
+ throw new PrimePlusProtocolError(`Unsupported SteelSeries Prime+ button action.`);
270
+ }
271
+ }
272
+ }
273
+ return new Uint8Array([...PRIME_PLUS_COMMAND.buttonsMapping, ...packet]);
274
+ }
275
+ //# sourceMappingURL=prime-plus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prime-plus.js","sourceRoot":"","sources":["../../src/steelseries/prime-plus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * SteelSeries Rival 3 Wireless configuration protocol — pure encode/decode helpers.
3
+ *
4
+ * Reconstructed from public open-source implementations, not vendor software:
5
+ *
6
+ * - rivalcfg `rivalcfg/devices/rival3_wireless.py` — the primary source for
7
+ * every command byte, product id, and default here. Read in full for this
8
+ * cluster; not assumed from any other SteelSeries device file.
9
+ * - rivalcfg `rivalcfg/devices/dpi/truemove_air.py` — the DPI byte table for
10
+ * this device's TrueMove Air sensor. **This is a distinct table from
11
+ * `./rival3.ts`'s `TRUEMOVE_CORE_DPI_TO_BYTE`** (used by Rival 3 Gen 1 and
12
+ * Aerox 3): TrueMove Air starts at 100 DPI (Core starts at 200), covers
13
+ * 100–18000 in 100 DPI steps (180 entries; Core tops out at 8500 in 84
14
+ * entries), and the byte values at shared DPI numbers differ (e.g.
15
+ * 400 DPI is `0x04` here vs. `0x08` for Core; 1600 DPI is `0x12` here vs.
16
+ * `0x24` for Core). Reusing Core's table for this device would silently
17
+ * set the wrong sensitivity, so this module defines its own
18
+ * `TRUEMOVE_AIR_DPI_TO_BYTE` and does not import Core's.
19
+ * - rivalcfg `rivalcfg/handlers/multidpi_range_choice.py` — the DPI preset
20
+ * packet shape, same handler as Rival 3 Gen 1/Aerox 3 but with
21
+ * `dpi_length_byte: 2` (little-endian two bytes per preset — Rival 3 Gen 1
22
+ * and Aerox 3 both use one byte per preset, so a preset list here is twice
23
+ * as long as an equivalent list for those families).
24
+ * - rivalcfg `rivalcfg/handlers/buttons/buttons.py` — the fixed-width button
25
+ * field layout, 6 buttons only (no `scrollUp`/`scrollDown` remap *slots* —
26
+ * this device profile has no such button entries — though `ScrollUp`
27
+ * (`0x31`) and `ScrollDown` (`0x32`) remain valid remap *targets*, same as
28
+ * `dpi` (`0x30`)).
29
+ * - rivalcfg's `usbhid.py` / `mouse.py` framing conventions, shared with
30
+ * `./rival3.ts` and `./aerox3.ts` (unnumbered HID output reports on the
31
+ * vendor configuration interface, `"endpoint": 3`).
32
+ *
33
+ * ## Why this is a separate protocol family from Rival 3 Gen 1 and Aerox 3
34
+ *
35
+ * Despite the shared "Rival 3" name, `rival3_wireless.py` is confirmed as a
36
+ * genuinely separate command set from both siblings, verified directly from
37
+ * the source rather than assumed from the family name:
38
+ *
39
+ * - Product id `1038:1830` ("2.4 GHz mode", endpoint 3) — distinct from Rival
40
+ * 3 Gen 1's `1038:1824`/`184C` and Aerox 3's `1038:1836`.
41
+ * - Sensitivity command `0x20` (single-byte prefix, like Aerox 3's `0x2D` but
42
+ * a different byte) vs. Rival 3 Gen 1's two-byte `0x0B 0x00`.
43
+ * - Polling command `0x17` with choices `{125:0x03, 250:0x02, 500:0x01,
44
+ * 1000:0x00}` — the same four rates as Gen 1/Aerox 3 but a **different
45
+ * command byte** (`0x17` here vs. `0x04 0x00` / `0x2B`); the value mapping
46
+ * is byte-identical, only the command prefix differs.
47
+ * - Buttons command `0x19` vs. Gen 1's undocumented `0x07 0x00` and Aerox 3's
48
+ * `0x2A`.
49
+ * - Save command `0x09` (**one byte**) — distinct from Rival 3 Gen 1's
50
+ * `0x09 0x00` (two bytes, same leading byte, easy to confuse) and Aerox 3's
51
+ * `0x11 0x00`.
52
+ * - Firmware query `0x90 0x00` — distinct from Rival 3 Gen 1's `0x10 0x00`.
53
+ * Aerox 3 has no firmware query at all.
54
+ * - A `battery_level` read (`0xAA 0x01`, three-byte response) that neither
55
+ * Rival 3 Gen 1 nor Aerox 3 profile defines at all — see below.
56
+ *
57
+ * `rivalcfg/devices/devices.py`'s `SUPPORTED_DEVICES` lists `rival3_wireless`
58
+ * and `rival3_wireless_gen2` (`1038:1872`) as separate profile modules from
59
+ * each other and from `rival3.py`/`aerox3.py`; nothing here claims `0x1872`
60
+ * — the Wireless Gen 2 is a different device with its own (unread) command
61
+ * set and is out of scope for this cluster.
62
+ *
63
+ * No corroborating libratbag or OpenRGB source for this exact device/PID was
64
+ * available in this environment (no local libratbag checkout, and OpenRGB's
65
+ * SteelSeries controllers were not searched for a Rival 3 Wireless-specific
66
+ * file this pass) — every command byte above is sourced from rivalcfg alone.
67
+ * This should be treated as a single-source reconstruction until corroborated
68
+ * or hardware-verified.
69
+ *
70
+ * ## Battery / charging read — this device IS partially readable
71
+ *
72
+ * Unlike the wired Rival 3 Gen 1 and Aerox 3 (write-only, no getters at
73
+ * all), `rival3_wireless.py` defines a top-level `battery_level` block: an
74
+ * output-report write of `0xAA 0x01` gets a 3-byte input-report reply, where
75
+ * `data[0]` is the battery percentage (`level`) and `data[2]` is a
76
+ * charging boolean (`is_charging`, `bool(data[2])`) — `data[1]` is unused by
77
+ * rivalcfg's lambdas. This module exposes `steelseriesRival3WirelessBatteryQuery`
78
+ * / `steelseriesRival3WirelessDecodeBattery` so the HID client can wire a real
79
+ * `readStatus` battery read instead of reporting `batteryState: "Unknown"`.
80
+ * The firmware query (`0x90 0x00`, 2-byte reply) is also readable, following
81
+ * the same pattern as `./rival3.ts`'s `10 00`.
82
+ *
83
+ * DPI presets, polling rate, and buttons remain write-only: `rival3_wireless.py`
84
+ * defines no getter for any of the three, same as every other SteelSeries
85
+ * profile in rivalcfg.
86
+ *
87
+ * Settings apply immediately; the save command (`09`) persists them to
88
+ * onboard flash, mirroring the other two families' CLI default. None of this
89
+ * has been verified on physical hardware by this project.
90
+ */
91
+ export declare const RIVAL3_WIRELESS_REPORT_ID = 0;
92
+ /** Command prefixes; length varies by command, matching rivalcfg exactly. */
93
+ export declare const RIVAL3_WIRELESS_COMMAND: {
94
+ readonly sensitivity: readonly [32];
95
+ readonly pollingRate: readonly [23];
96
+ readonly buttonsMapping: readonly [25];
97
+ /** `AA 01` — battery percentage + charging state, 3-byte input-report reply. */
98
+ readonly batteryLevel: readonly [170, 1];
99
+ /** One byte — distinct from Rival 3 Gen 1's two-byte `09 00`. */
100
+ readonly save: readonly [9];
101
+ /** `90 00` — distinct from Rival 3 Gen 1's `10 00`. */
102
+ readonly firmware: readonly [144, 0];
103
+ };
104
+ export declare const RIVAL3_WIRELESS_POLLING_RATES: readonly [125, 250, 500, 1000];
105
+ export declare const RIVAL3_WIRELESS_DPI_MIN = 100;
106
+ export declare const RIVAL3_WIRELESS_DPI_MAX = 18000;
107
+ export declare const RIVAL3_WIRELESS_DPI_STEP = 100;
108
+ export declare const RIVAL3_WIRELESS_MAX_DPI_PRESETS = 5;
109
+ export declare const RIVAL3_WIRELESS_FIRMWARE_RESPONSE_LENGTH = 2;
110
+ export declare const RIVAL3_WIRELESS_BATTERY_RESPONSE_LENGTH = 3;
111
+ /**
112
+ * rivalcfg's TrueMove Air sensor table (`devices/dpi/truemove_air.py`), the
113
+ * sensor used by the Rival 3 Wireless — **not** the TrueMove Core table
114
+ * `./rival3.ts` exports. Values pinned in `rival3-wireless.test.ts` against
115
+ * the source file: 100→0x00, 400→0x04, 1600→0x12, 18000→0xD6.
116
+ */
117
+ export declare const TRUEMOVE_AIR_DPI_TO_BYTE: ReadonlyMap<number, number>;
118
+ export declare class Rival3WirelessProtocolError extends Error {
119
+ }
120
+ /** The 180 DPI values the TrueMove Air sensor table can express, ascending. */
121
+ export declare function steelseriesRival3WirelessDpiOptions(): number[];
122
+ /**
123
+ * `20 <count> <selected> <v1_lo> <v1_hi>…<vN_lo> <vN_hi>` — replaces the
124
+ * mouse's whole preset table. Two little-endian bytes per DPI
125
+ * (`dpi_length_byte: 2`, unlike Rival 3 Gen 1/Aerox 3's one byte); the high
126
+ * byte is always `0x00` since the TrueMove Air table only produces values up
127
+ * to `0xD6`, but both bytes are always sent to match the wire format exactly.
128
+ * `selectedIndex` is 0-based here and encoded 1-based on the wire
129
+ * (`first_preset: 1`).
130
+ */
131
+ export declare function steelseriesRival3WirelessEncodeDpiPresets(presets: readonly number[], selectedIndex: number): Uint8Array;
132
+ /** `17 <v>` with 1000→0x00, 500→0x01, 250→0x02, 125→0x03 (different byte order than Rival 3 Gen 1/Aerox 3). */
133
+ export declare function steelseriesRival3WirelessEncodePollingRate(pollingRateHz: number): Uint8Array;
134
+ /** `09` — commit the current settings to onboard flash. One byte, unlike Rival 3 Gen 1's `09 00`. */
135
+ export declare function steelseriesRival3WirelessSaveCommand(): Uint8Array;
136
+ /** `90 00` — the device answers with a two-byte input report. */
137
+ export declare function steelseriesRival3WirelessFirmwareQuery(): Uint8Array;
138
+ export interface Rival3WirelessFirmware {
139
+ /** The two raw response bytes, in the order the device sent them. */
140
+ bytes: [number, number];
141
+ /** The bytes joined in read order, e.g. "37.0". */
142
+ display: string;
143
+ }
144
+ /** Decode the two-byte firmware response, same read-order convention as `./rival3.ts`. */
145
+ export declare function steelseriesRival3WirelessDecodeFirmware(payload: Uint8Array): Rival3WirelessFirmware;
146
+ /** `AA 01` — the device answers with a three-byte input report (level, unused, charging). */
147
+ export declare function steelseriesRival3WirelessBatteryQuery(): Uint8Array;
148
+ export interface Rival3WirelessBattery {
149
+ /** Battery percentage, `data[0]` verbatim (rivalcfg does not clamp it). */
150
+ level: number;
151
+ /** `bool(data[2])` in rivalcfg — `data[1]` is not used by either lambda. */
152
+ isCharging: boolean;
153
+ }
154
+ /**
155
+ * Decode the three-byte battery response: `data[0]` is the percentage
156
+ * (rivalcfg's `level` lambda, `int(data[0])`), `data[2]` is charging state
157
+ * (rivalcfg's `is_charging` lambda, `bool(data[2])`). `data[1]` is present in
158
+ * the response but unused by either rivalcfg lambda.
159
+ */
160
+ export declare function steelseriesRival3WirelessDecodeBattery(payload: Uint8Array): Rival3WirelessBattery;
161
+ /** `buttons_mapping.buttons` from `rival3_wireless.py`, id + byte offset into the packet. */
162
+ export declare const RIVAL3_WIRELESS_BUTTONS: {
163
+ readonly button1: {
164
+ readonly id: 1;
165
+ readonly offset: 0;
166
+ };
167
+ readonly button2: {
168
+ readonly id: 2;
169
+ readonly offset: 5;
170
+ };
171
+ readonly button3: {
172
+ readonly id: 3;
173
+ readonly offset: 10;
174
+ };
175
+ readonly button4: {
176
+ readonly id: 4;
177
+ readonly offset: 15;
178
+ };
179
+ readonly button5: {
180
+ readonly id: 5;
181
+ readonly offset: 20;
182
+ };
183
+ readonly button6: {
184
+ readonly id: 6;
185
+ readonly offset: 25;
186
+ };
187
+ };
188
+ export type Rival3WirelessButtonName = keyof typeof RIVAL3_WIRELESS_BUTTONS;
189
+ /**
190
+ * One button's target. Unlike `./aerox3.ts`, this device profile has no
191
+ * `scrollUp`/`scrollDown` button *slots* to remap from — only 6 physical
192
+ * buttons — but `scrollUp`/`scrollDown` remain valid remap *targets*
193
+ * (`button_scroll_up: 0x31`, `button_scroll_down: 0x32` in the source), same
194
+ * as `dpiSwitch`.
195
+ */
196
+ export type Rival3WirelessButtonAction = {
197
+ type: "button";
198
+ target: Rival3WirelessButtonName;
199
+ } | {
200
+ type: "disabled";
201
+ } | {
202
+ type: "dpiSwitch";
203
+ } | {
204
+ type: "scrollUp";
205
+ } | {
206
+ type: "scrollDown";
207
+ } | {
208
+ type: "keyboard";
209
+ code: number;
210
+ } | {
211
+ type: "multimedia";
212
+ code: number;
213
+ };
214
+ /**
215
+ * `19` + one 30-byte (`6 buttons × 5-byte field length`) packet, zero-filled
216
+ * except where a mapping is given. Unmapped buttons are left as all-zero
217
+ * fields (rivalcfg instead fills in per-button defaults; this codec leaves
218
+ * that policy to the caller — pass every button explicitly for parity with
219
+ * rivalcfg's default profile).
220
+ */
221
+ export declare function steelseriesRival3WirelessEncodeButtonsMapping(mapping: Partial<Record<Rival3WirelessButtonName, Rival3WirelessButtonAction>>): Uint8Array;
222
+ //# sourceMappingURL=rival3-wireless.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rival3-wireless.d.ts","sourceRoot":"","sources":["../../src/steelseries/rival3-wireless.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyFG;AAEH,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAE9C,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB;;;;IAIlC,gFAAgF;;IAEhF,iEAAiE;;IAEjE,uDAAuD;;CAE/C,CAAC;AAEX,eAAO,MAAM,6BAA6B,gCAAiC,CAAC;AAS5E,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,+BAA+B,IAAI,CAAC;AACjD,eAAO,MAAM,wCAAwC,IAAI,CAAC;AAC1D,eAAO,MAAM,uCAAuC,IAAI,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CA+B/D,CAAC;AAEH,qBAAa,2BAA4B,SAAQ,KAAK;CAAG;AAEzD,+EAA+E;AAC/E,wBAAgB,mCAAmC,IAAI,MAAM,EAAE,CAE9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,aAAa,EAAE,MAAM,GACpB,UAAU,CA2BZ;AAED,+GAA+G;AAC/G,wBAAgB,0CAA0C,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,CAQ5F;AAED,qGAAqG;AACrG,wBAAgB,oCAAoC,IAAI,UAAU,CAEjE;AAED,iEAAiE;AACjE,wBAAgB,sCAAsC,IAAI,UAAU,CAEnE;AAED,MAAM,WAAW,sBAAsB;IACrC,qEAAqE;IACrE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,0FAA0F;AAC1F,wBAAgB,uCAAuC,CAAC,OAAO,EAAE,UAAU,GAAG,sBAAsB,CAQnG;AAED,6FAA6F;AAC7F,wBAAgB,qCAAqC,IAAI,UAAU,CAElE;AAED,MAAM,WAAW,qBAAqB;IACpC,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,sCAAsC,CAAC,OAAO,EAAE,UAAU,GAAG,qBAAqB,CAOjG;AASD,6FAA6F;AAC7F,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;CAOyB,CAAC;AAE9D,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,uBAAuB,CAAC;AAU5E;;;;;;GAMG;AACH,MAAM,MAAM,0BAA0B,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,wBAAwB,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,6CAA6C,CAC3D,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,0BAA0B,CAAC,CAAC,GAC7E,UAAU,CAsDZ"}