commit d3aa6a3b73bea1d3498e7db5ef01ab90d34659d8 Author: Brikwerk Date: Fri May 22 16:24:54 2020 -0700 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..31a0f73 --- /dev/null +++ b/.gitignore @@ -0,0 +1,143 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# Project Specific Excludes +.vscode +secrets.txt +messages.txt \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c6df968 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Reece Walsh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..670790f --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# NXBT - Control your Switch Locally or Remotely + +This is meant to serve as an all-in-one solution to controlling a Nintendo Switch from a variety of devices. + +Functionality is currently under development. + +## Prerequisites + +- A Bluetooth adapter with a Bluetooth version greather than or equal to 4.0 +- A computer running Linux +- A Nintendo Switch + +## Getting Started + +TBA \ No newline at end of file diff --git a/demo.py b/demo.py new file mode 100644 index 0000000..6845a7f --- /dev/null +++ b/demo.py @@ -0,0 +1,30 @@ +import threading +import time + +from nxbt import ControllerServer +from nxbt import ControllerTypes + +# con = ControllerServer(ControllerTypes.JOYCON_R) +# con.run() +# # con.run(reconnect_address="7C:BB:8A:D9:91:5A") + + +def thread_func_1(): + + print("Starting Thread 1") + con = ControllerServer(ControllerTypes.JOYCON_R) + con.run() + + +def thread_func_2(): + + print("Starting Thread 2") + time.sleep(10) + con = ControllerServer(ControllerTypes.JOYCON_L) + con.run() + + +if __name__ == "__main__": + + x = threading.Thread(target=thread_func_1) + x.start() diff --git a/docs/Example Pairing Session.md b/docs/Example Pairing Session.md new file mode 100644 index 0000000..ebd8c5a --- /dev/null +++ b/docs/Example Pairing Session.md @@ -0,0 +1,2379 @@ +# Example Joy-Con (L) Pairing Session with a Nintendo Switch + +An example pairing session captured between a Joy-Con and a Switch is +detailed chronologically below. + +This is basically a dump of the packets being between the Switch and the +Joy-Con formatted nicely with comments. Messages are split into Payload and +Subcommand sections. The first 10 or so Switch messages are highlighted and +have comments on what it's trying to send. + +A message (for both devices) consists of 50 bytes. The Switch's Payload +is 11 bytes (including the initial byte) and the Joy-Con/ProCon's +Payload is 14 bytes (including the initial byte). The Joy-Con/ProCon's +subcommand section contains the controllers reply to a subcommand. + +Important interactions and replies are highlighted and explained. + +**PlEASE NOTE:** The information pertaining to what each byte means +comes from dekuNukem's Switch reverse engineering effort: +https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering + +--- + +## Events Before Communication + +1. The Joy-Con becomes discoverable over Bluetooth +2. The Switch (on the "Change Grip/Order Menu") sees the Joy-Con and attempts to pair +3. The pairing succeeds and the Switch opens control and interrupt sockets + +## Prompt Reply + +The Joy-Con begins by spam sending empty input reports to the Switch. A short +burst (>=60) packets sent quickly should be enough to emulate this. + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x00 0x60 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +## Request Device Info + +### Switch Requests Device Info + +After receiving an empty input report the Switch eventually responds +with a "Request for Device Info" packet. The first byte of the subcommand +section contains the subcommand for the Joy-Con (which in this case is 0x02, +which is request the device's info). + +``` +||| --- Switch Msg --- +||| Payload: 0xA2 0x01 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| Subcommand: 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Device Info + +The Joy-Con receives the subcommand and sends back a standard input report with a +subcommand reply. Joy-Con packets are identified by the second byte. In this case +it is "0x21", which is the standard input report with a subcommand reply. Details +regarding the contents of this packet can be seen below. + +``` +--- Controller Msg --- + 0 1 2 3 4 5 6 7 8 9 10 11 12 +Payload: 0xA1 0x21 0x93 0x6E 0x00 0x00 0x00 0x98 0x67 0x8C 0x00 0x00 0x00 0xA0 + 13 14 15 16 17 18 19 20 21 22 23 24 25 26 +Subcommand: 0x82 0x02 0x03 0x8B 0x01 0x02 0x60 0x6B 0xFF 0xD9 0xE2 0x2D 0x01 0x01 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 41 42 43 44 45 46 47 48 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +#### Standard Input Report (Bytes 0 - 12) + +| Byte # | Description| +| --- | --- | +| 0 | Input Report ID | +| 1 | Timer Byte | +| 2 (High Nibble) | Battery Level | +| 2 (Low Nibble) | Connection Info | +| 3, 4, 5 | Button Status | +| 6, 7, 8 | Left Analog Stick Data | +| 9, 10, 11 | Right Analog Stick Data | +| 12 | Vibrator Input Report | + +#### Subcommand Reply Data + +| Byte # | Description | +| --- | --- | +| 13 | ACK Byte for subcommand reply | +| 14 | Reply to subcommand ID (basically echo the previous subcommand back) | +| 15, 16 | Firmware version (Eg: 3.139) | +| 17 | Controller ID (1 = Joy-Con (L), 2 = Joy-Con (R), 3 = Pro Controller) | +| 18 | Unknown, always 02 (maybe?) | +| 19-24 | Controller Bluetooth MAC address | +| 25 | Unknown, always 01 (maybe?) | +| 26 | If 01, colours in SPI used for Controller colour | + +#### Joy-Con waits for a subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x96 0x6E 0x00 0x00 0x00 0x99 0x87 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x98 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x9A 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x9C 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +## Set Shipment Low Power State + +Sets the controller to a low power state that allows it to wake up from +button presses. This toggle is written to the SPI Flash. + +### Switch Output + +The argument for this subcommand comes directly after the ID. +It's either `0x01` or `0x00`. `0x01` disables scanning on button presses +while `0x00` enables scanning on button presses. + +``` +||| --- Switch Msg --- # Set shipment Low Power State +||| Payload: 0xA2 0x01 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| Subcommand: 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +#### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x9F 0x6E 0x00 0x00 0x00 0x98 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xA3 0x6E 0x00 0x00 0x00 0x9B 0x57 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Reply + +Switch always replies with an ACK byte and `0x08 x00` in this situation. + +``` +--- Controller Msg --- +Payload: 0xA1 0x21 0xA5 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x80 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +#### Joy-Con waits for a subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xAA 0x6E 0x00 0x00 0x00 0x98 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xAE 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xB7 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xBC 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xBE 0x6E 0x00 0x00 0x00 0x98 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xC5 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xCC 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +## SPI Flash Read: Serial Number + +### Switch Output + +The Switch requests a read from the Joy-Con's SPI flash memory. The Switch's +output report contains the address of the read and length of the read. +A table containing info about the individual bytes in the output report is detailed below. + +``` +||| --- Switch Msg --- # SPI Flash Read +||| Payload: 0xA2 0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0 1 2 3 4 5 6 7 8 9 10 11 12 +||| Subcommand: 0x10 0x00 0x60 0x00 0x00 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +| Byte # | Description | +| --- | --- | +| 0 | Report ID, in this case: "0x10 SPI Flash Read" | +| 1, 2, 3, 4 | The Int32 SPI Flash memory address in Little Endian. In this case, the address is 0x6000 | +| 5 | The length of the read. Max value is 0x1D + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xD2 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Reply + +Joy-Con replies with the data read from the flash memory. + +``` +--- Controller Msg --- + 0 1 2 3 4 5 6 7 8 9 10 11 12 +Payload: 0xA1 0x21 0xD5 0x6E 0x00 0x00 0x00 0x9B 0x87 0x8C 0x00 0x00 0x00 0xB0 + 13 14 15 16 17 18 19 20 21 22 23 24 25 26 +Subcommand: 0x90 0x10 0x00 0x60 0x00 0x00 0x10 0x00 0x00 0x58 0x42 0x57 0x31 0x34 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 + 0x30 0x36 0x36 0x32 0x38 0x35 0x37 0x33 0x38 0x00 0x00 0x00 0x00 0x00 + 41 42 43 44 45 46 47 48 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +| Byte # | Description | +| --- | --- | +| 0-12 | Standard input report | +| 13 | ACK Byte | +| 14 | Subcommand reply | +| 15-18 | Int32 Little Endian Memory Read address | +| 19 | Read Data Length | +| 20-48 | Serial Number | + +If first byte of the serial number is greater than or equal to 0x80, +serial number is null. + +Eg: Set the serial number to a series of 0xFF to avoid check. + +### Joy-Con waits for a subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xE3 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xEC 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF5 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xFE 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x07 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x12 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` +## SPI Flash Read: Joy-Con Colours + +### Switch Output + +Same format as the previous read, however, the Switch is reading 24 bit RGB +colour values starting from the 0x6050 address. + +``` +||| --- Switch Msg --- # SPI Flash Read +||| Payload: 0xA2 0x01 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| Subcommand: 0x10 0x50 0x60 0x00 0x00 0x0D 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x1E 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Reply + +``` +--- Controller Msg --- + 0 1 2 3 4 5 6 7 8 9 10 11 12 +Payload: 0xA1 0x21 0x20 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xA0 + 13 14 15 16 17 18 19 20 21 22 23 24 25 26 +Subcommand: 0x90 0x10 0x50 0x60 0x00 0x00 0x0D 0x82 0x82 0x82 0x0F 0x0F 0x0F 0xFF + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 + 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 41 42 43 44 45 46 47 48 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +| Byte # | Description | +| --- | --- | +| 0-12 | Standard input report | +| 13 | ACK Byte | +| 14 | Subcommand reply | +| 15-18 | Int32 Little Endian Memory Read address | +| 19 | Read Data Length | +| 20-22 | Body RGB Colour | +| 23-25 | Buttons RGB Colour | + + +If Joy-Con +| Byte # | Description | +| --- | --- | +| 26-28 | Default Colour 0xFFFFFF | +| 29-32 | Default ARGB Colour 0xFFFFFFFF | + + +If Pro Controller +| Byte # | Description | +| --- | --- | +| 26-28 | Pro Controller Left Grip RGB Colour | +| 29-31 | Pro Controller Right Grip RGB Colour | + +With this info in mind, we can see that the above Joy-Con has a body colour of +#828282 and a button colour of #0F0F0F. Left/right grip colours are unused or +default values. + +Note that the Switch reads 13 bytes to encompass the extra, longer default +colours, in case they're not set. + +### Joy-Con waits for a subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x32 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x3E 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x47 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +## Set Input Report Mode + +### Switch Output + +The Switch sets the input mode for the Joy-Con here. + +``` +||| --- Switch Msg --- # Set Input Report Mode +||| Payload: 0xA2 0x01 0x06 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 + 0 1 2 3 4 5 6 7 8 9 10 11 12 +||| Subcommand: 0x03 0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +| Byte # | Description | +| --- | --- | +| 0 | Output report ID | +| 1 | Input report type | + +#### Input Report Types + +Please note, a uncommon input report types are omitted here. +For a full list, please refer to [dekuNukem's full table](https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/bluetooth_hid_subcommands_notes.md#subcommand-0x03-set-input-report-mode). + +| Input Report Type | Description | +| --- | --- | +| 0x30 | Standard Full Input Report Mode. Updates at 60Hz for the Joy-Con (120Hz for the Pro Controller). | +| 0x31 | NFC/IR Mode. Pushes large packets at 60Hz (120hz for the Pro Controller). +| 0x3F | Simple HID mode. Pushes update packets on button presses. + +In the above output report, the Switch is telling the Joy-Con to set itself to +Standard Full Input mode (0x30). + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x50 0x6E 0x00 0x00 0x00 0x9B 0x87 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Reply + +The Joy-Con replies with a simple ACK byte and the subcommand reply. + +``` +--- Controller Msg --- +Payload: 0xA1 0x21 0x52 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0x30 +Subcommand: 0x80 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con waits for a subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x59 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x62 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x6B 0x6E 0x00 0x00 0x00 0x9B 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +## Trigger Buttons Elapsed Time + +### Switch Output + +Switch requests the elapsed time from triggered buttons. No arguments are +present in this subcommand. + +``` +||| --- Switch Msg --- # Trigger Buttons Elapsed Time +||| Payload: 0xA2 0x01 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| Subcommand: 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x74 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Reply + +It seems that updated Joy-Cons and Pro Controllers simply send an ACK byte, +the subcommand reply, and a series of zeroes instead of what dekuNukem notes +as proper values (Int16 10ms times). This at least demonstrates that we're +able to get away with sending zeroes for this subcommand (controllers that +sent this packet and paired with a Switch didn't exhibit any adverse +behaviour). + +``` +--- Controller Msg --- +Payload: 0xA1 0x21 0x76 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0x90 + 0 1 2 3 4 5 6 7 8 9 10 11 12 +Subcommand: 0x83 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 27 28 29 30 31 32 33 34 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Switch Output: Vibration + +This is the first vibration-data-only packet from the Switch. It's much +shorter than the typical subcommand packet. The ID of this packet is `0x10` +instead of `0x01` that we see in subcommand packets. + +The Switch doesn't respond to this packet in any noticeable way (at least from +what I can see), so I think it's safe to accept and ignore this. + +``` +||| --- Switch Msg --- +||| Payload: 0xA2 0x10 0x08 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +||| Subcommand: +``` + +### Joy-Con waits for a subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x7F 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x88 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +## SPI Flash Read: Factory Sensor and Stick device parameters + +### Switch Output + +The Switch requests 24 bytes (starting at location 0x6080) that contains +the factory sensor and stick device parameters. + +``` +||| --- Switch Msg --- # SPI Flash Read +||| Payload: 0xA2 0x01 0x09 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| Subcommand: 0x10 0x80 0x60 0x00 0x00 0x18 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x91 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Reply + +Joy-Con's reply is similar to above. + +Data, in this case, comes from SPI Memory locations 0x6080-0x6097 which contain +the stick parameters and Six-Axis horizontal offsets for the controller. + +``` +--- Controller Msg --- +Payload: 0xA1 0x21 0x93 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xA0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 +Subcommand: 0x90 0x10 0x80 0x60 0x00 0x00 0x18 0x5E 0x01 0x00 0x00 0xF1 0x0F 0x19 + 14 15 16 17 18 19 20 21 22 23 24 25 26 27 + 0xD0 0x4C 0xAE 0x40 0xE1 0xEE 0xE2 0x2E 0xEE 0xE2 0x2E 0xB4 0x4A 0xAB + 28 29 30 31 32 33 34 35 + 0x96 0x64 0x49 0x00 0x00 0x00 0x00 0x00 +``` + +| Byte # | Description | +| --- | --- | +| 0 | ACK Byte | +| 1 | Subcommand reply | +| 5-2 | SPI Memory Read Address in Little Endian | +| 6 | Read Length (# of bytes) | +| 7-29 | Data | + +#### Data Description + +| Byte # | Description | +| --- | --- | +| 7-12 | 6-Axis Controller Horizontal Offsets for Sideways Joy-Con (6 bytes) | +| 13-30 | Stick Device Parameters (18 bytes) | + +#### Six-Axis Horizontal Offsets + +Composed of 3 Int16 Little Endian values. Define the additional offset +from origin position when the controller is on a flat surface. Can be +levelled with the SL/SR buttons or equivalent. + +| Byte # | Axis | Joy-Con (L) | Joy-Con(R) | Pro Controller | +| --- | --- | --- | --- | -- | +| 7-8 | X | 0x15E | 0x15E | 0xFD50 | +| 9-10 | Y | 0x00 | 0x00 | 0x00 | +| 11-12 | Z | 0xFF1 | 0xF00F | 0xFC6 | + +#### Stick Parameters + +18 bytes produce 12 uint16 little endian values. +Define min/max range and dead zone for the sticks. +These values are the same for all controllers. + +| Byte # | uint16 # | Value | Description | +| --- | --- | --- | --- | +| 13-15 | 0, 1 | 0x019 0x4CD | Unused | +| 16-17 | 2 | 0x0AE | Dead-zone | +| 17-18 | 3 | 0xE14 | Range ratio | +| 19-21 | 4, 5 | 0x2EE 0x2EE | X/Y: Unknown | +| 22-24 | 6, 7| 0x2EE 0x2EE | X/Y: Unknown | +| 25-27 | 7, 8 | 0xAB4 0xAB4 | X/Y: Unknown | +| 28-30 | 9, 10 | 0x496 0x496 | X/Y: Unknown | + +### Joy-Con waits for a subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x9C 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xAE 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xB7 0x6E 0x00 0x00 0x00 0x99 0x57 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +## SPI Flash Read: Factory Stick Device Parameters 2 + +### Switch Output + +Switch queries for a read of the second set of stick device parameters. + +``` +||| --- Switch Msg --- # SPI Flash Read +||| Payload: 0xA2 0x01 0x0A 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| Subcommand: 0x10 0x98 0x60 0x00 0x00 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xC0 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Switch Output: Vibration + +``` +||| --- Switch Msg --- +||| Payload: 0xA2 0x10 0x0B 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +||| Subcommand: +``` + +### Joy-Con still hasn't replied + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xC2 0x6E 0x00 0x00 0x00 0x98 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Reply + +Joy-Con replies with the 18 bytes read from SPI Memory 0x6098-0x60A9. +The factory stick device parameters stored are the same (almost always) as +the stick parameters stored at 0x6086-0x6097. Check the above section for +info on this read. + +``` +--- Controller Msg --- +Payload: 0xA1 0x21 0xC5 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x90 0x10 0x98 0x60 0x00 0x00 0x12 0x19 0xD0 0x4C 0xAE 0x40 0xE1 0xEE 0xE2 0x2E 0xEE 0xE2 0x2E 0xB4 0x4A 0xAB 0x96 0x64 0x49 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con waits for a subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xD4 0x6E 0x00 0x00 0x00 0x98 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xE4 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x0 +``` + +## SPI Flash Read: User Analog Sticks calibration + +### Switch Output + +Switch asks for user calibration information on the analog sticks with a +read from SPI address 0x8010 of length 24 bytes. + +``` +||| --- Switch Msg --- # SPI Flash Read +||| Payload: 0xA2 0x01 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| Subcommand: 0x10 0x10 0x80 0x00 0x00 0x18 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xE6 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xED 0x6E 0x00 0x00 0x00 0x98 0x77 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xEF 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Reply + +Since there's no user calibration information, the Joy-Con responds with 24 bytes +of 0xFF. The Switch determines if there's user calibration if 0x8010-0x8011 equals +0xB2 0xA1 (start of left stick data) and 0x801B-0x801C equals 0xB2 0xA1. + +In the case below, no user calibration data is present. + +``` +--- Controller Msg --- +Payload: 0xA1 0x21 0xF2 0x6E 0x00 0x00 0x00 0x9B 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x90 0x10 0x10 0x80 0x00 0x00 0x18 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF + 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF + 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Waits for Subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xF8 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x06 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| --- Switch Msg --- +||| Payload: 0xA2 0x10 0x0D 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +||| Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x08 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x0F 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +## SPI Flash Read: Factory Analog stick calibration and Controller Colours + +### Switch Output + +Switch asks for factory calibration information on the analog sticks +plus controller colours with a read from SPI address 0x603D of length 25 bytes. + +``` +||| --- Switch Msg --- # SPI Flash Read +||| Payload: 0xA2 0x01 0x0E 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| Subcommand: 0x10 0x3D 0x60 0x00 0x00 0x19 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x11 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x21 0x6E 0x00 0x00 0x00 0x9B 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x21 0x23 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xB0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 +Subcommand: 0x90 0x10 0x3D 0x60 0x00 0x00 0x19 0xD5 0xA4 0x43 0xA4 0xE7 0x87 0x2A + 14 15 16 17 18 19 20 21 22 23 24 25 26 27 + 0xF5 0x43 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x82 0x82 + 28 29 30 31 32 33 34 35 + 0x82 0x0F 0x0F 0x0F 0x00 0x00 0x00 0x00 +``` + +#### Data Description + +| Byte # | Description | +| --- | --- | +| 0 | ACK byte | +| 1 | Subcommand reply | +| 5-2 | SPI memory address (Little Endian) | +| 6 | Read length | +| 7-25 | Stick factory calibration | +| 26-31 | Controller colours | + +#### Stick Factory Calibration + +Byte 7-15 comprises the left stick calibration data. Byte 16-25 comprises the +right stick data. These 9 bytes are used to generate 6 uint16 values which are +used to calculate the stick dead zones and min/max x/y values. + +These stick calibration byte can be used in the following equations to get +the calibration values. [These equations are courtesy dekuNukem](https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/spi_flash_notes.md#analog-stick-factory-and-user-calibration) + +```python +# The nine stick bytes are labelled stick_cal[0] - stick_cal[8] here +uint16_t data[6] +data[0] = (stick_cal[1] << 8) & 0xF00 | stick_cal[0]; +data[1] = (stick_cal[2] << 4) | (stick_cal[1] >> 4); +data[2] = (stick_cal[4] << 8) & 0xF00 | stick_cal[3]; +data[3] = (stick_cal[5] << 4) | (stick_cal[4] >> 4); +data[4] = (stick_cal[7] << 8) & 0xF00 | stick_cal[6]; +data[5] = (stick_cal[8] << 4) | (stick_cal[7] >> 4); + +# These values used as such in, for example, a right stick +uint16_t rstick_center_x = data[0]; +uint16_t rstick_center_y = data[1]; +uint16_t rstick_x_min = rstick_center_x - data[2]; +uint16_t rstick_x_max = rstick_center_x + data[4]; +uint16_t rstick_y_min = rstick_center_y - data[3]; +uint16_t rstick_y_max = rstick_center_y + data[5]; +``` + +### Joy-Con Waits for Subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x31 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x43 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| --- Switch Msg --- +||| Payload: 0xA2 0x10 0x0F 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +||| Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x4C 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +## SPI Flash Read: 6-Axis motion sensor Factory calibration + +### Switch Output + +Switch asks for factory calibration information on the Six-axis sensor +with a read from SPI address 0x6020 of length 24 bytes. + +``` +||| --- Switch Msg --- # SPI Flash Read +||| Payload: 0xA2 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| Subcommand: 0x10 0x20 0x60 0x00 0x00 0x18 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x55 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x21 0x57 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0x90 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 +Subcommand: 0x90 0x10 0x20 0x60 0x00 0x00 0x18 0x09 0x01 0x18 0xFF 0xED 0xFF 0x00 + 14 15 16 17 18 19 20 21 22 23 24 25 26 27 + 0x40 0x00 0x40 0x00 0x40 0xFA 0xFF 0xD0 0xFF 0xC7 0xFF 0x3B 0x34 0x3B + 28 29 30 31 32 33 34 35 + 0x34 0x3B 0x34 0x00 0x00 0x00 0x00 0x00 +``` + +| Byte # | Description | +| --- | --- | +| 0 | ACK byte | +| 1 | Subcommand reply | +| 5-2 | SPI read address | +| 6 | Read length | +| 7-30 | Six-Axis calibration data | + +#### Six-Axis Calibration data + +Data is comprised of 4 groups of 3 Int16 (Little Endian). +The table below describes the data from the packet. + +| Byte # | Int16 | Description | +| --- | --- | --- | +| 7-12 | FFED FF18 0109 | Acceleration origin position (Joy-Con on table, face-up) | +| 13-18 | 4000 4000 4000 | Acceleration sensitivity coefficient | +| 19-24 | FFC7 FFD0 FFFA | Gyro origin when still | +| 25-30 | 343B 343B 343B | Gyro sensitivity coefficient | + +### Joy-Con Waits for Subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x65 0x6E 0x00 0x00 0x00 0x9B 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x67 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x77 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x80 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +## Enable IMU (6-Axis Sensor) + +### Switch Output + +Switch sends subcommand with a single boolean toggle. + +``` +||| --- Switch Msg --- # Enable IMU (6-Axis Sensor) +||| Payload: 0xA2 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| Subcommand: 0x40 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x89 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Switch Output: Vibration + +``` +||| --- Switch Msg --- +||| Payload: 0xA2 0x10 0x02 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +||| Subcommand: +``` + +### Joy-Con still hasn't replied + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0x8B 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Switch Output: Vibration + +``` +||| --- Switch Msg --- +||| Payload: 0xA2 0x10 0x03 0xC2 0x18 0x03 0x72 0x00 0x00 0x00 0x00 +||| Subcommand: +``` + +### Joy-Con Reply + +Replies with simple ACK and subcommand. + +``` +--- Controller Msg --- +Payload: 0xA1 0x21 0x8E 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0x60 +Subcommand: 0x80 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +## First Full Standard Input Report + +Full standard report includes accelerometer and gyro data +in the subcommand section now. + +``` +--- Controller Msg --- + 0 1 2 3 4 5 6 7 8 9 10 11 12 +Payload: 0xA1 0x30 0xA7 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xE0 + 13 14 15 16 17 18 19 20 21 22 23 24 25 26 +Subcommand: 0xDA 0x00 0x66 0xF6 0x34 0x0D 0x22 0x00 0xFF 0xFF 0xC8 0xFF 0xE4 0x00 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 + 0x61 0xF6 0x2F 0x0D 0x1A 0x00 0xFE 0xFF 0xCD 0xFF 0xEA 0x00 0x65 0xF6 + 41 42 43 44 45 46 47 48 + 0x25 0x0D 0x1C 0x00 0xFC 0xFF 0xD4 0xFF +``` + +### Joy-Con waits for a subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xA9 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xE0 +Subcommand: 0xDB 0x00 0x7F 0xF6 0xF8 0x0C 0x28 0x00 0xFB 0xFF 0xC1 0xFF 0xDA 0x00 0x7A 0xF6 0x19 0x0D 0x2E 0x00 0xFD 0xFF 0xC5 0xFF 0xD9 0x00 0x6A 0xF6 0x32 0x0D 0x24 0x00 0x00 0x00 0xC8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xAE 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xE0 +Subcommand: 0xB9 0x00 0x88 0xF6 0x05 0x0D 0xD4 0xFF 0x06 0x00 0xCE 0xFF 0xBC 0x00 0x8E 0xF6 0xEF 0x0C 0xE2 0xFF 0x05 0x00 0xC4 0xFF 0xC1 0x00 0x89 0xF6 0xE3 0x0C 0xF7 0xFF 0x03 0x00 0xBE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB0 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xE0 +Subcommand: 0xBE 0x00 0x6C 0xF6 0x1B 0x0D 0xC2 0xFF 0x07 0x00 0xDE 0xFF 0xBA 0x00 0x7C 0xF6 0x17 0x0D 0xCC 0xFF 0x07 0x00 0xDA 0xFF 0xB8 0x00 0x86 0xF6 0x0A 0x0D 0xD3 0xFF 0x06 0x00 0xD0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB2 0x6E 0x00 0x00 0x00 0x99 0x57 0x8C 0x00 0x00 0x00 0xE0 +Subcommand: 0xD0 0x00 0x6B 0xF6 0x27 0x0D 0xBB 0xFF 0xFA 0xFF 0xEB 0xFF 0xC5 0x00 0x67 0xF6 0x22 0x0D 0xB9 0xFF 0x03 0x00 0xE4 0xFF 0xBE 0x00 0x6B 0xF6 0x1D 0x0D 0xC0 0xFF 0x07 0x00 0xDF 0xFF +``` + +## Enable Vibration + +### Switch Output + +Switch sends subcommand with a single boolean toggle + +``` +||| --- Switch Msg --- # Enable Vibration +||| Payload: 0xA2 0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +||| Subcommand: 0x48 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xB4 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xE0 +Subcommand: 0xC4 0x00 0x58 0xF6 0x1A 0x0D 0xE4 0xFF 0xF3 0xFF 0xFA 0xFF 0xC4 0x00 0x61 0xF6 0x21 0x0D 0xD6 0xFF 0xF4 0xFF 0xF4 0xFF 0xCE 0x00 0x6B 0xF6 0x25 0x0D 0xBF 0xFF 0xF9 0xFF 0xEC 0xFF +``` + +### Joy-Con Reply + +Joy-Con replies with simple ACK and subcommand. + +``` +--- Controller Msg --- +Payload: 0xA1 0x21 0xB7 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x80 0x48 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +### Joy-Con Waits for Subcommand + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xB9 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xBE 0x00 0x64 0xF6 0xDB 0x0C 0xEE 0xFF 0x0B 0x00 0xF9 0xFF 0xC0 0x00 0x5E 0xF6 0xDE 0x0C 0xEE 0xFF 0x07 0x00 0xFB 0xFF 0xC5 0x00 0x5A 0xF6 0xEE 0x0C 0xEE 0xFF 0x01 0x00 0x01 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xBB 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xCD 0x00 0x53 0xF6 0xE2 0x0C 0xEB 0xFF 0x13 0x00 0xF1 0xFF 0xC9 0x00 0x58 0xF6 0xDE 0x0C 0xE9 0xFF 0x13 0x00 0xF7 0xFF 0xC0 0x00 0x63 0xF6 0xDB 0x0C 0xED 0xFF 0x0D 0x00 0xF9 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC5 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xAC 0x00 0x69 0xF6 0xD3 0x0C 0x02 0x00 0x07 0x00 0xDB 0xFF 0xA8 0x00 0x79 0xF6 0xC5 0x0C 0x0F 0x00 0x09 0x00 0xD4 0xFF 0xA8 0x00 0x80 0xF6 0xDB 0x0C 0x16 0x00 0x0A 0x00 0xCE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC7 0x6E 0x00 0x00 0x00 0x98 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xA7 0x00 0x5B 0xF6 0x02 0x0D 0xF3 0xFF 0x07 0x00 0xE2 0xFF 0xA8 0x00 0x5E 0xF6 0xEC 0x0C 0xF8 0xFF 0x07 0x00 0xDF 0xFF 0xAC 0x00 0x67 0xF6 0xD8 0x0C 0xFF 0xFF 0x06 0x00 0xDC 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xCB 0x6E 0x00 0x00 0x00 0x98 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xAE 0x00 0x7F 0xF6 0x2D 0x0D 0xDE 0xFF 0x0F 0x00 0xDF 0xFF 0xAA 0x00 0x7C 0xF6 0x14 0x0D 0xE3 0xFF 0x05 0x00 0xE6 0xFF 0xA5 0x00 0x78 0xF6 0x03 0x0D 0xEB 0xFF 0x02 0x00 0xEA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xD7 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xAC 0x00 0x71 0xF6 0x12 0x0D 0x50 0x00 0x18 0x00 0xE4 0xFF 0xAB 0x00 0x6F 0xF6 0x27 0x0D 0x46 0x00 0x1E 0x00 0xEC 0xFF 0xA4 0x00 0x69 0xF6 0x37 0x0D 0x3E 0x00 0x29 0x00 0xF4 0xFF +``` + +``` +||| --- Switch Msg --- +||| Payload: 0xA2 0x10 0x05 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +||| Subcommand: +``` + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xD9 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xA0 0x00 0x68 0xF6 0x21 0x0D 0x4E 0x00 0x12 0x00 0xDB 0xFF 0xA2 0x00 0x70 0xF6 0x19 0x0D 0x54 0x00 0x16 0x00 0xE0 0xFF 0xAB 0x00 0x71 0xF6 0x10 0x0D 0x51 0x00 0x18 0x00 0xE3 0xFF +``` + +``` +||| --- Switch Msg --- +||| Payload: 0xA2 0x10 0x06 0x02 0x98 0x60 0x40 0x00 0x00 0x00 0x00 +||| Subcommand: +``` + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xDE 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x9C 0x00 0x7B 0xF6 0x17 0x0D 0xF7 0xFF 0xFD 0xFF 0xA8 0xFF 0x9E 0x00 0x5F 0xF6 0x22 0x0D 0x00 0x00 0xFE 0xFF 0xAC 0xFF 0x97 0x00 0x55 0xF6 0x18 0x0D 0x1C 0x00 0x05 0x00 0xBF 0xFF +``` + +## Set Player Lights + +### Switch Output + +Switch sends the 0x30 set player lights subcommand with a bitfield argument. + +To explain: the first argument is treated as binary, with the leading high +value representing the state. + +The total bitfield width is 8 bits, to encompass the hex byte. + +#### Bitfield Values: + +| Hex | Bits | Description | +| --- | --- | --- | +| 0x01 | 0000 0001 | Keep player lights on, player 1 | +| 0x03 | 0000 0011 | Keep player lights on, player 2 | +| 0x07 | 0000 0111 | Keep player lights on, player 3 | +| 0x0F | 0000 1111 | Keep player lights on, player 4 | +| 0x1F | 0001 1111 | Flash player lights, player 1 | +| 0x3F | 0011 1111 | Flash player lights, player 2 | +| 0x7F | 0111 1111 | Flash player lights, player 3 | +| 0xFF | 1111 1111 | Flash player lights, player 4 | + +``` +||| --- Switch Msg --- # Set Player Lights +||| Payload: 0xA2 0x01 0x07 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +||| Subcommand: 0x30 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + 0x00 0x00 0x00 0x00 0x00 0x0 +``` + +### Joy-Con takes a moment to reply + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xE5 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x91 0x00 0x58 0xF6 0x54 0x0D 0x4C 0x00 0x3D 0x00 0xBF 0xFF 0x99 0x00 0x59 0xF6 0x4F 0x0D 0x28 0x00 0x36 0x00 0xBA 0xFF 0x6F 0x00 0x68 0xF6 0x38 0x0D 0x0B 0x00 0x30 0x00 0xB0 0xFF +``` + +### Joy-Con Reply + +Joy-Con replies with an ACK byte and the subcommand reply. + +``` +--- Controller Msg --- +Payload: 0xA1 0x21 0xE7 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0x40 +Subcommand: 0x80 0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +``` + +Joy-Con is now ready for general input on the Switch. + +## Remainder of the Captured Session + +The rest of the captured session with the Joy-Con follows. +This includes a few button presses and stick movement. +None of this is highlighted, however. + +``` +--- Controller Msg --- +Payload: 0xA1 0x30 0xEC 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x9B 0x00 0xCA 0xF6 0x1A 0x0D 0x3B 0x00 0xF1 0xFF 0xF0 0xFF 0x8F 0x00 0x8B 0xF6 0x29 0x0D 0x40 0x00 0xF9 0xFF 0xF0 0xFF 0x29 0x00 0x51 0xF6 0x2F 0x0D 0x46 0x00 0x0B 0x00 0xE2 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xF2 0x6E 0x00 0x00 0x00 0x9B 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x7D 0x00 0x7A 0xF6 0x29 0x0D 0xA4 0x00 0xE0 0xFF 0xD7 0xFF 0x70 0x00 0x78 0xF6 0x32 0x0D 0xA3 0x00 0xE6 0xFF 0xE2 0xFF 0x73 0x00 0xA7 0xF6 0x30 0x0D 0x9F 0x00 0xEB 0xFF 0xE5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xFB 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x8B 0x00 0x96 0xF6 0x3B 0x0D 0xCF 0xFF 0xD8 0xFF 0x96 0xFF 0x90 0x00 0x9A 0xF6 0x28 0x0D 0xEB 0xFF 0xD9 0xFF 0x98 0xFF 0x8A 0x00 0x9E 0xF6 0x1F 0x0D 0x11 0x00 0xD4 0xFF 0x97 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x02 0x6E 0x00 0x00 0x00 0x98 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x88 0x00 0xA8 0xF6 0x52 0x0D 0x0A 0x00 0xD7 0xFF 0xBD 0xFF 0x7F 0x00 0xBD 0xF6 0x4D 0x0D 0xFF 0xFF 0xD8 0xFF 0xAE 0xFF 0x84 0x00 0xE0 0xF6 0x33 0x0D 0xF6 0xFF 0xD0 0xFF 0x99 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x04 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x81 0x00 0xC3 0xF6 0x2F 0x0D 0x1D 0x00 0xCA 0xFF 0xC1 0xFF 0x88 0x00 0xB6 0xF6 0x3C 0x0D 0x1A 0x00 0xD0 0xFF 0xBC 0xFF 0x8B 0x00 0xA8 0xF6 0x4F 0x0D 0x0E 0x00 0xD6 0xFF 0xBC 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x0D 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x7E 0x00 0xC6 0xF6 0x20 0x0D 0x2A 0x00 0xC7 0xFF 0xCD 0xFF 0x7D 0x00 0xC4 0xF6 0x20 0x0D 0x2E 0x00 0xCF 0xFF 0xD3 0xFF 0x7A 0x00 0xC8 0xF6 0x3A 0x0D 0x2D 0x00 0xD7 0xFF 0xD6 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x16 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xB7 0x00 0xBF 0xF6 0x79 0x0D 0x8E 0x00 0x7C 0xFF 0xDE 0xFF 0xB4 0x00 0xBD 0xF6 0x57 0x0D 0x8A 0x00 0x8A 0xFF 0xE0 0xFF 0xAE 0x00 0xC0 0xF6 0x50 0x0D 0x94 0x00 0x9B 0xFF 0xDE 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x08 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x22 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xBD 0x00 0x82 0xF7 0x46 0x0D 0xBB 0x00 0x3D 0xFF 0x79 0xFF 0xB9 0x00 0x3C 0xF7 0x3C 0x0D 0xA5 0x00 0x45 0xFF 0x97 0xFF 0xB1 0x00 0x1B 0xF7 0x41 0x0D 0xA2 0x00 0x49 0xFF 0xAB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x2B 0x6E 0x00 0x00 0x20 0x9A 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xFC 0x00 0x07 0xF7 0x6D 0x0C 0xB9 0x01 0x58 0xFF 0x22 0x00 0xEC 0x00 0x32 0xF7 0xA3 0x0C 0x1A 0x02 0x18 0xFF 0x09 0x00 0xCE 0x00 0x73 0xF7 0x24 0x0D 0x38 0x02 0xE2 0xFE 0xD7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x36 0x6E 0x00 0x00 0x30 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xE3 0x00 0x14 0xF7 0xE3 0x0D 0x09 0x00 0xE9 0x00 0x2B 0x00 0xD0 0x00 0x2F 0xF7 0x1E 0x0E 0x55 0x00 0xFB 0x00 0x1B 0x00 0xBD 0x00 0x6D 0xF7 0x32 0x0E 0x90 0x00 0xFE 0x00 0x17 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x3F 0x6E 0x00 0x00 0x30 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x72 0x00 0x74 0xF6 0x7C 0x0E 0x4F 0xFF 0x46 0x00 0x14 0x00 0x79 0x00 0x70 0xF6 0xA2 0x0E 0x20 0xFF 0x68 0x00 0x19 0x00 0x89 0x00 0x6D 0xF6 0xAD 0x0E 0xFB 0xFE 0x87 0x00 0x1D 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x41 0x6E 0x00 0x00 0x30 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x64 0x00 0x66 0xF6 0x15 0x0E 0xBF 0xFF 0xF8 0xFF 0x13 0x00 0x65 0x00 0x70 0xF6 0x3F 0x0E 0x8E 0xFF 0x17 0x00 0x13 0x00 0x70 0x00 0x74 0xF6 0x72 0x0E 0x5B 0xFF 0x3D 0x00 0x14 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x4A 0x6E 0x00 0x00 0x30 0x9A 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x5D 0x00 0xBB 0xF6 0x80 0x0D 0x97 0xFE 0xD7 0xFF 0x51 0x00 0x58 0x00 0xE9 0xF6 0x9A 0x0D 0xDC 0xFE 0xD4 0xFF 0x3F 0x00 0x54 0x00 0xE8 0xF6 0x8F 0x0D 0x22 0xFF 0xD2 0xFF 0x33 0x00 +--- Switch Msg --- +Payload: 0xA2 0x10 0x09 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x53 0x6E 0x00 0x00 0x30 0x99 0x97 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xA6 0x00 0x9C 0xF6 0x02 0x0E 0x17 0xFC 0xBE 0x00 0xC9 0xFF 0xA2 0x00 0x7A 0xF6 0xBF 0x0D 0xD9 0xFB 0x87 0x00 0xE9 0xFF 0x91 0x00 0x49 0xF6 0x67 0x0D 0xFA 0xFB 0x5B 0x00 0x10 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x5F 0x6E 0x00 0x00 0x00 0x9B 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x35 0x00 0xF9 0xF6 0x91 0x0C 0xF6 0xFF 0x44 0x00 0xD2 0xFF 0x2A 0x00 0x18 0xF7 0xB4 0x0C 0xC7 0xFF 0x53 0x00 0xB7 0xFF 0x34 0x00 0x16 0xF7 0xBB 0x0C 0x8C 0xFF 0x5C 0x00 0xA4 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x68 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x80 0x00 0x16 0xF6 0x2A 0x0C 0x16 0x00 0x63 0xFF 0xFF 0xFF 0x87 0x00 0x1C 0xF6 0x38 0x0C 0x27 0x00 0x89 0xFF 0x00 0x00 0x9D 0x00 0x1A 0xF6 0x54 0x0C 0x32 0x00 0xB4 0xFF 0x0E 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x6A 0x6E 0x00 0x00 0x00 0x99 0x57 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x8A 0x00 0xFE 0xF5 0x2B 0x0C 0xFB 0xFF 0x41 0xFF 0x00 0x00 0x86 0x00 0x0A 0xF6 0x27 0x0C 0x0B 0x00 0x47 0xFF 0x02 0x00 0x80 0x00 0x13 0xF6 0x2A 0x0C 0x12 0x00 0x5A 0xFF 0x00 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x73 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x6F 0x00 0x2E 0xF6 0xFB 0x0C 0x08 0x00 0xA7 0xFF 0xB3 0xFF 0x6B 0x00 0x27 0xF6 0x14 0x0D 0xF6 0xFF 0xA0 0xFF 0xB1 0xFF 0x6B 0x00 0x2A 0xF6 0x16 0x0D 0xDF 0xFF 0x90 0xFF 0xB6 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x7C 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x4E 0x00 0x5B 0xF6 0x53 0x0D 0x15 0x00 0xAC 0xFF 0xAE 0xFF 0x5D 0x00 0x3B 0xF6 0x63 0x0D 0x10 0x00 0xB7 0xFF 0xA8 0xFF 0x58 0x00 0x2B 0xF6 0x79 0x0D 0x05 0x00 0xC2 0xFF 0xA9 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x7E 0x6E 0x00 0x00 0x00 0x99 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x5D 0x00 0x44 0xF6 0x8C 0x0D 0x15 0x00 0x9B 0xFF 0xC2 0xFF 0x4B 0x00 0x55 0xF6 0x6B 0x0D 0x11 0x00 0xA2 0xFF 0xBD 0xFF 0x4A 0x00 0x5E 0xF6 0x53 0x0D 0x15 0x00 0xA9 0xFF 0xB0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x87 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x39 0x00 0x80 0xF6 0x27 0x0D 0xE7 0xFF 0x84 0xFF 0x99 0xFF 0x3F 0x00 0x77 0xF6 0x22 0x0D 0xEC 0xFF 0x87 0xFF 0x89 0xFF 0x4F 0x00 0x45 0xF6 0x1B 0x0D 0xF8 0xFF 0x92 0xFF 0x86 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x0A 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x90 0x6E 0x00 0x00 0x00 0x9B 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x82 0x00 0x64 0xF6 0xEA 0x0C 0x21 0x00 0xBA 0xFF 0xC6 0xFF 0x71 0x00 0x67 0xF6 0xE1 0x0C 0x29 0x00 0xB1 0xFF 0xC2 0xFF 0x6F 0x00 0x5C 0xF6 0xE2 0x0C 0x31 0x00 0xAC 0xFF 0xC0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x9C 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0xA4 0x00 0x63 0xF6 0xDB 0x0C 0xDA 0xFF 0xAA 0xFF 0xAF 0xFF 0x99 0x00 0x65 0xF6 0xD1 0x0C 0xEB 0xFF 0xA8 0xFF 0xAF 0xFF 0x8C 0x00 0x68 0xF6 0xDE 0x0C 0xFF 0xFF 0xA8 0xFF 0xAD 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA0 0x6E 0x00 0x00 0x00 0x99 0xA7 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x99 0x00 0x5A 0xF6 0xEB 0x0C 0xF3 0xFF 0xA9 0xFF 0xB0 0xFF 0x95 0x00 0x5E 0xF6 0x16 0x0D 0xF2 0xFF 0xAC 0xFF 0xAD 0xFF 0x96 0x00 0x60 0xF6 0x2F 0x0D 0xDF 0xFF 0xB2 0xFF 0xAB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA3 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0xAC 0x00 0x55 0xF6 0xD4 0x0C 0xC9 0xFF 0xAD 0xFF 0xAC 0xFF 0xA2 0x00 0x55 0xF6 0xCA 0x0C 0xE0 0xFF 0xAA 0xFF 0xAF 0xFF 0x9B 0x00 0x58 0xF6 0xE3 0x0C 0xF2 0xFF 0xA9 0xFF 0xB1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA5 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0xAF 0x00 0x55 0xF6 0xF9 0x0C 0xC0 0xFF 0xAE 0xFF 0xA4 0xFF 0xAF 0x00 0x56 0xF6 0xF2 0x0C 0xBD 0xFF 0xAD 0xFF 0xA6 0xFF 0xAE 0x00 0x55 0xF6 0xDA 0x0C 0xC4 0xFF 0xAE 0xFF 0xAB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA7 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0xC0 0x00 0x47 0xF6 0xF6 0x0C 0xBA 0xFF 0xAF 0xFF 0x9E 0xFF 0xB5 0x00 0x4C 0xF6 0xF4 0x0C 0xBF 0xFF 0xAF 0xFF 0xA1 0xFF 0xAE 0x00 0x53 0xF6 0xF9 0x0C 0xC0 0xFF 0xAE 0xFF 0xA3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA9 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0xB8 0x00 0x53 0xF6 0x15 0x0D 0xB5 0xFF 0xB0 0xFF 0x9D 0xFF 0xC0 0x00 0x48 0xF6 0x0B 0x0D 0xB4 0xFF 0xB1 0xFF 0x9A 0xFF 0xC1 0x00 0x47 0xF6 0xFA 0x0C 0xB9 0xFF 0xAF 0xFF 0x9C 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xAC 0x6E 0x00 0x00 0x00 0x9B 0x87 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0xC0 0x00 0x56 0xF6 0x11 0x0D 0xD0 0xFF 0xA7 0xFF 0xAE 0xFF 0xB9 0x00 0x5F 0xF6 0x1A 0x0D 0xC1 0xFF 0xAD 0xFF 0xA6 0xFF 0xB7 0x00 0x56 0xF6 0x17 0x0D 0xB6 0xFF 0xB0 0xFF 0x9E 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x0B 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0xAE 0x6E 0x00 0x00 0x00 0x9C 0x87 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0xBB 0x00 0x52 0xF6 0xEC 0x0C 0xE0 0xFF 0xA1 0xFF 0xB1 0xFF 0xC0 0x00 0x4E 0xF6 0xFE 0x0C 0xDD 0xFF 0xA1 0xFF 0xAF 0xFF 0xC2 0x00 0x53 0xF6 0x0F 0x0D 0xD3 0xFF 0xA6 0xFF 0xAE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB2 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xB2 0x00 0x49 0xF6 0xDD 0x0C 0xFF 0xFF 0xAD 0xFF 0xCA 0xFF 0xB3 0x00 0x50 0xF6 0xF3 0x0C 0xF6 0xFF 0xAE 0xFF 0xC5 0xFF 0xBB 0x00 0x53 0xF6 0xFF 0x0C 0xE2 0xFF 0xAE 0xFF 0xBF 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x0C 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0xB5 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0x30 +Subcommand: 0xAD 0x00 0x43 0xF6 0xBA 0x0C 0xF4 0xFF 0xBF 0xFF 0xCE 0xFF 0xAE 0x00 0x40 0xF6 0xBF 0x0C 0xFF 0xFF 0xB5 0xFF 0xCD 0xFF 0xB2 0x00 0x47 0xF6 0xD8 0x0C 0xFF 0xFF 0xAE 0xFF 0xCB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB7 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xA5 0x00 0x45 0xF6 0xEB 0x0C 0xDE 0xFF 0xDD 0xFF 0xDC 0xFF 0xA6 0x00 0x45 0xF6 0xD1 0x0C 0xE2 0xFF 0xD2 0xFF 0xD4 0xFF 0xAB 0x00 0x44 0xF6 0xBD 0x0C 0xED 0xFF 0xC5 0xFF 0xCF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xBA 0x6E 0x00 0x00 0x00 0x99 0x47 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xA9 0x00 0x3C 0xF6 0xFE 0x0C 0xE9 0xFF 0xE6 0xFF 0xE2 0xFF 0xAC 0x00 0x42 0xF6 0xFE 0x0C 0xE2 0xFF 0xE2 0xFF 0xDF 0xFF 0xA7 0x00 0x44 0xF6 0xF0 0x0C 0xDE 0xFF 0xE0 0xFF 0xDE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xBC 0x6E 0x00 0x00 0x00 0x99 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xAC 0x00 0x46 0xF6 0x19 0x0D 0xE7 0xFF 0xE9 0xFF 0xE7 0xFF 0xA5 0x00 0x3C 0xF6 0x02 0x0D 0xE9 0xFF 0xE8 0xFF 0xE4 0xFF 0xA8 0x00 0x3B 0xF6 0xFD 0x0C 0xE9 0xFF 0xE6 0xFF 0xE2 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC1 0x6E 0x00 0x00 0x00 0x99 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xAE 0x00 0x45 0xF6 0x07 0x0D 0x01 0x00 0xD7 0xFF 0xEE 0xFF 0xBC 0x00 0x5E 0xF6 0x31 0x0D 0xF6 0xFF 0xE0 0xFF 0xF9 0xFF 0xAA 0x00 0x4C 0xF6 0x3D 0x0D 0xE8 0xFF 0xEB 0xFF 0xF5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC3 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xB5 0x00 0x4A 0xF6 0xD8 0x0C 0xA9 0xFF 0xD0 0xFF 0xC4 0xFF 0xAF 0x00 0x3C 0xF6 0xEA 0x0C 0xE1 0xFF 0xD5 0xFF 0xD6 0xFF 0xAB 0x00 0x42 0xF6 0xFD 0x0C 0x01 0x00 0xD7 0xFF 0xEE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC5 0x6E 0x00 0x00 0x00 0x99 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xB6 0x00 0x54 0xF6 0xCF 0x0C 0x4A 0xFF 0xCF 0xFF 0xAE 0xFF 0xBC 0x00 0x5B 0xF6 0xD7 0x0C 0x73 0xFF 0xCE 0xFF 0xB5 0xFF 0xB5 0x00 0x4E 0xF6 0xD5 0x0C 0x9E 0xFF 0xCF 0xFF 0xC0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xCA 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xA9 0x00 0x35 0xF6 0x5D 0x0C 0x97 0xFE 0xC3 0xFF 0xE3 0xFF 0xA9 0x00 0x30 0xF6 0x68 0x0C 0xB3 0xFE 0xCD 0xFF 0xCC 0xFF 0x9B 0x00 0x2C 0xF6 0x79 0x0C 0xDE 0xFE 0xD4 0xFF 0xB5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xCE 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x9E 0x00 0xEB 0xF5 0x65 0x0C 0x42 0xFE 0x51 0xFF 0x04 0x00 0xBA 0x00 0xFE 0xF5 0x62 0x0C 0x4D 0xFE 0x6D 0xFF 0x06 0x00 0xB5 0x00 0x13 0xF6 0x5E 0x0C 0x59 0xFE 0x88 0xFF 0x05 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xD1 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x16 0x01 0xFA 0xF5 0x85 0x0C 0x3E 0xFE 0x27 0xFF 0xFF 0xFF 0xA2 0x00 0xEA 0xF5 0x85 0x0C 0x36 0xFE 0x33 0xFF 0x04 0x00 0x97 0x00 0xE7 0xF5 0x63 0x0C 0x3F 0xFE 0x4B 0xFF 0x03 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xD5 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x45 0x01 0x26 0xF6 0xE3 0x0A 0x34 0xFE 0xF5 0xFF 0xD2 0xFF 0x40 0x01 0xD2 0xF5 0x06 0x0C 0x6D 0xFE 0xAA 0xFF 0xD2 0xFF 0x29 0x01 0x8A 0xF5 0xA5 0x0C 0x59 0xFE 0x6C 0xFF 0xCA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xDA 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xF4 0xFF 0x19 0xF6 0x37 0x0A 0x5E 0xFB 0x8C 0x00 0x81 0xFF 0x4F 0x00 0x41 0xF6 0xFB 0x09 0xF2 0xFB 0xAC 0x00 0x96 0xFF 0x7F 0x00 0x5E 0xF6 0xB5 0x09 0xC5 0xFC 0xA0 0x00 0x9C 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xDC 0x6E 0x00 0x00 0x00 0x98 0x97 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xF5 0xFF 0xB7 0xF6 0x52 0x0A 0x7F 0xFA 0xD1 0xFF 0x12 0xFF 0x12 0x00 0x7E 0xF6 0x56 0x0A 0xE5 0xFA 0x33 0x00 0x49 0xFF 0xF0 0xFF 0x22 0xF6 0x40 0x0A 0x46 0xFB 0x7E 0x00 0x78 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xE0 0x6E 0x00 0x00 0x00 0x9A 0x97 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xC2 0x00 0x3A 0xF4 0xD2 0x12 0xAC 0xFA 0xF5 0xFD 0xB8 0xFE 0xF3 0xFF 0x8C 0xF5 0x84 0x0D 0xAE 0xF9 0x4B 0xFE 0xAD 0xFE 0x96 0xFF 0x4F 0xF6 0xD7 0x0A 0x9A 0xF9 0xBD 0xFE 0xB4 0xFE +--- Controller Msg --- +Payload: 0xA1 0x30 0xE7 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x65 0x01 0xD5 0xF4 0xB3 0x0B 0x4E 0xFE 0xE7 0xFF 0x8F 0xFF 0x32 0x01 0x15 0xF5 0x9D 0x0B 0x97 0xFE 0xFC 0xFF 0xBE 0xFF 0xCB 0x00 0x75 0xF5 0xD5 0x0B 0x2F 0xFF 0xEC 0xFF 0xC9 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x0D 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0xE9 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x56 0x01 0x66 0xF4 0xA6 0x0B 0x5F 0xFE 0x40 0xFF 0x1E 0xFF 0x50 0x01 0x85 0xF4 0xC5 0x0B 0x43 0xFE 0x9F 0xFF 0x47 0xFF 0x64 0x01 0xC6 0xF4 0xBA 0x0B 0x4A 0xFE 0xDB 0xFF 0x80 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xF0 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xD9 0x01 0x68 0xF4 0xAC 0x0B 0x1D 0xFE 0x95 0xFD 0x0D 0xFF 0xDB 0x01 0x3B 0xF4 0xBA 0x0B 0x65 0xFE 0x6B 0xFD 0xF9 0xFE 0xCC 0x01 0x28 0xF4 0xA6 0x0B 0x9E 0xFE 0x60 0xFD 0xF3 0xFE +--- Controller Msg --- +Payload: 0xA1 0x30 0xF9 0x6E 0x00 0x00 0x00 0x9B 0x77 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x29 0x02 0xCD 0xF2 0x0D 0x0C 0xEA 0xFD 0x95 0xFE 0xF2 0xFF 0x6B 0x02 0xDA 0xF2 0xAF 0x0B 0x65 0xFD 0x81 0xFE 0xEA 0xFF 0xB8 0x02 0xE7 0xF2 0x68 0x0B 0xFA 0xFC 0x72 0xFE 0xE1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x02 0x6E 0x00 0x00 0x00 0x9B 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0xDE 0x01 0x03 0xF4 0xFA 0x0A 0xEC 0x00 0xFC 0xFE 0x91 0xFF 0xD6 0x01 0x24 0xF4 0xED 0x0A 0xE4 0x00 0xED 0xFE 0x8F 0xFF 0xDE 0x01 0x24 0xF4 0x02 0x0B 0xE8 0x00 0xD8 0xFE 0x95 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x16 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0xB5 0x01 0x56 0xF5 0xD8 0x0C 0x23 0x01 0xA0 0xFF 0xAC 0xFF 0x3E 0x02 0xC2 0xF5 0x92 0x0C 0x3C 0x01 0xA1 0xFF 0xD7 0xFF 0xBA 0x01 0xA7 0xF4 0xC0 0x0C 0x1E 0x01 0xA9 0xFF 0xBA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x1F 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x43 0x02 0x77 0xF4 0x71 0x0A 0xDF 0xFF 0xA9 0xFE 0xF2 0xFF 0x27 0x02 0x6F 0xF4 0x84 0x0A 0xF6 0xFF 0xB2 0xFE 0xEA 0xFF 0x13 0x02 0x75 0xF4 0x8D 0x0A 0x30 0x00 0xE4 0xFE 0xE7 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x0E 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x2B 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x76 0x02 0x2B 0xF4 0x89 0x0A 0x8B 0xFF 0x92 0xFF 0x97 0xFF 0x7F 0x02 0x31 0xF4 0x94 0x0A 0x6A 0xFF 0x8A 0xFF 0x98 0xFF 0x94 0x02 0x3F 0xF4 0x90 0x0A 0x4D 0xFF 0x88 0xFF 0x9F 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x34 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x96 0x02 0x03 0xF4 0x3C 0x0B 0x61 0x00 0xBC 0x00 0xC1 0xFF 0xA2 0x02 0x17 0xF4 0x06 0x0B 0x4D 0x00 0x96 0x00 0xC3 0xFF 0xA0 0x02 0x23 0xF4 0xDB 0x0A 0x3B 0x00 0x70 0x00 0xBF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x3F 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x27 0x02 0x8B 0xF4 0x85 0x0B 0x82 0x00 0xC4 0x00 0xDB 0xFF 0x26 0x02 0x8F 0xF4 0x94 0x0B 0x9D 0x00 0xCD 0x00 0xD7 0xFF 0x1F 0x02 0x9A 0xF4 0xB6 0x0B 0xAD 0x00 0xE0 0x00 0xCF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x48 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x80 0x02 0xAE 0xF4 0x28 0x0B 0x0E 0x00 0xCA 0xFF 0xAB 0xFF 0x82 0x02 0xA4 0xF4 0x40 0x0B 0x27 0x00 0xE5 0xFF 0xB6 0xFF 0x7D 0x02 0xA2 0xF4 0x53 0x0B 0x40 0x00 0x0A 0x00 0xBF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x51 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0xF4 0x01 0xE5 0xF4 0x39 0x0B 0x7A 0xFF 0x0D 0x00 0xA1 0xFF 0xE2 0x01 0xF1 0xF4 0x1B 0x0B 0x75 0xFF 0xFB 0xFF 0x96 0xFF 0xDE 0x01 0xF9 0xF4 0xFB 0x0A 0x89 0xFF 0xE9 0xFF 0x8D 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x0F 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x63 0x6E 0x00 0x00 0x00 0x9A 0x97 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x20 0x02 0x53 0xF4 0x6C 0x0B 0x2A 0x00 0xF9 0xFF 0xCD 0xFF 0x35 0x02 0x32 0xF4 0x6A 0x0B 0x0C 0x00 0xF0 0xFF 0xD0 0xFF 0x60 0x02 0x22 0xF4 0x55 0x0B 0xED 0xFF 0xE1 0xFF 0xD1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x66 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x11 0x02 0x82 0xF4 0x54 0x0B 0x2B 0x00 0x08 0x00 0xCB 0xFF 0x10 0x02 0x71 0xF4 0x62 0x0B 0x2F 0x00 0x01 0x00 0xC9 0xFF 0x1C 0x02 0x5A 0xF4 0x6B 0x0B 0x2C 0x00 0xFA 0xFF 0xCC 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x6C 0x6E 0x00 0x00 0x00 0x9B 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xEC 0x01 0xA4 0xF4 0x79 0x0B 0x27 0x00 0x28 0x00 0xEF 0xFF 0xF5 0x01 0xA2 0xF4 0x72 0x0B 0x1D 0x00 0x30 0x00 0xEA 0xFF 0xFD 0x01 0xA2 0xF4 0x63 0x0B 0x1A 0x00 0x31 0x00 0xE3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x6F 0x6E 0x00 0x00 0x00 0x99 0x57 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xDF 0x01 0xAE 0xF4 0x57 0x0B 0x49 0x00 0x1B 0x00 0xFD 0xFF 0xDB 0x01 0xB0 0xF4 0x6A 0x0B 0x3D 0x00 0x21 0x00 0xF5 0xFF 0xE8 0x01 0xA5 0xF4 0x79 0x0B 0x2C 0x00 0x26 0x00 0xF0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x75 0x6E 0x00 0x00 0x00 0x9A 0x97 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x48 0x02 0x6C 0xF4 0x6B 0x0B 0x70 0x00 0x1B 0x00 0x08 0x00 0x33 0x02 0x74 0xF4 0x70 0x0B 0x76 0x00 0x1A 0x00 0x08 0x00 0x17 0x02 0x72 0xF4 0x76 0x0B 0x72 0x00 0x1A 0x00 0x04 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x7F 0x6E 0x00 0x00 0x00 0x9A 0x97 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xEB 0x01 0xCC 0xF4 0x5D 0x0B 0x4C 0x00 0x07 0x00 0xDA 0xFF 0xFB 0x01 0xBC 0xF4 0x72 0x0B 0x4C 0x00 0x0F 0x00 0xD5 0xFF 0x06 0x02 0xA5 0xF4 0x81 0x0B 0x42 0x00 0x17 0x00 0xD5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x88 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x03 0x02 0xA3 0xF4 0x61 0x0B 0x1E 0x00 0x40 0x00 0xF2 0xFF 0xFB 0x01 0xAB 0xF4 0x4F 0x0B 0x29 0x00 0x3E 0x00 0xEF 0xFF 0xFC 0x01 0xB8 0xF4 0x47 0x0B 0x2D 0x00 0x36 0x00 0xEC 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x9A 0x6E 0x00 0x00 0x00 0x9A 0x97 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xD0 0x01 0xB2 0xF4 0xA2 0x0B 0x00 0x00 0x27 0x00 0xD9 0xFF 0xD5 0x01 0xA9 0xF4 0xB0 0x0B 0x03 0x00 0x2D 0x00 0xDA 0xFF 0xD2 0x01 0x99 0xF4 0xB6 0x0B 0xFF 0xFF 0x33 0x00 0xDD 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x00 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x9C 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xCB 0x01 0xB4 0xF4 0x8D 0x0B 0xFA 0xFF 0x18 0x00 0xD9 0xFF 0xCB 0x01 0xB6 0xF4 0x8E 0x0B 0xFB 0xFF 0x1D 0x00 0xD5 0xFF 0xCD 0x01 0xB2 0xF4 0x9D 0x0B 0xFE 0xFF 0x25 0x00 0xD8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA5 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xD7 0x01 0xC1 0xF4 0x87 0x0B 0xF5 0xFF 0xFA 0xFF 0xDA 0xFF 0xD6 0x01 0xC7 0xF4 0x89 0x0B 0xF2 0xFF 0xFA 0xFF 0xDB 0xFF 0xCE 0x01 0xCC 0xF4 0x8B 0x0B 0xF2 0xFF 0xFD 0xFF 0xDA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xAC 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xC1 0x01 0xA5 0xF4 0x83 0x0B 0x02 0x00 0xEE 0xFF 0xE2 0xFF 0xBC 0x01 0xA2 0xF4 0x96 0x0B 0xFD 0xFF 0xF1 0xFF 0xE0 0xFF 0xBD 0x01 0xAA 0xF4 0xA1 0x0B 0xF5 0xFF 0xF2 0xFF 0xDF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xAE 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xBB 0x01 0xB9 0xF4 0x76 0x0B 0x05 0x00 0xF0 0xFF 0xE3 0xFF 0xC4 0x01 0xB1 0xF4 0x71 0x0B 0x05 0x00 0xED 0xFF 0xE0 0xFF 0xC3 0x01 0xA7 0xF4 0x7E 0x0B 0x03 0x00 0xED 0xFF 0xE3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB7 0x6E 0x00 0x00 0x00 0x9B 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xB6 0x01 0xC2 0xF4 0xB5 0x0B 0x26 0x00 0xF0 0xFF 0xE4 0xFF 0xB1 0x01 0xBA 0xF4 0x9A 0x0B 0x29 0x00 0xF1 0xFF 0xE8 0xFF 0xA9 0x01 0xB2 0xF4 0x82 0x0B 0x29 0x00 0xF0 0xFF 0xE8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC0 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xAC 0x01 0xBE 0xF4 0x9B 0x0B 0xF1 0xFF 0xD6 0xFF 0xDB 0xFF 0xB0 0x01 0xC1 0xF4 0x99 0x0B 0xEC 0xFF 0xD4 0xFF 0xD9 0xFF 0xAC 0x01 0xBE 0xF4 0x8E 0x0B 0xEF 0xFF 0xD2 0xFF 0xD8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC9 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xCA 0x01 0xB8 0xF4 0x49 0x0B 0x14 0x00 0xDD 0xFF 0xE2 0xFF 0xC4 0x01 0xB2 0xF4 0x51 0x0B 0x25 0x00 0xD4 0xFF 0xE6 0xFF 0xC0 0x01 0xB1 0xF4 0x6C 0x0B 0x32 0x00 0xCF 0xFF 0xE8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xD5 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xA9 0x01 0xCF 0xF4 0x9B 0x0B 0xE6 0xFF 0xE4 0xFF 0xD4 0xFF 0xAB 0x01 0xCA 0xF4 0x98 0x0B 0xEC 0xFF 0xE3 0xFF 0xD5 0xFF 0xB0 0x01 0xC6 0xF4 0x9B 0x0B 0xF2 0xFF 0xE4 0xFF 0xD9 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x01 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0xE7 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xA2 0x01 0xC7 0xF4 0x9C 0x0B 0xF6 0xFF 0xD4 0xFF 0xD7 0xFF 0xA7 0x01 0xC5 0xF4 0x9D 0x0B 0xF2 0xFF 0xD5 0xFF 0xD5 0xFF 0xAD 0x01 0xC4 0xF4 0x9D 0x0B 0xF0 0xFF 0xD5 0xFF 0xD3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xE9 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xA0 0x01 0xCD 0xF4 0x99 0x0B 0x04 0x00 0xDA 0xFF 0xDA 0xFF 0xA5 0x01 0xCD 0xF4 0x9D 0x0B 0xFF 0xFF 0xD5 0xFF 0xD9 0xFF 0xA3 0x01 0xC8 0xF4 0x9C 0x0B 0xF7 0xFF 0xD4 0xFF 0xD7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xEB 0x6E 0x00 0x00 0x00 0x9A 0x97 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xB1 0x01 0xBF 0xF4 0x9B 0x0B 0xFE 0xFF 0xE0 0xFF 0xDA 0xFF 0xAE 0x01 0xC2 0xF4 0x98 0x0B 0x02 0x00 0xDB 0xFF 0xDB 0xFF 0xA2 0x01 0xCB 0xF4 0x98 0x0B 0x04 0x00 0xDA 0xFF 0xDA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xEE 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xAC 0x01 0xD7 0xF4 0x95 0x0B 0x04 0x00 0xE5 0xFF 0xD5 0xFF 0xAF 0x01 0xD0 0xF4 0x9A 0x0B 0x01 0x00 0xE3 0xFF 0xD6 0xFF 0xB1 0x01 0xC0 0xF4 0x9D 0x0B 0xFE 0xFF 0xE1 0xFF 0xD9 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xF0 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xA0 0x01 0xCF 0xF4 0xA3 0x0B 0x03 0x00 0xE5 0xFF 0xD8 0xFF 0xA8 0x01 0xD7 0xF4 0x97 0x0B 0x03 0x00 0xE5 0xFF 0xD8 0xFF 0xAC 0x01 0xD9 0xF4 0x95 0x0B 0x04 0x00 0xE6 0xFF 0xD5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xF5 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xA3 0x01 0xC8 0xF4 0xA7 0x0B 0x0F 0x00 0xD0 0xFF 0xD6 0xFF 0x99 0x01 0xC5 0xF4 0xB3 0x0B 0x10 0x00 0xD5 0xFF 0xD8 0xFF 0x97 0x01 0xC1 0xF4 0xB5 0x0B 0x10 0x00 0xD9 0xFF 0xD7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xF9 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xAB 0x01 0xBF 0xF4 0x8E 0x0B 0xFA 0xFF 0xDA 0xFF 0xD1 0xFF 0xAC 0x01 0xC5 0xF4 0x84 0x0B 0xFF 0xFF 0xDA 0xFF 0xD3 0xFF 0xAE 0x01 0xCB 0xF4 0x82 0x0B 0x05 0x00 0xD7 0xFF 0xD3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xFE 0x6E 0x00 0x00 0x00 0x99 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xB0 0x01 0xC5 0xF4 0xA9 0x0B 0x09 0x00 0xDD 0xFF 0xD1 0xFF 0xAA 0x01 0xC0 0xF4 0xAF 0x0B 0x07 0x00 0xDC 0xFF 0xD0 0xFF 0xA6 0x01 0xBC 0xF4 0xAC 0x0B 0x02 0x00 0xDC 0xFF 0xD0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x02 0x6E 0x00 0x00 0x00 0x9B 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x9A 0x01 0xC8 0xF4 0xA6 0x0B 0x19 0x00 0xE3 0xFF 0xD0 0xFF 0x9A 0x01 0xCC 0xF4 0xAF 0x0B 0x14 0x00 0xE0 0xFF 0xCF 0xFF 0xA6 0x01 0xC7 0xF4 0xAA 0x0B 0x0D 0x00 0xDD 0xFF 0xD0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x09 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xC0 0x01 0xCD 0xF4 0xBB 0x0B 0xDF 0xFF 0xE0 0xFF 0xCA 0xFF 0xCB 0x01 0xCC 0xF4 0xA0 0x0B 0xDF 0xFF 0xDE 0xFF 0xCB 0xFF 0xD3 0x01 0xD4 0xF4 0x89 0x0B 0xE7 0xFF 0xDB 0xFF 0xCE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x17 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xB6 0x01 0xDC 0xF4 0xA0 0x0B 0xED 0xFF 0xD6 0xFF 0xD1 0xFF 0xBB 0x01 0xD6 0xF4 0xA3 0x0B 0xEA 0xFF 0xD3 0xFF 0xD1 0xFF 0xB8 0x01 0xCC 0xF4 0xA4 0x0B 0xEA 0xFF 0xD4 0xFF 0xD3 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x02 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x1D 0x6E 0x00 0x00 0x00 0x99 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xA3 0x01 0xD3 0xF4 0x95 0x0B 0x0A 0x00 0xEC 0xFF 0xDA 0xFF 0x9C 0x01 0xD3 0xF4 0x9A 0x0B 0x04 0x00 0xE8 0xFF 0xD8 0xFF 0x96 0x01 0xC8 0xF4 0xA1 0x0B 0xFD 0xFF 0xE5 0xFF 0xD6 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x26 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xAA 0x01 0xE3 0xF4 0xAF 0x0B 0x01 0x00 0xDC 0xFF 0xD0 0xFF 0xAC 0x01 0xE5 0xF4 0xA5 0x0B 0xFB 0xFF 0xDE 0xFF 0xD2 0xFF 0xA1 0x01 0xE4 0xF4 0x9B 0x0B 0xFA 0xFF 0xE7 0xFF 0xD5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x32 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xA3 0x01 0xC8 0xF4 0xB1 0x0B 0x22 0x00 0xF8 0xFF 0xE0 0xFF 0xAA 0x01 0xCC 0xF4 0xB2 0x0B 0x1F 0x00 0xF7 0xFF 0xDC 0xFF 0xAE 0x01 0xD3 0xF4 0xAA 0x0B 0x25 0x00 0xFB 0xFF 0xDD 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x3B 0x6E 0x00 0x00 0x01 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x64 0x01 0x26 0xF5 0x95 0x0B 0x1D 0x00 0xC3 0xFF 0x70 0xFF 0x2C 0x01 0x16 0xF5 0xAC 0x0B 0xF0 0xFF 0xDA 0xFF 0x91 0xFF 0x79 0x01 0x3F 0xF5 0x6B 0x0B 0xF2 0xFF 0xE4 0xFF 0xAB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x3D 0x6E 0x00 0x00 0x01 0x98 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x68 0x01 0x1D 0xF5 0xDE 0x0B 0x3F 0x00 0x21 0x00 0x50 0xFF 0x98 0x01 0x53 0xF5 0x98 0x0B 0x44 0x00 0xDA 0xFF 0x45 0xFF 0x8A 0x01 0x32 0xF5 0x92 0x0B 0x2A 0x00 0xBB 0xFF 0x63 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x4F 0x6E 0x00 0x00 0x01 0x9A 0x97 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xEA 0x01 0xD2 0xF4 0x80 0x0B 0x44 0x00 0x4A 0xFF 0x76 0xFF 0x03 0x02 0xB5 0xF4 0x7E 0x0B 0x72 0x00 0x6F 0xFF 0x8D 0xFF 0x1D 0x02 0x95 0xF4 0x93 0x0B 0xA2 0x00 0x93 0xFF 0xA2 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x03 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x51 0x6E 0x00 0x00 0x01 0x99 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0xAA 0x01 0xDA 0xF4 0x82 0x0B 0xFF 0xFF 0x36 0xFF 0x6C 0xFF 0xBF 0x01 0xE3 0xF4 0x84 0x0B 0x1B 0x00 0x38 0xFF 0x69 0xFF 0xE4 0x01 0xD8 0xF4 0x80 0x0B 0x3C 0x00 0x46 0xFF 0x73 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x5A 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x90 0x01 0x39 0xF5 0xD4 0x0B 0x5D 0xFF 0x7F 0xFF 0xF8 0xFF 0x8E 0x01 0x3D 0xF5 0xDB 0x0B 0x5D 0xFF 0x75 0xFF 0xED 0xFF 0x85 0x01 0x47 0xF5 0xC9 0x0B 0x6A 0xFF 0x75 0xFF 0xE3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x6A 0x6E 0x00 0x00 0x00 0x9A 0x97 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xA3 0x01 0x06 0xF5 0xB6 0x0B 0x32 0x00 0xDB 0xFF 0xDF 0xFF 0x9E 0x01 0x04 0xF5 0xBB 0x0B 0x2D 0x00 0xE1 0xFF 0xDD 0xFF 0xA1 0x01 0xF6 0xF4 0xBF 0x0B 0x23 0x00 0xE6 0xFF 0xDB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x6C 0x6E 0x00 0x00 0x00 0x99 0x47 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xAB 0x01 0x03 0xF5 0x9A 0x0B 0x3A 0x00 0xD2 0xFF 0xE3 0xFF 0xA8 0x01 0x05 0xF5 0xA5 0x0B 0x37 0x00 0xD5 0xFF 0xE3 0xFF 0xA5 0x01 0x07 0xF5 0xB3 0x0B 0x33 0x00 0xD9 0xFF 0xE0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x71 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xCE 0x01 0xEE 0xF4 0x75 0x0B 0x20 0x00 0xE9 0xFF 0xDB 0xFF 0xCC 0x01 0xEA 0xF4 0x6E 0x0B 0x2B 0x00 0xE1 0xFF 0xDF 0xFF 0xC1 0x01 0xEC 0xF4 0x73 0x0B 0x33 0x00 0xDB 0xFF 0xE0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x73 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xC0 0x01 0xF4 0xF4 0x94 0x0B 0x10 0x00 0xFE 0xFF 0xD7 0xFF 0xC8 0x01 0xF2 0xF4 0x87 0x0B 0x14 0x00 0xF5 0xFF 0xD7 0xFF 0xCC 0x01 0xEF 0xF4 0x78 0x0B 0x1C 0x00 0xEC 0xFF 0xD9 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x75 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xB3 0x01 0xF8 0xF4 0xA2 0x0B 0x0A 0x00 0x06 0x00 0xDA 0xFF 0xB8 0x01 0xF5 0xF4 0x9D 0x0B 0x0D 0x00 0x04 0x00 0xDB 0xFF 0xBD 0x01 0xF4 0xF4 0x97 0x0B 0x10 0x00 0xFF 0xFF 0xD8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x78 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xBA 0x01 0xF8 0xF4 0xA8 0x0B 0x03 0x00 0x06 0x00 0xE0 0xFF 0xB6 0x01 0xFC 0xF4 0xAA 0x0B 0x04 0x00 0x06 0x00 0xDD 0xFF 0xB3 0x01 0xF9 0xF4 0xA5 0x0B 0x09 0x00 0x06 0x00 0xDA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x7A 0x6E 0x00 0x00 0x00 0x99 0x87 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xBC 0x01 0xE2 0xF4 0xCB 0x0B 0x08 0x00 0x09 0x00 0xE6 0xFF 0xBF 0x01 0xE8 0xF4 0xBA 0x0B 0x03 0x00 0x06 0x00 0xE5 0xFF 0xBC 0x01 0xF6 0xF4 0xA8 0x0B 0x03 0x00 0x07 0x00 0xE1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x7C 0x6E 0x00 0x00 0x00 0x98 0x77 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xBB 0x01 0xC2 0xF4 0xF7 0x0B 0x21 0x00 0x06 0x00 0xE6 0xFF 0xBE 0x01 0xD2 0xF4 0xDE 0x0B 0x16 0x00 0x09 0x00 0xE6 0xFF 0xBD 0x01 0xDD 0xF4 0xCC 0x0B 0x0D 0x00 0x0A 0x00 0xE6 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x7F 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xD9 0x01 0x55 0xF4 0x87 0x0B 0x26 0x00 0x00 0x00 0xDC 0xFF 0xB9 0x01 0xB9 0xF4 0xD0 0x0B 0x36 0x00 0x01 0x00 0xE2 0xFF 0xB9 0x01 0xC2 0xF4 0xFB 0x0B 0x26 0x00 0x06 0x00 0xE5 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x04 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x83 0x6E 0x00 0x00 0x00 0x99 0x87 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xC0 0x01 0x0F 0xF5 0xAC 0x0B 0x2D 0x00 0xFA 0xFF 0xF4 0xFF 0xA4 0x01 0x42 0xF5 0xBE 0x0B 0x24 0x00 0xEF 0xFF 0xE0 0xFF 0x8C 0x01 0x4E 0xF5 0xF7 0x0B 0x19 0x00 0xF3 0xFF 0xC2 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x88 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x97 0x01 0xFA 0xF4 0xE8 0x0B 0x1D 0x00 0x0A 0x00 0xDC 0xFF 0x9D 0x01 0xF4 0xF4 0xE5 0x0B 0x21 0x00 0x10 0x00 0xDD 0xFF 0xAE 0x01 0xE1 0xF4 0xD3 0x0B 0x32 0x00 0x17 0x00 0xE3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x8E 0x6E 0x00 0x00 0x00 0x98 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x86 0x01 0xB8 0xF4 0xB1 0x0B 0x64 0x00 0x22 0x00 0xC0 0xFF 0x81 0x01 0xB9 0xF4 0xAC 0x0B 0x65 0x00 0x1B 0x00 0xCA 0xFF 0x72 0x01 0xC3 0xF4 0xBD 0x0B 0x55 0x00 0x14 0x00 0xD0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x93 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x63 0x01 0x00 0xF5 0x0A 0x0C 0x2B 0x00 0x0D 0x00 0xF4 0xFF 0x76 0x01 0xE1 0xF4 0xED 0x0B 0x48 0x00 0x1E 0x00 0x02 0x00 0x45 0x01 0xA1 0xF4 0x01 0x0C 0xE5 0xFF 0x2C 0x00 0xF2 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x9A 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xB4 0x01 0x0F 0xF5 0x0C 0x0B 0x3C 0xFF 0x40 0x00 0x42 0x00 0x98 0x01 0x1E 0xF5 0x16 0x0B 0x46 0xFF 0x2A 0x00 0x43 0x00 0x71 0x01 0x35 0xF5 0x1E 0x0B 0x74 0xFF 0x1C 0x00 0x3B 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x9E 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xB9 0x01 0xCF 0xF4 0x99 0x0B 0x56 0xFF 0x82 0x00 0x01 0x00 0xCF 0x01 0xA9 0xF4 0x77 0x0B 0x45 0xFF 0x82 0x00 0x18 0x00 0xD8 0x01 0xA4 0xF4 0x4D 0x0B 0x38 0xFF 0x7A 0x00 0x30 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xA1 0x6E 0x00 0x00 0x00 0x99 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xAB 0x01 0xE6 0xF4 0xBD 0x0B 0x6A 0xFF 0x71 0x00 0x01 0x00 0xAE 0x01 0xED 0xF4 0xA6 0x0B 0x66 0xFF 0x78 0x00 0xF8 0xFF 0xB6 0x01 0xD8 0xF4 0x9D 0x0B 0x5B 0xFF 0x82 0x00 0xFC 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA7 0x6E 0x00 0x00 0x00 0x9B 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x7B 0x01 0x88 0xF4 0x1F 0x0C 0x22 0x00 0x2B 0x00 0xEF 0xFF 0x75 0x01 0x78 0xF4 0x25 0x0C 0x1E 0x00 0x36 0x00 0x03 0x00 0x6E 0x01 0x82 0xF4 0x2E 0x0C 0x08 0x00 0x3E 0x00 0x10 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xAE 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x7F 0x01 0x7B 0xF5 0x18 0x0C 0x09 0x00 0xE7 0xFF 0x27 0x00 0x81 0x01 0x92 0xF5 0x15 0x0C 0x09 0x00 0xF1 0xFF 0x08 0x00 0x88 0x01 0x88 0xF5 0x09 0x0C 0x0A 0x00 0xF5 0xFF 0xED 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB5 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x64 0x01 0xCA 0xF4 0x09 0x0C 0x41 0x00 0xBD 0xFF 0x19 0x00 0x6C 0x01 0xCD 0xF4 0x01 0x0C 0x35 0x00 0xC3 0xFF 0x26 0x00 0x6C 0x01 0xDD 0xF4 0xF5 0x0B 0x2E 0x00 0xC6 0xFF 0x2F 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xB7 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x59 0x01 0xED 0xF4 0xE7 0x0B 0x5C 0x00 0xA8 0xFF 0x0C 0x00 0x58 0x01 0xDC 0xF4 0xFB 0x0B 0x55 0x00 0xB2 0xFF 0x0F 0x00 0x61 0x01 0xCD 0xF4 0x08 0x0C 0x44 0x00 0xBC 0xFF 0x16 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xBE 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x53 0x01 0x04 0xF5 0xF0 0x0B 0x53 0x00 0xA9 0xFF 0x10 0x00 0x64 0x01 0xF6 0xF4 0xDF 0x0B 0x50 0x00 0xA4 0xFF 0x0D 0x00 0x67 0x01 0xF3 0xF4 0xD3 0x0B 0x4E 0x00 0xA4 0xFF 0x0B 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xC0 0x6E 0x00 0x00 0x00 0x99 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x4A 0x01 0xF1 0xF4 0x04 0x0C 0x61 0x00 0xB4 0xFF 0x24 0x00 0x4C 0x01 0xFD 0xF4 0xF9 0x0B 0x5F 0x00 0xB1 0xFF 0x1E 0x00 0x4E 0x01 0x04 0xF5 0xF3 0x0B 0x56 0x00 0xAB 0xFF 0x13 0x00 +--- Switch Msg --- +Payload: 0xA2 0x10 0x05 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0xC3 0x6E 0x00 0x00 0x00 0x98 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x16 0x01 0xDE 0xF4 0x20 0x0C 0x48 0x00 0xAE 0xFF 0x18 0x00 0x3E 0x01 0xBA 0xF4 0x0D 0x0C 0x53 0x00 0xB3 0xFF 0x22 0x00 0x48 0x01 0xE6 0xF4 0x01 0x0C 0x60 0x00 0xB4 0xFF 0x25 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xC5 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xF4 0x00 0x43 0xF5 0xEC 0x0B 0x48 0x00 0xA8 0xFF 0x34 0x00 0xDE 0x00 0x37 0xF5 0xFF 0x0B 0x4D 0x00 0xA7 0xFF 0x1F 0x00 0x0A 0x01 0xEE 0xF4 0x1B 0x0C 0x45 0x00 0xAC 0xFF 0x15 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xC7 0x6E 0x00 0x00 0x00 0x9B 0x67 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x52 0x01 0xDE 0xF4 0xBE 0x0B 0x69 0x00 0xC5 0xFF 0x5A 0x00 0x2F 0x01 0x1E 0xF5 0xDA 0x0B 0x5B 0x00 0xB8 0xFF 0x4E 0x00 0xFF 0x00 0x40 0xF5 0xE8 0x0B 0x4C 0x00 0xAB 0xFF 0x3A 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xC9 0x6E 0x00 0x00 0x00 0x9B 0x87 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x39 0x01 0xC7 0xF4 0xE5 0x0B 0x51 0x00 0xD2 0xFF 0x39 0x00 0x4F 0x01 0xB3 0xF4 0xD5 0x0B 0x5E 0x00 0xD0 0xFF 0x4F 0x00 0x57 0x01 0xD0 0xF4 0xBF 0x0B 0x69 0x00 0xC8 0xFF 0x5A 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xCE 0x6E 0x00 0x00 0x00 0x9A 0x97 0x8C 0x00 0x00 0x00 0xA0 +Subcommand: 0x48 0x01 0xEA 0xF4 0x12 0x0C 0xB5 0x00 0xED 0xFF 0x1F 0x00 0x2E 0x01 0xEB 0xF4 0xDD 0x0B 0xD5 0x00 0xE0 0xFF 0x1D 0x00 0x1B 0x01 0xCA 0xF4 0xF2 0x0B 0x86 0x00 0xD7 0xFF 0x1E 0x00 +--- Switch Msg --- +Payload: 0xA2 0x10 0x06 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0xD0 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0x40 +Subcommand: 0x56 0x01 0x0A 0xF5 0xF2 0x0B 0x61 0x00 0xC6 0xFF 0x0B 0x00 0x58 0x01 0xEF 0xF4 0x0B 0x0C 0x7D 0x00 0xDE 0xFF 0x19 0x00 0x4C 0x01 0xE7 0xF4 0x18 0x0C 0xA6 0x00 0xED 0xFF 0x20 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xD2 0x6E 0x00 0x00 0x00 0x99 0x97 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x51 0x01 0x16 0xF5 0x1E 0x0C 0x31 0x00 0xB5 0xFF 0xF8 0xFF 0x5A 0x01 0x17 0xF5 0x09 0x0C 0x3A 0x00 0xB6 0xFF 0xFC 0xFF 0x58 0x01 0x0E 0xF5 0xF3 0x0B 0x59 0x00 0xC1 0xFF 0x07 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xD5 0x6E 0x00 0x00 0x00 0x99 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x3C 0x01 0x12 0xF5 0x25 0x0C 0x3B 0x00 0xB3 0xFF 0xF9 0xFF 0x40 0x01 0x16 0xF5 0x26 0x0C 0x3A 0x00 0xB7 0xFF 0xF5 0xFF 0x4E 0x01 0x15 0xF5 0x21 0x0C 0x30 0x00 0xB6 0xFF 0xF7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xD7 0x6E 0x00 0x00 0x00 0x99 0x97 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x19 0x01 0xD1 0xF4 0x19 0x0C 0x41 0x00 0x9B 0xFF 0xF9 0xFF 0x27 0x01 0xE8 0xF4 0x23 0x0C 0x3B 0x00 0xA3 0xFF 0xFE 0xFF 0x3A 0x01 0x0E 0xF5 0x25 0x0C 0x3B 0x00 0xB0 0xFF 0xFA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xD9 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x26 0x01 0xF1 0xF4 0x11 0x0C 0x44 0x00 0x8F 0xFF 0xE7 0xFF 0x21 0x01 0xDF 0xF4 0x04 0x0C 0x4A 0x00 0x95 0xFF 0xEB 0xFF 0x19 0x01 0xD2 0xF4 0x13 0x0C 0x43 0x00 0x9A 0xFF 0xF6 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xDB 0x6E 0x00 0x00 0x00 0x98 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x2C 0x01 0x00 0xF5 0x45 0x0C 0x28 0x00 0x6B 0xFF 0xF8 0xFF 0x2C 0x01 0xFF 0xF4 0x38 0x0C 0x32 0x00 0x80 0xFF 0xEF 0xFF 0x26 0x01 0xF5 0xF4 0x1A 0x0C 0x41 0x00 0x8D 0xFF 0xE7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xDE 0x6E 0x00 0x00 0x00 0x98 0xA7 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x2F 0x01 0x05 0xF5 0x3C 0x0C 0x35 0x00 0x56 0xFF 0xFB 0xFF 0x25 0x01 0xFF 0xF4 0x40 0x0C 0x2B 0x00 0x5A 0xFF 0xFD 0xFF 0x29 0x01 0xFE 0xF4 0x46 0x0C 0x28 0x00 0x67 0xFF 0xF9 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xE0 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x17 0x01 0x13 0xF5 0x1D 0x0C 0x5C 0x00 0x4B 0xFF 0xFA 0xFF 0x2A 0x01 0x18 0xF5 0x41 0x0C 0x43 0x00 0x54 0xFF 0xF6 0xFF 0x30 0x01 0x07 0xF5 0x3C 0x0C 0x38 0x00 0x56 0xFF 0xF9 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xE2 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x47 0x01 0xFC 0xF4 0xEE 0x0B 0x50 0x00 0x54 0xFF 0x13 0x00 0x21 0x01 0xF3 0xF4 0xFD 0x0B 0x67 0x00 0x49 0xFF 0x0C 0x00 0x14 0x01 0x0D 0xF5 0x0E 0x0C 0x63 0x00 0x48 0xFF 0xFB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xE4 0x6E 0x00 0x00 0x00 0x98 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x62 0x01 0x1D 0xF5 0xB3 0x0B 0x52 0x00 0x6A 0xFF 0xFE 0xFF 0x59 0x01 0x15 0xF5 0xCB 0x0B 0x55 0x00 0x5E 0xFF 0x06 0x00 0x4D 0x01 0x03 0xF5 0xE7 0x0B 0x51 0x00 0x56 0xFF 0x10 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xE7 0x6E 0x00 0x00 0x00 0x9A 0x97 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x5F 0x01 0x43 0xF5 0xAE 0x0B 0x39 0x00 0x88 0xFF 0xFA 0xFF 0x60 0x01 0x35 0xF5 0xA8 0x0B 0x47 0x00 0x7B 0xFF 0xF9 0xFF 0x64 0x01 0x22 0xF5 0xAF 0x0B 0x51 0x00 0x6D 0xFF 0xFD 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xE9 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x74 0x01 0x60 0xF5 0xCA 0x0B 0x20 0x00 0x9D 0xFF 0x01 0x00 0x67 0x01 0x4E 0xF5 0xC5 0x0B 0x28 0x00 0x92 0xFF 0xFE 0xFF 0x61 0x01 0x46 0xF5 0xB1 0x0B 0x36 0x00 0x8A 0xFF 0xFB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xEB 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x66 0x01 0x6F 0xF5 0xAD 0x0B 0x24 0x00 0xB5 0xFF 0x06 0x00 0x7D 0x01 0x7B 0xF5 0xD6 0x0B 0x1B 0x00 0xAD 0xFF 0x02 0x00 0x76 0x01 0x64 0xF5 0xCA 0x0B 0x1D 0x00 0xA3 0xFF 0x01 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xED 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x6C 0x01 0x42 0xF5 0xEE 0x0B 0x0C 0x00 0xC4 0xFF 0x16 0x00 0x61 0x01 0x57 0xF5 0xCA 0x0B 0x1D 0x00 0xBE 0xFF 0x14 0x00 0x63 0x01 0x6D 0xF5 0xAB 0x0B 0x27 0x00 0xB6 0xFF 0x09 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF0 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x57 0x01 0x2D 0xF5 0x2E 0x0C 0x08 0x00 0xBD 0xFF 0x01 0x00 0x6B 0x01 0x3E 0xF5 0x0F 0x0C 0x09 0x00 0xC0 0xFF 0x09 0x00 0x6C 0x01 0x40 0xF5 0xF6 0x0B 0x0B 0x00 0xC4 0xFF 0x14 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF2 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x4C 0x01 0x3F 0xF5 0x2E 0x0C 0x18 0x00 0xA8 0xFF 0xFF 0xFF 0x50 0x01 0x3B 0xF5 0x2C 0x0C 0x12 0x00 0xAE 0xFF 0xFC 0xFF 0x53 0x01 0x2A 0xF5 0x32 0x0C 0x07 0x00 0xBC 0xFF 0xFF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xF4 0x6E 0x00 0x00 0x00 0x99 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x6B 0x01 0x3D 0xF5 0x06 0x0C 0x1B 0x00 0xAC 0xFF 0x04 0x00 0x5F 0x01 0x42 0xF5 0x0C 0x0C 0x18 0x00 0xA5 0xFF 0x05 0x00 0x4D 0x01 0x3E 0xF5 0x2B 0x0C 0x18 0x00 0xA7 0xFF 0x01 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF6 0x6E 0x00 0x00 0x00 0x9B 0x87 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x77 0x01 0x40 0xF5 0x05 0x0C 0x1F 0x00 0xC6 0xFF 0xFF 0xFF 0x74 0x01 0x3E 0xF5 0xF9 0x0B 0x26 0x00 0xBA 0xFF 0x02 0x00 0x6C 0x01 0x39 0xF5 0x04 0x0C 0x1C 0x00 0xB2 0xFF 0x04 0x00 +--- Switch Msg --- +Payload: 0xA2 0x10 0x07 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0xF9 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x6E 0x01 0x3F 0xF5 0x13 0x0C 0x1D 0x00 0xC3 0xFF 0xFF 0xFF 0x6E 0x01 0x42 0xF5 0x15 0x0C 0x1E 0x00 0xC8 0xFF 0xFF 0xFF 0x76 0x01 0x41 0xF5 0x09 0x0C 0x1F 0x00 0xC6 0xFF 0xFF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xFB 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x7C 0x01 0x49 0xF5 0x0C 0x0C 0x10 0x00 0xBC 0xFF 0xFD 0xFF 0x7E 0x01 0x45 0xF5 0x11 0x0C 0x18 0x00 0xBE 0xFF 0xFE 0xFF 0x72 0x01 0x41 0xF5 0x11 0x0C 0x1C 0x00 0xC2 0xFF 0xFF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xFD 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x7A 0x01 0x22 0xF5 0xF9 0x0B 0x02 0x00 0xB7 0xFF 0xF4 0xFF 0x80 0x01 0x3A 0xF5 0xFF 0x0B 0x09 0x00 0xB8 0xFF 0xFB 0xFF 0x7C 0x01 0x49 0xF5 0x08 0x0C 0x0F 0x00 0xBA 0xFF 0xFD 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x00 0x6E 0x00 0x00 0x00 0x99 0x97 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x7C 0x01 0x2D 0xF5 0xE4 0x0B 0x00 0x00 0xBA 0xFF 0xE3 0xFF 0x7E 0x01 0x1E 0xF5 0xE6 0x0B 0x03 0x00 0xB9 0xFF 0xEA 0xFF 0x7A 0x01 0x1E 0xF5 0xF6 0x0B 0x01 0x00 0xB6 0xFF 0xF3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x02 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x76 0x01 0x53 0xF5 0x05 0x0C 0xF1 0xFF 0xC2 0xFF 0xD8 0xFF 0x78 0x01 0x4C 0xF5 0xF2 0x0B 0xF8 0xFF 0xBE 0xFF 0xDC 0xFF 0x7B 0x01 0x33 0xF5 0xE5 0x0B 0xFE 0xFF 0xBB 0xFF 0xE1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x04 0x6E 0x00 0x00 0x00 0x9A 0x97 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x69 0x01 0x2F 0xF5 0x17 0x0C 0xE7 0xFF 0xC1 0xFF 0xD2 0xFF 0x6D 0x01 0x3C 0xF5 0x14 0x0C 0xEA 0xFF 0xC1 0xFF 0xD5 0xFF 0x75 0x01 0x51 0xF5 0x09 0x0C 0xEF 0xFF 0xC2 0xFF 0xD7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x09 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x62 0x01 0x29 0xF5 0x0D 0x0C 0xEF 0xFF 0xC3 0xFF 0xC8 0xFF 0x5B 0x01 0x1F 0xF5 0x28 0x0C 0xE5 0xFF 0xC3 0xFF 0xCE 0xFF 0x60 0x01 0x34 0xF5 0x24 0x0C 0xDF 0xFF 0xC5 0xFF 0xCE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x0B 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x59 0x01 0x38 0xF5 0x01 0x0C 0xEC 0xFF 0xD8 0xFF 0xC1 0xFF 0x67 0x01 0x3C 0xF5 0x06 0x0C 0xEF 0xFF 0xCF 0xFF 0xC1 0xFF 0x65 0x01 0x31 0xF5 0x06 0x0C 0xF1 0xFF 0xC5 0xFF 0xC5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x0D 0x6E 0x00 0x00 0x00 0x9A 0x97 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x50 0x01 0x3D 0xF5 0x02 0x0C 0xEF 0xFF 0xE2 0xFF 0xC1 0xFF 0x52 0x01 0x3B 0xF5 0x00 0x0C 0xEE 0xFF 0xDD 0xFF 0xC0 0xFF 0x56 0x01 0x3A 0xF5 0x00 0x0C 0xEC 0xFF 0xD9 0xFF 0xC1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x0F 0x6E 0x00 0x00 0x00 0x99 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x51 0x01 0x2F 0xF5 0x13 0x0C 0xEA 0xFF 0xE1 0xFF 0xC5 0xFF 0x4D 0x01 0x38 0xF5 0x15 0x0C 0xEC 0xFF 0xE5 0xFF 0xC3 0xFF 0x4F 0x01 0x3D 0xF5 0x05 0x0C 0xEF 0xFF 0xE3 0xFF 0xC1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x12 0x6E 0x00 0x00 0x00 0x99 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x57 0x01 0x3B 0xF5 0x0B 0x0C 0xE0 0xFF 0xD6 0xFF 0xC4 0xFF 0x56 0x01 0x39 0xF5 0x0C 0x0C 0xE8 0xFF 0xDA 0xFF 0xC4 0xFF 0x53 0x01 0x30 0xF5 0x10 0x0C 0xEA 0xFF 0xDF 0xFF 0xC4 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x14 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x54 0x01 0x25 0xF5 0x1A 0x0C 0xD3 0xFF 0xC6 0xFF 0xC9 0xFF 0x55 0x01 0x35 0xF5 0x10 0x0C 0xD8 0xFF 0xCE 0xFF 0xC7 0xFF 0x58 0x01 0x3B 0xF5 0x0A 0x0C 0xDD 0xFF 0xD4 0xFF 0xC4 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x16 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x4F 0x01 0x18 0xF5 0x17 0x0C 0xD7 0xFF 0xB7 0xFF 0xC0 0xFF 0x52 0x01 0x17 0xF5 0x1D 0x0C 0xD2 0xFF 0xBD 0xFF 0xC5 0xFF 0x53 0x01 0x21 0xF5 0x1B 0x0C 0xD2 0xFF 0xC4 0xFF 0xC9 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x18 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x6D 0x01 0x3E 0xF5 0x0A 0x0C 0xD4 0xFF 0xB1 0xFF 0xC1 0xFF 0x5C 0x01 0x2F 0xF5 0x0B 0x0C 0xD7 0xFF 0xB2 0xFF 0xBF 0xFF 0x51 0x01 0x1B 0xF5 0x14 0x0C 0xD7 0xFF 0xB6 0xFF 0xC0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x1B 0x6E 0x00 0x00 0x00 0x99 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x75 0x01 0x3D 0xF5 0xFC 0x0B 0xDE 0xFF 0xB8 0xFF 0xC3 0xFF 0x78 0x01 0x3A 0xF5 0x02 0x0C 0xD9 0xFF 0xB3 0xFF 0xC4 0xFF 0x70 0x01 0x3F 0xF5 0x08 0x0C 0xD4 0xFF 0xB0 0xFF 0xC1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x1D 0x6E 0x00 0x00 0x00 0x9A 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x70 0x01 0x3B 0xF5 0xFD 0x0B 0xE9 0xFF 0xC7 0xFF 0xC3 0xFF 0x70 0x01 0x3F 0xF5 0xFE 0x0B 0xE5 0xFF 0xC1 0xFF 0xBF 0xFF 0x74 0x01 0x3F 0xF5 0xFB 0x0B 0xDF 0xFF 0xBA 0xFF 0xC3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x1F 0x6E 0x00 0x00 0x00 0x9A 0xA7 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x73 0x01 0x43 0xF5 0x1E 0x0C 0xE3 0xFF 0xCB 0xFF 0xC4 0xFF 0x72 0x01 0x45 0xF5 0x12 0x0C 0xE7 0xFF 0xC7 0xFF 0xC5 0xFF 0x71 0x01 0x3D 0xF5 0x00 0x0C 0xE9 0xFF 0xC7 0xFF 0xC3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x21 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x79 0x01 0x3D 0xF5 0x10 0x0C 0xE4 0xFF 0xCE 0xFF 0xC5 0xFF 0x73 0x01 0x3D 0xF5 0x15 0x0C 0xE4 0xFF 0xCC 0xFF 0xC5 0xFF 0x73 0x01 0x42 0xF5 0x1E 0x0C 0xE3 0xFF 0xCB 0xFF 0xC4 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x24 0x6E 0x00 0x00 0x00 0x9A 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x78 0x01 0x2C 0xF5 0xF6 0x0B 0xEB 0xFF 0xD5 0xFF 0xC4 0xFF 0x7C 0x01 0x34 0xF5 0xFB 0x0B 0xE7 0xFF 0xCF 0xFF 0xC5 0xFF 0x79 0x01 0x3C 0xF5 0x0E 0x0C 0xE3 0xFF 0xD0 0xFF 0xC5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x26 0x6E 0x00 0x00 0x00 0x9A 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x6D 0x01 0x14 0xF5 0x05 0x0C 0xED 0xFF 0xE6 0xFF 0xC1 0xFF 0x6E 0x01 0x1D 0xF5 0xFE 0x0B 0xED 0xFF 0xDD 0xFF 0xC3 0xFF 0x76 0x01 0x2A 0xF5 0xF6 0x0B 0xEB 0xFF 0xD6 0xFF 0xC4 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x28 0x6E 0x00 0x00 0x00 0x9B 0x87 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x64 0x01 0x22 0xF5 0x01 0x0C 0xE6 0xFF 0xE9 0xFF 0xB4 0xFF 0x65 0x01 0x16 0xF5 0xFB 0x0B 0xEA 0xFF 0xEA 0xFF 0xBA 0xFF 0x6C 0x01 0x13 0xF5 0x05 0x0C 0xED 0xFF 0xE7 0xFF 0xBF 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x08 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x2A 0x6E 0x00 0x00 0x00 0x9A 0x57 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x61 0x01 0x47 0xF5 0x24 0x0C 0xDC 0xFF 0xE6 0xFF 0xB8 0xFF 0x62 0x01 0x37 0xF5 0x12 0x0C 0xDE 0xFF 0xE9 0xFF 0xB3 0xFF 0x65 0x01 0x25 0xF5 0x04 0x0C 0xE4 0xFF 0xEA 0xFF 0xB3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x2D 0x6E 0x00 0x00 0x00 0x99 0x67 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x6C 0x01 0x3A 0xF5 0x00 0x0C 0xDC 0xFF 0xD1 0xFF 0xC4 0xFF 0x63 0x01 0x3F 0xF5 0x28 0x0C 0xDA 0xFF 0xDB 0xFF 0xC0 0xFF 0x60 0x01 0x47 0xF5 0x29 0x0C 0xDC 0xFF 0xE5 0xFF 0xB9 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x2F 0x6E 0x00 0x00 0x00 0x8D 0x97 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x64 0x01 0x2A 0xF5 0xAE 0x0B 0xFE 0xFF 0xFE 0xFF 0xCC 0xFF 0x6E 0x01 0x39 0xF5 0xBE 0x0B 0xE0 0xFF 0xDF 0xFF 0xC8 0xFF 0x6D 0x01 0x3A 0xF5 0xF1 0x0B 0xDC 0xFF 0xD2 0xFF 0xC5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x31 0x6E 0x00 0x00 0x00 0x11 0x77 0x8C 0x00 0x00 0x00 0xB0 +Subcommand: 0x76 0x01 0x09 0xF5 0x38 0x0C 0x1F 0x00 0x1E 0x00 0xC3 0xFF 0x56 0x01 0x1C 0xF5 0xD6 0x0B 0x2D 0x00 0x22 0x00 0xC9 0xFF 0x5D 0x01 0x26 0xF5 0xB3 0x0B 0x0C 0x00 0x08 0x00 0xCD 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x33 0x6E 0x00 0x00 0x00 0xA1 0x25 0x8D 0x00 0x00 0x00 0xB0 +Subcommand: 0xFD 0x00 0x6D 0xF4 0x8A 0x0C 0x28 0x00 0xE5 0xFF 0xA8 0xFF 0x26 0x01 0xB7 0xF4 0x90 0x0C 0x17 0x00 0x0C 0x00 0xC1 0xFF 0x6B 0x01 0xFD 0xF4 0x59 0x0C 0x18 0x00 0x1B 0x00 0xC2 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x36 0x6E 0x00 0x00 0x00 0xAD 0x03 0x91 0x00 0x00 0x00 0xB0 +Subcommand: 0xFD 0x00 0xD3 0xF4 0x3F 0x0C 0xED 0x00 0xE9 0xFF 0x6C 0xFF 0xEC 0x00 0x80 0xF4 0x53 0x0C 0x85 0x00 0xDD 0xFF 0x7F 0xFF 0xF3 0x00 0x62 0xF4 0x86 0x0C 0x37 0x00 0xE2 0xFF 0x9F 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x38 0x6E 0x00 0x00 0x00 0x29 0x03 0x93 0x00 0x00 0x00 0xB0 +Subcommand: 0x87 0x01 0x05 0xF6 0x10 0x0C 0x44 0x00 0xE1 0xFF 0xCF 0xFF 0xEB 0x00 0x30 0xF6 0x44 0x0B 0xE8 0x00 0xD8 0xFF 0x78 0xFF 0x02 0x01 0xEE 0xF4 0x3E 0x0C 0xF6 0x00 0xEA 0xFF 0x6C 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x3A 0x6E 0x00 0x00 0x00 0x20 0x43 0x93 0x00 0x00 0x00 0xB0 +Subcommand: 0x9B 0x01 0x5C 0xF5 0x1D 0x0C 0x42 0x00 0xE1 0xFF 0x06 0x00 0x99 0x01 0xC9 0xF5 0xFD 0x0B 0x5D 0x00 0xDE 0xFF 0x18 0x00 0xA3 0x01 0xED 0xF5 0x22 0x0C 0x17 0x00 0xE6 0xFF 0xE8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x3C 0x6E 0x00 0x00 0x00 0x0E 0x33 0x93 0x00 0x00 0x00 0xB0 +Subcommand: 0x85 0x01 0x28 0xF5 0x25 0x0C 0x0E 0x00 0xDD 0xFF 0xDF 0xFF 0x9B 0x01 0x40 0xF5 0x1E 0x0C 0x28 0x00 0xDC 0xFF 0xE6 0xFF 0x9C 0x01 0x4E 0xF5 0x1B 0x0C 0x3D 0x00 0xDF 0xFF 0xFE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x3F 0x6E 0x00 0x00 0x00 0x0D 0x53 0x93 0x00 0x00 0x00 0xB0 +Subcommand: 0x93 0x01 0x18 0xF5 0x40 0x0C 0x14 0x00 0xE1 0xFF 0xE5 0xFF 0x6E 0x01 0x2F 0xF5 0x29 0x0C 0x02 0x00 0xDE 0xFF 0xE3 0xFF 0x78 0x01 0x31 0xF5 0x19 0x0C 0x0A 0x00 0xDC 0xFF 0xDF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x41 0x6E 0x00 0x00 0x00 0x0C 0x63 0x93 0x00 0x00 0x00 0xB0 +Subcommand: 0xE7 0x01 0x69 0xF5 0x5D 0x0C 0x28 0x00 0xC9 0xFF 0xDD 0xFF 0xB5 0x01 0x5F 0xF5 0x39 0x0C 0x35 0x00 0xDC 0xFF 0xDC 0xFF 0x95 0x01 0x24 0xF5 0x38 0x0C 0x1D 0x00 0xE1 0xFF 0xE4 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x43 0x6E 0x00 0x00 0x00 0x0B 0x13 0x93 0x00 0x00 0x00 0xB0 +Subcommand: 0xE6 0x01 0x67 0xF5 0x38 0x0C 0x3D 0x00 0xBC 0xFF 0xC7 0xFF 0xEA 0x01 0x6F 0xF5 0x42 0x0C 0x3D 0x00 0xBD 0xFF 0xD1 0xFF 0xED 0x01 0x6E 0xF5 0x57 0x0C 0x32 0x00 0xC3 0xFF 0xDB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x46 0x6E 0x00 0x00 0x00 0x0C 0xC3 0x94 0x00 0x00 0x00 0xB0 +Subcommand: 0xB7 0x01 0x51 0xF5 0x14 0x0C 0x37 0x00 0xCA 0xFF 0xAB 0xFF 0xD6 0x01 0x5D 0xF5 0x28 0x0C 0x3A 0x00 0xC1 0xFF 0xB7 0xFF 0xE5 0x01 0x65 0xF5 0x36 0x0C 0x3D 0x00 0xBC 0xFF 0xC3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x48 0x6E 0x00 0x00 0x00 0x44 0xE3 0x94 0x00 0x00 0x00 0xB0 +Subcommand: 0x79 0x01 0xA2 0xF5 0xDD 0x0B 0x1E 0x00 0xF0 0xFF 0xA2 0xFF 0x95 0x01 0x7D 0xF5 0xD9 0x0B 0x32 0x00 0xDE 0xFF 0xA0 0xFF 0xB0 0x01 0x53 0xF5 0x09 0x0C 0x36 0x00 0xCD 0xFF 0xA8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x4A 0x6E 0x00 0x00 0x00 0x77 0xF4 0x94 0x00 0x00 0x00 0xB0 +Subcommand: 0x65 0x01 0xAB 0xF5 0x02 0x0C 0xF0 0xFF 0xFF 0xFF 0xCE 0xFF 0x71 0x01 0xAA 0xF5 0xFC 0x0B 0xFA 0xFF 0xFE 0xFF 0xBD 0xFF 0x75 0x01 0xA6 0xF5 0xE3 0x0B 0x17 0x00 0xF4 0xFF 0xA3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x4C 0x6E 0x00 0x00 0x00 0x4E 0x66 0x93 0x00 0x00 0x00 0xB0 +Subcommand: 0x72 0x01 0xAE 0xF5 0x05 0x0C 0xBD 0xFF 0xF3 0xFF 0xF5 0xFF 0x62 0x01 0xB9 0xF5 0xF7 0x0B 0xD7 0xFF 0xFC 0xFF 0xE2 0xFF 0x63 0x01 0xAD 0xF5 0x01 0x0C 0xEC 0xFF 0xFF 0xFF 0xD2 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x4F 0x6E 0x00 0x00 0x00 0x5E 0x67 0x8B 0x00 0x00 0x00 0xB0 +Subcommand: 0xD0 0x01 0x4E 0xF4 0x03 0x0D 0xBF 0xFF 0xD9 0xFF 0xFA 0xFF 0xD8 0x01 0x26 0xF5 0x73 0x0C 0xA1 0xFF 0xE6 0xFF 0x08 0x00 0x76 0x01 0xAB 0xF5 0x09 0x0C 0xB6 0xFF 0xF0 0xFF 0xFA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x51 0x6E 0x00 0x00 0x00 0x61 0xF7 0x89 0x00 0x00 0x00 0xB0 +Subcommand: 0x1E 0x01 0xA8 0xF4 0xF3 0x0B 0xF8 0xFF 0x9B 0xFF 0x61 0xFF 0x14 0x01 0x4F 0xF4 0x16 0x0C 0x23 0x00 0xAB 0xFF 0x9E 0xFF 0x9C 0x01 0x37 0xF4 0xF4 0x0C 0xCB 0xFF 0xD5 0xFF 0xF5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x53 0x6E 0x00 0x00 0x00 0x60 0x57 0x8A 0x00 0x00 0x00 0xB0 +Subcommand: 0x24 0x01 0x51 0xF5 0x1D 0x0C 0x0C 0x00 0xAD 0xFF 0x7A 0xFF 0x20 0x01 0x14 0xF5 0x29 0x0C 0xFB 0xFF 0xAF 0xFF 0x64 0xFF 0x1F 0x01 0xC6 0xF4 0xFC 0x0B 0xF8 0xFF 0xA0 0xFF 0x60 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x55 0x6E 0x00 0x00 0x00 0x60 0x77 0x8A 0x00 0x00 0x00 0xB0 +Subcommand: 0x69 0x01 0xC7 0xF5 0xE4 0x0B 0xEA 0xFF 0xB2 0xFF 0xA8 0xFF 0x44 0x01 0xA1 0xF5 0xE8 0x0B 0x07 0x00 0xA8 0xFF 0x94 0xFF 0x25 0x01 0x66 0xF5 0x0E 0x0C 0x10 0x00 0xAB 0xFF 0x7E 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x58 0x6E 0x00 0x00 0x00 0x4F 0x67 0x8A 0x00 0x00 0x00 0xB0 +Subcommand: 0x88 0x01 0xD4 0xF5 0x8D 0x0B 0xCB 0xFF 0xE9 0xFF 0xD4 0xFF 0x80 0x01 0xE2 0xF5 0xB4 0x0B 0xD8 0xFF 0xC9 0xFF 0xBF 0xFF 0x6F 0x01 0xCE 0xF5 0xE3 0x0B 0xE2 0xFF 0xB5 0xFF 0xAD 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x09 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x5A 0x6E 0x00 0x00 0x00 0xF0 0xE6 0x8A 0x00 0x00 0x00 0xB0 +Subcommand: 0x3E 0x01 0x94 0xF5 0xC0 0x0B 0xA9 0xFF 0x38 0x00 0xF3 0xFF 0x52 0x01 0xC2 0xF5 0x8B 0x0B 0xB8 0xFF 0x1E 0x00 0xE6 0xFF 0x84 0x01 0xCA 0xF5 0x90 0x0B 0xC7 0xFF 0xF4 0xFF 0xD8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x5C 0x6E 0x00 0x00 0x00 0xA5 0x55 0x8D 0x00 0x00 0x00 0xC0 +Subcommand: 0x31 0x01 0x45 0xF4 0x9C 0x0C 0xE7 0xFF 0x54 0x00 0xF7 0xFF 0x62 0x01 0xE3 0xF4 0x45 0x0C 0xA5 0xFF 0x4F 0x00 0x06 0x00 0x45 0x01 0x7E 0xF5 0xCD 0x0B 0xA2 0xFF 0x3E 0x00 0xF9 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x5E 0x6E 0x00 0x00 0x00 0xF9 0x03 0x90 0x00 0x00 0x00 0xC0 +Subcommand: 0xA5 0x00 0x66 0xF4 0x80 0x0C 0x60 0x00 0x0B 0x00 0x88 0xFF 0xAA 0x00 0x40 0xF4 0x98 0x0C 0x4E 0x00 0x3C 0x00 0xBA 0xFF 0x17 0x01 0x34 0xF4 0x9B 0x0C 0x01 0x00 0x53 0x00 0xEF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x61 0x6E 0x00 0x00 0x00 0x11 0x53 0x92 0x00 0x00 0x00 0xC0 +Subcommand: 0xCF 0x00 0xEE 0xF6 0x37 0x0B 0x51 0x00 0xE1 0xFF 0xC7 0xFF 0x89 0x00 0xA8 0xF5 0xB3 0x0B 0x84 0x00 0xE6 0xFF 0x91 0xFF 0xAA 0x00 0x78 0xF4 0x75 0x0C 0x69 0x00 0x03 0x00 0x88 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x63 0x6E 0x00 0x00 0x00 0xFD 0xA2 0x93 0x00 0x00 0x00 0xC0 +Subcommand: 0x8C 0x01 0x78 0xF5 0x66 0x0C 0x02 0x00 0xFB 0xFF 0x79 0x00 0x91 0x01 0x3C 0xF6 0x47 0x0C 0xCC 0xFF 0xFC 0xFF 0x55 0x00 0x0C 0x01 0xD4 0xF6 0x91 0x0B 0x1A 0x00 0xE9 0xFF 0xE7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x65 0x6E 0x00 0x00 0x00 0xD6 0x32 0x94 0x00 0x00 0x00 0xC0 +Subcommand: 0x9E 0x01 0x11 0xF5 0x4F 0x0C 0x58 0x00 0x04 0x00 0x19 0x00 0xAA 0x01 0x0C 0xF5 0x4D 0x0C 0x37 0x00 0xFA 0xFF 0x41 0x00 0x92 0x01 0x4F 0xF5 0x69 0x0C 0x0C 0x00 0xFA 0xFF 0x73 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x67 0x6E 0x00 0x00 0x00 0xC7 0x52 0x94 0x00 0x00 0x00 0xC0 +Subcommand: 0x8E 0x01 0x28 0xF5 0x89 0x0C 0xE4 0xFF 0xC9 0xFF 0xF7 0xFF 0x7F 0x01 0x08 0xF5 0x94 0x0C 0x06 0x00 0xEB 0xFF 0xFF 0xFF 0x97 0x01 0x10 0xF5 0x60 0x0C 0x5F 0x00 0x07 0x00 0x10 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x6A 0x6E 0x00 0x00 0x00 0xBF 0x42 0x94 0x00 0x00 0x00 0xC0 +Subcommand: 0xD9 0x01 0x4C 0xF5 0x63 0x0C 0x14 0x00 0xBE 0xFF 0xE1 0xFF 0xC6 0x01 0x3A 0xF5 0x6A 0x0C 0xF8 0xFF 0xBE 0xFF 0xF0 0xFF 0x9B 0x01 0x2A 0xF5 0x87 0x0C 0xE5 0xFF 0xC5 0xFF 0xF7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x6C 0x6E 0x00 0x00 0x00 0xBD 0x62 0x94 0x00 0x00 0x00 0xC0 +Subcommand: 0xCD 0x01 0x66 0xF5 0x70 0x0C 0x23 0x00 0xB1 0xFF 0xC6 0xFF 0xDE 0x01 0x67 0xF5 0x6D 0x0C 0x21 0x00 0xB7 0xFF 0xCE 0xFF 0xDD 0x01 0x50 0xF5 0x65 0x0C 0x18 0x00 0xBE 0xFF 0xDD 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x6E 0x6E 0x00 0x00 0x00 0xC0 0xE2 0x94 0x00 0x00 0x00 0xC0 +Subcommand: 0xB4 0x01 0x3F 0xF5 0x6A 0x0C 0x36 0x00 0xAF 0xFF 0xB2 0xFF 0xC2 0x01 0x4E 0xF5 0x70 0x0C 0x29 0x00 0xAF 0xFF 0xBD 0xFF 0xC9 0x01 0x63 0xF5 0x72 0x0C 0x23 0x00 0xB0 0xFF 0xC5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x71 0x6E 0x00 0x00 0x00 0xD1 0xB2 0x94 0x00 0x00 0x00 0xC0 +Subcommand: 0x6C 0x01 0x8F 0xF5 0x00 0x0C 0x42 0x00 0xAB 0xFF 0xA3 0xFF 0x86 0x01 0x44 0xF5 0x59 0x0C 0x43 0x00 0xAC 0xFF 0xA5 0xFF 0xA8 0x01 0x39 0xF5 0x6F 0x0C 0x3A 0x00 0xAE 0xFF 0xAD 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x73 0x6E 0x00 0x00 0x00 0x50 0xD4 0x94 0x00 0x00 0x00 0xC0 +Subcommand: 0x6F 0x01 0xB5 0xF5 0x0B 0x0C 0x18 0x00 0xC5 0xFF 0xD4 0xFF 0x7B 0x01 0xB2 0xF5 0x0C 0x0C 0x22 0x00 0xB9 0xFF 0xBA 0xFF 0x6E 0x01 0x9B 0xF5 0x00 0x0C 0x3E 0x00 0xAC 0xFF 0xA3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x75 0x6E 0x00 0x00 0x00 0xF9 0x55 0x90 0x00 0x00 0x00 0xC0 +Subcommand: 0xAC 0x01 0xCE 0xF5 0xF0 0x0B 0xE3 0xFF 0xC4 0xFF 0xFE 0xFF 0x85 0x01 0xBE 0xF5 0xE4 0x0B 0x07 0x00 0xC2 0xFF 0xEB 0xFF 0x6A 0x01 0xB6 0xF5 0x09 0x0C 0x17 0x00 0xC8 0xFF 0xDA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x77 0x6E 0x00 0x00 0x00 0xAD 0x67 0x8B 0x00 0x00 0x00 0xC0 +Subcommand: 0xEA 0x01 0xFA 0xF3 0xAB 0x0D 0xA1 0xFF 0xAA 0xFF 0x0E 0x00 0xDB 0x01 0x98 0xF5 0x2E 0x0C 0xB2 0xFF 0xBF 0xFF 0x11 0x00 0xB7 0x01 0xCC 0xF5 0xF9 0x0B 0xD9 0xFF 0xC3 0xFF 0x02 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x7A 0x6E 0x00 0x00 0x00 0xAF 0xE7 0x8A 0x00 0x00 0x00 0xC0 +Subcommand: 0x59 0x01 0x90 0xF4 0x99 0x0B 0xD4 0xFF 0x84 0xFF 0x47 0xFF 0x63 0x01 0x31 0xF4 0x68 0x0B 0x22 0x00 0x55 0xFF 0x8A 0xFF 0xB0 0x01 0xB8 0xF3 0x31 0x0D 0xC1 0xFF 0x95 0xFF 0xFB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x7C 0x6E 0x00 0x00 0x00 0xB0 0xC7 0x8A 0x00 0x00 0x00 0xC0 +Subcommand: 0x1D 0x01 0x90 0xF5 0x97 0x0B 0xE5 0xFF 0xB7 0xFF 0x61 0xFF 0x1F 0x01 0x37 0xF5 0xB8 0x0B 0xE0 0xFF 0xB4 0xFF 0x45 0xFF 0x4E 0x01 0xAE 0xF4 0xAB 0x0B 0xB1 0xFF 0x99 0xFF 0x3C 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x7E 0x6E 0x00 0x00 0x00 0x80 0xE7 0x8A 0x00 0x00 0x00 0xC0 +Subcommand: 0x65 0x01 0x36 0xF6 0x16 0x0B 0xDB 0xFF 0x25 0x00 0xAE 0xFF 0x2E 0x01 0xF7 0xF5 0x2C 0x0B 0xE0 0xFF 0xEC 0xFF 0x8B 0xFF 0x1C 0x01 0xA1 0xF5 0x8B 0x0B 0xE3 0xFF 0xC1 0xFF 0x69 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x81 0x6E 0x00 0x00 0x00 0xB5 0xD5 0x94 0x00 0x00 0x00 0xC0 +Subcommand: 0x44 0x01 0x6F 0xF4 0xED 0x0C 0xF1 0xFF 0x7D 0x00 0xD5 0xFF 0x79 0x01 0x95 0xF5 0x01 0x0C 0xC5 0xFF 0x6C 0x00 0xD6 0xFF 0x79 0x01 0x2C 0xF6 0x32 0x0B 0xD1 0xFF 0x35 0x00 0xB7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x83 0x6E 0x00 0x00 0x00 0x2F 0xE3 0x99 0x00 0x00 0x00 0xC0 +Subcommand: 0xA4 0x00 0x86 0xF4 0xAE 0x0C 0x73 0x00 0x1F 0x00 0x45 0xFF 0xE6 0x00 0x00 0xF4 0xD2 0x0C 0x61 0x00 0x4B 0x00 0x8B 0xFF 0x38 0x01 0x34 0xF4 0xFF 0x0C 0x04 0x00 0x7A 0x00 0xCF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x85 0x6E 0x00 0x00 0x00 0x9B 0xF2 0x99 0x00 0x00 0x00 0xC0 +Subcommand: 0x70 0x01 0x7C 0xF7 0xCB 0x0B 0x2D 0x00 0x27 0x00 0xAC 0xFF 0x6D 0x00 0xD7 0xF6 0xF5 0x0A 0x5E 0x00 0xEF 0xFF 0x49 0xFF 0x9C 0x00 0x8C 0xF4 0x85 0x0C 0x70 0x00 0x15 0x00 0x35 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x87 0x6E 0x00 0x00 0x00 0x96 0x02 0x9A 0x00 0x00 0x00 0xC0 +Subcommand: 0x7C 0x01 0x54 0xF5 0x54 0x0C 0x13 0x00 0x29 0x00 0x79 0x00 0x48 0x01 0x08 0xF6 0x6F 0x0C 0x98 0xFF 0x2F 0x00 0x97 0x00 0x86 0x01 0x23 0xF7 0x1C 0x0C 0xEE 0xFF 0x2A 0x00 0xE4 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x0A 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x8A 0x6E 0x00 0x00 0x00 0x96 0xF2 0x99 0x00 0x00 0x00 0xC0 +Subcommand: 0x79 0x01 0xCA 0xF4 0x37 0x0C 0x0B 0x00 0x1C 0x00 0x09 0x00 0xC3 0x01 0xDC 0xF4 0x4A 0x0C 0x09 0x00 0x1C 0x00 0x25 0x00 0x98 0x01 0x31 0xF5 0x52 0x0C 0x1C 0x00 0x26 0x00 0x65 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x8C 0x6E 0x00 0x00 0x00 0x94 0xE2 0x99 0x00 0x00 0x00 0x90 +Subcommand: 0x47 0x01 0xE6 0xF4 0x9C 0x0C 0x12 0x00 0x07 0x00 0xDE 0xFF 0x1F 0x01 0xDD 0xF4 0x59 0x0C 0x39 0x00 0x27 0x00 0xFB 0xFF 0x5E 0x01 0xCE 0xF4 0x34 0x0C 0x0F 0x00 0x1D 0x00 0x04 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x8E 0x6E 0x00 0x00 0x00 0x94 0xF2 0x99 0x00 0x00 0x00 0x90 +Subcommand: 0x7A 0x01 0x43 0xF5 0xAF 0x0C 0x36 0x00 0xB5 0xFF 0xCB 0xFF 0x64 0x01 0x1E 0xF5 0xA9 0x0C 0x18 0x00 0xD2 0xFF 0xCE 0xFF 0x51 0x01 0xEB 0xF4 0xA7 0x0C 0x11 0x00 0xFC 0xFF 0xDA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x91 0x6E 0x00 0x00 0x00 0x94 0xF2 0x99 0x00 0x00 0x00 0x90 +Subcommand: 0xC7 0x01 0x27 0xF5 0xD5 0x0C 0x6B 0x00 0x61 0xFF 0xA8 0xFF 0xAC 0x01 0x2A 0xF5 0xD5 0x0C 0x5A 0x00 0x85 0xFF 0xB8 0xFF 0x89 0x01 0x3D 0xF5 0xBD 0x0C 0x41 0x00 0xAA 0xFF 0xC6 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x93 0x6E 0x00 0x00 0x00 0x93 0x12 0x98 0x00 0x00 0x00 0x90 +Subcommand: 0xB1 0x01 0x3F 0xF5 0xAF 0x0C 0x5D 0x00 0x3A 0xFF 0x83 0xFF 0xD0 0x01 0x35 0xF5 0xBE 0x0C 0x62 0x00 0x48 0xFF 0x94 0xFF 0xCB 0x01 0x29 0xF5 0xD3 0x0C 0x6B 0x00 0x61 0xFF 0xA8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x95 0x6E 0x00 0x00 0x00 0x41 0x53 0x95 0x00 0x00 0x00 0x90 +Subcommand: 0x65 0x01 0xD8 0xF6 0x3D 0x0C 0x41 0x00 0x4C 0xFF 0x9A 0xFF 0x79 0x01 0x4F 0xF6 0x2F 0x0C 0x65 0x00 0x42 0xFF 0x7E 0xFF 0xA2 0x01 0x72 0xF5 0x8B 0x0C 0x68 0x00 0x3B 0xFF 0x7D 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x98 0x6E 0x00 0x00 0x00 0xA3 0xB5 0x94 0x00 0x00 0x00 0x90 +Subcommand: 0xE0 0x01 0xA7 0xF6 0xFB 0x0B 0xD8 0xFF 0x7D 0xFF 0x3A 0x00 0xD3 0x01 0x6F 0xF6 0x32 0x0C 0xE5 0xFF 0x5E 0xFF 0x00 0x00 0x70 0x01 0xDE 0xF6 0x44 0x0C 0x2A 0x00 0x4F 0xFF 0xAE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x9A 0x6E 0x00 0x00 0x00 0xC0 0xD7 0x8D 0x00 0x00 0x00 0x90 +Subcommand: 0x56 0x02 0x18 0xF4 0x7C 0x0F 0x58 0xFF 0x62 0xFF 0xA7 0x00 0xBE 0x01 0x9E 0xF6 0xDA 0x0C 0xA2 0xFF 0x92 0xFF 0x5F 0x00 0xD1 0x01 0xC6 0xF6 0xFE 0x0B 0xDC 0xFF 0x86 0xFF 0x3F 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x9C 0x6E 0x00 0x00 0x00 0xDC 0xB7 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xAD 0x01 0x30 0xF4 0x2B 0x0B 0xBF 0x00 0xCF 0xFE 0x8E 0xFF 0x4B 0x01 0xD0 0xF3 0xEC 0x0B 0xDB 0x00 0xB6 0xFE 0x10 0x00 0x40 0x02 0xBF 0xF3 0x17 0x0F 0xB8 0xFF 0x38 0xFF 0x8C 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x9F 0x6E 0x00 0x00 0x00 0xDC 0xB7 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xE0 0x01 0x2C 0xF6 0x6F 0x0B 0xBE 0xFF 0xA3 0xFF 0x9C 0xFF 0x07 0x02 0x8F 0xF5 0x04 0x0B 0x10 0x00 0x6A 0xFF 0x8B 0xFF 0xFB 0x01 0x77 0xF4 0x04 0x0B 0x77 0x00 0x10 0xFF 0x8A 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA1 0x6E 0x00 0x00 0x00 0xD9 0x87 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xEC 0x01 0x5F 0xF6 0x9E 0x0B 0xA2 0xFF 0xDA 0xFF 0xD9 0xFF 0xE7 0x01 0x78 0xF6 0x8B 0x0B 0xB8 0xFF 0xBC 0xFF 0xB9 0xFF 0xDD 0x01 0x3E 0xF6 0x7D 0x0B 0xAB 0xFF 0xAF 0xFF 0xA1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA3 0x6E 0x00 0x00 0x00 0xD9 0xB7 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x8E 0x01 0x23 0xF5 0x26 0x0C 0x7A 0xFF 0x03 0x00 0xD1 0xFF 0xC7 0x01 0xBD 0xF5 0xD6 0x0B 0x7D 0xFF 0xF8 0xFF 0xE1 0xFF 0xEA 0x01 0x4A 0xF6 0xA6 0x0B 0xA2 0xFF 0xDA 0xFF 0xD9 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA5 0x6E 0x00 0x00 0x00 0xD5 0xC7 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x3E 0x01 0xBB 0xF4 0x5C 0x0C 0xB5 0xFF 0xF6 0xFF 0x99 0xFF 0x58 0x01 0xB8 0xF4 0x5D 0x0C 0x94 0xFF 0xFE 0xFF 0xB0 0xFF 0x81 0x01 0x04 0xF5 0x37 0x0C 0x7E 0xFF 0x03 0x00 0xCA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA8 0x6E 0x00 0x00 0x00 0xD5 0x87 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x38 0x01 0x25 0xF5 0x1A 0x0C 0x25 0x00 0xF0 0xFF 0x8B 0xFF 0x2E 0x01 0xF3 0xF4 0x3F 0x0C 0xF3 0xFF 0xEE 0xFF 0x88 0xFF 0x37 0x01 0xCB 0xF4 0x54 0x0C 0xC7 0xFF 0xF3 0xFF 0x8F 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xAA 0x6E 0x00 0x00 0x00 0xB9 0x77 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x6A 0x01 0x6E 0xF5 0x10 0x0C 0x62 0x00 0xF9 0xFF 0x9D 0xFF 0x4E 0x01 0x56 0xF5 0x02 0x0C 0x4B 0x00 0xF3 0xFF 0x94 0xFF 0x3B 0x01 0x2D 0xF5 0x14 0x0C 0x25 0x00 0xF0 0xFF 0x8B 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xAC 0x6E 0x00 0x00 0x00 0x75 0xA7 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x9E 0x01 0x7C 0xF5 0x1B 0x0C 0x61 0x00 0xEF 0xFF 0x9F 0xFF 0x8A 0x01 0x79 0xF5 0x1A 0x0C 0x6C 0x00 0xF7 0xFF 0xA0 0xFF 0x70 0x01 0x71 0xF5 0x14 0x0C 0x65 0x00 0xF9 0xFF 0x9E 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xAF 0x6E 0x00 0x00 0x00 0x75 0xC7 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xAB 0x01 0x81 0xF5 0x19 0x0C 0x47 0x00 0xFA 0xFF 0x8D 0xFF 0xB0 0x01 0x73 0xF5 0x19 0x0C 0x48 0x00 0xEF 0xFF 0x97 0xFF 0xA5 0x01 0x79 0xF5 0x1C 0x0C 0x5C 0x00 0xEE 0xFF 0x9E 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB1 0x6E 0x00 0x00 0x00 0x75 0x97 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x87 0x01 0x54 0xF5 0x26 0x0C 0x4C 0x00 0x09 0x00 0x83 0xFF 0x9D 0x01 0x5D 0xF5 0x1D 0x0C 0x4C 0x00 0x06 0x00 0x87 0xFF 0xA8 0x01 0x7B 0xF5 0x16 0x0C 0x49 0x00 0xFF 0xFF 0x89 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB3 0x6E 0x00 0x00 0x00 0x76 0x77 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x66 0x01 0xF3 0xF4 0x4B 0x0C 0x83 0x00 0x14 0x00 0x6D 0xFF 0x6F 0x01 0x43 0xF5 0x3F 0x0C 0x5E 0x00 0x0F 0x00 0x74 0xFF 0x83 0x01 0x55 0xF5 0x26 0x0C 0x4F 0x00 0x0A 0x00 0x80 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB6 0x6E 0x00 0x00 0x00 0xA0 0xA7 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0x0E 0x01 0xBA 0xF4 0x3B 0x0C 0xA0 0x01 0x2A 0x00 0x16 0xFF 0x4F 0x01 0x59 0xF4 0x6F 0x0C 0xF3 0x00 0x20 0x00 0x57 0xFF 0x67 0x01 0xD6 0xF4 0x4B 0x0C 0x96 0x00 0x16 0x00 0x6B 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xBA 0x6E 0x00 0x00 0x00 0xE0 0xAA 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xA8 0x01 0xDD 0xF7 0x4A 0x0C 0xDE 0x00 0x3C 0x00 0x5E 0x00 0x7B 0x01 0xD6 0xF7 0x05 0x0C 0x36 0x01 0x45 0x00 0xD9 0xFF 0x68 0x01 0x6D 0xF7 0xF6 0x0B 0x8F 0x01 0x3D 0x00 0x51 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x0B 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0xBC 0x6E 0x00 0x00 0x00 0xE6 0x9B 0x8C 0x00 0x00 0x00 0x90 +Subcommand: 0xFA 0x01 0x32 0xF2 0x3D 0x0E 0x18 0x02 0x1B 0x00 0x89 0x00 0x8B 0x02 0x20 0xF4 0x91 0x0E 0x9A 0x00 0x27 0x00 0xD2 0x00 0xBB 0x01 0xDD 0xF7 0x5F 0x0C 0xC8 0x00 0x38 0x00 0x7A 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xBF 0x6E 0x00 0x00 0x00 0xE9 0x3B 0x88 0x00 0x00 0x00 0xA0 +Subcommand: 0xCE 0x00 0xA6 0xF5 0xD1 0x0C 0xEB 0x02 0xA2 0xFF 0x0F 0xFF 0x0F 0x01 0x61 0xF4 0x6E 0x0C 0x5C 0x04 0xD8 0xFF 0x24 0xFF 0x73 0x01 0x10 0xF3 0xFB 0x0C 0x98 0x03 0x1A 0x00 0x1D 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xC1 0x6E 0x00 0x00 0x00 0xF0 0x5B 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0xE3 0x00 0xAC 0xF6 0x23 0x0D 0xC3 0x01 0x3E 0xFF 0xB6 0xFF 0xBF 0x00 0xA0 0xF6 0x1F 0x0D 0x3E 0x02 0x6E 0xFF 0x62 0xFF 0xC3 0x00 0xE8 0xF5 0xE4 0x0C 0xC8 0x02 0x98 0xFF 0x1E 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC3 0x6E 0x00 0x00 0x00 0xED 0x5B 0x85 0x00 0x00 0x00 0xA0 +Subcommand: 0x68 0x01 0xDF 0xF6 0xCF 0x0C 0x10 0x01 0x15 0xFF 0x14 0x00 0x24 0x01 0xA0 0xF6 0xF7 0x0C 0x57 0x01 0x15 0xFF 0xF6 0xFF 0xEE 0x00 0xA4 0xF6 0x1D 0x0D 0xAB 0x01 0x33 0xFF 0xC6 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC6 0x6E 0x00 0x00 0x00 0xEB 0xCB 0x84 0x00 0x00 0x00 0xA0 +Subcommand: 0xC7 0x01 0xA7 0xF7 0x8A 0x0C 0x1A 0x00 0x4B 0xFF 0x7F 0x00 0xA1 0x01 0x6E 0xF7 0x90 0x0C 0x9A 0x00 0x2E 0xFF 0x41 0x00 0x77 0x01 0xF8 0xF6 0xC4 0x0C 0xFD 0x00 0x19 0xFF 0x1A 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xC8 0x6E 0x00 0x00 0x00 0xE9 0xDB 0x84 0x00 0x00 0x00 0xA0 +Subcommand: 0x01 0x02 0x80 0xF7 0x94 0x0C 0xEB 0xFE 0x9A 0xFF 0x1B 0x01 0xED 0x01 0x9C 0xF7 0xA2 0x0C 0x76 0xFF 0x7E 0xFF 0xE1 0x00 0xCF 0x01 0xA6 0xF7 0x91 0x0C 0xF8 0xFF 0x53 0xFF 0x90 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xCA 0x6E 0x00 0x00 0x00 0xEB 0x8B 0x84 0x00 0x00 0x00 0xA0 +Subcommand: 0x97 0x02 0x51 0xF6 0x39 0x0C 0xBF 0xFD 0xF9 0xFF 0x77 0x01 0x60 0x02 0x2A 0xF7 0x45 0x0C 0x37 0xFE 0xC4 0xFF 0x53 0x01 0x09 0x02 0x72 0xF7 0x8B 0x0C 0xC6 0xFE 0xA1 0xFF 0x26 0x01 +--- Controller Msg --- +Payload: 0xA1 0x30 0xCC 0x6E 0x00 0x00 0x00 0x8E 0x0A 0x85 0x00 0x00 0x00 0xA0 +Subcommand: 0xD9 0x02 0x41 0xF5 0x3B 0x0C 0x41 0xFE 0x94 0x00 0x05 0x01 0xAD 0x02 0xEF 0xF4 0x95 0x0C 0xA4 0xFD 0x60 0x00 0x68 0x01 0x9E 0x02 0xEE 0xF5 0x4B 0x0C 0xA5 0xFD 0x0A 0x00 0x7C 0x01 +--- Controller Msg --- +Payload: 0xA1 0x30 0xCF 0x6E 0x00 0x00 0x00 0xD5 0xB8 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x1B 0x02 0x08 0xF6 0x32 0x0C 0x92 0xFE 0xB8 0x00 0x65 0x00 0x8A 0x02 0x98 0xF5 0xEE 0x0B 0xCB 0xFE 0xB5 0x00 0x8F 0x00 0xD8 0x02 0x56 0xF5 0x14 0x0C 0x70 0xFE 0x9F 0x00 0xE7 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xD1 0x6E 0x00 0x00 0x00 0x97 0x37 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xB1 0x01 0x38 0xF7 0x57 0x0C 0xAB 0xFE 0x7D 0x00 0xA8 0x00 0xD7 0x01 0xBC 0xF6 0x63 0x0C 0x98 0xFE 0x99 0x00 0x7B 0x00 0x05 0x02 0x2E 0xF6 0x41 0x0C 0x92 0xFE 0xB2 0x00 0x68 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xD3 0x6E 0x00 0x00 0x00 0x7F 0x37 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xDF 0x01 0xC9 0xF6 0x8E 0x0C 0xA6 0xFE 0x49 0x00 0x43 0x01 0x8D 0x01 0x67 0xF7 0x49 0x0C 0xA5 0xFE 0x5F 0x00 0xFA 0x00 0x97 0x01 0x5C 0xF7 0x47 0x0C 0xAF 0xFE 0x77 0x00 0xB6 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xD5 0x6E 0x00 0x00 0x00 0x7D 0x37 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x59 0x01 0xE2 0xF4 0x79 0x0C 0x0F 0xFF 0x16 0x00 0x34 0x01 0xA5 0x01 0x9D 0xF5 0x81 0x0C 0xEE 0xFE 0x32 0x00 0x68 0x01 0xE0 0x01 0x8F 0xF6 0x91 0x0C 0xB0 0xFE 0x44 0x00 0x53 0x01 +--- Controller Msg --- +Payload: 0xA1 0x30 0xD8 0x6E 0x00 0x00 0x00 0x7B 0x37 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x13 0x01 0x35 0xF4 0xA0 0x0C 0x45 0xFF 0xF0 0xFF 0x74 0x00 0x26 0x01 0x70 0xF4 0x7E 0x0C 0x2A 0xFF 0xFD 0xFF 0xC8 0x00 0x4B 0x01 0xC0 0xF4 0x77 0x0C 0x14 0xFF 0x11 0x00 0x1F 0x01 +--- Controller Msg --- +Payload: 0xA1 0x30 0xDA 0x6E 0x00 0x00 0x00 0x7B 0x37 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x80 0x00 0x87 0xF3 0xCD 0x0C 0xE2 0xFF 0xE4 0xFF 0xE4 0xFF 0xD1 0x00 0xAF 0xF3 0xFE 0x0C 0x86 0xFF 0xE9 0xFF 0x25 0x00 0x0B 0x01 0x1A 0xF4 0xAD 0x0C 0x50 0xFF 0xEE 0xFF 0x63 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xDC 0x6E 0x00 0x00 0x00 0x7C 0x17 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x6B 0x00 0xD9 0xF2 0xBE 0x0B 0xFE 0x00 0x18 0x00 0x47 0xFF 0x52 0x00 0x25 0xF3 0x35 0x0C 0x77 0x00 0xEF 0xFF 0x92 0xFF 0x6E 0x00 0x7C 0xF3 0xAC 0x0C 0x00 0x00 0xE3 0xFF 0xD3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xDE 0x6E 0x00 0x00 0x00 0x97 0xE7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x86 0xFF 0xAC 0xF2 0xA3 0x0B 0x78 0x02 0xB2 0x00 0x69 0xFE 0x10 0x00 0x91 0xF2 0x87 0x0B 0xEA 0x01 0x79 0x00 0xC2 0xFE 0x69 0x00 0xCE 0xF2 0xA4 0x0B 0x21 0x01 0x24 0x00 0x34 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xE1 0x6E 0x00 0x00 0x00 0x1E 0x58 0x7D 0x00 0x00 0x00 0xA0 +Subcommand: 0x22 0x00 0x55 0xF5 0x9F 0x0B 0xD9 0x02 0xA6 0x00 0xF2 0xFD 0x9E 0xFF 0xB6 0xF3 0xAC 0x0B 0xF1 0x02 0xBC 0x00 0x08 0xFE 0x71 0xFF 0xC5 0xF2 0xAE 0x0B 0x98 0x02 0xB8 0x00 0x51 0xFE +--- Controller Msg --- +Payload: 0xA1 0x30 0xE3 0x6E 0x00 0x00 0x00 0x4D 0xE9 0x6C 0x00 0x00 0x00 0xA0 +Subcommand: 0x60 0x00 0x95 0xF7 0x09 0x0C 0x59 0x01 0x3E 0x00 0xFB 0xFE 0x59 0x00 0x0B 0xF7 0xB8 0x0B 0x12 0x02 0x7A 0x00 0x56 0xFE 0x35 0x00 0xC1 0xF5 0xA7 0x0B 0xC0 0x02 0x9F 0x00 0xF5 0xFD +--- Controller Msg --- +Payload: 0xA1 0x30 0xE5 0x6E 0x00 0x00 0x00 0x94 0xAA 0x60 0x00 0x00 0x00 0xA0 +Subcommand: 0xA8 0x00 0x56 0xF7 0xA3 0x0D 0x4C 0x00 0x7C 0xFF 0x1F 0x00 0x7B 0x00 0xC8 0xF7 0xEA 0x0C 0xB0 0x00 0xDD 0xFF 0xBC 0xFF 0x63 0x00 0xAC 0xF7 0x2C 0x0C 0x2C 0x01 0x2E 0x00 0x28 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xE7 0x6E 0x00 0x00 0x00 0xA4 0x5A 0x60 0x00 0x00 0x00 0xA0 +Subcommand: 0xF6 0x00 0xDC 0xF4 0x77 0x0D 0x19 0x01 0xD2 0xFE 0x1D 0x00 0xE5 0x00 0x98 0xF4 0x7C 0x0E 0x56 0x00 0x14 0xFF 0x4F 0x00 0xB6 0x00 0x07 0xF7 0xCD 0x0D 0x46 0x00 0x66 0xFF 0x2D 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xEA 0x6E 0x00 0x00 0x00 0xA6 0x3A 0x60 0x00 0x00 0x00 0xA0 +Subcommand: 0xC9 0x00 0x89 0xF6 0x3D 0x0C 0x05 0x01 0xBB 0xFE 0xDA 0xFF 0xB0 0x00 0xEF 0xF5 0xB8 0x0C 0x22 0x01 0xAE 0xFE 0xAF 0xFF 0xEB 0x00 0x0F 0xF5 0x48 0x0D 0x44 0x01 0xC7 0xFE 0xFD 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x0C 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0xEC 0x6E 0x00 0x00 0x00 0xC7 0x5A 0x60 0x00 0x00 0x00 0xA0 +Subcommand: 0xCA 0x01 0xF3 0xF6 0x71 0x0C 0x98 0x00 0x1E 0xFF 0x49 0x00 0x59 0x01 0xD0 0xF6 0x2B 0x0C 0xDB 0x00 0xF4 0xFE 0x2B 0x00 0xDF 0x00 0x9D 0xF6 0x2D 0x0C 0x04 0x01 0xC1 0xFE 0xEA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xEE 0x6E 0x00 0x00 0x00 0xDF 0x7A 0x60 0x00 0x00 0x00 0xC0 +Subcommand: 0x6D 0x02 0x03 0xF7 0xDC 0x0C 0xD0 0xFF 0x45 0xFF 0x5E 0x00 0x3D 0x02 0x04 0xF7 0xD6 0x0C 0x23 0x00 0x33 0xFF 0x5A 0x00 0xE2 0x01 0xF9 0xF6 0x87 0x0C 0x80 0x00 0x22 0xFF 0x4D 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF1 0x6E 0x00 0x00 0x00 0xE0 0x5A 0x61 0x00 0x00 0x00 0xC0 +Subcommand: 0x48 0x02 0xBE 0xF6 0x60 0x0C 0x3B 0xFF 0xC5 0xFF 0x3B 0x00 0x6E 0x02 0xE6 0xF6 0x74 0x0C 0x73 0xFF 0x83 0xFF 0x4F 0x00 0x75 0x02 0x00 0xF7 0xBD 0x0C 0xAF 0xFF 0x54 0xFF 0x5B 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF3 0x6E 0x00 0x00 0x00 0xDF 0x9A 0x68 0x00 0x00 0x00 0xC0 +Subcommand: 0xEC 0x01 0x2D 0xF6 0xAF 0x0C 0xF3 0xFE 0x41 0x00 0x0B 0x00 0x03 0x02 0x68 0xF6 0x90 0x0C 0x04 0xFF 0x16 0x00 0x21 0x00 0x3B 0x02 0xB2 0xF6 0x64 0x0C 0x2D 0xFF 0xD7 0xFF 0x36 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF5 0x6E 0x00 0x00 0x00 0xCB 0x7A 0x79 0x00 0x00 0x00 0xC0 +Subcommand: 0xCF 0x01 0xFE 0xF5 0xDE 0x0C 0xFD 0xFE 0x68 0x00 0xD4 0xFF 0xE7 0x01 0xF8 0xF5 0xD8 0x0C 0xF6 0xFE 0x5F 0x00 0xEA 0xFF 0xEC 0x01 0x21 0xF6 0xB6 0x0C 0xF3 0xFE 0x48 0x00 0x04 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF7 0x6E 0x00 0x00 0x00 0x44 0xAA 0x80 0x00 0x00 0x00 0xC0 +Subcommand: 0x33 0x02 0xCC 0xF5 0x3F 0x0D 0x1F 0xFF 0x59 0x00 0xB6 0xFF 0xE8 0x01 0xEE 0xF5 0x08 0x0D 0x06 0xFF 0x61 0x00 0xC3 0xFF 0xCB 0x01 0x04 0xF6 0xDE 0x0C 0x00 0xFF 0x67 0x00 0xD0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xFA 0x6E 0x00 0x00 0x00 0x10 0x59 0x83 0x00 0x00 0x00 0xC0 +Subcommand: 0x32 0x01 0xDE 0xF5 0x16 0x0D 0x8F 0xFF 0x3B 0x00 0x76 0xFF 0x8A 0x01 0xBC 0xF5 0x34 0x0D 0x6D 0xFF 0x4C 0x00 0x91 0xFF 0x17 0x02 0xBD 0xF5 0x4A 0x0D 0x36 0xFF 0x56 0x00 0xAE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xFC 0x6E 0x00 0x00 0x00 0x9D 0x58 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x17 0x01 0xAB 0xF5 0xEF 0x0C 0xD9 0xFF 0x28 0x00 0x85 0xFF 0x04 0x01 0xE9 0xF5 0x13 0x0D 0xAE 0xFF 0x2A 0x00 0x77 0xFF 0x24 0x01 0xE8 0xF5 0x13 0x0D 0x94 0xFF 0x37 0x00 0x75 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xFE 0x6E 0x00 0x00 0x00 0x91 0x08 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xE5 0x00 0x0F 0xF5 0xCB 0x0C 0x82 0x00 0x6B 0x00 0x67 0xFF 0x14 0x01 0x2A 0xF5 0xCB 0x0C 0x37 0x00 0x4D 0x00 0x81 0xFF 0x1E 0x01 0x91 0xF5 0xE5 0x0C 0xEA 0xFF 0x2D 0x00 0x87 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x01 0x6E 0x00 0x00 0x00 0x8F 0x18 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xB5 0x00 0x31 0xF5 0xC1 0x0C 0x97 0x00 0x44 0x00 0x48 0xFF 0xB0 0x00 0x1B 0xF5 0xD0 0x0C 0x9A 0x00 0x62 0x00 0x4B 0xFF 0xD6 0x00 0x12 0xF5 0xCE 0x0C 0x91 0x00 0x70 0x00 0x5F 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x03 0x6E 0x00 0x00 0x00 0x94 0xF8 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xBC 0x00 0xB7 0xF5 0xC3 0x0C 0x80 0x00 0x05 0x00 0x69 0xFF 0xBB 0x00 0x7D 0xF5 0xB3 0x0C 0x98 0x00 0x24 0x00 0x56 0xFF 0xBA 0x00 0x46 0xF5 0xB9 0x0C 0x99 0x00 0x38 0x00 0x4B 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x05 0x6E 0x00 0x00 0x00 0xA1 0xF8 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xF2 0x00 0xF5 0xF5 0xE1 0x0C 0x3D 0x00 0x9E 0xFF 0xAA 0xFF 0xD3 0x00 0xD6 0xF5 0xED 0x0C 0x58 0x00 0xCD 0xFF 0x8D 0xFF 0xBF 0x00 0xBF 0xF5 0xCC 0x0C 0x78 0x00 0xFA 0xFF 0x70 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x08 0x6E 0x00 0x00 0x00 0xB3 0x18 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x22 0x01 0x12 0xF6 0xA2 0x0C 0x16 0x00 0x64 0xFF 0xDD 0xFF 0x18 0x01 0x0B 0xF6 0xB9 0x0C 0x20 0x00 0x75 0xFF 0xCA 0xFF 0xFA 0x00 0xFC 0xF5 0xDA 0x0C 0x37 0x00 0x92 0xFF 0xB0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x0A 0x6E 0x00 0x00 0x00 0xB6 0x18 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x4A 0x01 0x2B 0xF6 0x8E 0x0C 0xFF 0xFF 0x4D 0xFF 0x06 0x00 0x2E 0x01 0x15 0xF6 0xA1 0x0C 0x0A 0x00 0x57 0xFF 0xF5 0xFF 0x23 0x01 0x12 0xF6 0xA0 0x0C 0x15 0x00 0x60 0xFF 0xE2 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x0C 0x6E 0x00 0x00 0x00 0xB5 0x88 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x83 0x01 0x67 0xF6 0x8F 0x0C 0xC9 0xFF 0x60 0xFF 0x2E 0x00 0x71 0x01 0x63 0xF6 0x75 0x0C 0xE5 0xFF 0x51 0xFF 0x19 0x00 0x54 0x01 0x36 0xF6 0x85 0x0C 0xFA 0xFF 0x4D 0xFF 0x0A 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x0E 0x6E 0x00 0x00 0x00 0x62 0x38 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xC4 0x01 0x21 0xF6 0xC7 0x0C 0xA1 0xFF 0x6D 0xFF 0x3E 0x00 0xA0 0x01 0x56 0xF6 0xA7 0x0C 0xB1 0xFF 0x69 0xFF 0x3E 0x00 0x89 0x01 0x62 0xF6 0x99 0x0C 0xC3 0xFF 0x62 0xFF 0x32 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x11 0x6E 0x00 0x00 0x00 0xDE 0x57 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xBF 0x01 0x2A 0xF6 0x77 0x0C 0x83 0xFF 0x76 0xFF 0x11 0x00 0xC4 0x01 0x12 0xF6 0xA0 0x0C 0x99 0xFF 0x71 0xFF 0x2B 0x00 0xC7 0x01 0x16 0xF6 0xC7 0x0C 0x9C 0xFF 0x6F 0xFF 0x3D 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x17 0x6E 0x00 0x00 0x00 0x79 0x37 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x4B 0x01 0x2B 0xF6 0x91 0x0C 0xC5 0xFE 0xBC 0xFF 0x24 0x00 0x2E 0x01 0x8F 0xF6 0x4E 0x0C 0xFB 0xFE 0xC3 0xFF 0x0E 0x00 0x89 0x01 0x5C 0xF6 0x5F 0x0C 0x13 0xFF 0xC7 0xFF 0x1B 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x1A 0x6E 0x00 0x00 0x00 0x79 0x47 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x48 0x01 0x58 0xF5 0xB6 0x0C 0x02 0xFF 0x9E 0xFF 0x35 0x00 0x45 0x01 0xC0 0xF5 0xAD 0x0C 0xEE 0xFE 0xAB 0xFF 0x39 0x00 0x4D 0x01 0x18 0xF6 0x9A 0x0C 0xB7 0xFE 0xBA 0xFF 0x2C 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x1C 0x6E 0x00 0x00 0x00 0x77 0x57 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x03 0x01 0x15 0xF6 0xCE 0x0C 0x69 0xFF 0x87 0xFF 0x0C 0x00 0x34 0x01 0x41 0xF5 0xC8 0x0C 0x22 0xFF 0x8E 0xFF 0x1A 0x00 0x47 0x01 0x44 0xF5 0xB3 0x0C 0x06 0xFF 0x9A 0xFF 0x31 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x1E 0x6E 0x00 0x00 0x00 0x7B 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x7A 0x01 0x0D 0xF5 0x40 0x0C 0xD9 0xFF 0xAD 0xFF 0x43 0x00 0x53 0x01 0xB2 0xF5 0x40 0x0C 0xDA 0xFF 0x92 0xFF 0x3A 0x00 0x09 0x01 0x24 0xF6 0xA5 0x0C 0x84 0xFF 0x85 0xFF 0x0D 0x00 +--- Switch Msg --- +Payload: 0xA2 0x10 0x0D 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x20 0x6E 0x00 0x00 0x00 0x75 0x37 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x23 0x01 0x8B 0xF4 0x5E 0x0C 0xAA 0xFF 0xBE 0xFF 0xDE 0xFF 0x57 0x01 0xA6 0xF4 0x40 0x0C 0xC9 0xFF 0xB6 0xFF 0x14 0x00 0x77 0x01 0xF3 0xF4 0x3E 0x0C 0xD2 0xFF 0xB4 0xFF 0x41 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x23 0x6E 0x00 0x00 0x00 0x76 0x77 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xB5 0x00 0x33 0xF5 0x28 0x0C 0xB9 0xFF 0xE6 0xFF 0xAA 0xFF 0xC9 0x00 0x10 0xF5 0x38 0x0C 0x9F 0xFF 0xCC 0xFF 0xA9 0xFF 0x10 0x01 0x9E 0xF4 0x5F 0x0C 0xA6 0xFF 0xC0 0xFF 0xD1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x25 0x6E 0x00 0x00 0x00 0x77 0x47 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x25 0x01 0xA7 0xF4 0x02 0x0C 0x58 0x00 0x3E 0x00 0xB3 0xFF 0xFC 0x00 0xDC 0xF4 0x17 0x0C 0xFF 0xFF 0x12 0x00 0xC0 0xFF 0xBE 0x00 0x29 0xF5 0x25 0x0C 0xC1 0xFF 0xEE 0xFF 0xB0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x27 0x6E 0x00 0x00 0x00 0x77 0x57 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xFE 0x00 0xE5 0xF4 0x03 0x0C 0xF5 0x00 0x95 0x00 0x6D 0xFF 0x16 0x01 0xBA 0xF4 0xFA 0x0B 0xC0 0x00 0x74 0x00 0x89 0xFF 0x27 0x01 0xA4 0xF4 0xFD 0x0B 0x70 0x00 0x49 0x00 0xAE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x29 0x6E 0x00 0x00 0x00 0x76 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xF7 0x00 0xD9 0xF4 0x86 0x0C 0x53 0x01 0xB7 0x00 0x53 0xFF 0xFE 0x00 0xE8 0xF4 0x36 0x0C 0x24 0x01 0xAE 0x00 0x62 0xFF 0xFC 0x00 0xE9 0xF4 0x08 0x0C 0xFE 0x00 0x9A 0x00 0x6B 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x2C 0x6E 0x00 0x00 0x00 0x76 0x47 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x09 0x01 0x43 0xF5 0xD8 0x0C 0x8D 0x01 0x7B 0x00 0x2B 0xFF 0xE7 0x00 0x14 0xF5 0xAB 0x0C 0x87 0x01 0xA4 0x00 0x3A 0xFF 0xF0 0x00 0xDB 0xF4 0x90 0x0C 0x5F 0x01 0xB6 0x00 0x4F 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x2E 0x6E 0x00 0x00 0x00 0x90 0x47 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x45 0x01 0x92 0xF5 0xD5 0x0C 0x85 0x01 0x13 0x00 0x1E 0xFF 0x3B 0x01 0x52 0xF5 0xE4 0x0C 0x87 0x01 0x41 0x00 0x2A 0xFF 0x14 0x01 0x46 0xF5 0xE0 0x0C 0x8A 0x01 0x72 0x00 0x2A 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x30 0x6E 0x00 0x00 0x00 0xC1 0xC8 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x5C 0x01 0x4A 0xF7 0xD9 0x0C 0x1B 0x01 0xCD 0xFF 0x42 0xFF 0x36 0x01 0xA1 0xF6 0xBA 0x0C 0x60 0x01 0xE9 0xFF 0x1A 0xFF 0x42 0x01 0xBC 0xF5 0xCA 0x0C 0x81 0x01 0x0A 0x00 0x1B 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x32 0x6E 0x00 0x00 0x00 0xB6 0xAA 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0xEC 0x01 0x98 0xF7 0x66 0x0C 0xB9 0x00 0xBC 0xFF 0xC8 0xFF 0xC3 0x01 0x9C 0xF7 0xAB 0x0C 0xE1 0x00 0xB6 0xFF 0x93 0xFF 0x6A 0x01 0x61 0xF7 0xD8 0x0C 0x0D 0x01 0xC7 0xFF 0x52 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x35 0x6E 0x00 0x00 0x00 0xD7 0x9B 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x1F 0x02 0x31 0xF3 0xF6 0x0D 0x0C 0x01 0xFB 0xFF 0xC0 0xFF 0x4B 0x02 0xC6 0xF5 0x77 0x0D 0x85 0x00 0xE3 0xFF 0xF1 0xFF 0xEC 0x01 0x8E 0xF7 0x5C 0x0C 0xAD 0x00 0xC2 0xFF 0xD3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x37 0x6E 0x00 0x00 0x00 0xE3 0x8B 0x8C 0x00 0x00 0x00 0xC0 +Subcommand: 0x89 0x00 0x52 0xF6 0x32 0x0E 0x39 0x01 0x63 0xFF 0x5C 0xFE 0xBD 0x00 0x2F 0xF5 0x51 0x0D 0x2B 0x02 0xAC 0xFF 0x76 0xFE 0xC6 0x01 0x8D 0xF3 0x7C 0x0D 0x8C 0x01 0xEF 0xFF 0x64 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x39 0x6E 0x00 0x00 0x00 0xE4 0x6B 0x8A 0x00 0x00 0x00 0xC0 +Subcommand: 0xF0 0x00 0x8A 0xF7 0x6C 0x0D 0x18 0x01 0xD9 0xFE 0x2E 0xFF 0xA3 0x00 0x59 0xF7 0xEF 0x0D 0x37 0x01 0xFF 0xFE 0xD3 0xFE 0x87 0x00 0x96 0xF6 0x3C 0x0E 0x3B 0x01 0x4C 0xFF 0x72 0xFE +--- Controller Msg --- +Payload: 0xA1 0x30 0x3B 0x6E 0x00 0x00 0x00 0xE2 0xCB 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x86 0x01 0xB6 0xF7 0x83 0x0C 0x89 0x00 0xF9 0xFE 0xBD 0xFF 0x4B 0x01 0xA8 0xF7 0xB0 0x0C 0xE0 0x00 0xDA 0xFE 0x83 0xFF 0x03 0x01 0x8D 0xF7 0x45 0x0D 0x0D 0x01 0xD6 0xFE 0x41 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x3E 0x6E 0x00 0x00 0x00 0xE1 0x7B 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xB2 0x01 0x5C 0xF7 0xBC 0x0C 0xA2 0xFF 0x53 0xFF 0x26 0x00 0xB0 0x01 0x7D 0xF7 0xB2 0x0C 0x00 0x00 0x2F 0xFF 0x02 0x00 0x92 0x01 0xB0 0xF7 0x8A 0x0C 0x6F 0x00 0x03 0xFF 0xCB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x40 0x6E 0x00 0x00 0x00 0xDE 0xBB 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xBE 0x01 0x73 0xF7 0xBF 0x0C 0x9D 0xFE 0x97 0xFF 0x72 0x00 0xA7 0x01 0x8F 0xF7 0xA8 0x0C 0xFE 0xFE 0x81 0xFF 0x53 0x00 0xB1 0x01 0x5D 0xF7 0xBA 0x0C 0x89 0xFF 0x5B 0xFF 0x2D 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x42 0x6E 0x00 0x00 0x00 0xC0 0x6A 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x25 0x02 0x23 0xF5 0x56 0x0D 0x7A 0xFE 0xD0 0xFF 0x75 0x00 0x1C 0x02 0xED 0xF5 0x65 0x0D 0x25 0xFE 0xC1 0xFF 0xA5 0x00 0xD1 0x01 0x3B 0xF7 0xE0 0x0C 0x7B 0xFE 0x9F 0xFF 0x7E 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x44 0x6E 0x00 0x00 0x00 0xB8 0xD8 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xC1 0x01 0xCC 0xF5 0xA3 0x0C 0xD1 0xFE 0xC8 0xFF 0xD5 0xFF 0xEF 0x01 0x3F 0xF5 0xEA 0x0C 0xD0 0xFE 0xCB 0xFF 0x07 0x00 0x1E 0x02 0x11 0xF5 0x41 0x0D 0x99 0xFE 0xD3 0xFF 0x64 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x47 0x6E 0x00 0x00 0x00 0x7A 0xC7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xED 0x00 0x46 0xF9 0x57 0x0B 0x75 0xFE 0xC1 0xFF 0x0F 0x00 0x67 0x01 0xDD 0xF6 0x25 0x0C 0xC1 0xFE 0xC6 0xFF 0xDD 0xFF 0xB7 0x01 0xE9 0xF5 0x99 0x0C 0xCE 0xFE 0xC8 0xFF 0xD5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x49 0x6E 0x00 0x00 0x00 0x79 0xA7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x4B 0x02 0x9F 0xF6 0x21 0x0D 0x52 0xFD 0x8F 0xFF 0x76 0x01 0xF4 0x01 0x12 0xF8 0xE0 0x0C 0x47 0xFD 0xA7 0xFF 0xE4 0x00 0x0D 0x01 0x50 0xF9 0x9D 0x0B 0x2F 0xFE 0xBD 0xFF 0x2F 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x4B 0x6E 0x00 0x00 0x00 0x79 0xA7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xE2 0x01 0xB5 0xF4 0x9B 0x0C 0x6E 0xFE 0x7A 0xFF 0xD6 0x00 0x1A 0x02 0x33 0xF5 0xD3 0x0C 0x0B 0xFE 0x80 0xFF 0x5B 0x01 0x48 0x02 0x43 0xF6 0x1A 0x0D 0x87 0xFD 0x8B 0xFF 0x85 0x01 +--- Controller Msg --- +Payload: 0xA1 0x30 0x4D 0x6E 0x00 0x00 0x00 0x79 0xA7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x4E 0x01 0x54 0xF5 0x6B 0x0C 0x80 0xFF 0xAD 0xFF 0x6D 0x00 0x4E 0x01 0x5E 0xF5 0xEC 0x0C 0xDC 0xFE 0x8E 0xFF 0x76 0x00 0xCE 0x01 0xB5 0xF4 0xA3 0x0C 0x7F 0xFE 0x7D 0xFF 0xBF 0x00 +--- Switch Msg --- +Payload: 0xA2 0x10 0x0E 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x50 0x6E 0x00 0x00 0x00 0x79 0xC7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xAE 0x01 0x63 0xF4 0xF6 0x0B 0xE8 0xFF 0xF2 0xFF 0x29 0x00 0xAB 0x01 0x83 0xF4 0x0C 0x0C 0xE8 0xFF 0xE6 0xFF 0x67 0x00 0x6D 0x01 0x10 0xF5 0x2F 0x0C 0xC9 0xFF 0xC3 0xFF 0x7D 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x52 0x6E 0x00 0x00 0x00 0x7A 0xC7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x09 0x01 0x44 0xF5 0x3D 0x0C 0xDC 0xFF 0xFE 0xFF 0xBC 0xFF 0x5C 0x01 0xC4 0xF4 0x25 0x0C 0xDF 0xFF 0xF8 0xFF 0xE8 0xFF 0xA8 0x01 0x68 0xF4 0xF7 0x0B 0xE9 0xFF 0xF3 0xFF 0x18 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x54 0x6E 0x00 0x00 0x00 0x7A 0xA7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x20 0x01 0x5B 0xF5 0x0A 0x0C 0x0B 0x00 0x0B 0x00 0xD5 0xFF 0x00 0x01 0x7A 0xF5 0x28 0x0C 0xF1 0xFF 0xFC 0xFF 0xC6 0xFF 0x00 0x01 0x59 0xF5 0x3B 0x0C 0xDC 0xFF 0xFE 0xFF 0xBC 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x57 0x6E 0x00 0x00 0x00 0x79 0xB7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x31 0x01 0xD1 0xF4 0x93 0x0B 0x5B 0x00 0x54 0x00 0xC9 0xFF 0x3D 0x01 0x1D 0xF5 0xBF 0x0B 0x37 0x00 0x30 0x00 0xDA 0xFF 0x28 0x01 0x50 0xF5 0xFE 0x0B 0x15 0x00 0x12 0x00 0xD8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x59 0x6E 0x00 0x00 0x00 0x7A 0xD7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0xE2 0x00 0xEC 0xF4 0xBF 0x0B 0xD1 0x00 0xAE 0x00 0x72 0xFF 0x02 0x01 0xBE 0xF4 0x91 0x0B 0xA0 0x00 0x8C 0x00 0x9A 0xFF 0x2A 0x01 0xC3 0xF4 0x8C 0x0B 0x64 0x00 0x5F 0x00 0xC3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x5B 0x6E 0x00 0x00 0x00 0x79 0xD7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0xC3 0x00 0x99 0xF5 0xA1 0x0C 0xEB 0x00 0xA0 0x00 0x60 0xFF 0xC7 0x00 0x4F 0xF5 0x2E 0x0C 0xEB 0x00 0xB3 0x00 0x58 0xFF 0xDB 0x00 0xFE 0xF4 0xCD 0x0B 0xDC 0x00 0xB5 0x00 0x68 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x5D 0x6E 0x00 0x00 0x00 0x79 0xD7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x08 0x01 0xE0 0xF5 0xB1 0x0C 0xE7 0x00 0x23 0x00 0x8F 0xFF 0xE1 0x00 0xD6 0xF5 0xC5 0x0C 0xEC 0x00 0x5D 0x00 0x7C 0xFF 0xC5 0x00 0xA9 0xF5 0xB2 0x0C 0xEC 0x00 0x93 0x00 0x66 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x60 0x6E 0x00 0x00 0x00 0x7F 0xC7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x39 0x01 0xD8 0xF5 0x88 0x0C 0x44 0x01 0x2C 0x00 0x8D 0xFF 0x2F 0x01 0xCE 0xF5 0x86 0x0C 0x0C 0x01 0x15 0x00 0x96 0xFF 0x11 0x01 0xDA 0xF5 0xAB 0x0C 0xE8 0x00 0x1B 0x00 0x92 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x62 0x6E 0x00 0x00 0x00 0x03 0xD8 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x26 0x01 0x4A 0xF6 0xB3 0x0C 0x6F 0x01 0x52 0x00 0x84 0xFF 0x1C 0x01 0x11 0xF6 0x96 0x0C 0x78 0x01 0x4C 0x00 0x81 0xFF 0x36 0x01 0xDA 0xF5 0x8E 0x0C 0x53 0x01 0x34 0x00 0x8A 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x64 0x6E 0x00 0x00 0x00 0x10 0xD9 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x40 0x01 0xA3 0xF6 0xF2 0x0C 0x11 0x01 0x4F 0x00 0xB9 0xFF 0x44 0x01 0x6C 0xF6 0xD1 0x0C 0x36 0x01 0x50 0x00 0xA2 0xFF 0x2F 0x01 0x4C 0xF6 0xBC 0x0C 0x63 0x01 0x52 0x00 0x8A 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x66 0x6E 0x00 0x00 0x00 0x97 0x1A 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x72 0x01 0xD8 0xF6 0x21 0x0D 0x9B 0x00 0x29 0x00 0xFB 0xFF 0x53 0x01 0xD6 0xF6 0x0A 0x0D 0xCB 0x00 0x3B 0x00 0xDB 0xFF 0x41 0x01 0xAF 0xF6 0xFB 0x0C 0x03 0x01 0x4C 0x00 0xC0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x69 0x6E 0x00 0x00 0x00 0xDB 0xEB 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x16 0x02 0x37 0xF4 0x84 0x0E 0x5B 0x00 0x10 0x00 0x38 0x00 0x8C 0x01 0xD8 0xF6 0x2B 0x0D 0x72 0x00 0x19 0x00 0x21 0x00 0x7A 0x01 0xD5 0xF6 0x28 0x0D 0x90 0x00 0x27 0x00 0x04 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x6B 0x6E 0x00 0x00 0x00 0xDA 0x9B 0x83 0x00 0x00 0x00 0xA0 +Subcommand: 0xEE 0x00 0x0F 0xF5 0x62 0x0C 0x12 0x02 0xF1 0xFF 0x02 0xFF 0x9F 0x01 0x0D 0xF4 0xC9 0x0C 0xC6 0x01 0x01 0x00 0xA3 0xFF 0x30 0x02 0xA1 0xF3 0x90 0x0E 0xA9 0x00 0x0E 0x00 0x20 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x6D 0x6E 0x00 0x00 0x00 0xDA 0x8B 0x81 0x00 0x00 0x00 0xA0 +Subcommand: 0xB7 0x00 0xEE 0xF6 0x82 0x0D 0x0B 0x01 0xB5 0xFF 0x55 0xFF 0x8E 0x00 0x72 0xF6 0x2D 0x0D 0x26 0x01 0xDD 0xFF 0x14 0xFF 0xCD 0x00 0x5B 0xF5 0x8B 0x0C 0xC9 0x01 0xF0 0xFF 0xFE 0xFE +--- Controller Msg --- +Payload: 0xA1 0x30 0x70 0x6E 0x00 0x00 0x00 0xDA 0xBB 0x80 0x00 0x00 0x00 0xA0 +Subcommand: 0x31 0x01 0x08 0xF7 0x32 0x0D 0x0B 0x01 0x65 0xFF 0xC6 0xFF 0x12 0x01 0x0C 0xF7 0x71 0x0D 0x05 0x01 0x77 0xFF 0xA7 0xFF 0xDB 0x00 0x04 0xF7 0x92 0x0D 0x01 0x01 0x9F 0xFF 0x79 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x72 0x6E 0x00 0x00 0x00 0xDB 0x3B 0x80 0x00 0x00 0x00 0xA0 +Subcommand: 0x5B 0x01 0x46 0xF7 0xC8 0x0C 0x9F 0x00 0x87 0xFF 0x03 0x00 0x46 0x01 0x20 0xF7 0xE5 0x0C 0xDF 0x00 0x6F 0xFF 0xE7 0xFF 0x35 0x01 0x09 0xF7 0x23 0x0D 0x04 0x01 0x66 0xFF 0xCD 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x74 0x6E 0x00 0x00 0x00 0xD8 0x5B 0x80 0x00 0x00 0x00 0xA0 +Subcommand: 0x8B 0x01 0x2A 0xF7 0x02 0x0D 0xFB 0xFF 0xD2 0xFF 0x4E 0x00 0x7B 0x01 0x37 0xF7 0xE9 0x0C 0x3D 0x00 0xB1 0xFF 0x30 0x00 0x61 0x01 0x49 0xF7 0xCA 0x0C 0x8A 0x00 0x8F 0xFF 0x0C 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x76 0x6E 0x00 0x00 0x00 0xD8 0x5B 0x80 0x00 0x00 0x00 0xA0 +Subcommand: 0xAC 0x01 0x3D 0xF7 0x44 0x0D 0x49 0xFF 0x02 0x00 0x81 0x00 0x98 0x01 0x43 0xF7 0x25 0x0D 0xA1 0xFF 0xF4 0xFF 0x6A 0x00 0x8C 0x01 0x2D 0xF7 0x06 0x0D 0xED 0xFF 0xDA 0xFF 0x54 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x79 0x6E 0x00 0x00 0x00 0xDB 0x3B 0x80 0x00 0x00 0x00 0xA0 +Subcommand: 0xD9 0x01 0x53 0xF6 0x48 0x0D 0xA6 0xFE 0x0D 0x00 0xAB 0x00 0xBE 0x01 0xF8 0xF6 0x38 0x0D 0xEA 0xFE 0x09 0x00 0x9F 0x00 0xB0 0x01 0x34 0xF7 0x46 0x0D 0x33 0xFF 0x04 0x00 0x87 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x7B 0x6E 0x00 0x00 0x00 0xBF 0x1A 0x80 0x00 0x00 0x00 0xA0 +Subcommand: 0xD0 0x01 0x7D 0xF5 0xEA 0x0C 0xDB 0xFE 0x0C 0x00 0x69 0x00 0xF4 0x01 0x87 0xF5 0x2E 0x0D 0x9E 0xFE 0x0D 0x00 0x9A 0x00 0xE4 0x01 0x19 0xF6 0x50 0x0D 0xA0 0xFE 0x0D 0x00 0xAA 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x82 0x6E 0x00 0x00 0x00 0x7D 0x17 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x35 0x01 0x7A 0xF7 0xD1 0x0C 0x9F 0xFD 0x7C 0xFF 0xF3 0x00 0x23 0x01 0x49 0xF8 0x23 0x0C 0x50 0xFE 0x7E 0xFF 0x62 0x00 0xFC 0x00 0xE3 0xF7 0xF3 0x0B 0xC2 0xFE 0x94 0xFF 0x28 0x00 +--- Switch Msg --- +Payload: 0xA2 0x10 0x0F 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x84 0x6E 0x00 0x00 0x00 0x7B 0xC7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0xEA 0x00 0xB7 0xF6 0x8E 0x0C 0xD8 0xFE 0x8F 0xFF 0x91 0x01 0x24 0x01 0xCB 0xF6 0xE8 0x0C 0x1F 0xFE 0x75 0xFF 0x5A 0x01 0x42 0x01 0x3E 0xF7 0xD8 0x0C 0xB6 0xFD 0x7B 0xFF 0x11 0x01 +--- Controller Msg --- +Payload: 0xA1 0x30 0x86 0x6E 0x00 0x00 0x00 0x7C 0xF7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x40 0x01 0x7B 0xF4 0x48 0x0C 0x9B 0xFF 0x1A 0x00 0x0C 0x02 0x31 0x01 0x77 0xF5 0x25 0x0C 0x7F 0xFF 0xDB 0xFF 0x03 0x02 0xF4 0x00 0x89 0xF6 0x68 0x0C 0x02 0xFF 0x98 0xFF 0x9E 0x01 +--- Controller Msg --- +Payload: 0xA1 0x30 0x88 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x9C 0x00 0xA5 0xF3 0x5C 0x0C 0xF7 0xFF 0x18 0x00 0xE9 0x00 0x06 0x01 0xE0 0xF3 0x6E 0x0C 0xD7 0xFF 0x23 0x00 0x83 0x01 0x3E 0x01 0x52 0xF4 0x56 0x0C 0xA6 0xFF 0x1D 0x00 0xF4 0x01 +--- Controller Msg --- +Payload: 0xA1 0x30 0x8B 0x6E 0x00 0x00 0x00 0x7D 0x07 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x7A 0x00 0xBE 0xF4 0xA6 0x0C 0xCD 0xFF 0xFF 0xFF 0xC8 0xFF 0x8B 0x00 0xE9 0xF3 0x9D 0x0C 0xCD 0xFF 0x0C 0x00 0x35 0x00 0x90 0x00 0xA4 0xF3 0x67 0x0C 0xEE 0xFF 0x15 0x00 0xC4 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x8D 0x6E 0x00 0x00 0x00 0x7D 0xE7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x7E 0x00 0xB8 0xF5 0xC1 0x0C 0xEB 0xFF 0xE3 0xFF 0xC0 0xFF 0x68 0x00 0x81 0xF5 0xAF 0x0C 0xE8 0xFF 0xEF 0xFF 0xA2 0xFF 0x75 0x00 0xF2 0xF4 0xA3 0x0C 0xD4 0xFF 0xFB 0xFF 0xB4 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x8F 0x6E 0x00 0x00 0x00 0x7C 0xE7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0xDB 0x00 0xBE 0xF5 0x87 0x0C 0x00 0x00 0xB7 0xFF 0xF3 0xFF 0xB9 0x00 0xC5 0xF5 0xA6 0x0C 0xF8 0xFF 0xC6 0xFF 0xE9 0xFF 0x88 0x00 0xBF 0xF5 0xBE 0x0C 0xEB 0xFF 0xE0 0xFF 0xCA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x91 0x6E 0x00 0x00 0x00 0x7A 0x27 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xE2 0x00 0xD4 0xF5 0x5C 0x0C 0x09 0x00 0xBE 0xFF 0xFF 0xFF 0xEA 0x00 0xC9 0xF5 0x6A 0x0C 0x06 0x00 0xB8 0xFF 0xF8 0xFF 0xE0 0x00 0xBF 0xF5 0x81 0x0C 0x02 0x00 0xB6 0xFF 0xF4 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x94 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xDA 0x00 0xE2 0xF5 0x75 0x0C 0x00 0x00 0xD0 0xFF 0x0F 0x00 0xDB 0x00 0xDE 0xF5 0x63 0x0C 0x06 0x00 0xC9 0xFF 0x07 0x00 0xE0 0x00 0xD6 0xF5 0x5C 0x0C 0x09 0x00 0xC0 0xFF 0x01 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x96 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x27 0x01 0xD9 0xF5 0x9C 0x0C 0x01 0x00 0xDE 0xFF 0x25 0x00 0xF6 0x00 0xDB 0xF5 0x90 0x0C 0xFD 0xFF 0xDA 0xFF 0x1C 0x00 0xDD 0x00 0xE2 0xF5 0x7B 0x0C 0xFE 0xFF 0xD2 0xFF 0x11 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x98 0x6E 0x00 0x00 0x00 0x7B 0x07 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x22 0x01 0xBD 0xF5 0xB8 0x0C 0xFA 0xFF 0xD8 0xFF 0x35 0x00 0x28 0x01 0xC7 0xF5 0xB0 0x0C 0xFD 0xFF 0xDA 0xFF 0x2F 0x00 0x2F 0x01 0xD7 0xF5 0x9F 0x0C 0x01 0x00 0xDD 0xFF 0x27 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x9A 0x6E 0x00 0x00 0x00 0x7B 0x17 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x06 0x01 0xE6 0xF5 0x82 0x0C 0x0F 0x00 0xD6 0xFF 0x23 0x00 0x34 0x01 0xD5 0xF5 0xB4 0x0C 0x09 0x00 0xD6 0xFF 0x2C 0x00 0x29 0x01 0xC0 0xF5 0xBB 0x0C 0xFC 0xFF 0xD8 0xFF 0x34 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x9D 0x6E 0x00 0x00 0x00 0x7E 0xF7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x22 0x01 0xE7 0xF5 0xAC 0x0C 0x10 0x00 0xF8 0xFF 0xFE 0xFF 0x0D 0x01 0xD6 0xF5 0x93 0x0C 0x01 0x00 0xE7 0xFF 0x14 0x00 0x01 0x01 0xE4 0xF5 0x7E 0x0C 0x0F 0x00 0xD6 0xFF 0x21 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x9F 0x6E 0x00 0x00 0x00 0x7B 0x17 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x05 0x01 0x1A 0xF6 0xC8 0x0C 0x16 0x00 0x07 0x00 0xDC 0xFF 0x18 0x01 0x0D 0xF6 0xBF 0x0C 0x1D 0x00 0x04 0x00 0xE3 0xFF 0x23 0x01 0xEF 0xF5 0xB0 0x0C 0x14 0x00 0xFB 0xFF 0xF8 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA1 0x6E 0x00 0x00 0x00 0x7A 0x27 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xE9 0x00 0xF9 0xF5 0xC5 0x0C 0x02 0x00 0xFE 0xFF 0xE1 0xFF 0xF5 0x00 0x11 0xF6 0xCC 0x0C 0x07 0x00 0x02 0x00 0xDF 0xFF 0x02 0x01 0x1B 0xF6 0xCA 0x0C 0x13 0x00 0x06 0x00 0xDC 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA3 0x6E 0x00 0x00 0x00 0x7D 0x17 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xD8 0x00 0xC7 0xF5 0xA7 0x0C 0x12 0x00 0x07 0x00 0xE2 0xFF 0xDE 0x00 0xDB 0xF5 0xB3 0x0C 0x08 0x00 0x05 0x00 0xE3 0xFF 0xE5 0x00 0xF2 0xF5 0xC2 0x0C 0x02 0x00 0xFE 0xFF 0xE2 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA6 0x6E 0x00 0x00 0x00 0x7B 0xE7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0xC3 0x00 0xAF 0xF5 0x9E 0x0C 0x18 0x00 0x12 0x00 0xD8 0xFF 0xD0 0x00 0xB7 0xF5 0x98 0x0C 0x16 0x00 0x0E 0x00 0xDD 0xFF 0xD5 0x00 0xC3 0xF5 0xA4 0x0C 0x13 0x00 0x09 0x00 0xE1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xA8 0x6E 0x00 0x00 0x00 0x7B 0xE7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0xA3 0x00 0xAF 0xF5 0xB8 0x0C 0x1E 0x00 0x0D 0x00 0xD0 0xFF 0xB1 0x00 0xA9 0xF5 0xBC 0x0C 0x1A 0x00 0x14 0x00 0xD2 0xFF 0xBE 0x00 0xAC 0xF5 0xAA 0x0C 0x18 0x00 0x15 0x00 0xD6 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xAA 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xA4 0x00 0xA8 0xF5 0x85 0x0C 0x2A 0x00 0x0A 0x00 0xDD 0xFF 0x9D 0x00 0xB3 0xF5 0xA3 0x0C 0x21 0x00 0x08 0x00 0xD4 0xFF 0xA2 0x00 0xB0 0xF5 0xB6 0x0C 0x1F 0x00 0x0B 0x00 0xD0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xAD 0x6E 0x00 0x00 0x00 0x7D 0x17 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xC4 0x00 0x7C 0xF5 0x58 0x0C 0x4B 0x00 0x23 0x00 0xDE 0xFF 0xB3 0x00 0x92 0xF5 0x66 0x0C 0x3C 0x00 0x17 0x00 0xE1 0xFF 0xA7 0x00 0xA5 0xF5 0x7E 0x0C 0x2E 0x00 0x0D 0x00 0xDE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xAF 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xC3 0x00 0x50 0xF5 0x54 0x0C 0x57 0x00 0x41 0x00 0xC4 0xFF 0xD2 0x00 0x64 0xF5 0x49 0x0C 0x58 0x00 0x33 0x00 0xD1 0xFF 0xCA 0x00 0x77 0xF5 0x56 0x0C 0x4E 0x00 0x26 0x00 0xDB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB1 0x6E 0x00 0x00 0x00 0x7C 0xE7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0x63 0x00 0x06 0xF5 0xD1 0x0C 0x28 0x00 0x4B 0x00 0x72 0xFF 0x5B 0x00 0x39 0xF5 0x7C 0x0C 0x47 0x00 0x4E 0x00 0xA5 0xFF 0xB9 0x00 0x4D 0xF5 0x5B 0x0C 0x54 0x00 0x45 0x00 0xC0 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x00 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0xB3 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x2E 0x00 0xE6 0xF5 0x1C 0x0D 0x20 0x00 0x17 0x00 0x36 0xFF 0x66 0x00 0x5F 0xF5 0x0B 0x0D 0x11 0x00 0x2A 0x00 0x33 0xFF 0x6F 0x00 0x03 0xF5 0xE1 0x0C 0x1F 0x00 0x49 0x00 0x64 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB6 0x6E 0x00 0x00 0x00 0x7B 0x37 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x42 0x00 0xF9 0xF5 0x41 0x0D 0x4A 0x00 0xE1 0xFF 0x9D 0xFF 0x22 0x00 0x19 0xF6 0x44 0x0D 0x31 0x00 0x03 0x00 0x70 0xFF 0x25 0x00 0xFC 0xF5 0x22 0x0D 0x23 0x00 0x14 0x00 0x42 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xB8 0x6E 0x00 0x00 0x00 0x7D 0x17 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x87 0x00 0x80 0xF5 0xFC 0x0C 0x53 0x00 0xB0 0xFF 0xAF 0xFF 0x7C 0x00 0xA8 0xF5 0x15 0x0D 0x5A 0x00 0xBD 0xFF 0xB3 0xFF 0x57 0x00 0xDD 0xF5 0x33 0x0D 0x57 0x00 0xD0 0xFF 0xA9 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xBD 0x6E 0x00 0x00 0x00 0x7C 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x5E 0x00 0x7D 0xF5 0xD8 0x0C 0x48 0x00 0xAF 0xFF 0x63 0xFF 0x65 0x00 0x6B 0xF5 0xDA 0x0C 0x44 0x00 0xAA 0xFF 0x72 0xFF 0x6C 0x00 0x65 0xF5 0xDE 0x0C 0x43 0x00 0xA5 0xFF 0x84 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xBF 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x69 0x00 0xA5 0xF5 0xDD 0x0C 0x4E 0x00 0xB3 0xFF 0x51 0xFF 0x61 0x00 0x94 0xF5 0xDD 0x0C 0x4E 0x00 0xB1 0xFF 0x57 0xFF 0x5D 0x00 0x82 0xF5 0xD8 0x0C 0x4A 0x00 0xAF 0xFF 0x60 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC1 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x76 0x00 0xBC 0xF5 0xDD 0x0C 0x3A 0x00 0xB7 0xFF 0x47 0xFF 0x6E 0x00 0xB4 0xF5 0xDB 0x0C 0x46 0x00 0xB6 0xFF 0x4C 0xFF 0x69 0x00 0xA8 0xF5 0xDD 0x0C 0x4E 0x00 0xB3 0xFF 0x50 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC3 0x6E 0x00 0x00 0x00 0x7E 0xE7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x8B 0x00 0xCE 0xF5 0xE6 0x0C 0x21 0x00 0xC4 0xFF 0x3A 0xFF 0x7F 0x00 0xC7 0xF5 0xE0 0x0C 0x2B 0x00 0xBD 0xFF 0x41 0xFF 0x78 0x00 0xBE 0xF5 0xDD 0x0C 0x37 0x00 0xB8 0xFF 0x46 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC6 0x6E 0x00 0x00 0x00 0x7D 0xE7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x9F 0x00 0xF8 0xF5 0x00 0x0D 0x0F 0x00 0xD4 0xFF 0x23 0xFF 0x98 0x00 0xE2 0xF5 0xF2 0x0C 0x17 0x00 0xCC 0xFF 0x2D 0xFF 0x8F 0x00 0xD1 0xF5 0xE8 0x0C 0x1F 0x00 0xC5 0xFF 0x37 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xC8 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xAF 0x00 0x36 0xF6 0x1D 0x0D 0xFC 0xFF 0xE7 0xFF 0x1A 0xFF 0xA4 0x00 0x17 0xF6 0x11 0x0D 0x04 0x00 0xDE 0xFF 0x1B 0xFF 0xA1 0x00 0xFE 0xF5 0x04 0x0D 0x0D 0x00 0xD7 0xFF 0x21 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xCA 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xC5 0x00 0x5F 0xF6 0x36 0x0D 0xEE 0xFF 0xE6 0xFF 0x20 0xFF 0xC0 0x00 0x56 0xF6 0x2E 0x0D 0xF1 0xFF 0xE9 0xFF 0x1C 0xFF 0xB4 0x00 0x3C 0xF6 0x1F 0x0D 0xFC 0xFF 0xE7 0xFF 0x1A 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xCC 0x6E 0x00 0x00 0x00 0x7B 0x17 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xF4 0x00 0x69 0xF6 0x13 0x0D 0xEB 0xFF 0xD5 0xFF 0x31 0xFF 0xDB 0x00 0x66 0xF6 0x29 0x0D 0xEC 0xFF 0xDD 0xFF 0x29 0xFF 0xC7 0x00 0x61 0xF6 0x35 0x0D 0xED 0xFF 0xE5 0xFF 0x22 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xCF 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x32 0x01 0x50 0xF6 0xB9 0x0C 0xE5 0xFF 0xC7 0xFF 0x44 0xFF 0x1B 0x01 0x5E 0xF6 0xDB 0x0C 0xE7 0xFF 0xCB 0xFF 0x3E 0xFF 0x01 0x01 0x68 0xF6 0x04 0x0D 0xEA 0xFF 0xD2 0xFF 0x36 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xD1 0x6E 0x00 0x00 0x00 0x7D 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x6A 0x01 0x23 0xF6 0x84 0x0C 0xE1 0xFF 0xC8 0xFF 0x49 0xFF 0x50 0x01 0x35 0xF6 0x96 0x0C 0xDF 0xFF 0xC8 0xFF 0x47 0xFF 0x37 0x01 0x4C 0xF6 0xB2 0x0C 0xE5 0xFF 0xC7 0xFF 0x44 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xD3 0x6E 0x00 0x00 0x00 0x7C 0x17 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xAF 0x01 0x08 0xF6 0x70 0x0C 0xFB 0xFF 0xCD 0xFF 0x50 0xFF 0x8C 0x01 0x10 0xF6 0x76 0x0C 0xEE 0xFF 0xCC 0xFF 0x4D 0xFF 0x6F 0x01 0x1F 0xF6 0x81 0x0C 0xE3 0xFF 0xC9 0xFF 0x49 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xD6 0x6E 0x00 0x00 0x00 0x7B 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xFD 0x01 0x00 0xF6 0x5D 0x0C 0x12 0x00 0xCB 0xFF 0x59 0xFF 0xDB 0x01 0x03 0xF6 0x66 0x0C 0x0A 0x00 0xCD 0xFF 0x54 0xFF 0xB8 0x01 0x06 0xF6 0x6D 0x0C 0xFE 0xFF 0xCE 0xFF 0x51 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xD8 0x6E 0x00 0x00 0x00 0x7C 0x37 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x60 0x02 0x0C 0xF6 0x4E 0x0C 0x1A 0x00 0xC6 0xFF 0x68 0xFF 0x31 0x02 0x00 0xF6 0x56 0x0C 0x16 0x00 0xCA 0xFF 0x62 0xFF 0x06 0x02 0x00 0xF6 0x5C 0x0C 0x14 0x00 0xCB 0xFF 0x5A 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xDA 0x6E 0x00 0x00 0x00 0x7D 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x9D 0x02 0x3A 0xF6 0x47 0x0C 0x24 0x00 0xBF 0xFF 0x7D 0xFF 0x8A 0x02 0x23 0xF6 0x47 0x0C 0x1E 0x00 0xC2 0xFF 0x72 0xFF 0x69 0x02 0x11 0xF6 0x4C 0x0C 0x1B 0x00 0xC5 0xFF 0x6A 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xDC 0x6E 0x00 0x00 0x00 0x7C 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xA1 0x02 0x77 0xF6 0x50 0x0C 0x3A 0x00 0xB4 0xFF 0x9E 0xFF 0xA6 0x02 0x55 0xF6 0x4B 0x0C 0x30 0x00 0xB9 0xFF 0x8E 0xFF 0xA1 0x02 0x3F 0xF6 0x48 0x0C 0x27 0x00 0xBD 0xFF 0x80 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xDF 0x6E 0x00 0x00 0x00 0x7D 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x91 0x02 0xB7 0xF6 0x4B 0x0C 0x52 0x00 0x9E 0xFF 0xCC 0xFF 0x97 0x02 0x9B 0xF6 0x52 0x0C 0x4B 0x00 0xA8 0xFF 0xB9 0xFF 0x9F 0x02 0x80 0xF6 0x52 0x0C 0x3D 0x00 0xB3 0xFF 0xA3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xE1 0x6E 0x00 0x00 0x00 0x7B 0x17 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x5C 0x02 0x01 0xF7 0x36 0x0C 0x5A 0x00 0x8B 0xFF 0xEF 0xFF 0x7B 0x02 0xDF 0xF6 0x40 0x0C 0x56 0x00 0x92 0xFF 0xDF 0xFF 0x8F 0x02 0xBF 0xF6 0x49 0x0C 0x53 0x00 0x9B 0xFF 0xD0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xE3 0x6E 0x00 0x00 0x00 0x7B 0x37 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x04 0x02 0x3F 0xF7 0x21 0x0C 0x59 0x00 0x9A 0xFF 0x16 0x00 0x2F 0x02 0x28 0xF7 0x25 0x0C 0x5C 0x00 0x8F 0xFF 0x04 0x00 0x54 0x02 0x0A 0xF7 0x33 0x0C 0x5A 0x00 0x8B 0xFF 0xF3 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x01 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0xE6 0x6E 0x00 0x00 0x00 0x7C 0x37 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x9B 0x01 0x41 0xF7 0x25 0x0C 0x44 0x00 0xC9 0xFF 0x42 0x00 0xBF 0x01 0x4D 0xF7 0x1E 0x0C 0x4E 0x00 0xB3 0xFF 0x31 0x00 0xEE 0x01 0x47 0xF7 0x20 0x0C 0x56 0x00 0xA1 0xFF 0x1E 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xE8 0x6E 0x00 0x00 0x00 0x7C 0xF7 0x86 0x00 0x00 0x00 0x40 +Subcommand: 0x62 0x01 0x15 0xF7 0x65 0x0C 0x2F 0x00 0xFF 0xFF 0x50 0x00 0x7D 0x01 0x2A 0xF7 0x41 0x0C 0x37 0x00 0xE8 0xFF 0x4F 0x00 0x94 0x01 0x3C 0xF7 0x28 0x0C 0x41 0x00 0xCF 0xFF 0x45 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xEA 0x6E 0x00 0x00 0x00 0x7E 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x09 0x01 0xFC 0xF6 0xD2 0x0C 0x23 0x00 0x24 0x00 0x44 0x00 0x36 0x01 0x04 0xF7 0x9E 0x0C 0x25 0x00 0x18 0x00 0x4B 0x00 0x5B 0x01 0x10 0xF7 0x6F 0x0C 0x2C 0x00 0x05 0x00 0x50 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xEC 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xBE 0x00 0xEE 0xF6 0x23 0x0D 0x2A 0x00 0x28 0x00 0x46 0x00 0xD7 0x00 0xFA 0xF6 0x06 0x0D 0x28 0x00 0x29 0x00 0x42 0x00 0xFE 0x00 0xFC 0xF6 0xDE 0x0C 0x24 0x00 0x26 0x00 0x43 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xEF 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xA9 0x00 0x93 0xF6 0x3D 0x0D 0x28 0x00 0x27 0x00 0x52 0x00 0xAC 0x00 0xC3 0xF6 0x35 0x0D 0x2B 0x00 0x27 0x00 0x4E 0x00 0xB9 0x00 0xE7 0xF6 0x28 0x0D 0x2A 0x00 0x28 0x00 0x47 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF1 0x6E 0x00 0x00 0x00 0x7C 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xA5 0x00 0x1C 0xF6 0x67 0x0D 0x1D 0x00 0x31 0x00 0x47 0x00 0xAA 0x00 0x51 0xF6 0x50 0x0D 0x21 0x00 0x2A 0x00 0x4F 0x00 0xAA 0x00 0x86 0xF6 0x40 0x0D 0x27 0x00 0x27 0x00 0x52 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF3 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x88 0x00 0xA7 0xF5 0xA7 0x0D 0x1B 0x00 0x47 0x00 0x2E 0x00 0x95 0x00 0xE1 0xF5 0x8F 0x0D 0x1A 0x00 0x3F 0x00 0x3A 0x00 0xA3 0x00 0x10 0xF6 0x6E 0x0D 0x1C 0x00 0x33 0x00 0x45 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF5 0x6E 0x00 0x00 0x00 0x7C 0x17 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x8C 0x00 0x3A 0xF5 0xB2 0x0D 0x08 0x00 0x3B 0x00 0x15 0x00 0x82 0x00 0x67 0xF5 0xB3 0x0D 0x16 0x00 0x45 0x00 0x20 0x00 0x85 0x00 0x99 0xF5 0xAC 0x0D 0x1B 0x00 0x48 0x00 0x2B 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xF8 0x6E 0x00 0x00 0x00 0x7C 0x37 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xA8 0x00 0xF1 0xF4 0xB0 0x0D 0xEE 0xFF 0x21 0x00 0xEC 0xFF 0x9B 0x00 0x0B 0xF5 0xB0 0x0D 0xF7 0xFF 0x2B 0x00 0xFE 0xFF 0x8E 0x00 0x30 0xF5 0xB2 0x0D 0x05 0x00 0x38 0x00 0x11 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0xFA 0x6E 0x00 0x00 0x00 0x7C 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xAA 0x00 0xE6 0xF4 0x9C 0x0D 0xF1 0xFF 0x0D 0x00 0xBE 0xFF 0xAB 0x00 0xE2 0xF4 0xA5 0x0D 0xEF 0xFF 0x15 0x00 0xCF 0xFF 0xAA 0x00 0xEC 0xF4 0xAF 0x0D 0xED 0xFF 0x1F 0x00 0xE7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xFC 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xB4 0x00 0x00 0xF5 0x68 0x0D 0xF7 0xFF 0xFA 0xFF 0xA1 0xFF 0xAE 0x00 0xF2 0xF4 0x89 0x0D 0xF3 0xFF 0x05 0x00 0xAB 0xFF 0xAA 0x00 0xE8 0xF4 0x9A 0x0D 0xF2 0xFF 0x0B 0x00 0xBA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0xFE 0x6E 0x00 0x00 0x00 0x7D 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xC4 0x00 0x2E 0xF5 0x26 0x0D 0xFA 0xFF 0xF2 0xFF 0x92 0xFF 0xBD 0x00 0x21 0xF5 0x29 0x0D 0x04 0x00 0xF1 0xFF 0x9A 0xFF 0xB6 0x00 0x06 0xF5 0x5B 0x0D 0xFB 0xFF 0xF8 0xFF 0xA0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x01 0x6E 0x00 0x00 0x00 0x7C 0x17 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xD0 0x00 0x7E 0xF5 0xE7 0x0C 0xE3 0xFF 0xDD 0xFF 0x6E 0xFF 0xCB 0x00 0x53 0xF5 0x0E 0x0D 0xEC 0xFF 0xEB 0xFF 0x7E 0xFF 0xC6 0x00 0x34 0xF5 0x26 0x0D 0xF6 0xFF 0xF2 0xFF 0x8F 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x03 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xC7 0x00 0xDC 0xF5 0xC2 0x0C 0xC5 0xFF 0xCC 0xFF 0x5F 0xFF 0xCF 0x00 0xB3 0xF5 0xD5 0x0C 0xCB 0xFF 0xD0 0xFF 0x63 0xFF 0xD1 0x00 0x8A 0xF5 0xE1 0x0C 0xE0 0xFF 0xDA 0xFF 0x6B 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x05 0x6E 0x00 0x00 0x00 0x7B 0x17 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xED 0x00 0x2F 0xF6 0x95 0x0C 0xD5 0xFF 0xD9 0xFF 0x63 0xFF 0xD5 0x00 0x0F 0xF6 0xA2 0x0C 0xCF 0xFF 0xD2 0xFF 0x5F 0xFF 0xC6 0x00 0xE7 0xF5 0xBC 0x0C 0xC5 0xFF 0xCC 0xFF 0x5E 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x07 0x6E 0x00 0x00 0x00 0x7C 0x17 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x15 0x01 0x6C 0xF6 0x90 0x0C 0xDC 0xFF 0xE5 0xFF 0x6D 0xFF 0x04 0x01 0x4E 0xF6 0x93 0x0C 0xDB 0xFF 0xE1 0xFF 0x69 0xFF 0xF2 0x00 0x35 0xF6 0x95 0x0C 0xD7 0xFF 0xDB 0xFF 0x65 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x0A 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x23 0x01 0x9F 0xF6 0xAB 0x0C 0xD5 0xFF 0xF3 0xFF 0x7C 0xFF 0x1E 0x01 0x8D 0xF6 0x99 0x0C 0xD8 0xFF 0xEF 0xFF 0x76 0xFF 0x18 0x01 0x73 0xF6 0x91 0x0C 0xDB 0xFF 0xE7 0xFF 0x6F 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x0C 0x6E 0x00 0x00 0x00 0x7D 0xD7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x1C 0x01 0xBC 0xF6 0xCC 0x0C 0xE2 0xFF 0xFB 0xFF 0x90 0xFF 0x20 0x01 0xB1 0xF6 0xBF 0x0C 0xD9 0xFF 0xFA 0xFF 0x84 0xFF 0x23 0x01 0xA3 0xF6 0xAF 0x0C 0xD5 0xFF 0xF4 0xFF 0x7D 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x0E 0x6E 0x00 0x00 0x00 0x7B 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x30 0x01 0xBF 0xF6 0xD8 0x0C 0xEE 0xFF 0xE8 0xFF 0xA3 0xFF 0x24 0x01 0xBA 0xF6 0xD3 0x0C 0xEC 0xFF 0xF2 0xFF 0x9D 0xFF 0x1D 0x01 0xBC 0xF6 0xCE 0x0C 0xE4 0xFF 0xFA 0xFF 0x92 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x10 0x6E 0x00 0x00 0x00 0x7D 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x31 0x01 0xD0 0xF6 0xD0 0x0C 0xF5 0xFF 0xD6 0xFF 0xAF 0xFF 0x2F 0x01 0xC6 0xF6 0xD9 0x0C 0xF0 0xFF 0xDB 0xFF 0xAA 0xFF 0x31 0x01 0xC0 0xF6 0xD9 0x0C 0xEE 0xFF 0xE6 0xFF 0xA5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x15 0x6E 0x00 0x00 0x00 0x7B 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x56 0x01 0xED 0xF6 0xAE 0x0C 0xF9 0xFF 0xD1 0xFF 0xCC 0xFF 0x46 0x01 0xE7 0xF6 0xB6 0x0C 0x00 0x00 0xD1 0xFF 0xC6 0xFF 0x38 0x01 0xE5 0xF6 0xBE 0x0C 0x01 0x00 0xD1 0xFF 0xBF 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x02 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x17 0x6E 0x00 0x00 0x00 0x7B 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x51 0x01 0xFA 0xF6 0xA2 0x0C 0xEF 0xFF 0xDD 0xFF 0xE4 0xFF 0x53 0x01 0xF7 0xF6 0xA0 0x0C 0xF0 0xFF 0xD6 0xFF 0xD8 0xFF 0x57 0x01 0xEF 0xF6 0xAC 0x0C 0xF7 0xFF 0xD2 0xFF 0xCE 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x1C 0x6E 0x00 0x00 0x00 0x7C 0x37 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x2B 0x01 0x99 0xF6 0xE4 0x0C 0xF0 0xFF 0x00 0x00 0x1C 0x00 0x2F 0x01 0xBE 0xF6 0xD7 0x0C 0xF3 0xFF 0x00 0x00 0x12 0x00 0x3C 0x01 0xDD 0xF6 0xC5 0x0C 0xF3 0xFF 0xF8 0xFF 0x05 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x1E 0x6E 0x00 0x00 0x00 0x7C 0xE7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x15 0x01 0x55 0xF6 0x04 0x0D 0xE6 0xFF 0xF7 0xFF 0x27 0x00 0x21 0x01 0x6D 0xF6 0xF5 0x0C 0xE8 0xFF 0xFD 0xFF 0x24 0x00 0x2A 0x01 0x90 0xF6 0xE7 0x0C 0xEF 0xFF 0xFF 0xFF 0x1E 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x20 0x6E 0x00 0x00 0x00 0x7C 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xE7 0x00 0x22 0xF6 0x2B 0x0D 0xF4 0xFF 0xEF 0xFF 0x26 0x00 0xFC 0x00 0x38 0xF6 0x1A 0x0D 0xEA 0xFF 0xF2 0xFF 0x27 0x00 0x12 0x01 0x4F 0xF6 0x07 0x0D 0xE7 0xFF 0xF5 0xFF 0x27 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x22 0x6E 0x00 0x00 0x00 0x7D 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xD4 0x00 0xEA 0xF5 0x3A 0x0D 0x02 0x00 0xE3 0xFF 0x27 0x00 0xD8 0x00 0x03 0xF6 0x39 0x0D 0xFE 0xFF 0xEC 0xFF 0x28 0x00 0xE3 0x00 0x1C 0xF6 0x2F 0x0D 0xF6 0xFF 0xEF 0xFF 0x27 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x25 0x6E 0x00 0x00 0x00 0x7C 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0xD7 0x00 0xCF 0xF5 0x26 0x0D 0xF7 0xFF 0xCC 0xFF 0x18 0x00 0xD7 0x00 0xD7 0xF5 0x33 0x0D 0xFF 0xFF 0xD4 0xFF 0x1F 0x00 0xD4 0x00 0xE6 0xF5 0x39 0x0D 0x03 0x00 0xE0 0xFF 0x26 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x27 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xD5 0x00 0xCA 0xF5 0x0B 0x0D 0xEB 0xFF 0xC7 0xFF 0x09 0x00 0xD6 0x00 0xCC 0xF5 0x11 0x0D 0xEE 0xFF 0xC7 0xFF 0x0F 0x00 0xD7 0x00 0xCF 0xF5 0x22 0x0D 0xF5 0xFF 0xCA 0xFF 0x16 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x29 0x6E 0x00 0x00 0x00 0x7A 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xC8 0x00 0xB9 0xF5 0xF3 0x0C 0xEB 0xFF 0xD4 0xFF 0x00 0x00 0xCA 0x00 0xC5 0xF5 0xFF 0x0C 0xE9 0xFF 0xD0 0xFF 0x03 0x00 0xD3 0x00 0xCA 0xF5 0x0A 0x0D 0xEA 0xFF 0xC8 0xFF 0x08 0x00 +--- Controller Msg --- +Payload: 0xA1 0x30 0x2B 0x6E 0x00 0x00 0x00 0x7C 0x37 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xDD 0x00 0xA5 0xF5 0xEC 0x0C 0xDC 0xFF 0xD7 0xFF 0xF5 0xFF 0xD4 0x00 0xAC 0xF5 0xF1 0x0C 0xE3 0xFF 0xD6 0xFF 0xFB 0xFF 0xCA 0x00 0xB6 0xF5 0xF2 0x0C 0xEA 0xFF 0xD4 0xFF 0xFF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x2E 0x6E 0x00 0x00 0x00 0x7C 0x17 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xDC 0x00 0xA7 0xF5 0xE7 0x0C 0xD6 0xFF 0xD6 0xFF 0xE4 0xFF 0xDB 0x00 0xA4 0xF5 0xE4 0x0C 0xD6 0xFF 0xD5 0xFF 0xEB 0xFF 0xDD 0x00 0xA3 0xF5 0xEA 0x0C 0xDA 0xFF 0xD7 0xFF 0xF4 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x30 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xDD 0x00 0xC2 0xF5 0xF0 0x0C 0xDF 0xFF 0xD8 0xFF 0xD6 0xFF 0xDC 0x00 0xB5 0xF5 0xE9 0x0C 0xDA 0xFF 0xD7 0xFF 0xDC 0xFF 0xDB 0x00 0xAA 0xF5 0xE7 0x0C 0xD6 0xFF 0xD6 0xFF 0xE3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x32 0x6E 0x00 0x00 0x00 0x7B 0x37 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xEB 0x00 0xDE 0xF5 0xED 0x0C 0xDD 0xFF 0xD3 0xFF 0xCC 0xFF 0xE2 0x00 0xCF 0xF5 0xEE 0x0C 0xE1 0xFF 0xD7 0xFF 0xCF 0xFF 0xDD 0x00 0xC5 0xF5 0xF1 0x0C 0xE0 0xFF 0xD8 0xFF 0xD4 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x34 0x6E 0x00 0x00 0x00 0x7B 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xE8 0x00 0x00 0xF6 0xEF 0x0C 0xE1 0xFF 0xC1 0xFF 0xC5 0xFF 0xEF 0x00 0xF3 0xF5 0xEE 0x0C 0xDA 0xFF 0xC9 0xFF 0xC7 0xFF 0xED 0x00 0xE2 0xF5 0xED 0x0C 0xDC 0xFF 0xD1 0xFF 0xCA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x37 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xEB 0x00 0x0C 0xF6 0xDC 0x0C 0xF8 0xFF 0xBE 0xFF 0xCB 0xFF 0xE4 0x00 0x05 0xF6 0xEA 0x0C 0xF0 0xFF 0xBE 0xFF 0xC9 0xFF 0xE6 0x00 0x02 0xF6 0xEE 0x0C 0xE3 0xFF 0xC0 0xFF 0xC5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x39 0x6E 0x00 0x00 0x00 0x7B 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x06 0x01 0x24 0xF6 0xAA 0x0C 0xED 0xFF 0xB9 0xFF 0xC4 0xFF 0xFB 0x00 0x17 0xF6 0xC0 0x0C 0xF5 0xFF 0xB9 0xFF 0xC7 0xFF 0xEE 0x00 0x0E 0xF6 0xD6 0x0C 0xF8 0xFF 0xBD 0xFF 0xCA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x3B 0x6E 0x00 0x00 0x00 0x7B 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x11 0x01 0x47 0xF6 0x94 0x0C 0xDB 0xFF 0xCB 0xFF 0xC0 0xFF 0x11 0x01 0x37 0xF6 0x95 0x0C 0xDF 0xFF 0xC1 0xFF 0xBF 0xFF 0x08 0x01 0x28 0xF6 0xA4 0x0C 0xEA 0xFF 0xBB 0xFF 0xC2 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x3E 0x6E 0x00 0x00 0x00 0x7B 0x37 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x0D 0x01 0x44 0xF6 0xB3 0x0C 0xE7 0xFF 0xE7 0xFF 0xCE 0xFF 0x10 0x01 0x4F 0xF6 0xA4 0x0C 0xE0 0xFF 0xDC 0xFF 0xC6 0xFF 0x0F 0x01 0x4B 0xF6 0x96 0x0C 0xDB 0xFF 0xD2 0xFF 0xC2 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x40 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x1B 0x01 0x28 0xF6 0xDD 0x0C 0xEA 0xFF 0xEB 0xFF 0xD6 0xFF 0x15 0x01 0x33 0xF6 0xCA 0x0C 0xEB 0xFF 0xED 0xFF 0xD4 0xFF 0x0E 0x01 0x41 0xF6 0xB6 0x0C 0xE8 0xFF 0xE9 0xFF 0xCF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x42 0x6E 0x00 0x00 0x00 0x7C 0xF7 0x86 0x00 0x00 0x00 0xC0 +Subcommand: 0x23 0x01 0x16 0xF6 0xDA 0x0C 0xDD 0xFF 0xE4 0xFF 0xD7 0xFF 0x22 0x01 0x19 0xF6 0xE0 0x0C 0xE3 0xFF 0xE8 0xFF 0xD8 0xFF 0x1C 0x01 0x25 0xF6 0xE0 0x0C 0xE9 0xFF 0xEB 0xFF 0xD7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x44 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x27 0x01 0x09 0xF6 0xD8 0x0C 0xD8 0xFF 0xE5 0xFF 0xD6 0xFF 0x28 0x01 0x0F 0xF6 0xD6 0x0C 0xD8 0xFF 0xE3 0xFF 0xD5 0xFF 0x25 0x01 0x15 0xF6 0xD8 0x0C 0xDB 0xFF 0xE4 0xFF 0xD6 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x47 0x6E 0x00 0x00 0x00 0x7C 0x17 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0x18 0x01 0x0A 0xF6 0x02 0x0D 0xD8 0xFF 0xF1 0xFF 0xD6 0xFF 0x20 0x01 0x0A 0xF6 0xE8 0x0C 0xD8 0xFF 0xEC 0xFF 0xD7 0xFF 0x27 0x01 0x09 0xF6 0xD9 0x0C 0xD8 0xFF 0xE6 0xFF 0xD7 0xFF +--- Switch Msg --- +Payload: 0xA2 0x10 0x03 0x00 0x01 0x40 0x40 0x00 0x00 0x00 0x00 +Subcommand: +--- Controller Msg --- +Payload: 0xA1 0x30 0x49 0x6E 0x00 0x00 0x00 0x7D 0x07 0x87 0x00 0x00 0x00 0xC0 +Subcommand: 0xFB 0x00 0x0C 0xF6 0x30 0x0D 0xDE 0xFF 0xEC 0xFF 0xD1 0xFF 0x09 0x01 0x08 0xF6 0x23 0x0D 0xDC 0xFF 0xEF 0xFF 0xD3 0xFF 0x16 0x01 0x09 0xF6 0x08 0x0D 0xD9 0xFF 0xF1 0xFF 0xD5 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x4B 0x6E 0x00 0x00 0x00 0x7C 0xF7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0xFA 0x00 0x04 0xF6 0x27 0x0D 0xDC 0xFF 0xD9 0xFF 0xD0 0xFF 0xF3 0x00 0x08 0xF6 0x31 0x0D 0xDF 0xFF 0xE2 0xFF 0xCF 0xFF 0xF8 0x00 0x0B 0xF6 0x31 0x0D 0xDF 0xFF 0xEB 0xFF 0xD1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x4D 0x6E 0x00 0x00 0x00 0x7B 0x07 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xF4 0x00 0xFD 0xF5 0x06 0x0D 0xCF 0xFF 0xCC 0xFF 0xCC 0xFF 0xF8 0x00 0xFF 0xF5 0x14 0x0D 0xD1 0xFF 0xCF 0xFF 0xCF 0xFF 0xFB 0x00 0x02 0xF6 0x1F 0x0D 0xD9 0xFF 0xD5 0xFF 0xD1 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x50 0x6E 0x00 0x00 0x00 0x7C 0x17 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xE8 0x00 0xF3 0xF5 0x08 0x0D 0xD6 0xFF 0xD9 0xFF 0xC4 0xFF 0xEB 0x00 0xF6 0xF5 0xFE 0x0C 0xD0 0xFF 0xD2 0xFF 0xC7 0xFF 0xF2 0x00 0xFB 0xF5 0x03 0x0D 0xCF 0xFF 0xCD 0xFF 0xCB 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x52 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xEA 0x00 0xFA 0xF5 0xE9 0x0C 0xD2 0xFF 0xE0 0xFF 0xBB 0xFF 0xEE 0x00 0xFD 0xF5 0xFB 0x0C 0xDA 0xFF 0xE0 0xFF 0xBE 0xFF 0xE9 0x00 0xF4 0xF5 0x08 0x0D 0xD7 0xFF 0xDB 0xFF 0xC3 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x54 0x6E 0x00 0x00 0x00 0x7C 0xF7 0x86 0x00 0x00 0x00 0xA0 +Subcommand: 0xEF 0x00 0xF2 0xF5 0xD0 0x0C 0xB5 0xFF 0xD1 0xFF 0xB8 0xFF 0xE9 0x00 0xF3 0xF5 0xD8 0x0C 0xBD 0xFF 0xD5 0xFF 0xB9 0xFF 0xE8 0x00 0xF8 0xF5 0xE6 0x0C 0xCF 0xFF 0xE0 0xFF 0xBA 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x57 0x6E 0x00 0x00 0x00 0x7D 0x07 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0xE8 0x00 0xE0 0xF5 0xC2 0x0C 0xC7 0xFF 0xDE 0xFF 0xB0 0xFF 0xEB 0x00 0xE6 0xF5 0xC9 0x0C 0xBC 0xFF 0xD7 0xFF 0xB5 0xFF 0xEF 0x00 0xF0 0xF5 0xCF 0x0C 0xB6 0xFF 0xD2 0xFF 0xB7 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x59 0x6E 0x00 0x00 0x00 0x7C 0x27 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x05 0x01 0xE2 0xF5 0xC2 0x0C 0xD0 0xFF 0xDE 0xFF 0xA7 0xFF 0xFA 0x00 0xDF 0xF5 0xC5 0x0C 0xCE 0xFF 0xE1 0xFF 0xAB 0xFF 0xEB 0x00 0xE0 0xF5 0xC3 0x0C 0xC9 0xFF 0xDF 0xFF 0xAF 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x5B 0x6E 0x00 0x00 0x00 0x7C 0x17 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x11 0x01 0xF8 0xF5 0xA7 0x0C 0xC8 0xFF 0xCB 0xFF 0xA1 0xFF 0x0A 0x01 0xEE 0xF5 0xB1 0x0C 0xCC 0xFF 0xD3 0xFF 0xA2 0xFF 0x05 0x01 0xE3 0xF5 0xBF 0x0C 0xD0 0xFF 0xDC 0xFF 0xA6 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x5D 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x2B 0x01 0x0B 0xF6 0x7C 0x0C 0xD5 0xFF 0xCB 0xFF 0x9F 0xFF 0x1D 0x01 0x02 0xF6 0x93 0x0C 0xCD 0xFF 0xCA 0xFF 0x9F 0xFF 0x12 0x01 0xF9 0xF5 0xA4 0x0C 0xC9 0xFF 0xCB 0xFF 0xA0 0xFF +--- Controller Msg --- +Payload: 0xA1 0x30 0x60 0x6E 0x00 0x00 0x00 0x7C 0x07 0x87 0x00 0x00 0x00 0xA0 +Subcommand: 0x42 0x01 0x16 0xF6 0x5A 0x0C 0xE2 0xFF 0xCF 0xFF 0xA4 0xFF 0x37 0x01 0x13 0xF6 0x67 0x0C 0xDC 0xFF 0xCC 0xFF 0xA1 0xFF 0x2F 0x01 0x0D 0xF6 0x76 0x0C 0xD6 0xFF 0xCB 0xFF 0x9F 0xFF +``` \ No newline at end of file diff --git a/docs/Miscellaneous Notes.md b/docs/Miscellaneous Notes.md new file mode 100644 index 0000000..66583e1 --- /dev/null +++ b/docs/Miscellaneous Notes.md @@ -0,0 +1,21 @@ +# Miscellaneous Notes + +This is a compilation of quirks, tidbits, and other info that pertain to +this project. + +## Requirements for pairing with the Switch + +- Controller SDP record. They all share the same one (generally), so a only a single record is needed to emulate all three controllers +- The Bluetooth alias "Joy-Con (L)", "Joy-Con (R)", or "Pro Controller" +- The Bluetooth Gamepad HID Class + +### Weird Tibit: + +If you wanted to be a little lazy during emulation, the Bluetooth +alias isn't used to define the identity of the controller within +the Switch. You only need to set the alias as one of the three +mentioned above. The Switch only checks for identity in the device +inquiry input report packet. + +Eg: You could get away with emulating a Joy-Con (L) while having the +Bluetooth alias set to "Pro Controller". diff --git a/nxbt/__init__.py b/nxbt/__init__.py new file mode 100644 index 0000000..b226ace --- /dev/null +++ b/nxbt/__init__.py @@ -0,0 +1,8 @@ +from .controller import ControllerServer +from .controller import ControllerTypes +from .controller import ControllerProtocol +from .controller import SwitchReportParser +from .controller import SwitchResponses +from .controller import Controller +from .bluez import BlueZ + diff --git a/nxbt/bluez.py b/nxbt/bluez.py new file mode 100644 index 0000000..7db6008 --- /dev/null +++ b/nxbt/bluez.py @@ -0,0 +1,615 @@ +import subprocess +import re +import os +import time + +import dbus + + +class BlueZ(): + """Exposes the BlueZ D-Bus API as a Python object. + """ + + SERVICE_NAME = "org.bluez" + BLUEZ_OBJECT_PATH = "/org/bluez" + ADAPTER_INTERFACE = SERVICE_NAME + ".Adapter1" + PROFILEMANAGER_INTERFACE = SERVICE_NAME + ".ProfileManager1" + DEVICE_INTERFACE = SERVICE_NAME + ".Device1" + + def __init__(self, device_id="hci0"): + self.bus = dbus.SystemBus() + + # Try to find the default adapter (hci0) or a user specified adapter + self.device_path = self.find_object_path( + self.SERVICE_NAME, + self.ADAPTER_INTERFACE, + object_name=device_id) + + # If we weren't able to find an adapter with the specified ID, + # try to find any usable Bluetooth adapter + if self.device_path is None: + self.device_path = self.find_object_path( + self.SERVICE_NAME, + self.ADAPTER_INTERFACE) + + # If we aren't able to find an adapter still + if self.device_path is None: + raise Exception("Unable to find a bluetooth adapter") + + # Load the adapter's interface + print(f"Using adapter under object path: {self.device_path}") + self.device = dbus.Interface( + self.bus.get_object( + self.SERVICE_NAME, + self.device_path), + "org.freedesktop.DBus.Properties") + + if device_id: + self.device_id = device_id + else: + self.device_id = self.device_path.split("/")[-1] + + # Load the ProfileManager interface + self.profile_manager = dbus.Interface(self.bus.get_object( + self.SERVICE_NAME, self.BLUEZ_OBJECT_PATH), + self.PROFILEMANAGER_INTERFACE) + + self.adapter = dbus.Interface( + self.bus.get_object( + self.SERVICE_NAME, + self.device_path), + self.ADAPTER_INTERFACE) + + def find_object_path(self, service_name, interface_name, object_name=None): + """Searches for a D-Bus object path that contains a specified interface + under a specified service. + + :param service_name: The name of a D-Bus service to search for the + object path under. + :type service_name: string + :param interface_name: The name of a D-Bus interface to search for + within objects under the specified service. + :type interface_name: string + :param object_name: The name or ending of the object path, + defaults to None + :type object_name: string, optional + :return: The D-Bus object path or None, if no matching object + can be found + :rtype: string + """ + + manager = dbus.Interface( + self.bus.get_object(service_name, "/"), + "org.freedesktop.DBus.ObjectManager") + + # Iterating over objects under the specified service + # and searching for the specified interface + for path, ifaces in manager.GetManagedObjects().items(): + managed_interface = ifaces.get(interface_name) + if managed_interface is None: + continue + # If the object name wasn't specified or it matches + # the interface address or the path ending + elif (not object_name or + object_name == managed_interface["Address"] or + path.endswith(object_name)): + obj = self.bus.get_object(service_name, path) + return dbus.Interface(obj, interface_name).object_path + + return None + + def find_objects(self, service_name, interface_name): + """Searches for D-Bus objects that contain a specified interface + under a specified service. + + :param service_name: The name of a D-Bus service to search for the + object path under. + :type service_name: string + :param interface_name: The name of a D-Bus interface to search for + within objects under the specified service. + :type interface_name: string + :return: The D-Bus object paths matching the arguments + :rtype: array + """ + + manager = dbus.Interface( + self.bus.get_object(service_name, "/"), + "org.freedesktop.DBus.ObjectManager") + paths = [] + + # Iterating over objects under the specified service + # and searching for the specified interface within them + for path, ifaces in manager.GetManagedObjects().items(): + managed_interface = ifaces.get(interface_name) + if managed_interface is None: + continue + else: + obj = self.bus.get_object(service_name, path) + path = str(dbus.Interface(obj, interface_name).object_path) + paths.append(path) + + return paths + + @property + def address(self): + """Gets the Bluetooth MAC address of the Bluetooth adapter. + + :return: The Bluetooth Adapter's MAC address + :rtype: string + """ + + return self.device.Get(self.ADAPTER_INTERFACE, "Address").upper() + + @property + def name(self): + """Gets the name of the Bluetooth adapter. + + :return: The name of the Bluetooth adapter. + :rtype: string + """ + + return self.device.Get(self.ADAPTER_INTERFACE, "Name") + + @property + def alias(self): + """Gets the alias of the Bluetooth adapter. This value is used + as the "friendly" name of the adapter when communicating over + Bluetooth. + + :return: The adapter's alias + :rtype: string + """ + + return self.device.Get(self.ADAPTER_INTERFACE, "Alias") + + def set_alias(self, value): + """Asynchronously sets the alias of the Bluetooth adapter. + If you wish to check the set value, a time delay is needed + before the alias getter is run. + + :param value: The new value to be set as the adapter's alias + :type value: string + """ + + self.device.Set(self.ADAPTER_INTERFACE, "Alias", value) + + @property + def pairable(self): + """Gets the pairable status of the Bluetooth adapter. + + :return: A boolean value representing if the adapter is set as + pairable or not + :rtype: boolean + """ + + return bool(self.device.Get(self.ADAPTER_INTERFACE, "Pairable")) + + def set_pairable(self, value): + """Sets the pariable boolean status of the Bluetooth adapter. + + :param value: A boolean value representing if the adapter is + pairable or not. + :type value: boolean + """ + + dbus_value = dbus.Boolean(value) + self.device.Set(self.ADAPTER_INTERFACE, "Pairable", dbus_value) + + @property + def pairable_timeout(self): + """Gets the timeout time (in seconds) for how long the adapter + should remain as pairable. Defaults to 0 (no timeout). + + :return: The pairable timeout in seconds + :rtype: int + """ + + return self.device.Get(self.ADAPTER_INTERFACE, "PairableTimeout") + + def set_pairable_timeout(self, value): + """Sets the timeout time (in seconds) for the pairable property. + + :param value: The pairable timeout value in seconds + :type value: int + """ + + dbus_value = dbus.UInt32(value) + self.device.Set(self.ADAPTER_INTERFACE, "PairableTimeout", dbus_value) + + @property + def discoverable(self): + """Gets the discoverable status of the Bluetooth adapter + + :return: The boolean status of the discoverable status + :rtype: boolean + """ + + return bool(self.device.Get(self.ADAPTER_INTERFACE, "Discoverable")) + + def set_discoverable(self, value): + """Sets the discoverable boolean status of the Bluetooth adapter. + + :param value: A boolean value representing if the Bluetooth adapter + is discoverable or not. + :type value: boolean + """ + + dbus_value = dbus.Boolean(value) + self.device.Set(self.ADAPTER_INTERFACE, "Discoverable", dbus_value) + + @property + def discoverable_timeout(self): + """Gets the timeout time (in seconds) for how long the adapter + should remain as discoverable. Defaults to 180 (3 minutes). + + :return: The discoverable timeout in seconds + :rtype: int + """ + + return self.device.Get(self.ADAPTER_INTERFACE, "DiscoverableTimeout") + + def set_discoverable_timeout(self, value): + """Sets the discoverable time (in seconds) for the discoverable + property. Setting this property to 0 results in an infinite + discoverable timeout. + + :param value: The discoverable timeout value in seconds + :type value: int + """ + + dbus_value = dbus.UInt32(value) + self.device.Set( + self.ADAPTER_INTERFACE, + "DiscoverableTimeout", + dbus_value) + + @property + def device_class(self): + """Gets the Bluetooth class of the device. This represents what type + of device this reporting as (Ex: Gamepad, Headphones, etc). + + :return: A 32-bit hexadecimal Integer representing the + Bluetooth Code for a given device type. + :rtype: string + """ + + # This is another hacky bit. We're using hciconfig here instead + # of the D-Bus API so that results match the setter. See the + # setter for further justification on using hciconfig. + result = subprocess.run( + ["hciconfig", self.device_id, "class"], + stdout=subprocess.PIPE) + device_class = result.stdout.decode("utf-8").split("Class: ")[1][0:8] + + return device_class + + def set_device_class(self, device_class): + """Sets the Bluetooth class of the device. This represents what type + of device this reporting as (Ex: Gamepad, Headphones, etc). + Note: To work this function *MUST* be run as the super user. An + exception is returned if this function is run without elevation. + + :param device_class: A 32-bit Hexadecimal integer + :type device_class: string + :raises PermissionError: If user is not root + :raises ValueError: If the device class is not length 8 + :raises Exception: On inability to set class + """ + + if os.geteuid() != 0: + raise PermissionError("The device class must be set as root") + + if len(device_class) != 8: + raise ValueError("Device class must be length 8") + + # This is a bit of a hack. BlueZ allows you to set this value, however, + # a config file needs to filled and the BT daemon restarted. This is a + # good compromise but requires super user privileges. Not ideal. + result = subprocess.run( + ["hciconfig", self.device_id, "class", device_class], + stderr=subprocess.PIPE) + + # Checking if there was a problem setting the device class + cmd_err = result.stderr.decode("utf-8").replace("\n", "") + if cmd_err != "": + raise Exception(cmd_err) + + @property + def powered(self): + """The powered state of the adapter (on/off) as a boolean value. + + :return: A boolean representing the powered state of the adapter. + :rtype: boolean + """ + + return bool(self.device.Get(self.ADAPTER_INTERFACE, "Powered")) + + def set_powered(self, value): + """Switches the adapter on or off. + + :param value: A boolean value switching the adapter on or off + :type value: boolean + """ + + dbus_value = dbus.Boolean(value) + self.device.Set(self.ADAPTER_INTERFACE, "Powered", dbus_value) + + def register_profile(self, profile_path, uuid, opts): + """Registers an SDP record on the BlueZ SDP server. + + Options (non-exhaustive, refer to BlueZ docs for + the complete list): + + - Name: Human readable name of the profile + + - Role: Specifies precise local role. Either "client" + or "servier". + + - RequireAuthentication: A boolean value indicating if + pairing is required before connection. + + - RequireAuthorization: A boolean value indiciating if + authorization is needed before connection. + + - AutoConnect: A boolean value indicating whether a + connection can be forced if a client UUID is present. + + - ServiceRecord: An XML SDP record as a string. + + :param profile_path: The path for the SDP record + :type profile_path: string + :param uuid: The UUID for the SDP record + :type uuid: string + :param opts: The options for the SDP server + :type opts: dict + """ + + self.profile_manager.RegisterProfile(profile_path, uuid, opts) + + def reset(self): + """Restarts the Bluetooth Service + + :raises Exception: If the bluetooth service can't be restarted + """ + + result = subprocess.run( + ["systemctl", "restart", "bluetooth"], + stderr=subprocess.PIPE) + + cmd_err = result.stderr.decode("utf-8").replace("\n", "") + if cmd_err != "": + raise Exception(cmd_err) + + self.device = dbus.Interface( + self.bus.get_object( + self.SERVICE_NAME, + self.device_path), + "org.freedesktop.DBus.Properties") + self.profile_manager = dbus.Interface( + self.bus.get_object( + self.SERVICE_NAME, + self.BLUEZ_OBJECT_PATH), + self.PROFILEMANAGER_INTERFACE) + + def toggle_input_plugin(self, toggle): + """Enables or disables the BlueZ input plugin. Requires + root user to be run. The units and Bluetooth service will + not be restarted if the input plugin already matches + the toggle. + + :param toggle: A boolean element indicating if the plugin + is enabled (True) or disabled (False) + :type toggle: boolean + :raises PermissionError: If the user is not root + :raises Exception: If the units can't be reloaded + """ + + if os.geteuid() != 0: + raise PermissionError("The input plugin must be toggled as root") + + service_path = "/lib/systemd/system/bluetooth.service" + service = None + with open(service_path, "r") as f: + service = f.read() + + # Find the bluetooth service execution line + lines = service.split("\n") + for i in range(0, len(lines)): + line = lines[i] + if line.startswith("ExecStart="): + # If we want to ensure the plugin is enabled + if toggle: + # If input is already enabled + if "--noplugin=input" not in line: + return + lines[i] = re.sub(" --noplugin=input", "", line) + else: + # If input is already disabled + if "--noplugin=input" in line: + return + # If not, add the flag + lines[i] = line + " --noplugin=input" + + service = "\n".join(lines) + with open(service_path, "w") as f: + f.write(service) + + # Reload units + result = subprocess.run( + ["systemctl", "daemon-reload"], + stderr=subprocess.PIPE) + + cmd_err = result.stderr.decode("utf-8").replace("\n", "") + if cmd_err != "": + raise Exception(cmd_err) + + # Reload the bluetooth service with input disabled + self.reset() + + def get_discovered_devices(self): + """Gets a dict of all discovered (or previously discovered + and connected) devices. The key is the device's dbus object + path and the values are the device's properties. + + The following is a non-exhaustive list of the properties a + device dictionary can contain: + - "Address": The Bluetooth address + - "Alias": The friendly name of the device + - "Paired": Whether the device is paired + - "Connected": Whether the device is presently connected + - "UUIDs": The services a device provides + + :return: A dictionary of all discovered devices + :rtype: dictionary + """ + + bluez_objects = dbus.Interface( + self.bus.get_object(self.SERVICE_NAME, "/"), + "org.freedesktop.DBus.ObjectManager") + + devices = {} + objects = bluez_objects.GetManagedObjects() + for path, interfaces in list(objects.items()): + if self.DEVICE_INTERFACE in interfaces: + devices[str(path)] = interfaces[self.DEVICE_INTERFACE] + + return devices + + def discover_devices(self, alias=None, timeout=10, callback=None): + """Runs a device discovery of the timeout length (in seconds) + on the adapter. If specified, a callback is run, every second, + and passed an updated list of discovered devices. An alias + can be specified to filter discovered devices. + + The following is a non-exhaustive list of the properties a + device dictionary can contain: + - "Address": The Bluetooth address + - "Alias": The friendly name of the device + - "Paired": Whether the device is paired + - "Connected": Whether the device is presently connected + - "UUIDs": The services a device provides + + :param alias: The alias of a bluetooth device, defaults to None + :type alias: string, optional + :param timeout: The discovery timeout in seconds, defaults to 10 + :type timeout: int, optional + :param callback: A callback function, defaults to None + :type callback: function, optional + :return: A dictionary of discovered devices with the object path + as the key and the device properties as the dictionary properties + :rtype: dictionary + """ + + # TODO: Device discovery still needs work. Currently, devices + # are added as DBus objects while device discovery runs, however, + # added devices linger after discovery stops. This means a device + # can become unpairable, still show up on a new discovery session, + # and throw an error when an attempt is made to pair it. Using DBus + # signals ("interface added"/"property changed") does not solve + # this issue. + + # Get all devices that have been previously discovered + devices = self.get_discovered_devices() + + # Start discovering new devices and loop + self.adapter.StartDiscovery() + try: + for i in range(0, timeout): + time.sleep(1) + + new_devices = self.get_discovered_devices() + # Shallowly merging dictionaries. Latter dictionary + # overrides the former. Requires Python 3.5 + devices = {**devices, **new_devices} + + if callback: + callback(devices) + finally: + self.adapter.StopDiscovery() + + # Filter out paired devices or devices that don't + # match a specified alias. + filtered_devices = {} + for key in devices.keys(): + # Filter for devices matching alias, if specified + if "Alias" not in devices[key].keys(): + continue + if alias and not alias == devices[key]["Alias"]: + continue + + # Filter for paired devices + if "Paired" not in devices[key].keys(): + continue + if devices[key]["Paired"]: + continue + + filtered_devices[key] = devices[key] + + return filtered_devices + + def pair_device(self, device_path): + """Pairs a discovered device at a given DBus object path. + + :param device_path: The D-Bus object path to the device + :type device_path: string + """ + + device = dbus.Interface( + self.bus.get_object( + self.SERVICE_NAME, + device_path), + self.DEVICE_INTERFACE) + device.Pair() + + def connect_device(self, device_path): + + device = dbus.Interface( + self.bus.get_object( + self.SERVICE_NAME, + device_path), + self.DEVICE_INTERFACE) + try: + device.Connect() + except dbus.exceptions.DBusException: + print("Here1") + + def remove_device(self, path): + """Removes a device that's been either discovered, paired, + connected, etc. + + :param path: The D-Bus path to the object + :type path: string + """ + + self.adapter.RemoveDevice( + self.bus.get_object(self.SERVICE_NAME, path)) + + def find_device_by_address(self, address): + """Finds the D-Bus path to a device that contains the + specified address. + + :param address: The Bluetooth MAC address + :type address: string + :return: The path to the D-Bus object or None + :rtype: string or None + """ + + # Find all connected/paired/discovered devices + devices = self.find_objects( + self.SERVICE_NAME, + self.DEVICE_INTERFACE) + for path in devices: + # Get the device's address and paired status + device_props = dbus.Interface( + self.bus.get_object(self.SERVICE_NAME, path), + "org.freedesktop.DBus.Properties") + device_addr = device_props.Get( + self.DEVICE_INTERFACE, + "Address").upper() + + # Check for an address match + if device_addr != address.upper(): + continue + return path + + return None diff --git a/nxbt/cli.py b/nxbt/cli.py new file mode 100644 index 0000000..cc46ed2 --- /dev/null +++ b/nxbt/cli.py @@ -0,0 +1,2 @@ +def main(): + raise NotImplementedError() \ No newline at end of file diff --git a/nxbt/controller/__init__.py b/nxbt/controller/__init__.py new file mode 100644 index 0000000..a832b79 --- /dev/null +++ b/nxbt/controller/__init__.py @@ -0,0 +1,6 @@ +from .server import ControllerServer +from .controller import ControllerTypes +from .controller import Controller +from .protocol import ControllerProtocol +from .protocol import SwitchReportParser +from .protocol import SwitchResponses diff --git a/nxbt/controller/controller.py b/nxbt/controller/controller.py new file mode 100644 index 0000000..8270059 --- /dev/null +++ b/nxbt/controller/controller.py @@ -0,0 +1,69 @@ +from enum import Enum +import os + +import dbus + + +class ControllerTypes(Enum): + """Controller type enumerations for initializing the controller server. + """ + + JOYCON_L = 1 + JOYCON_R = 2 + PRO_CONTROLLER = 3 + + +class Controller(): + + GAMEPAD_CLASS = "0x002508" + SDP_UUID = "00001000-0000-1000-8000-00805f9b34fb" + SDP_RECORD_PATH = "/nxbt/controller" + ALIASES = { + ControllerTypes.JOYCON_L: "Joy-Con (L)", + ControllerTypes.JOYCON_R: "Joy-Con (R)", + ControllerTypes.PRO_CONTROLLER: "Pro Controller" + } + + def __init__(self, bluetooth, controller_type): + + self.bt = bluetooth + + if controller_type not in self.ALIASES.keys(): + raise ValueError("Unknown controller type specified") + self.alias = self.ALIASES[controller_type] + + def setup(self): + """Configures the specified Bluetooth device as the + specified controller. + """ + + # Setting up Bluetooth adapter options + self.bt.set_powered(True) + self.bt.set_pairable(True) + self.bt.set_pairable_timeout(0) + self.bt.set_discoverable_timeout(180) + + self.bt.set_alias(self.alias) + + # Adding the SDP record + sdp_record_path = os.path.join( + os.path.dirname(__file__), "sdp", "switch-controller.xml") + sdp_record = None + with open(sdp_record_path, "r") as f: + sdp_record = f.read() + + opts = { + "ServiceRecord": sdp_record, + "Role": "server", + "RequireAuthentication": False, + "RequireAuthorization": False, + "AutoConnect": True + } + # If the profile has already been registered, + # catch the error and continue + try: + self.bt.register_profile(self.SDP_RECORD_PATH, self.SDP_UUID, opts) + except dbus.exceptions.DBusException: + pass + + self.bt.set_device_class(self.GAMEPAD_CLASS) diff --git a/nxbt/controller/input.py b/nxbt/controller/input.py new file mode 100644 index 0000000..ed5f5d6 --- /dev/null +++ b/nxbt/controller/input.py @@ -0,0 +1,4 @@ +class InputParser(): + + def __init__(): + print("") diff --git a/nxbt/controller/protocol.py b/nxbt/controller/protocol.py new file mode 100644 index 0000000..7ae1559 --- /dev/null +++ b/nxbt/controller/protocol.py @@ -0,0 +1,575 @@ +from enum import Enum +import random +from time import perf_counter + +from .controller import ControllerTypes +from .utils import replace_subarray + + +class SwitchResponses(Enum): + + NO_DATA = -1 + MALFORMED = -2 + TOO_SHORT = -3 + UNKNOWN_SUBCOMMAND = -4 + REQUEST_DEVICE_INFO = 2 + SET_SHIPMENT = 0x08 + SPI_READ = 0x10 + SET_MODE = 0x03 + TRIGGER_BUTTONS = 0x04 + TOGGLE_IMU = 0x40 + ENABLE_VIBRATION = 0x48 + SET_PLAYER = 0x30 + SET_NFC_IR_STATE = 0x22 + SET_NFC_IR_CONFIG = 0x21 + + +class ControllerProtocol(): + + CONTROLLER_INFO = { + ControllerTypes.JOYCON_L: { + "id": 0x01, + "connection_info": 0x0E + }, + ControllerTypes.JOYCON_R: { + "id": 0x02, + "connection_info": 0x0E + }, + ControllerTypes.PRO_CONTROLLER: { + "id": 0x03, + "connection_info": 0x00 + } + } + VIBRATOR_BYTES = [0xA0, 0xB0, 0xC0, 0x90] + + def __init__(self, controller_type, bt_address, report_size=50): + """Initializes the protocol for the controller. + + :param controller_type: The type of controller (Joy-Con (L), + Pro Controller, etc) + :type controller_type: ControllerTypes + :param bt_address: A colon-separated Bluetooth MAC address + :type bt_address: string + :param report_size: The size of the protocol report, defaults to 50 + :type report_size: int, optional + :raises ValueError: On unknown controller type + """ + + self.bt_address = bt_address + + if controller_type in self.CONTROLLER_INFO.keys(): + self.controller_type = controller_type + else: + raise ValueError("Unknown controller type specified") + + self.report = None + self.report_size = report_size + self.set_empty_report() + + # Input report mode + self.mode = None + + # Player number + self.player_number = None + + # Setting if the controller has been asked for device info + # Enables buttons/stick output for the standard full report + self.device_info_queried = False + + # Standard Input Report Properties + # Timestamp to generate timer byte ticks + self.timer = 0 + self.timestamp = None + + # High/Low Nibble + self.battery_level = 0x90 + self.connection_info = ( + self.CONTROLLER_INFO[self.controller_type]["connection_info"]) + + self.button_status = [0x00] * 3 + + # Disable left stick if we have a right Joy-Con + if self.controller_type == ControllerTypes.JOYCON_R: + self.left_stick_status = [0x00] * 3 + else: + self.left_stick_status = [0x74, 0x58, 0x75] + + # Disable right stick if we have a left Joy-Con + if self.controller_type == ControllerTypes.JOYCON_L: + self.right_stick_status = [0x00] * 3 + else: + self.right_stick_status = [0x4B, 0x68, 0x7C] + + self.vibrator_report = random.choice(self.VIBRATOR_BYTES) + + # IMU (Six Axis Sensor) State + self.imu_enabled = False + + # Controller colours + # Body Colour + self.colour_body = [0x82] * 3 + self.colour_buttons = [0x0F] * 3 + + def get_report(self): + + report = bytes(self.report) + # Clear report + self.set_empty_report() + return report + + def process_commands(self, data): + + # Parsing the Switch's message + message = SwitchReportParser(data) + # print(message.response) + + # Responding to the parsed message + if message.response == SwitchResponses.REQUEST_DEVICE_INFO: + self.device_info_queried = True + self.set_subcommand_reply() + self.set_device_info() + + elif message.response == SwitchResponses.SET_SHIPMENT: + self.set_subcommand_reply() + self.set_shipment() + + elif message.response == SwitchResponses.SPI_READ: + self.set_subcommand_reply() + self.spi_read(message) + + elif message.response == SwitchResponses.SET_MODE: + self.set_subcommand_reply() + self.set_mode(message) + + elif message.response == SwitchResponses.TRIGGER_BUTTONS: + self.set_subcommand_reply() + self.set_trigger_buttons() + + elif message.response == SwitchResponses.TOGGLE_IMU: + self.set_subcommand_reply() + self.toggle_imu(message) + + elif message.response == SwitchResponses.ENABLE_VIBRATION: + self.set_subcommand_reply() + self.enable_vibration() + + elif message.response == SwitchResponses.SET_PLAYER: + self.set_subcommand_reply() + self.set_player_lights(message) + + elif message.response == SwitchResponses.SET_NFC_IR_STATE: + self.set_subcommand_reply() + self.set_nfc_ir_state() + + elif message.response == SwitchResponses.SET_NFC_IR_CONFIG: + self.set_subcommand_reply() + self.set_nfc_ir_config() + + # Bad Packet handling statements + elif message.response == SwitchResponses.UNKNOWN_SUBCOMMAND: + self.set_full_input_report() + # self.set_subcommand_reply() + # self.set_unknown_subcommand(message.subcommand_id) + + elif message.response == SwitchResponses.NO_DATA: + self.set_full_input_report() + + elif message.response == SwitchResponses.TOO_SHORT: + self.set_full_input_report() + + elif message.response == SwitchResponses.MALFORMED: + self.set_full_input_report() + + def set_empty_report(self): + + empty_report = [0] * self.report_size + empty_report[0] = 0xA1 + + self.report = empty_report + + def set_subcommand_reply(self): + + # Input Report ID + self.report[1] = 0x21 + + # TODO: Find out what the vibrator byte is doing. + # This is a hack in an attempt to semi-emulate + # actions of the vibrator byte as it seems to change + # when a subcommand reply is sent. + self.vibrator_report = random.choice(self.VIBRATOR_BYTES) + + self.set_standard_input_report() + + def set_unknown_subcommand(self, subcommand_id): + + # Set NACK + self.report[14] + + # Set unknown subcommand ID + self.report[15] = subcommand_id + + def set_timer(self): + + # If the timer hasn't been set before + if not self.timestamp: + self.timestamp = perf_counter() + self.report[2] = 0x00 + return + + # Get the time that has passed since the last timestamp + # in milliseconds + now = perf_counter() + delta_t = (now - self.timestamp) * 1000 + + # Get how many ticks have passed in hex with overflow at 255 + # Joy-Con uses 4.96ms as the timer tick rate + elapsed_ticks = int(delta_t // 4.96) + self.timer = (self.timer + elapsed_ticks) & 0xFF + + self.report[2] = self.timer + self.timestamp = now + + def set_full_input_report(self): + + # Setting Report ID to full standard input report ID + self.report[1] = 0x30 + self.set_standard_input_report() + self.set_imu_data() + + def set_standard_input_report(self): + + self.set_timer() + + if self.device_info_queried: + self.report[3] = self.battery_level + self.connection_info + + self.report[4] = self.button_status[0] + self.report[5] = self.button_status[1] + self.report[6] = self.button_status[2] + + self.report[7] = self.left_stick_status[0] + self.report[8] = self.left_stick_status[1] + self.report[9] = self.left_stick_status[2] + + self.report[10] = self.right_stick_status[0] + self.report[11] = self.right_stick_status[1] + self.report[12] = self.right_stick_status[2] + + self.report[13] = self.vibrator_report + + def set_device_info(self): + + # ACK Reply + self.report[14] = 0x82 + + # Subcommand Reply + self.report[15] = 0x02 + + # Firmware version + self.report[16] = 0x03 + self.report[17] = 0x8B + + # Controller ID + self.report[18] = self.CONTROLLER_INFO[self.controller_type]["id"] + + # Unknown Byte, always 2 + self.report[19] = 0x02 + + # Controller Bluetooth Address + address = self.bt_address.strip().split(":") # Getting from adapter + address_location = 20 + for address_byte_str in address: + # Converting string address bytes to hex + # and assigning to report + address_byte = int(address_byte_str, 16) + self.report[address_location] = address_byte + address_location += 1 + + # Unknown byte, always 1 + self.report[26] = 0x01 + + # Controller colours location (read from SPI) + self.report[27] = 0x01 + + def set_shipment(self): + + # ACK Reply + self.report[14] = 0x80 + + # Subcommand reply + self.report[15] = 0x08 + + def toggle_imu(self, message): + + if message.subcommand[1] == 0x01: + self.imu_enabled = True + else: + self.imu_enabled = False + + # ACK Reply + self.report[14] = 0x80 + + # Subcommand reply + self.report[15] = 0x40 + + def set_imu_data(self): + + if not self.imu_enabled: + return + + imu_data = [0x75, 0xFD, 0xFD, 0xFF, 0x09, 0x10, 0x21, 0x00, 0xD5, 0xFF, + 0xE0, 0xFF, 0x72, 0xFD, 0xF9, 0xFF, 0x0A, 0x10, 0x22, 0x00, + 0xD5, 0xFF, 0xE0, 0xFF, 0x76, 0xFD, 0xFC, 0xFF, 0x09, 0x10, + 0x23, 0x00, 0xD5, 0xFF, 0xE0, 0xFF] + replace_subarray(self.report, 14, 49, replace_arr=imu_data) + + def spi_read(self, message): + + addr_top = message.subcommand[2] + addr_bottom = message.subcommand[1] + read_length = message.subcommand[5] + + # ACK byte + self.report[14] = 0x90 + + # Subcommand reply + self.report[15] = 0x10 + + # Read address + self.report[16] = addr_bottom + self.report[17] = addr_top + + # Read length + self.report[20] = read_length + + # Stick Parameters + # Params are generally the same for all sticks + # Notable difference is the deadzone (10% Joy-Con vs 15% Pro Con) + params = [0x0F, 0x30, 0x61, # Unused + 0x96, 0x30, 0xF3, # Dead Zone/Range Ratio + 0xD4, 0x14, 0x54, # X/Y ? + 0x41, 0x15, 0x54, # X/Y ? + 0xC7, 0x79, 0x9C, # X/Y ? + 0x33, 0x36, 0x63] # X/Y ? + # Adjusting deadzone for Joy-Cons + if not self.controller_type == ControllerTypes.PRO_CONTROLLER: + params[3] = 0xAE + + # Serial Number read + if addr_top == 0x60 and addr_bottom == 0x00: + # Switch will take this as no serial number + replace_subarray(self.report, 21, 16, 0xFF) + + # Colours + elif addr_top == 0x60 and addr_bottom == 0x50: + # Body colour + replace_subarray( + self.report, 21, 3, + replace_arr=self.colour_body) + # Buttons colour + replace_subarray( + self.report, 24, 3, + replace_arr=self.colour_buttons) + # Left/right grip colours (Pro controller) + replace_subarray(self.report, 27, 7, 0xFF) + + # Factory sensor/stick device parameters + elif addr_top == 0x60 and addr_bottom == 0x80: + + # Six-Axis factory parameters + if self.controller_type == ControllerTypes.PRO_CONTROLLER: + self.report[21] = 0x50 + self.report[22] = 0xFD + self.report[23] = 0x00 + self.report[24] = 0x00 + self.report[25] = 0xC6 + self.report[26] = 0x0F + else: + self.report[21] = 0x5E + self.report[22] = 0x01 + self.report[23] = 0x00 + self.report[24] = 0x00 + if self.controller_type == ControllerTypes.JOYCON_L: + self.report[25] = 0xF1 + self.report[26] = 0x0F + else: + self.report[25] = 0x0F + self.report[26] = 0xF0 + + replace_subarray(self.report, 27, 18, replace_arr=params) + + # Stick device parameters 2 + elif addr_top == 0x60 and addr_bottom == 0x98: + + # Setting same params since controllers always + # have duplicates of stick params 1 for stick params 2 + replace_subarray(self.report, 21, 18, replace_arr=params) + + # User analog stick calibration + elif addr_top == 0x80 and addr_bottom == 0x10: + + # Fill report with null user calibration info + replace_subarray(self.report, 21, 24, 0xFF) + + # Factory analog stick calibration + elif addr_top == 0x60 and addr_bottom == 0x3D: + + # Left/right stick calibration + l_calibration = [0xBA, 0xF5, 0x62, + 0x6F, 0xC8, 0x77, + 0xED, 0x95, 0x5B] + r_calibration = [0x16, 0xD8, 0x7D, + 0xF2, 0xB5, 0x5F, + 0x86, 0x65, 0x5E] + + # Left stick calibration + # If null, fill with 0xFF + if not self.controller_type == ControllerTypes.JOYCON_R: + replace_subarray(self.report, 21, 9, replace_arr=l_calibration) + else: + replace_subarray(self.report, 21, 9, value=0xFF) + + # Right stick calibration + # If null, fill with 0xFF + if not self.controller_type == ControllerTypes.JOYCON_L: + replace_subarray(self.report, 30, 9, replace_arr=r_calibration) + else: + replace_subarray(self.report, 30, 9, value=0xFF) + + # Body colour + replace_subarray( + self.report, 39, 3, + replace_arr=self.colour_body) + # Buttons colour + replace_subarray( + self.report, 42, 3, + replace_arr=self.colour_buttons) + + # Six-Axis motion sensor factor calibration + elif addr_top == 0x60 and addr_bottom == 0x20: + + # 1: Acceleration origin position + # 2: Acceleration sensitivity coefficient + # 3: Gyro origin when still + # 4: Gyro sensitivity coefficient + sa_calibration = [0xD3, 0xFF, 0xD5, 0xFF, 0x55, 0x01, # 1 + 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, # 2 + 0x19, 0x00, 0xDD, 0xFF, 0xDC, 0xFF, # 3 + 0x3B, 0x34, 0x3B, 0x34, 0x3B, 0x34] # 4 + + replace_subarray(self.report, 21, 24, replace_arr=sa_calibration) + + def set_mode(self, message): + + # ACK byte + self.report[14] = 0x80 + + # Subcommand reply + self.report[15] = 0x03 + + if message.subcommand[1] == 0x30: + self.mode = "standard" + elif message.subcommand[1] == 0x31: + self.mode = "nfc/ir" + elif message.subcommand[1] == 0x3F: + self.mode = "simpleHID" + + def set_trigger_buttons(self): + + # ACK byte + self.report[14] = 0x83 + + # Subcommand reply + self.report[15] = 0x04 + + def enable_vibration(self): + + # ACK Reply + self.report[14] = 0x80 + + # Subcommand reply + self.report[15] = 0x48 + + def set_player_lights(self, message): + + # ACK byte + self.report[14] = 0x80 + + # Subcommand reply + self.report[15] = 0x30 + + bitfield = message.subcommand[1] + + if bitfield == 0x01 or bitfield == 0x1F: + self.player_number = 1 + elif bitfield == 0x03 or bitfield == 0x3F: + self.player_number = 2 + elif bitfield == 0x07 or bitfield == 0x7F: + self.player_number = 3 + elif bitfield == 0x0F or bitfield == 0xFF: + self.player_number = 4 + + def set_nfc_ir_state(self): + + # ACK byte + self.report[14] = 0x80 + + # Subcommand reply + self.report[15] = 0x22 + + def set_nfc_ir_config(self): + + # ACK byte + self.report[14] = 0xA0 + + # Subcommand reply + self.report[15] = 0x21 + + # NFC/IR state data + params = [0x01, 0x00, 0xFF, 0x00, 0x08, 0x00, 0x1B, 0x01] + replace_subarray(self.report, 16, 8, replace_arr=params) + self.report[49] = 0xC8 + + +class SwitchReportParser(): + + SUBCOMMANDS = { + 0x02: SwitchResponses.REQUEST_DEVICE_INFO, + 0x08: SwitchResponses.SET_SHIPMENT, + 0x10: SwitchResponses.SPI_READ, + 0x03: SwitchResponses.SET_MODE, + 0x04: SwitchResponses.TRIGGER_BUTTONS, + 0x40: SwitchResponses.TOGGLE_IMU, + 0x48: SwitchResponses.ENABLE_VIBRATION, + 0x30: SwitchResponses.SET_PLAYER, + 0x22: SwitchResponses.SET_NFC_IR_STATE, + 0x21: SwitchResponses.SET_NFC_IR_CONFIG, + } + + def __init__(self, data, data_length=50): + + # Non-data check + if not data: + self.response = SwitchResponses.NO_DATA + return + + # Report length check + if len(data) < data_length: + self.response = SwitchResponses.TOO_SHORT + return + + # First byte check + if data[0] != 0xA2: + self.response = SwitchResponses.MALFORMED + return + + # Splitting data + self.payload = data[:11] + self.subcommand = data[11:] + self.subcommand_id = self.subcommand[0] + + # Parsing the subcommand + if self.subcommand[0] in self.SUBCOMMANDS.keys(): + self.response = self.SUBCOMMANDS[self.subcommand[0]] + else: + self.response = SwitchResponses.UNKNOWN_SUBCOMMAND diff --git a/nxbt/controller/sdp/switch-controller.xml b/nxbt/controller/sdp/switch-controller.xml new file mode 100644 index 0000000..04303a2 --- /dev/null +++ b/nxbt/controller/sdp/switch-controller.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/nxbt/controller/server.py b/nxbt/controller/server.py new file mode 100644 index 0000000..2a4b0ad --- /dev/null +++ b/nxbt/controller/server.py @@ -0,0 +1,175 @@ +import socket +import fcntl +import os +import time + +from .controller import Controller, ControllerTypes +from ..bluez import BlueZ +from .protocol import ControllerProtocol +from .utils import format_msg_controller, format_msg_switch + + +class ControllerServer(): + + def __init__(self, controller_type, bt_device_id="hci0"): + + self.controller_type = controller_type + + # Intializing Bluetooth + self.bt = BlueZ(device_id=bt_device_id) + + self.controller = Controller(self.bt, self.controller_type) + self.protocol = ControllerProtocol( + self.controller_type, + self.bt.address) + + def run(self, reconnect_address=None): + """Runs the mainloop of the controller server. + + :param reconnect_address: The Bluetooth MAC address of a + previously connected to Nintendo Switch, defaults to None + :type reconnect_address: string, optional + """ + + self.controller.setup() + + if reconnect_address: + itr, s_itr, ctrl, s_ctrl = self.reconnect(reconnect_address) + else: + itr, s_itr, ctrl, s_ctrl = self.connect() + + # Mainloop + while True: + # Attempt to get output from Switch + try: + reply = itr.recv(50) + if len(reply) > 40: + print(format_msg_switch(reply)) + except BlockingIOError: + reply = None + + self.protocol.process_commands(reply) + msg = self.protocol.get_report() + + if reply: + print(format_msg_controller(msg)) + + try: + itr.sendall(msg) + except BlockingIOError: + continue + + # Respond at 120Hz for Pro Controller + # or 60Hz for Joy-Cons + if self.controller_type == ControllerTypes.PRO_CONTROLLER: + time.sleep(1/120) + else: + time.sleep(1/60) + + def connect(self): + """Configures as a specified controller, pairs with a Nintendo Switch, + and creates/accepts sockets for communication with the Switch. + """ + + # Creating control and interrupt sockets + s_ctrl = socket.socket( + family=socket.AF_BLUETOOTH, + type=socket.SOCK_SEQPACKET, + proto=socket.BTPROTO_L2CAP) + s_itr = socket.socket( + family=socket.AF_BLUETOOTH, + type=socket.SOCK_SEQPACKET, + proto=socket.BTPROTO_L2CAP) + + # Setting up HID interrupt/control sockets + try: + s_ctrl.bind((self.bt.address, 17)) + s_itr.bind((self.bt.address, 19)) + except OSError: + s_ctrl.bind((socket.BDADDR_ANY, 17)) + s_itr.bind((socket.BDADDR_ANY, 19)) + + s_itr.listen(1) + s_ctrl.listen(1) + + self.bt.set_discoverable(True) + + ctrl, ctrl_address = s_ctrl.accept() + itr, itr_address = s_itr.accept() + + # Send an empty input report to the Switch to prompt a reply + self.protocol.process_commands(None) + msg = self.protocol.get_report() + itr.sendall(msg) + + # Setting interrupt connection as non-blocking + # In this case, non-blocking means it throws a "BlockingIOError" + # for sending and receiving, instead of blocking + fcntl.fcntl(itr, fcntl.F_SETFL, os.O_NONBLOCK) + + # Mainloop + while True: + # Attempt to get output from Switch + try: + reply = itr.recv(50) + if len(reply) > 40: + print(format_msg_switch(reply)) + except BlockingIOError: + reply = None + + self.protocol.process_commands(reply) + msg = self.protocol.get_report() + + #if reply: + # print(format_msg_controller(msg)) + + try: + itr.sendall(msg) + except BlockingIOError: + continue + + # Exit pairing loop on set player lights + if reply and len(reply) > 45 and reply[11] == 0x30: + break + + # Switch responds to packets slower during pairing + # Pairing cycle responds optimally on a 15Hz loop + time.sleep(1/15) + + return itr, s_itr, ctrl, s_ctrl + + def reconnect(self, reconnect_address): + """Attempts to reconnect with a Switch at the given address. + + :param reconnect_address: The Bluetooth MAC address of the Switch + :type reconnect_address: string + """ + + device_path = self.bt.find_device_by_address(reconnect_address) + if not device_path: + raise ValueError( + "No device Switch found with MAC address " + reconnect_address) + + # Creating control and interrupt sockets + s_ctrl = socket.socket( + family=socket.AF_BLUETOOTH, + type=socket.SOCK_SEQPACKET, + proto=socket.BTPROTO_L2CAP) + s_itr = socket.socket( + family=socket.AF_BLUETOOTH, + type=socket.SOCK_SEQPACKET, + proto=socket.BTPROTO_L2CAP) + + # Setting up HID interrupt/control sockets + s_ctrl.bind((self.bt.address, 17)) + s_itr.bind((self.bt.address, 19)) + + s_itr.listen(1) + s_ctrl.listen(1) + + self.bt.connect_device(device_path) + + ctrl, ctrl_address = s_ctrl.accept() + itr, itr_address = s_itr.accept() + + print("Here") diff --git a/nxbt/controller/utils.py b/nxbt/controller/utils.py new file mode 100644 index 0000000..5216961 --- /dev/null +++ b/nxbt/controller/utils.py @@ -0,0 +1,59 @@ +def replace_subarray(arr, start, num_elms, value=0, replace_arr=None): + + if replace_arr: + arr[start:start + num_elms] = replace_arr + else: + arr[start:start + num_elms] = [value] * num_elms + + +def format_message(data, split, name): + """Formats a given byte message in hex format split + into payload and subcommand sections. + + :param data: A series of bytes + :type data: bytes + :param split: The location of the payload/subcommand split + :type split: integer + :param name: The name featured in the start/end messages + :type name: string + :return: The formatted data + :rtype: string + """ + + payload = "" + subcommand = "" + for i in range(0, len(data)): + data_byte = str(hex(data[i]))[2:].upper() + if len(data_byte) < 2: + data_byte = "0" + data_byte + if i <= split: + payload += "0x" + data_byte + " " + else: + subcommand += "0x" + data_byte + " " + + formatted = ( + f"--- {name} Msg ---\n" + + f"Payload: {payload}\n" + + f"Subcommand: {subcommand}") + + return formatted + + +def format_msg_controller(data): + """Prints a formatted message from a controller + + :param data: The bytes from the controller message + :type data: bytes + """ + + return format_message(data, 13, "Controller") + + +def format_msg_switch(data): + """Prints a formatted message from a Switch + + :param data: The bytes from the Switch message + :type data: bytes + """ + + return format_message(data, 10, "Switch") diff --git a/nxbt/manager.py b/nxbt/manager.py new file mode 100644 index 0000000..69aa933 --- /dev/null +++ b/nxbt/manager.py @@ -0,0 +1,12 @@ +from multiprocessing import Process +from multiprocessing import Queue + +from .controller import ControllerServer +from .controller import ControllerTypes + + +class Nxbt(): + + def __init__(self): + + self.task_queue = Queue() diff --git a/nxbt/web/app.py b/nxbt/web/app.py new file mode 100644 index 0000000..13ffacd --- /dev/null +++ b/nxbt/web/app.py @@ -0,0 +1,53 @@ +import time +import os + +from flask import Flask, render_template +from flask_socketio import SocketIO, emit +import eventlet + + +app = Flask(__name__, + static_url_path='', + static_folder='static',) + +# Configuring/retrieving secret key +secrets_path = os.path.join( + os.path.dirname(__file__), "secrets.txt" +) +if not os.path.isfile(secrets_path): + secret_key = os.urandom(24).hex() + with open(secrets_path, "w") as f: + f.write(secret_key) +else: + secret_key = None + with open(secrets_path, "r") as f: + secret_key = f.read() +app.config['SECRET_KEY'] = secret_key + +# Starting socket server with Flask app +sio = SocketIO(app) + + +@app.route('/') +def index(): + return render_template('index.html') + + +@sio.on('connect') +def on_connect(): + print("Connected") + emit('my response', {'data': 'Connected'}) + + +@sio.on('disconnect') +def on_disconnect(): + print("Disconnected") + + +@sio.on('message') +def handle_message(message): + print("Elapsed Time", (time.time()*1000) - message["timestamp"]) + + +if __name__ == "__main__": + eventlet.wsgi.server(eventlet.listen(('', 8000)), app) diff --git a/nxbt/web/static/js/socket.io.js b/nxbt/web/static/js/socket.io.js new file mode 100644 index 0000000..d3e3950 --- /dev/null +++ b/nxbt/web/static/js/socket.io.js @@ -0,0 +1,9 @@ +/*! + * Socket.IO v2.2.0 + * (c) 2014-2018 Guillermo Rauch + * Released under the MIT License. + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.io=e():t.io=e()}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";function r(t,e){"object"===("undefined"==typeof t?"undefined":o(t))&&(e=t,t=void 0),e=e||{};var n,r=i(t),s=r.source,u=r.id,h=r.path,f=p[u]&&h in p[u].nsps,l=e.forceNew||e["force new connection"]||!1===e.multiplex||f;return l?(c("ignoring socket cache for %s",s),n=a(s,e)):(p[u]||(c("new io instance for %s",s),p[u]=a(s,e)),n=p[u]),r.query&&!e.query&&(e.query=r.query),n.socket(r.path,e)}var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=n(1),s=n(7),a=n(12),c=n(3)("socket.io-client");t.exports=e=r;var p=e.managers={};e.protocol=s.protocol,e.connect=r,e.Manager=n(12),e.Socket=n(36)},function(t,e,n){"use strict";function r(t,e){var n=t;e=e||"undefined"!=typeof location&&location,null==t&&(t=e.protocol+"//"+e.host),"string"==typeof t&&("/"===t.charAt(0)&&(t="/"===t.charAt(1)?e.protocol+t:e.host+t),/^(https?|wss?):\/\//.test(t)||(i("protocol-less url %s",t),t="undefined"!=typeof e?e.protocol+"//"+t:"https://"+t),i("parse %s",t),n=o(t)),n.port||(/^(http|ws)$/.test(n.protocol)?n.port="80":/^(http|ws)s$/.test(n.protocol)&&(n.port="443")),n.path=n.path||"/";var r=n.host.indexOf(":")!==-1,s=r?"["+n.host+"]":n.host;return n.id=n.protocol+"://"+s+":"+n.port,n.href=n.protocol+"://"+s+(e&&e.port===n.port?"":":"+n.port),n}var o=n(2),i=n(3)("socket.io-client:url");t.exports=r},function(t,e){var n=/^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,r=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];t.exports=function(t){var e=t,o=t.indexOf("["),i=t.indexOf("]");o!=-1&&i!=-1&&(t=t.substring(0,o)+t.substring(o,i).replace(/:/g,";")+t.substring(i,t.length));for(var s=n.exec(t||""),a={},c=14;c--;)a[r[c]]=s[c]||"";return o!=-1&&i!=-1&&(a.source=e,a.host=a.host.substring(1,a.host.length-1).replace(/;/g,":"),a.authority=a.authority.replace("[","").replace("]","").replace(/;/g,":"),a.ipv6uri=!0),a}},function(t,e,n){(function(r){function o(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))}function i(t){var n=this.useColors;if(t[0]=(n?"%c":"")+this.namespace+(n?" %c":" ")+t[0]+(n?"%c ":" ")+"+"+e.humanize(this.diff),n){var r="color: "+this.color;t.splice(1,0,r,"color: inherit");var o=0,i=0;t[0].replace(/%[a-zA-Z%]/g,function(t){"%%"!==t&&(o++,"%c"===t&&(i=o))}),t.splice(i,0,r)}}function s(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function a(t){try{null==t?e.storage.removeItem("debug"):e.storage.debug=t}catch(n){}}function c(){var t;try{t=e.storage.debug}catch(n){}return!t&&"undefined"!=typeof r&&"env"in r&&(t=r.env.DEBUG),t}function p(){try{return window.localStorage}catch(t){}}e=t.exports=n(5),e.log=s,e.formatArgs=i,e.save=a,e.load=c,e.useColors=o,e.storage="undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage?chrome.storage.local:p(),e.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],e.formatters.j=function(t){try{return JSON.stringify(t)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}},e.enable(c())}).call(e,n(4))},function(t,e){function n(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function o(t){if(u===setTimeout)return setTimeout(t,0);if((u===n||!u)&&setTimeout)return u=setTimeout,setTimeout(t,0);try{return u(t,0)}catch(e){try{return u.call(null,t,0)}catch(e){return u.call(this,t,0)}}}function i(t){if(h===clearTimeout)return clearTimeout(t);if((h===r||!h)&&clearTimeout)return h=clearTimeout,clearTimeout(t);try{return h(t)}catch(e){try{return h.call(null,t)}catch(e){return h.call(this,t)}}}function s(){y&&l&&(y=!1,l.length?d=l.concat(d):m=-1,d.length&&a())}function a(){if(!y){var t=o(s);y=!0;for(var e=d.length;e;){for(l=d,d=[];++m1)for(var n=1;n100)){var e=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(t);if(e){var n=parseFloat(e[1]),r=(e[2]||"ms").toLowerCase();switch(r){case"years":case"year":case"yrs":case"yr":case"y":return n*u;case"days":case"day":case"d":return n*p;case"hours":case"hour":case"hrs":case"hr":case"h":return n*c;case"minutes":case"minute":case"mins":case"min":case"m":return n*a;case"seconds":case"second":case"secs":case"sec":case"s":return n*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function r(t){return t>=p?Math.round(t/p)+"d":t>=c?Math.round(t/c)+"h":t>=a?Math.round(t/a)+"m":t>=s?Math.round(t/s)+"s":t+"ms"}function o(t){return i(t,p,"day")||i(t,c,"hour")||i(t,a,"minute")||i(t,s,"second")||t+" ms"}function i(t,e,n){if(!(t0)return n(t);if("number"===i&&isNaN(t)===!1)return e["long"]?o(t):r(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))}},function(t,e,n){function r(){}function o(t){var n=""+t.type;if(e.BINARY_EVENT!==t.type&&e.BINARY_ACK!==t.type||(n+=t.attachments+"-"),t.nsp&&"/"!==t.nsp&&(n+=t.nsp+","),null!=t.id&&(n+=t.id),null!=t.data){var r=i(t.data);if(r===!1)return g;n+=r}return f("encoded %j as %s",t,n),n}function i(t){try{return JSON.stringify(t)}catch(e){return!1}}function s(t,e){function n(t){var n=d.deconstructPacket(t),r=o(n.packet),i=n.buffers;i.unshift(r),e(i)}d.removeBlobs(t,n)}function a(){this.reconstructor=null}function c(t){var n=0,r={type:Number(t.charAt(0))};if(null==e.types[r.type])return h("unknown packet type "+r.type);if(e.BINARY_EVENT===r.type||e.BINARY_ACK===r.type){for(var o="";"-"!==t.charAt(++n)&&(o+=t.charAt(n),n!=t.length););if(o!=Number(o)||"-"!==t.charAt(n))throw new Error("Illegal attachments");r.attachments=Number(o)}if("/"===t.charAt(n+1))for(r.nsp="";++n;){var i=t.charAt(n);if(","===i)break;if(r.nsp+=i,n===t.length)break}else r.nsp="/";var s=t.charAt(n+1);if(""!==s&&Number(s)==s){for(r.id="";++n;){var i=t.charAt(n);if(null==i||Number(i)!=i){--n;break}if(r.id+=t.charAt(n),n===t.length)break}r.id=Number(r.id)}if(t.charAt(++n)){var a=p(t.substr(n)),c=a!==!1&&(r.type===e.ERROR||y(a));if(!c)return h("invalid payload");r.data=a}return f("decoded %s as %j",t,r),r}function p(t){try{return JSON.parse(t)}catch(e){return!1}}function u(t){this.reconPack=t,this.buffers=[]}function h(t){return{type:e.ERROR,data:"parser error: "+t}}var f=n(3)("socket.io-parser"),l=n(8),d=n(9),y=n(10),m=n(11);e.protocol=4,e.types=["CONNECT","DISCONNECT","EVENT","ACK","ERROR","BINARY_EVENT","BINARY_ACK"],e.CONNECT=0,e.DISCONNECT=1,e.EVENT=2,e.ACK=3,e.ERROR=4,e.BINARY_EVENT=5,e.BINARY_ACK=6,e.Encoder=r,e.Decoder=a;var g=e.ERROR+'"encode error"';r.prototype.encode=function(t,n){if(f("encoding packet %j",t),e.BINARY_EVENT===t.type||e.BINARY_ACK===t.type)s(t,n);else{var r=o(t);n([r])}},l(a.prototype),a.prototype.add=function(t){var n;if("string"==typeof t)n=c(t),e.BINARY_EVENT===n.type||e.BINARY_ACK===n.type?(this.reconstructor=new u(n),0===this.reconstructor.reconPack.attachments&&this.emit("decoded",n)):this.emit("decoded",n);else{if(!m(t)&&!t.base64)throw new Error("Unknown type: "+t);if(!this.reconstructor)throw new Error("got binary data when not reconstructing a packet");n=this.reconstructor.takeBinaryData(t),n&&(this.reconstructor=null,this.emit("decoded",n))}},a.prototype.destroy=function(){this.reconstructor&&this.reconstructor.finishedReconstruction()},u.prototype.takeBinaryData=function(t){if(this.buffers.push(t),this.buffers.length===this.reconPack.attachments){var e=d.reconstructPacket(this.reconPack,this.buffers);return this.finishedReconstruction(),e}return null},u.prototype.finishedReconstruction=function(){this.reconPack=null,this.buffers=[]}},function(t,e,n){function r(t){if(t)return o(t)}function o(t){for(var e in r.prototype)t[e]=r.prototype[e];return t}t.exports=r,r.prototype.on=r.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},r.prototype.once=function(t,e){function n(){this.off(t,n),e.apply(this,arguments)}return n.fn=e,this.on(t,n),this},r.prototype.off=r.prototype.removeListener=r.prototype.removeAllListeners=r.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n=this._callbacks["$"+t];if(!n)return this;if(1==arguments.length)return delete this._callbacks["$"+t],this;for(var r,o=0;o0&&!this.encoding){var t=this.packetBuffer.shift();this.packet(t)}},r.prototype.cleanup=function(){h("cleanup");for(var t=this.subs.length,e=0;e=this._reconnectionAttempts)h("reconnect failed"),this.backoff.reset(),this.emitAll("reconnect_failed"),this.reconnecting=!1;else{var e=this.backoff.duration();h("will wait %dms before reconnect attempt",e),this.reconnecting=!0;var n=setTimeout(function(){t.skipReconnect||(h("attempting reconnect"),t.emitAll("reconnect_attempt",t.backoff.attempts),t.emitAll("reconnecting",t.backoff.attempts),t.skipReconnect||t.open(function(e){e?(h("reconnect attempt error"),t.reconnecting=!1,t.reconnect(),t.emitAll("reconnect_error",e.data)):(h("reconnect success"),t.onreconnect())}))},e);this.subs.push({destroy:function(){clearTimeout(n)}})}},r.prototype.onreconnect=function(){var t=this.backoff.attempts;this.reconnecting=!1,this.backoff.reset(),this.updateSocketIds(),this.emitAll("reconnect",t)}},function(t,e,n){t.exports=n(14),t.exports.parser=n(21)},function(t,e,n){function r(t,e){return this instanceof r?(e=e||{},t&&"object"==typeof t&&(e=t,t=null),t?(t=u(t),e.hostname=t.host,e.secure="https"===t.protocol||"wss"===t.protocol,e.port=t.port,t.query&&(e.query=t.query)):e.host&&(e.hostname=u(e.host).host),this.secure=null!=e.secure?e.secure:"undefined"!=typeof location&&"https:"===location.protocol,e.hostname&&!e.port&&(e.port=this.secure?"443":"80"),this.agent=e.agent||!1,this.hostname=e.hostname||("undefined"!=typeof location?location.hostname:"localhost"),this.port=e.port||("undefined"!=typeof location&&location.port?location.port:this.secure?443:80),this.query=e.query||{},"string"==typeof this.query&&(this.query=h.decode(this.query)),this.upgrade=!1!==e.upgrade,this.path=(e.path||"/engine.io").replace(/\/$/,"")+"/",this.forceJSONP=!!e.forceJSONP,this.jsonp=!1!==e.jsonp,this.forceBase64=!!e.forceBase64,this.enablesXDR=!!e.enablesXDR,this.timestampParam=e.timestampParam||"t",this.timestampRequests=e.timestampRequests,this.transports=e.transports||["polling","websocket"],this.transportOptions=e.transportOptions||{},this.readyState="",this.writeBuffer=[],this.prevBufferLen=0,this.policyPort=e.policyPort||843,this.rememberUpgrade=e.rememberUpgrade||!1,this.binaryType=null,this.onlyBinaryUpgrades=e.onlyBinaryUpgrades,this.perMessageDeflate=!1!==e.perMessageDeflate&&(e.perMessageDeflate||{}),!0===this.perMessageDeflate&&(this.perMessageDeflate={}),this.perMessageDeflate&&null==this.perMessageDeflate.threshold&&(this.perMessageDeflate.threshold=1024),this.pfx=e.pfx||null,this.key=e.key||null,this.passphrase=e.passphrase||null,this.cert=e.cert||null,this.ca=e.ca||null,this.ciphers=e.ciphers||null,this.rejectUnauthorized=void 0===e.rejectUnauthorized||e.rejectUnauthorized,this.forceNode=!!e.forceNode,this.isReactNative="undefined"!=typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase(),("undefined"==typeof self||this.isReactNative)&&(e.extraHeaders&&Object.keys(e.extraHeaders).length>0&&(this.extraHeaders=e.extraHeaders),e.localAddress&&(this.localAddress=e.localAddress)),this.id=null,this.upgrades=null,this.pingInterval=null,this.pingTimeout=null,this.pingIntervalTimer=null,this.pingTimeoutTimer=null,void this.open()):new r(t,e)}function o(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}var i=n(15),s=n(8),a=n(3)("engine.io-client:socket"),c=n(35),p=n(21),u=n(2),h=n(29);t.exports=r,r.priorWebsocketSuccess=!1,s(r.prototype),r.protocol=p.protocol,r.Socket=r,r.Transport=n(20),r.transports=n(15),r.parser=n(21),r.prototype.createTransport=function(t){a('creating transport "%s"',t);var e=o(this.query);e.EIO=p.protocol,e.transport=t;var n=this.transportOptions[t]||{};this.id&&(e.sid=this.id);var r=new i[t]({query:e,socket:this,agent:n.agent||this.agent,hostname:n.hostname||this.hostname,port:n.port||this.port,secure:n.secure||this.secure,path:n.path||this.path,forceJSONP:n.forceJSONP||this.forceJSONP,jsonp:n.jsonp||this.jsonp,forceBase64:n.forceBase64||this.forceBase64,enablesXDR:n.enablesXDR||this.enablesXDR,timestampRequests:n.timestampRequests||this.timestampRequests,timestampParam:n.timestampParam||this.timestampParam,policyPort:n.policyPort||this.policyPort,pfx:n.pfx||this.pfx,key:n.key||this.key,passphrase:n.passphrase||this.passphrase,cert:n.cert||this.cert,ca:n.ca||this.ca,ciphers:n.ciphers||this.ciphers,rejectUnauthorized:n.rejectUnauthorized||this.rejectUnauthorized,perMessageDeflate:n.perMessageDeflate||this.perMessageDeflate,extraHeaders:n.extraHeaders||this.extraHeaders,forceNode:n.forceNode||this.forceNode,localAddress:n.localAddress||this.localAddress,requestTimeout:n.requestTimeout||this.requestTimeout,protocols:n.protocols||void 0,isReactNative:this.isReactNative});return r},r.prototype.open=function(){var t;if(this.rememberUpgrade&&r.priorWebsocketSuccess&&this.transports.indexOf("websocket")!==-1)t="websocket";else{if(0===this.transports.length){var e=this;return void setTimeout(function(){e.emit("error","No transports available")},0)}t=this.transports[0]}this.readyState="opening";try{t=this.createTransport(t)}catch(n){return this.transports.shift(),void this.open()}t.open(),this.setTransport(t)},r.prototype.setTransport=function(t){a("setting transport %s",t.name);var e=this;this.transport&&(a("clearing existing transport %s",this.transport.name),this.transport.removeAllListeners()),this.transport=t,t.on("drain",function(){e.onDrain()}).on("packet",function(t){e.onPacket(t)}).on("error",function(t){e.onError(t)}).on("close",function(){e.onClose("transport close")})},r.prototype.probe=function(t){function e(){if(f.onlyBinaryUpgrades){var e=!this.supportsBinary&&f.transport.supportsBinary;h=h||e}h||(a('probe transport "%s" opened',t),u.send([{type:"ping",data:"probe"}]),u.once("packet",function(e){if(!h)if("pong"===e.type&&"probe"===e.data){if(a('probe transport "%s" pong',t),f.upgrading=!0,f.emit("upgrading",u),!u)return;r.priorWebsocketSuccess="websocket"===u.name,a('pausing current transport "%s"',f.transport.name),f.transport.pause(function(){h||"closed"!==f.readyState&&(a("changing transport and sending upgrade packet"),p(),f.setTransport(u),u.send([{type:"upgrade"}]),f.emit("upgrade",u),u=null,f.upgrading=!1,f.flush())})}else{a('probe transport "%s" failed',t);var n=new Error("probe error");n.transport=u.name,f.emit("upgradeError",n)}}))}function n(){h||(h=!0,p(),u.close(),u=null)}function o(e){var r=new Error("probe error: "+e);r.transport=u.name,n(),a('probe transport "%s" failed because of error: %s',t,e),f.emit("upgradeError",r)}function i(){o("transport closed")}function s(){o("socket closed")}function c(t){u&&t.name!==u.name&&(a('"%s" works - aborting "%s"',t.name,u.name),n())}function p(){u.removeListener("open",e),u.removeListener("error",o),u.removeListener("close",i),f.removeListener("close",s),f.removeListener("upgrading",c)}a('probing transport "%s"',t);var u=this.createTransport(t,{probe:1}),h=!1,f=this;r.priorWebsocketSuccess=!1,u.once("open",e),u.once("error",o),u.once("close",i),this.once("close",s),this.once("upgrading",c),u.open()},r.prototype.onOpen=function(){if(a("socket open"),this.readyState="open",r.priorWebsocketSuccess="websocket"===this.transport.name,this.emit("open"),this.flush(),"open"===this.readyState&&this.upgrade&&this.transport.pause){a("starting upgrade probes");for(var t=0,e=this.upgrades.length;t1?{type:b[o],data:t.substring(1)}:{type:b[o]}:w}var i=new Uint8Array(t),o=i[0],s=f(t,1);return k&&"blob"===n&&(s=new k([s])),{type:b[o],data:s}},e.decodeBase64Packet=function(t,e){var n=b[t.charAt(0)];if(!p)return{type:n,data:{base64:!0,data:t.substr(1)}};var r=p.decode(t.substr(1));return"blob"===e&&k&&(r=new k([r])),{type:n,data:r}},e.encodePayload=function(t,n,r){function o(t){return t.length+":"+t}function i(t,r){e.encodePacket(t,!!s&&n,!1,function(t){r(null,o(t))})}"function"==typeof n&&(r=n,n=null);var s=h(t);return n&&s?k&&!g?e.encodePayloadAsBlob(t,r):e.encodePayloadAsArrayBuffer(t,r):t.length?void c(t,i,function(t,e){return r(e.join(""))}):r("0:")},e.decodePayload=function(t,n,r){if("string"!=typeof t)return e.decodePayloadAsBinary(t,n,r);"function"==typeof n&&(r=n,n=null);var o;if(""===t)return r(w,0,1);for(var i,s,a="",c=0,p=t.length;c0;){for(var s=new Uint8Array(o),a=0===s[0],c="",p=1;255!==s[p];p++){if(c.length>310)return r(w,0,1);c+=s[p]}o=f(o,2+c.length),c=parseInt(c);var u=f(o,0,c);if(a)try{u=String.fromCharCode.apply(null,new Uint8Array(u))}catch(h){var l=new Uint8Array(u);u="";for(var p=0;pr&&(n=r),e>=r||e>=n||0===r)return new ArrayBuffer(0);for(var o=new Uint8Array(t),i=new Uint8Array(n-e),s=e,a=0;s=55296&&e<=56319&&o65535&&(e-=65536,o+=d(e>>>10&1023|55296),e=56320|1023&e),o+=d(e);return o}function o(t,e){if(t>=55296&&t<=57343){if(e)throw Error("Lone surrogate U+"+t.toString(16).toUpperCase()+" is not a scalar value");return!1}return!0}function i(t,e){return d(t>>e&63|128)}function s(t,e){if(0==(4294967168&t))return d(t);var n="";return 0==(4294965248&t)?n=d(t>>6&31|192):0==(4294901760&t)?(o(t,e)||(t=65533),n=d(t>>12&15|224),n+=i(t,6)):0==(4292870144&t)&&(n=d(t>>18&7|240),n+=i(t,12),n+=i(t,6)),n+=d(63&t|128)}function a(t,e){e=e||{};for(var r,o=!1!==e.strict,i=n(t),a=i.length,c=-1,p="";++c=f)throw Error("Invalid byte index");var t=255&h[l];if(l++,128==(192&t))return 63&t;throw Error("Invalid continuation byte")}function p(t){var e,n,r,i,s;if(l>f)throw Error("Invalid byte index");if(l==f)return!1;if(e=255&h[l],l++,0==(128&e))return e;if(192==(224&e)){if(n=c(),s=(31&e)<<6|n,s>=128)return s;throw Error("Invalid continuation byte")}if(224==(240&e)){if(n=c(),r=c(),s=(15&e)<<12|n<<6|r,s>=2048)return o(s,t)?s:65533;throw Error("Invalid continuation byte")}if(240==(248&e)&&(n=c(),r=c(),i=c(),s=(7&e)<<18|n<<12|r<<6|i,s>=65536&&s<=1114111))return s;throw Error("Invalid UTF-8 detected")}function u(t,e){e=e||{};var o=!1!==e.strict;h=n(t),f=h.length,l=0;for(var i,s=[];(i=p(o))!==!1;)s.push(i);return r(s)}/*! https://mths.be/utf8js v2.1.2 by @mathias */ +var h,f,l,d=String.fromCharCode;t.exports={version:"2.1.2",encode:a,decode:u}},function(t,e){!function(){"use strict";for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n=new Uint8Array(256),r=0;r>2],i+=t[(3&r[n])<<4|r[n+1]>>4],i+=t[(15&r[n+1])<<2|r[n+2]>>6],i+=t[63&r[n+2]];return o%3===2?i=i.substring(0,i.length-1)+"=":o%3===1&&(i=i.substring(0,i.length-2)+"=="),i},e.decode=function(t){var e,r,o,i,s,a=.75*t.length,c=t.length,p=0;"="===t[t.length-1]&&(a--,"="===t[t.length-2]&&a--);var u=new ArrayBuffer(a),h=new Uint8Array(u);for(e=0;e>4,h[p++]=(15&o)<<4|i>>2,h[p++]=(3&i)<<6|63&s;return u}}()},function(t,e){function n(t){return t.map(function(t){if(t.buffer instanceof ArrayBuffer){var e=t.buffer;if(t.byteLength!==e.byteLength){var n=new Uint8Array(t.byteLength);n.set(new Uint8Array(e,t.byteOffset,t.byteLength)),e=n.buffer}return e}return t})}function r(t,e){e=e||{};var r=new i;return n(t).forEach(function(t){r.append(t)}),e.type?r.getBlob(e.type):r.getBlob()}function o(t,e){return new Blob(n(t),e||{})}var i="undefined"!=typeof i?i:"undefined"!=typeof WebKitBlobBuilder?WebKitBlobBuilder:"undefined"!=typeof MSBlobBuilder?MSBlobBuilder:"undefined"!=typeof MozBlobBuilder&&MozBlobBuilder,s=function(){try{var t=new Blob(["hi"]);return 2===t.size}catch(e){return!1}}(),a=s&&function(){try{var t=new Blob([new Uint8Array([1,2])]);return 2===t.size}catch(e){return!1}}(),c=i&&i.prototype.append&&i.prototype.getBlob;"undefined"!=typeof Blob&&(r.prototype=Blob.prototype,o.prototype=Blob.prototype),t.exports=function(){return s?a?Blob:o:c?r:void 0}()},function(t,e){e.encode=function(t){var e="";for(var n in t)t.hasOwnProperty(n)&&(e.length&&(e+="&"),e+=encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e},e.decode=function(t){for(var e={},n=t.split("&"),r=0,o=n.length;r0);return e}function r(t){var e=0;for(u=0;u';i=document.createElement(e)}catch(t){i=document.createElement("iframe"),i.name=o.iframeId,i.src="javascript:0"}i.id=o.iframeId,o.form.appendChild(i),o.iframe=i}var o=this;if(!this.form){var i,s=document.createElement("form"),a=document.createElement("textarea"),c=this.iframeId="eio_iframe_"+this.index;s.className="socketio",s.style.position="absolute",s.style.top="-1000px",s.style.left="-1000px",s.target=c,s.method="POST",s.setAttribute("accept-charset","utf-8"),a.name="d",s.appendChild(a),document.body.appendChild(s),this.form=s,this.area=a}this.form.action=this.uri(),r(),t=t.replace(u,"\\\n"),this.area.value=t.replace(p,"\\n");try{this.form.submit()}catch(h){}this.iframe.attachEvent?this.iframe.onreadystatechange=function(){"complete"===o.iframe.readyState&&n()}:this.iframe.onload=n}}).call(e,function(){return this}())},function(t,e,n){function r(t){var e=t&&t.forceBase64;e&&(this.supportsBinary=!1),this.perMessageDeflate=t.perMessageDeflate,this.usingBrowserWebSocket=o&&!t.forceNode,this.protocols=t.protocols,this.usingBrowserWebSocket||(l=i),s.call(this,t)}var o,i,s=n(20),a=n(21),c=n(29),p=n(30),u=n(31),h=n(3)("engine.io-client:websocket");if("undefined"==typeof self)try{i=n(34)}catch(f){}else o=self.WebSocket||self.MozWebSocket;var l=o||i;t.exports=r,p(r,s),r.prototype.name="websocket",r.prototype.supportsBinary=!0,r.prototype.doOpen=function(){if(this.check()){var t=this.uri(),e=this.protocols,n={agent:this.agent,perMessageDeflate:this.perMessageDeflate};n.pfx=this.pfx,n.key=this.key,n.passphrase=this.passphrase,n.cert=this.cert,n.ca=this.ca,n.ciphers=this.ciphers,n.rejectUnauthorized=this.rejectUnauthorized,this.extraHeaders&&(n.headers=this.extraHeaders),this.localAddress&&(n.localAddress=this.localAddress);try{this.ws=this.usingBrowserWebSocket&&!this.isReactNative?e?new l(t,e):new l(t):new l(t,e,n)}catch(r){return this.emit("error",r)}void 0===this.ws.binaryType&&(this.supportsBinary=!1),this.ws.supports&&this.ws.supports.binary?(this.supportsBinary=!0,this.ws.binaryType="nodebuffer"):this.ws.binaryType="arraybuffer",this.addEventListeners()}},r.prototype.addEventListeners=function(){var t=this;this.ws.onopen=function(){t.onOpen()},this.ws.onclose=function(){t.onClose()},this.ws.onmessage=function(e){t.onData(e.data)},this.ws.onerror=function(e){t.onError("websocket error",e)}},r.prototype.write=function(t){function e(){n.emit("flush"),setTimeout(function(){n.writable=!0,n.emit("drain")},0)}var n=this;this.writable=!1;for(var r=t.length,o=0,i=r;o0&&t.jitter<=1?t.jitter:0,this.attempts=0}t.exports=n,n.prototype.duration=function(){var t=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),n=Math.floor(e*this.jitter*t);t=0==(1&Math.floor(10*e))?t-n:t+n}return 0|Math.min(t,this.max)},n.prototype.reset=function(){this.attempts=0},n.prototype.setMin=function(t){this.ms=t},n.prototype.setMax=function(t){this.max=t},n.prototype.setJitter=function(t){this.jitter=t}}])}); +//# sourceMappingURL=socket.io.js.map \ No newline at end of file diff --git a/nxbt/web/static/js/socket.io.js.map b/nxbt/web/static/js/socket.io.js.map new file mode 100644 index 0000000..15a248d --- /dev/null +++ b/nxbt/web/static/js/socket.io.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///socket.io.js","webpack:///webpack/bootstrap fca06ab6cc8ba9aaccf0","webpack:///./lib/index.js","webpack:///./lib/url.js","webpack:///./~/parseuri/index.js","webpack:///./~/debug/src/browser.js","webpack:///./~/process/browser.js","webpack:///./~/debug/src/debug.js","webpack:///./~/ms/index.js","webpack:///./~/socket.io-parser/index.js","webpack:///./~/component-emitter/index.js","webpack:///./~/socket.io-parser/binary.js","webpack:///./~/isarray/index.js","webpack:///./~/socket.io-parser/is-buffer.js","webpack:///./lib/manager.js","webpack:///./~/engine.io-client/lib/index.js","webpack:///./~/engine.io-client/lib/socket.js","webpack:///./~/engine.io-client/lib/transports/index.js","webpack:///./~/engine.io-client/lib/xmlhttprequest.js","webpack:///./~/has-cors/index.js","webpack:///./~/engine.io-client/lib/transports/polling-xhr.js","webpack:///./~/engine.io-client/lib/transports/polling.js","webpack:///./~/engine.io-client/lib/transport.js","webpack:///./~/engine.io-parser/lib/browser.js","webpack:///./~/engine.io-parser/lib/keys.js","webpack:///./~/has-binary2/index.js","webpack:///./~/arraybuffer.slice/index.js","webpack:///./~/after/index.js","webpack:///./~/engine.io-parser/lib/utf8.js","webpack:///./~/base64-arraybuffer/lib/base64-arraybuffer.js","webpack:///./~/blob/index.js","webpack:///./~/parseqs/index.js","webpack:///./~/component-inherit/index.js","webpack:///./~/yeast/index.js","webpack:///./~/engine.io-client/lib/transports/polling-jsonp.js","webpack:///./~/engine.io-client/lib/transports/websocket.js","webpack:///./~/indexof/index.js","webpack:///./lib/socket.js","webpack:///./~/to-array/index.js","webpack:///./lib/on.js","webpack:///./~/component-bind/index.js","webpack:///./~/backo2/index.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","lookup","uri","opts","_typeof","undefined","io","parsed","url","source","path","sameNamespace","cache","nsps","newConnection","forceNew","multiplex","debug","Manager","query","socket","Symbol","iterator","obj","constructor","prototype","parser","managers","protocol","connect","Socket","loc","location","host","charAt","test","parseuri","port","ipv6","indexOf","href","re","parts","str","src","b","e","substring","replace","length","exec","i","authority","ipv6uri","process","useColors","window","type","navigator","userAgent","toLowerCase","match","document","documentElement","style","WebkitAppearance","console","firebug","exception","table","parseInt","RegExp","$1","formatArgs","args","namespace","humanize","diff","color","splice","index","lastC","log","Function","apply","arguments","save","namespaces","storage","removeItem","load","r","env","DEBUG","localstorage","localStorage","chrome","local","colors","formatters","j","v","JSON","stringify","err","message","enable","defaultSetTimout","Error","defaultClearTimeout","runTimeout","fun","cachedSetTimeout","setTimeout","runClearTimeout","marker","cachedClearTimeout","clearTimeout","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","timeout","len","run","Item","array","noop","nextTick","Array","push","title","browser","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","name","binding","cwd","chdir","dir","umask","selectColor","hash","charCodeAt","Math","abs","createDebug","enabled","self","curr","Date","ms","prevTime","prev","coerce","unshift","format","formatter","val","logFn","bind","destroy","init","instances","names","skips","split","substr","instance","disable","stack","parse","String","n","parseFloat","y","d","h","s","fmtShort","round","fmtLong","plural","floor","ceil","options","isNaN","Encoder","encodeAsString","BINARY_EVENT","BINARY_ACK","attachments","nsp","data","payload","tryStringify","ERROR_PACKET","encodeAsBinary","callback","writeEncoding","bloblessData","deconstruction","binary","deconstructPacket","pack","packet","buffers","removeBlobs","Decoder","reconstructor","decodeString","Number","types","error","buf","next","tryParse","isPayloadValid","ERROR","isArray","BinaryReconstructor","reconPack","msg","Emitter","isBuf","CONNECT","DISCONNECT","EVENT","ACK","encode","encoding","add","base64","takeBinaryData","finishedReconstruction","binData","reconstructPacket","mixin","key","addEventListener","event","fn","_callbacks","removeEventListener","callbacks","cb","slice","hasListeners","_deconstructPacket","placeholder","_placeholder","num","newData","_reconstructPacket","toString","Object","withNativeBlob","Blob","withNativeFile","File","packetData","_removeBlobs","curKey","containingObject","pendingBlobs","fileReader","FileReader","onload","result","readAsArrayBuffer","arr","withNativeBuffer","Buffer","isBuffer","withNativeArrayBuffer","ArrayBuffer","isView","buffer","subs","reconnection","reconnectionAttempts","Infinity","reconnectionDelay","reconnectionDelayMax","randomizationFactor","backoff","Backoff","min","max","jitter","readyState","connecting","lastPing","packetBuffer","_parser","encoder","decoder","autoConnect","open","eio","has","hasOwnProperty","emitAll","updateSocketIds","generateId","engine","_reconnection","_reconnectionAttempts","_reconnectionDelay","setMin","_randomizationFactor","setJitter","_reconnectionDelayMax","setMax","_timeout","maybeReconnectOnOpen","reconnecting","attempts","reconnect","skipReconnect","openSub","onopen","errorSub","cleanup","timer","close","onping","onpong","ondata","ondecoded","onerror","onConnecting","encodedPackets","write","processPacketQueue","shift","subsLength","sub","disconnect","reset","onclose","reason","delay","duration","onreconnect","attempt","hostname","secure","agent","parseqs","decode","upgrade","forceJSONP","jsonp","forceBase64","enablesXDR","timestampParam","timestampRequests","transports","transportOptions","writeBuffer","prevBufferLen","policyPort","rememberUpgrade","binaryType","onlyBinaryUpgrades","perMessageDeflate","threshold","pfx","passphrase","cert","ca","ciphers","rejectUnauthorized","forceNode","isReactNative","product","extraHeaders","keys","localAddress","upgrades","pingInterval","pingTimeout","pingIntervalTimer","pingTimeoutTimer","clone","o","priorWebsocketSuccess","Transport","createTransport","EIO","transport","sid","requestTimeout","protocols","setTransport","onDrain","onPacket","onError","onClose","probe","onTransportOpen","upgradeLosesBinary","supportsBinary","failed","send","upgrading","pause","flush","freezeTransport","onTransportClose","onupgrade","to","onOpen","l","onHandshake","setPing","code","filterUpgrades","onHeartbeat","ping","sendPacket","writable","compress","cleanupAndClose","waitForUpgrade","desc","filteredUpgrades","polling","xhr","xd","xs","isSSL","xdomain","xscheme","XMLHttpRequest","XHR","JSONP","websocket","hasCORS","XDomainRequest","join","empty","Polling","Request","method","async","isBinary","create","unloadHandler","requests","abort","inherit","request","doWrite","req","sendXhr","doPoll","onData","pollXhr","setDisableHeaderCheck","setRequestHeader","withCredentials","hasXDR","onLoad","responseText","onreadystatechange","contentType","getResponseHeader","responseType","status","requestsCount","onSuccess","fromError","response","attachEvent","terminationEvent","hasXHR2","yeast","doOpen","poll","onPause","total","decodePayload","doClose","packets","callbackfn","encodePayload","schema","b64","description","decodePacket","encodeBase64Object","encodeArrayBuffer","encodeBase64Packet","contentArray","Uint8Array","resultBuffer","byteLength","encodeBlobAsArrayBuffer","fr","encodePacket","encodeBlob","dontSendBlobs","blob","tryDecode","utf8","strict","map","ary","each","done","after","eachWithIndex","el","base64encoder","hasBinary","sliceBuffer","isAndroid","isPhantomJS","pong","packetslist","utf8encode","encoded","readAsDataURL","b64data","fromCharCode","typed","basic","btoa","utf8decode","decodeBase64Packet","asArray","rest","setLengthHeader","encodeOne","doneCallback","encodePayloadAsBlob","encodePayloadAsArrayBuffer","results","decodePayloadAsBinary","chr","ret","totalLength","reduce","acc","resultArray","bufferIndex","forEach","isString","ab","view","lenStr","binaryIdentifier","size","lengthAry","bufferTail","tailArray","msgLength","toJSON","arraybuffer","start","end","bytes","abv","ii","count","err_cb","proxy","bail","ucs2decode","string","value","extra","output","counter","ucs2encode","stringFromCharCode","checkScalarValue","codePoint","toUpperCase","createByte","encodeCodePoint","symbol","codePoints","byteString","readContinuationByte","byteIndex","byteCount","continuationByte","byteArray","decodeSymbol","byte1","byte2","byte3","byte4","tmp","chars","encoded1","encoded2","encoded3","encoded4","bufferLength","mapArrayBufferViews","chunk","copy","set","byteOffset","BlobBuilderConstructor","bb","BlobBuilder","part","append","getBlob","BlobConstructor","WebKitBlobBuilder","MSBlobBuilder","MozBlobBuilder","blobSupported","a","blobSupportsArrayBufferView","blobBuilderSupported","encodeURIComponent","qs","qry","pairs","pair","decodeURIComponent","alphabet","decoded","now","seed","global","glob","JSONPPolling","___eio","script","rNewline","rEscapedNewline","parentNode","removeChild","form","iframe","createElement","insertAt","getElementsByTagName","insertBefore","head","body","appendChild","isUAgecko","complete","initIframe","html","iframeId","area","className","position","top","left","target","setAttribute","action","submit","WS","usingBrowserWebSocket","BrowserWebSocket","WebSocket","NodeWebSocket","MozWebSocket","check","headers","ws","supports","addEventListeners","onmessage","ev","json","ids","acks","receiveBuffer","sendBuffer","connected","disconnected","flags","toArray","hasBin","events","connect_error","connect_timeout","reconnect_attempt","reconnect_failed","reconnect_error","subEvents","pop","onpacket","rootNamespaceError","onconnect","onevent","onack","ondisconnect","ack","sent","emitBuffered","list","factor","pow","rand","random","deviation"],"mappings":"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","file":"socket.io.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"io\"] = factory();\n\telse\n\t\troot[\"io\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"io\"] = factory();\n\telse\n\t\troot[\"io\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\t/**\n\t * Module dependencies.\n\t */\n\t\n\tvar url = __webpack_require__(1);\n\tvar parser = __webpack_require__(7);\n\tvar Manager = __webpack_require__(12);\n\tvar debug = __webpack_require__(3)('socket.io-client');\n\t\n\t/**\n\t * Module exports.\n\t */\n\t\n\tmodule.exports = exports = lookup;\n\t\n\t/**\n\t * Managers cache.\n\t */\n\t\n\tvar cache = exports.managers = {};\n\t\n\t/**\n\t * Looks up an existing `Manager` for multiplexing.\n\t * If the user summons:\n\t *\n\t * `io('http://localhost/a');`\n\t * `io('http://localhost/b');`\n\t *\n\t * We reuse the existing instance based on same scheme/port/host,\n\t * and we initialize sockets for each namespace.\n\t *\n\t * @api public\n\t */\n\t\n\tfunction lookup(uri, opts) {\n\t if ((typeof uri === 'undefined' ? 'undefined' : _typeof(uri)) === 'object') {\n\t opts = uri;\n\t uri = undefined;\n\t }\n\t\n\t opts = opts || {};\n\t\n\t var parsed = url(uri);\n\t var source = parsed.source;\n\t var id = parsed.id;\n\t var path = parsed.path;\n\t var sameNamespace = cache[id] && path in cache[id].nsps;\n\t var newConnection = opts.forceNew || opts['force new connection'] || false === opts.multiplex || sameNamespace;\n\t\n\t var io;\n\t\n\t if (newConnection) {\n\t debug('ignoring socket cache for %s', source);\n\t io = Manager(source, opts);\n\t } else {\n\t if (!cache[id]) {\n\t debug('new io instance for %s', source);\n\t cache[id] = Manager(source, opts);\n\t }\n\t io = cache[id];\n\t }\n\t if (parsed.query && !opts.query) {\n\t opts.query = parsed.query;\n\t }\n\t return io.socket(parsed.path, opts);\n\t}\n\t\n\t/**\n\t * Protocol version.\n\t *\n\t * @api public\n\t */\n\t\n\texports.protocol = parser.protocol;\n\t\n\t/**\n\t * `connect`.\n\t *\n\t * @param {String} uri\n\t * @api public\n\t */\n\t\n\texports.connect = lookup;\n\t\n\t/**\n\t * Expose constructors for standalone build.\n\t *\n\t * @api public\n\t */\n\t\n\texports.Manager = __webpack_require__(12);\n\texports.Socket = __webpack_require__(36);\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t/**\n\t * Module dependencies.\n\t */\n\t\n\tvar parseuri = __webpack_require__(2);\n\tvar debug = __webpack_require__(3)('socket.io-client:url');\n\t\n\t/**\n\t * Module exports.\n\t */\n\t\n\tmodule.exports = url;\n\t\n\t/**\n\t * URL parser.\n\t *\n\t * @param {String} url\n\t * @param {Object} An object meant to mimic window.location.\n\t * Defaults to window.location.\n\t * @api public\n\t */\n\t\n\tfunction url(uri, loc) {\n\t var obj = uri;\n\t\n\t // default to window.location\n\t loc = loc || typeof location !== 'undefined' && location;\n\t if (null == uri) uri = loc.protocol + '//' + loc.host;\n\t\n\t // relative path support\n\t if ('string' === typeof uri) {\n\t if ('/' === uri.charAt(0)) {\n\t if ('/' === uri.charAt(1)) {\n\t uri = loc.protocol + uri;\n\t } else {\n\t uri = loc.host + uri;\n\t }\n\t }\n\t\n\t if (!/^(https?|wss?):\\/\\//.test(uri)) {\n\t debug('protocol-less url %s', uri);\n\t if ('undefined' !== typeof loc) {\n\t uri = loc.protocol + '//' + uri;\n\t } else {\n\t uri = 'https://' + uri;\n\t }\n\t }\n\t\n\t // parse\n\t debug('parse %s', uri);\n\t obj = parseuri(uri);\n\t }\n\t\n\t // make sure we treat `localhost:80` and `localhost` equally\n\t if (!obj.port) {\n\t if (/^(http|ws)$/.test(obj.protocol)) {\n\t obj.port = '80';\n\t } else if (/^(http|ws)s$/.test(obj.protocol)) {\n\t obj.port = '443';\n\t }\n\t }\n\t\n\t obj.path = obj.path || '/';\n\t\n\t var ipv6 = obj.host.indexOf(':') !== -1;\n\t var host = ipv6 ? '[' + obj.host + ']' : obj.host;\n\t\n\t // define unique id\n\t obj.id = obj.protocol + '://' + host + ':' + obj.port;\n\t // define href\n\t obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : ':' + obj.port);\n\t\n\t return obj;\n\t}\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\n\t/**\r\n\t * Parses an URI\r\n\t *\r\n\t * @author Steven Levithan (MIT license)\r\n\t * @api private\r\n\t */\r\n\t\r\n\tvar re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\r\n\t\r\n\tvar parts = [\r\n\t 'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\r\n\t];\r\n\t\r\n\tmodule.exports = function parseuri(str) {\r\n\t var src = str,\r\n\t b = str.indexOf('['),\r\n\t e = str.indexOf(']');\r\n\t\r\n\t if (b != -1 && e != -1) {\r\n\t str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\r\n\t }\r\n\t\r\n\t var m = re.exec(str || ''),\r\n\t uri = {},\r\n\t i = 14;\r\n\t\r\n\t while (i--) {\r\n\t uri[parts[i]] = m[i] || '';\r\n\t }\r\n\t\r\n\t if (b != -1 && e != -1) {\r\n\t uri.source = src;\r\n\t uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\r\n\t uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\r\n\t uri.ipv6uri = true;\r\n\t }\r\n\t\r\n\t return uri;\r\n\t};\r\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {/**\n\t * This is the web browser implementation of `debug()`.\n\t *\n\t * Expose `debug()` as the module.\n\t */\n\t\n\texports = module.exports = __webpack_require__(5);\n\texports.log = log;\n\texports.formatArgs = formatArgs;\n\texports.save = save;\n\texports.load = load;\n\texports.useColors = useColors;\n\texports.storage = 'undefined' != typeof chrome\n\t && 'undefined' != typeof chrome.storage\n\t ? chrome.storage.local\n\t : localstorage();\n\t\n\t/**\n\t * Colors.\n\t */\n\t\n\texports.colors = [\n\t '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',\n\t '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',\n\t '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',\n\t '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',\n\t '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',\n\t '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',\n\t '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',\n\t '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',\n\t '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',\n\t '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',\n\t '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'\n\t];\n\t\n\t/**\n\t * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n\t * and the Firebug extension (any Firefox version) are known\n\t * to support \"%c\" CSS customizations.\n\t *\n\t * TODO: add a `localStorage` variable to explicitly enable/disable colors\n\t */\n\t\n\tfunction useColors() {\n\t // NB: In an Electron preload script, document will be defined but not fully\n\t // initialized. Since we know we're in Chrome, we'll just detect this case\n\t // explicitly\n\t if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n\t return true;\n\t }\n\t\n\t // Internet Explorer and Edge do not support colors.\n\t if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t return false;\n\t }\n\t\n\t // is webkit? http://stackoverflow.com/a/16459606/376773\n\t // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t // is firebug? http://stackoverflow.com/a/398120/376773\n\t (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t // is firefox >= v31?\n\t // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n\t // double check webkit in userAgent just in case we are in a worker\n\t (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n\t}\n\t\n\t/**\n\t * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n\t */\n\t\n\texports.formatters.j = function(v) {\n\t try {\n\t return JSON.stringify(v);\n\t } catch (err) {\n\t return '[UnexpectedJSONParseError]: ' + err.message;\n\t }\n\t};\n\t\n\t\n\t/**\n\t * Colorize log arguments if enabled.\n\t *\n\t * @api public\n\t */\n\t\n\tfunction formatArgs(args) {\n\t var useColors = this.useColors;\n\t\n\t args[0] = (useColors ? '%c' : '')\n\t + this.namespace\n\t + (useColors ? ' %c' : ' ')\n\t + args[0]\n\t + (useColors ? '%c ' : ' ')\n\t + '+' + exports.humanize(this.diff);\n\t\n\t if (!useColors) return;\n\t\n\t var c = 'color: ' + this.color;\n\t args.splice(1, 0, c, 'color: inherit')\n\t\n\t // the final \"%c\" is somewhat tricky, because there could be other\n\t // arguments passed either before or after the %c, so we need to\n\t // figure out the correct index to insert the CSS into\n\t var index = 0;\n\t var lastC = 0;\n\t args[0].replace(/%[a-zA-Z%]/g, function(match) {\n\t if ('%%' === match) return;\n\t index++;\n\t if ('%c' === match) {\n\t // we only are interested in the *last* %c\n\t // (the user may have provided their own)\n\t lastC = index;\n\t }\n\t });\n\t\n\t args.splice(lastC, 0, c);\n\t}\n\t\n\t/**\n\t * Invokes `console.log()` when available.\n\t * No-op when `console.log` is not a \"function\".\n\t *\n\t * @api public\n\t */\n\t\n\tfunction log() {\n\t // this hackery is required for IE8/9, where\n\t // the `console.log` function doesn't have 'apply'\n\t return 'object' === typeof console\n\t && console.log\n\t && Function.prototype.apply.call(console.log, console, arguments);\n\t}\n\t\n\t/**\n\t * Save `namespaces`.\n\t *\n\t * @param {String} namespaces\n\t * @api private\n\t */\n\t\n\tfunction save(namespaces) {\n\t try {\n\t if (null == namespaces) {\n\t exports.storage.removeItem('debug');\n\t } else {\n\t exports.storage.debug = namespaces;\n\t }\n\t } catch(e) {}\n\t}\n\t\n\t/**\n\t * Load `namespaces`.\n\t *\n\t * @return {String} returns the previously persisted debug modes\n\t * @api private\n\t */\n\t\n\tfunction load() {\n\t var r;\n\t try {\n\t r = exports.storage.debug;\n\t } catch(e) {}\n\t\n\t // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\t if (!r && typeof process !== 'undefined' && 'env' in process) {\n\t r = process.env.DEBUG;\n\t }\n\t\n\t return r;\n\t}\n\t\n\t/**\n\t * Enable namespaces listed in `localStorage.debug` initially.\n\t */\n\t\n\texports.enable(load());\n\t\n\t/**\n\t * Localstorage attempts to return the localstorage.\n\t *\n\t * This is necessary because safari throws\n\t * when a user disables cookies/localstorage\n\t * and you attempt to access it.\n\t *\n\t * @return {LocalStorage}\n\t * @api private\n\t */\n\t\n\tfunction localstorage() {\n\t try {\n\t return window.localStorage;\n\t } catch (e) {}\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t// shim for using process in browser\n\tvar process = module.exports = {};\n\t\n\t// cached from whatever global is present so that test runners that stub it\n\t// don't break things. But we need to wrap it in a try catch in case it is\n\t// wrapped in strict mode code which doesn't define any globals. It's inside a\n\t// function because try/catches deoptimize in certain engines.\n\t\n\tvar cachedSetTimeout;\n\tvar cachedClearTimeout;\n\t\n\tfunction defaultSetTimout() {\n\t throw new Error('setTimeout has not been defined');\n\t}\n\tfunction defaultClearTimeout () {\n\t throw new Error('clearTimeout has not been defined');\n\t}\n\t(function () {\n\t try {\n\t if (typeof setTimeout === 'function') {\n\t cachedSetTimeout = setTimeout;\n\t } else {\n\t cachedSetTimeout = defaultSetTimout;\n\t }\n\t } catch (e) {\n\t cachedSetTimeout = defaultSetTimout;\n\t }\n\t try {\n\t if (typeof clearTimeout === 'function') {\n\t cachedClearTimeout = clearTimeout;\n\t } else {\n\t cachedClearTimeout = defaultClearTimeout;\n\t }\n\t } catch (e) {\n\t cachedClearTimeout = defaultClearTimeout;\n\t }\n\t} ())\n\tfunction runTimeout(fun) {\n\t if (cachedSetTimeout === setTimeout) {\n\t //normal enviroments in sane situations\n\t return setTimeout(fun, 0);\n\t }\n\t // if setTimeout wasn't available but was latter defined\n\t if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n\t cachedSetTimeout = setTimeout;\n\t return setTimeout(fun, 0);\n\t }\n\t try {\n\t // when when somebody has screwed with setTimeout but no I.E. maddness\n\t return cachedSetTimeout(fun, 0);\n\t } catch(e){\n\t try {\n\t // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n\t return cachedSetTimeout.call(null, fun, 0);\n\t } catch(e){\n\t // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n\t return cachedSetTimeout.call(this, fun, 0);\n\t }\n\t }\n\t\n\t\n\t}\n\tfunction runClearTimeout(marker) {\n\t if (cachedClearTimeout === clearTimeout) {\n\t //normal enviroments in sane situations\n\t return clearTimeout(marker);\n\t }\n\t // if clearTimeout wasn't available but was latter defined\n\t if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n\t cachedClearTimeout = clearTimeout;\n\t return clearTimeout(marker);\n\t }\n\t try {\n\t // when when somebody has screwed with setTimeout but no I.E. maddness\n\t return cachedClearTimeout(marker);\n\t } catch (e){\n\t try {\n\t // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n\t return cachedClearTimeout.call(null, marker);\n\t } catch (e){\n\t // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n\t // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n\t return cachedClearTimeout.call(this, marker);\n\t }\n\t }\n\t\n\t\n\t\n\t}\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\t\n\tfunction cleanUpNextTick() {\n\t if (!draining || !currentQueue) {\n\t return;\n\t }\n\t draining = false;\n\t if (currentQueue.length) {\n\t queue = currentQueue.concat(queue);\n\t } else {\n\t queueIndex = -1;\n\t }\n\t if (queue.length) {\n\t drainQueue();\n\t }\n\t}\n\t\n\tfunction drainQueue() {\n\t if (draining) {\n\t return;\n\t }\n\t var timeout = runTimeout(cleanUpNextTick);\n\t draining = true;\n\t\n\t var len = queue.length;\n\t while(len) {\n\t currentQueue = queue;\n\t queue = [];\n\t while (++queueIndex < len) {\n\t if (currentQueue) {\n\t currentQueue[queueIndex].run();\n\t }\n\t }\n\t queueIndex = -1;\n\t len = queue.length;\n\t }\n\t currentQueue = null;\n\t draining = false;\n\t runClearTimeout(timeout);\n\t}\n\t\n\tprocess.nextTick = function (fun) {\n\t var args = new Array(arguments.length - 1);\n\t if (arguments.length > 1) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t }\n\t queue.push(new Item(fun, args));\n\t if (queue.length === 1 && !draining) {\n\t runTimeout(drainQueue);\n\t }\n\t};\n\t\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t this.fun = fun;\n\t this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\t\n\tfunction noop() {}\n\t\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\tprocess.prependListener = noop;\n\tprocess.prependOnceListener = noop;\n\t\n\tprocess.listeners = function (name) { return [] }\n\t\n\tprocess.binding = function (name) {\n\t throw new Error('process.binding is not supported');\n\t};\n\t\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\n\t/**\n\t * This is the common logic for both the Node.js and web browser\n\t * implementations of `debug()`.\n\t *\n\t * Expose `debug()` as the module.\n\t */\n\t\n\texports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\n\texports.coerce = coerce;\n\texports.disable = disable;\n\texports.enable = enable;\n\texports.enabled = enabled;\n\texports.humanize = __webpack_require__(6);\n\t\n\t/**\n\t * Active `debug` instances.\n\t */\n\texports.instances = [];\n\t\n\t/**\n\t * The currently active debug mode names, and names to skip.\n\t */\n\t\n\texports.names = [];\n\texports.skips = [];\n\t\n\t/**\n\t * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t *\n\t * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t */\n\t\n\texports.formatters = {};\n\t\n\t/**\n\t * Select a color.\n\t * @param {String} namespace\n\t * @return {Number}\n\t * @api private\n\t */\n\t\n\tfunction selectColor(namespace) {\n\t var hash = 0, i;\n\t\n\t for (i in namespace) {\n\t hash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t hash |= 0; // Convert to 32bit integer\n\t }\n\t\n\t return exports.colors[Math.abs(hash) % exports.colors.length];\n\t}\n\t\n\t/**\n\t * Create a debugger with the given `namespace`.\n\t *\n\t * @param {String} namespace\n\t * @return {Function}\n\t * @api public\n\t */\n\t\n\tfunction createDebug(namespace) {\n\t\n\t var prevTime;\n\t\n\t function debug() {\n\t // disabled?\n\t if (!debug.enabled) return;\n\t\n\t var self = debug;\n\t\n\t // set `diff` timestamp\n\t var curr = +new Date();\n\t var ms = curr - (prevTime || curr);\n\t self.diff = ms;\n\t self.prev = prevTime;\n\t self.curr = curr;\n\t prevTime = curr;\n\t\n\t // turn the `arguments` into a proper Array\n\t var args = new Array(arguments.length);\n\t for (var i = 0; i < args.length; i++) {\n\t args[i] = arguments[i];\n\t }\n\t\n\t args[0] = exports.coerce(args[0]);\n\t\n\t if ('string' !== typeof args[0]) {\n\t // anything else let's inspect with %O\n\t args.unshift('%O');\n\t }\n\t\n\t // apply any `formatters` transformations\n\t var index = 0;\n\t args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n\t // if we encounter an escaped % then don't increase the array index\n\t if (match === '%%') return match;\n\t index++;\n\t var formatter = exports.formatters[format];\n\t if ('function' === typeof formatter) {\n\t var val = args[index];\n\t match = formatter.call(self, val);\n\t\n\t // now we need to remove `args[index]` since it's inlined in the `format`\n\t args.splice(index, 1);\n\t index--;\n\t }\n\t return match;\n\t });\n\t\n\t // apply env-specific formatting (colors, etc.)\n\t exports.formatArgs.call(self, args);\n\t\n\t var logFn = debug.log || exports.log || console.log.bind(console);\n\t logFn.apply(self, args);\n\t }\n\t\n\t debug.namespace = namespace;\n\t debug.enabled = exports.enabled(namespace);\n\t debug.useColors = exports.useColors();\n\t debug.color = selectColor(namespace);\n\t debug.destroy = destroy;\n\t\n\t // env-specific initialization logic for debug instances\n\t if ('function' === typeof exports.init) {\n\t exports.init(debug);\n\t }\n\t\n\t exports.instances.push(debug);\n\t\n\t return debug;\n\t}\n\t\n\tfunction destroy () {\n\t var index = exports.instances.indexOf(this);\n\t if (index !== -1) {\n\t exports.instances.splice(index, 1);\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t}\n\t\n\t/**\n\t * Enables a debug mode by namespaces. This can include modes\n\t * separated by a colon and wildcards.\n\t *\n\t * @param {String} namespaces\n\t * @api public\n\t */\n\t\n\tfunction enable(namespaces) {\n\t exports.save(namespaces);\n\t\n\t exports.names = [];\n\t exports.skips = [];\n\t\n\t var i;\n\t var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t var len = split.length;\n\t\n\t for (i = 0; i < len; i++) {\n\t if (!split[i]) continue; // ignore empty strings\n\t namespaces = split[i].replace(/\\*/g, '.*?');\n\t if (namespaces[0] === '-') {\n\t exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n\t } else {\n\t exports.names.push(new RegExp('^' + namespaces + '$'));\n\t }\n\t }\n\t\n\t for (i = 0; i < exports.instances.length; i++) {\n\t var instance = exports.instances[i];\n\t instance.enabled = exports.enabled(instance.namespace);\n\t }\n\t}\n\t\n\t/**\n\t * Disable debug output.\n\t *\n\t * @api public\n\t */\n\t\n\tfunction disable() {\n\t exports.enable('');\n\t}\n\t\n\t/**\n\t * Returns true if the given mode name is enabled, false otherwise.\n\t *\n\t * @param {String} name\n\t * @return {Boolean}\n\t * @api public\n\t */\n\t\n\tfunction enabled(name) {\n\t if (name[name.length - 1] === '*') {\n\t return true;\n\t }\n\t var i, len;\n\t for (i = 0, len = exports.skips.length; i < len; i++) {\n\t if (exports.skips[i].test(name)) {\n\t return false;\n\t }\n\t }\n\t for (i = 0, len = exports.names.length; i < len; i++) {\n\t if (exports.names[i].test(name)) {\n\t return true;\n\t }\n\t }\n\t return false;\n\t}\n\t\n\t/**\n\t * Coerce `val`.\n\t *\n\t * @param {Mixed} val\n\t * @return {Mixed}\n\t * @api private\n\t */\n\t\n\tfunction coerce(val) {\n\t if (val instanceof Error) return val.stack || val.message;\n\t return val;\n\t}\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * Helpers.\n\t */\n\t\n\tvar s = 1000;\n\tvar m = s * 60;\n\tvar h = m * 60;\n\tvar d = h * 24;\n\tvar y = d * 365.25;\n\t\n\t/**\n\t * Parse or format the given `val`.\n\t *\n\t * Options:\n\t *\n\t * - `long` verbose formatting [false]\n\t *\n\t * @param {String|Number} val\n\t * @param {Object} [options]\n\t * @throws {Error} throw an error if val is not a non-empty string or a number\n\t * @return {String|Number}\n\t * @api public\n\t */\n\t\n\tmodule.exports = function(val, options) {\n\t options = options || {};\n\t var type = typeof val;\n\t if (type === 'string' && val.length > 0) {\n\t return parse(val);\n\t } else if (type === 'number' && isNaN(val) === false) {\n\t return options.long ? fmtLong(val) : fmtShort(val);\n\t }\n\t throw new Error(\n\t 'val is not a non-empty string or a valid number. val=' +\n\t JSON.stringify(val)\n\t );\n\t};\n\t\n\t/**\n\t * Parse the given `str` and return milliseconds.\n\t *\n\t * @param {String} str\n\t * @return {Number}\n\t * @api private\n\t */\n\t\n\tfunction parse(str) {\n\t str = String(str);\n\t if (str.length > 100) {\n\t return;\n\t }\n\t var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n\t str\n\t );\n\t if (!match) {\n\t return;\n\t }\n\t var n = parseFloat(match[1]);\n\t var type = (match[2] || 'ms').toLowerCase();\n\t switch (type) {\n\t case 'years':\n\t case 'year':\n\t case 'yrs':\n\t case 'yr':\n\t case 'y':\n\t return n * y;\n\t case 'days':\n\t case 'day':\n\t case 'd':\n\t return n * d;\n\t case 'hours':\n\t case 'hour':\n\t case 'hrs':\n\t case 'hr':\n\t case 'h':\n\t return n * h;\n\t case 'minutes':\n\t case 'minute':\n\t case 'mins':\n\t case 'min':\n\t case 'm':\n\t return n * m;\n\t case 'seconds':\n\t case 'second':\n\t case 'secs':\n\t case 'sec':\n\t case 's':\n\t return n * s;\n\t case 'milliseconds':\n\t case 'millisecond':\n\t case 'msecs':\n\t case 'msec':\n\t case 'ms':\n\t return n;\n\t default:\n\t return undefined;\n\t }\n\t}\n\t\n\t/**\n\t * Short format for `ms`.\n\t *\n\t * @param {Number} ms\n\t * @return {String}\n\t * @api private\n\t */\n\t\n\tfunction fmtShort(ms) {\n\t if (ms >= d) {\n\t return Math.round(ms / d) + 'd';\n\t }\n\t if (ms >= h) {\n\t return Math.round(ms / h) + 'h';\n\t }\n\t if (ms >= m) {\n\t return Math.round(ms / m) + 'm';\n\t }\n\t if (ms >= s) {\n\t return Math.round(ms / s) + 's';\n\t }\n\t return ms + 'ms';\n\t}\n\t\n\t/**\n\t * Long format for `ms`.\n\t *\n\t * @param {Number} ms\n\t * @return {String}\n\t * @api private\n\t */\n\t\n\tfunction fmtLong(ms) {\n\t return plural(ms, d, 'day') ||\n\t plural(ms, h, 'hour') ||\n\t plural(ms, m, 'minute') ||\n\t plural(ms, s, 'second') ||\n\t ms + ' ms';\n\t}\n\t\n\t/**\n\t * Pluralization helper.\n\t */\n\t\n\tfunction plural(ms, n, name) {\n\t if (ms < n) {\n\t return;\n\t }\n\t if (ms < n * 1.5) {\n\t return Math.floor(ms / n) + ' ' + name;\n\t }\n\t return Math.ceil(ms / n) + ' ' + name + 's';\n\t}\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\n\t/**\n\t * Module dependencies.\n\t */\n\t\n\tvar debug = __webpack_require__(3)('socket.io-parser');\n\tvar Emitter = __webpack_require__(8);\n\tvar binary = __webpack_require__(9);\n\tvar isArray = __webpack_require__(10);\n\tvar isBuf = __webpack_require__(11);\n\t\n\t/**\n\t * Protocol version.\n\t *\n\t * @api public\n\t */\n\t\n\texports.protocol = 4;\n\t\n\t/**\n\t * Packet types.\n\t *\n\t * @api public\n\t */\n\t\n\texports.types = [\n\t 'CONNECT',\n\t 'DISCONNECT',\n\t 'EVENT',\n\t 'ACK',\n\t 'ERROR',\n\t 'BINARY_EVENT',\n\t 'BINARY_ACK'\n\t];\n\t\n\t/**\n\t * Packet type `connect`.\n\t *\n\t * @api public\n\t */\n\t\n\texports.CONNECT = 0;\n\t\n\t/**\n\t * Packet type `disconnect`.\n\t *\n\t * @api public\n\t */\n\t\n\texports.DISCONNECT = 1;\n\t\n\t/**\n\t * Packet type `event`.\n\t *\n\t * @api public\n\t */\n\t\n\texports.EVENT = 2;\n\t\n\t/**\n\t * Packet type `ack`.\n\t *\n\t * @api public\n\t */\n\t\n\texports.ACK = 3;\n\t\n\t/**\n\t * Packet type `error`.\n\t *\n\t * @api public\n\t */\n\t\n\texports.ERROR = 4;\n\t\n\t/**\n\t * Packet type 'binary event'\n\t *\n\t * @api public\n\t */\n\t\n\texports.BINARY_EVENT = 5;\n\t\n\t/**\n\t * Packet type `binary ack`. For acks with binary arguments.\n\t *\n\t * @api public\n\t */\n\t\n\texports.BINARY_ACK = 6;\n\t\n\t/**\n\t * Encoder constructor.\n\t *\n\t * @api public\n\t */\n\t\n\texports.Encoder = Encoder;\n\t\n\t/**\n\t * Decoder constructor.\n\t *\n\t * @api public\n\t */\n\t\n\texports.Decoder = Decoder;\n\t\n\t/**\n\t * A socket.io Encoder instance\n\t *\n\t * @api public\n\t */\n\t\n\tfunction Encoder() {}\n\t\n\tvar ERROR_PACKET = exports.ERROR + '\"encode error\"';\n\t\n\t/**\n\t * Encode a packet as a single string if non-binary, or as a\n\t * buffer sequence, depending on packet type.\n\t *\n\t * @param {Object} obj - packet object\n\t * @param {Function} callback - function to handle encodings (likely engine.write)\n\t * @return Calls callback with Array of encodings\n\t * @api public\n\t */\n\t\n\tEncoder.prototype.encode = function(obj, callback){\n\t debug('encoding packet %j', obj);\n\t\n\t if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {\n\t encodeAsBinary(obj, callback);\n\t } else {\n\t var encoding = encodeAsString(obj);\n\t callback([encoding]);\n\t }\n\t};\n\t\n\t/**\n\t * Encode packet as string.\n\t *\n\t * @param {Object} packet\n\t * @return {String} encoded\n\t * @api private\n\t */\n\t\n\tfunction encodeAsString(obj) {\n\t\n\t // first is type\n\t var str = '' + obj.type;\n\t\n\t // attachments if we have them\n\t if (exports.BINARY_EVENT === obj.type || exports.BINARY_ACK === obj.type) {\n\t str += obj.attachments + '-';\n\t }\n\t\n\t // if we have a namespace other than `/`\n\t // we append it followed by a comma `,`\n\t if (obj.nsp && '/' !== obj.nsp) {\n\t str += obj.nsp + ',';\n\t }\n\t\n\t // immediately followed by the id\n\t if (null != obj.id) {\n\t str += obj.id;\n\t }\n\t\n\t // json data\n\t if (null != obj.data) {\n\t var payload = tryStringify(obj.data);\n\t if (payload !== false) {\n\t str += payload;\n\t } else {\n\t return ERROR_PACKET;\n\t }\n\t }\n\t\n\t debug('encoded %j as %s', obj, str);\n\t return str;\n\t}\n\t\n\tfunction tryStringify(str) {\n\t try {\n\t return JSON.stringify(str);\n\t } catch(e){\n\t return false;\n\t }\n\t}\n\t\n\t/**\n\t * Encode packet as 'buffer sequence' by removing blobs, and\n\t * deconstructing packet into object with placeholders and\n\t * a list of buffers.\n\t *\n\t * @param {Object} packet\n\t * @return {Buffer} encoded\n\t * @api private\n\t */\n\t\n\tfunction encodeAsBinary(obj, callback) {\n\t\n\t function writeEncoding(bloblessData) {\n\t var deconstruction = binary.deconstructPacket(bloblessData);\n\t var pack = encodeAsString(deconstruction.packet);\n\t var buffers = deconstruction.buffers;\n\t\n\t buffers.unshift(pack); // add packet info to beginning of data list\n\t callback(buffers); // write all the buffers\n\t }\n\t\n\t binary.removeBlobs(obj, writeEncoding);\n\t}\n\t\n\t/**\n\t * A socket.io Decoder instance\n\t *\n\t * @return {Object} decoder\n\t * @api public\n\t */\n\t\n\tfunction Decoder() {\n\t this.reconstructor = null;\n\t}\n\t\n\t/**\n\t * Mix in `Emitter` with Decoder.\n\t */\n\t\n\tEmitter(Decoder.prototype);\n\t\n\t/**\n\t * Decodes an encoded packet string into packet JSON.\n\t *\n\t * @param {String} obj - encoded packet\n\t * @return {Object} packet\n\t * @api public\n\t */\n\t\n\tDecoder.prototype.add = function(obj) {\n\t var packet;\n\t if (typeof obj === 'string') {\n\t packet = decodeString(obj);\n\t if (exports.BINARY_EVENT === packet.type || exports.BINARY_ACK === packet.type) { // binary packet's json\n\t this.reconstructor = new BinaryReconstructor(packet);\n\t\n\t // no attachments, labeled binary but no binary data to follow\n\t if (this.reconstructor.reconPack.attachments === 0) {\n\t this.emit('decoded', packet);\n\t }\n\t } else { // non-binary full packet\n\t this.emit('decoded', packet);\n\t }\n\t } else if (isBuf(obj) || obj.base64) { // raw binary data\n\t if (!this.reconstructor) {\n\t throw new Error('got binary data when not reconstructing a packet');\n\t } else {\n\t packet = this.reconstructor.takeBinaryData(obj);\n\t if (packet) { // received final buffer\n\t this.reconstructor = null;\n\t this.emit('decoded', packet);\n\t }\n\t }\n\t } else {\n\t throw new Error('Unknown type: ' + obj);\n\t }\n\t};\n\t\n\t/**\n\t * Decode a packet String (JSON data)\n\t *\n\t * @param {String} str\n\t * @return {Object} packet\n\t * @api private\n\t */\n\t\n\tfunction decodeString(str) {\n\t var i = 0;\n\t // look up type\n\t var p = {\n\t type: Number(str.charAt(0))\n\t };\n\t\n\t if (null == exports.types[p.type]) {\n\t return error('unknown packet type ' + p.type);\n\t }\n\t\n\t // look up attachments if type binary\n\t if (exports.BINARY_EVENT === p.type || exports.BINARY_ACK === p.type) {\n\t var buf = '';\n\t while (str.charAt(++i) !== '-') {\n\t buf += str.charAt(i);\n\t if (i == str.length) break;\n\t }\n\t if (buf != Number(buf) || str.charAt(i) !== '-') {\n\t throw new Error('Illegal attachments');\n\t }\n\t p.attachments = Number(buf);\n\t }\n\t\n\t // look up namespace (if any)\n\t if ('/' === str.charAt(i + 1)) {\n\t p.nsp = '';\n\t while (++i) {\n\t var c = str.charAt(i);\n\t if (',' === c) break;\n\t p.nsp += c;\n\t if (i === str.length) break;\n\t }\n\t } else {\n\t p.nsp = '/';\n\t }\n\t\n\t // look up id\n\t var next = str.charAt(i + 1);\n\t if ('' !== next && Number(next) == next) {\n\t p.id = '';\n\t while (++i) {\n\t var c = str.charAt(i);\n\t if (null == c || Number(c) != c) {\n\t --i;\n\t break;\n\t }\n\t p.id += str.charAt(i);\n\t if (i === str.length) break;\n\t }\n\t p.id = Number(p.id);\n\t }\n\t\n\t // look up json data\n\t if (str.charAt(++i)) {\n\t var payload = tryParse(str.substr(i));\n\t var isPayloadValid = payload !== false && (p.type === exports.ERROR || isArray(payload));\n\t if (isPayloadValid) {\n\t p.data = payload;\n\t } else {\n\t return error('invalid payload');\n\t }\n\t }\n\t\n\t debug('decoded %s as %j', str, p);\n\t return p;\n\t}\n\t\n\tfunction tryParse(str) {\n\t try {\n\t return JSON.parse(str);\n\t } catch(e){\n\t return false;\n\t }\n\t}\n\t\n\t/**\n\t * Deallocates a parser's resources\n\t *\n\t * @api public\n\t */\n\t\n\tDecoder.prototype.destroy = function() {\n\t if (this.reconstructor) {\n\t this.reconstructor.finishedReconstruction();\n\t }\n\t};\n\t\n\t/**\n\t * A manager of a binary event's 'buffer sequence'. Should\n\t * be constructed whenever a packet of type BINARY_EVENT is\n\t * decoded.\n\t *\n\t * @param {Object} packet\n\t * @return {BinaryReconstructor} initialized reconstructor\n\t * @api private\n\t */\n\t\n\tfunction BinaryReconstructor(packet) {\n\t this.reconPack = packet;\n\t this.buffers = [];\n\t}\n\t\n\t/**\n\t * Method to be called when binary data received from connection\n\t * after a BINARY_EVENT packet.\n\t *\n\t * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n\t * @return {null | Object} returns null if more binary data is expected or\n\t * a reconstructed packet object if all buffers have been received.\n\t * @api private\n\t */\n\t\n\tBinaryReconstructor.prototype.takeBinaryData = function(binData) {\n\t this.buffers.push(binData);\n\t if (this.buffers.length === this.reconPack.attachments) { // done with buffer list\n\t var packet = binary.reconstructPacket(this.reconPack, this.buffers);\n\t this.finishedReconstruction();\n\t return packet;\n\t }\n\t return null;\n\t};\n\t\n\t/**\n\t * Cleans up binary packet reconstruction variables.\n\t *\n\t * @api private\n\t */\n\t\n\tBinaryReconstructor.prototype.finishedReconstruction = function() {\n\t this.reconPack = null;\n\t this.buffers = [];\n\t};\n\t\n\tfunction error(msg) {\n\t return {\n\t type: exports.ERROR,\n\t data: 'parser error: ' + msg\n\t };\n\t}\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\r\n\t/**\r\n\t * Expose `Emitter`.\r\n\t */\r\n\t\r\n\tif (true) {\r\n\t module.exports = Emitter;\r\n\t}\r\n\t\r\n\t/**\r\n\t * Initialize a new `Emitter`.\r\n\t *\r\n\t * @api public\r\n\t */\r\n\t\r\n\tfunction Emitter(obj) {\r\n\t if (obj) return mixin(obj);\r\n\t};\r\n\t\r\n\t/**\r\n\t * Mixin the emitter properties.\r\n\t *\r\n\t * @param {Object} obj\r\n\t * @return {Object}\r\n\t * @api private\r\n\t */\r\n\t\r\n\tfunction mixin(obj) {\r\n\t for (var key in Emitter.prototype) {\r\n\t obj[key] = Emitter.prototype[key];\r\n\t }\r\n\t return obj;\r\n\t}\r\n\t\r\n\t/**\r\n\t * Listen on the given `event` with `fn`.\r\n\t *\r\n\t * @param {String} event\r\n\t * @param {Function} fn\r\n\t * @return {Emitter}\r\n\t * @api public\r\n\t */\r\n\t\r\n\tEmitter.prototype.on =\r\n\tEmitter.prototype.addEventListener = function(event, fn){\r\n\t this._callbacks = this._callbacks || {};\r\n\t (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n\t .push(fn);\r\n\t return this;\r\n\t};\r\n\t\r\n\t/**\r\n\t * Adds an `event` listener that will be invoked a single\r\n\t * time then automatically removed.\r\n\t *\r\n\t * @param {String} event\r\n\t * @param {Function} fn\r\n\t * @return {Emitter}\r\n\t * @api public\r\n\t */\r\n\t\r\n\tEmitter.prototype.once = function(event, fn){\r\n\t function on() {\r\n\t this.off(event, on);\r\n\t fn.apply(this, arguments);\r\n\t }\r\n\t\r\n\t on.fn = fn;\r\n\t this.on(event, on);\r\n\t return this;\r\n\t};\r\n\t\r\n\t/**\r\n\t * Remove the given callback for `event` or all\r\n\t * registered callbacks.\r\n\t *\r\n\t * @param {String} event\r\n\t * @param {Function} fn\r\n\t * @return {Emitter}\r\n\t * @api public\r\n\t */\r\n\t\r\n\tEmitter.prototype.off =\r\n\tEmitter.prototype.removeListener =\r\n\tEmitter.prototype.removeAllListeners =\r\n\tEmitter.prototype.removeEventListener = function(event, fn){\r\n\t this._callbacks = this._callbacks || {};\r\n\t\r\n\t // all\r\n\t if (0 == arguments.length) {\r\n\t this._callbacks = {};\r\n\t return this;\r\n\t }\r\n\t\r\n\t // specific event\r\n\t var callbacks = this._callbacks['$' + event];\r\n\t if (!callbacks) return this;\r\n\t\r\n\t // remove all handlers\r\n\t if (1 == arguments.length) {\r\n\t delete this._callbacks['$' + event];\r\n\t return this;\r\n\t }\r\n\t\r\n\t // remove specific handler\r\n\t var cb;\r\n\t for (var i = 0; i < callbacks.length; i++) {\r\n\t cb = callbacks[i];\r\n\t if (cb === fn || cb.fn === fn) {\r\n\t callbacks.splice(i, 1);\r\n\t break;\r\n\t }\r\n\t }\r\n\t return this;\r\n\t};\r\n\t\r\n\t/**\r\n\t * Emit `event` with the given args.\r\n\t *\r\n\t * @param {String} event\r\n\t * @param {Mixed} ...\r\n\t * @return {Emitter}\r\n\t */\r\n\t\r\n\tEmitter.prototype.emit = function(event){\r\n\t this._callbacks = this._callbacks || {};\r\n\t var args = [].slice.call(arguments, 1)\r\n\t , callbacks = this._callbacks['$' + event];\r\n\t\r\n\t if (callbacks) {\r\n\t callbacks = callbacks.slice(0);\r\n\t for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n\t callbacks[i].apply(this, args);\r\n\t }\r\n\t }\r\n\t\r\n\t return this;\r\n\t};\r\n\t\r\n\t/**\r\n\t * Return array of callbacks for `event`.\r\n\t *\r\n\t * @param {String} event\r\n\t * @return {Array}\r\n\t * @api public\r\n\t */\r\n\t\r\n\tEmitter.prototype.listeners = function(event){\r\n\t this._callbacks = this._callbacks || {};\r\n\t return this._callbacks['$' + event] || [];\r\n\t};\r\n\t\r\n\t/**\r\n\t * Check if this emitter has `event` handlers.\r\n\t *\r\n\t * @param {String} event\r\n\t * @return {Boolean}\r\n\t * @api public\r\n\t */\r\n\t\r\n\tEmitter.prototype.hasListeners = function(event){\r\n\t return !! this.listeners(event).length;\r\n\t};\r\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*global Blob,File*/\n\t\n\t/**\n\t * Module requirements\n\t */\n\t\n\tvar isArray = __webpack_require__(10);\n\tvar isBuf = __webpack_require__(11);\n\tvar toString = Object.prototype.toString;\n\tvar withNativeBlob = typeof Blob === 'function' || (typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]');\n\tvar withNativeFile = typeof File === 'function' || (typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]');\n\t\n\t/**\n\t * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.\n\t * Anything with blobs or files should be fed through removeBlobs before coming\n\t * here.\n\t *\n\t * @param {Object} packet - socket.io event packet\n\t * @return {Object} with deconstructed packet and list of buffers\n\t * @api public\n\t */\n\t\n\texports.deconstructPacket = function(packet) {\n\t var buffers = [];\n\t var packetData = packet.data;\n\t var pack = packet;\n\t pack.data = _deconstructPacket(packetData, buffers);\n\t pack.attachments = buffers.length; // number of binary 'attachments'\n\t return {packet: pack, buffers: buffers};\n\t};\n\t\n\tfunction _deconstructPacket(data, buffers) {\n\t if (!data) return data;\n\t\n\t if (isBuf(data)) {\n\t var placeholder = { _placeholder: true, num: buffers.length };\n\t buffers.push(data);\n\t return placeholder;\n\t } else if (isArray(data)) {\n\t var newData = new Array(data.length);\n\t for (var i = 0; i < data.length; i++) {\n\t newData[i] = _deconstructPacket(data[i], buffers);\n\t }\n\t return newData;\n\t } else if (typeof data === 'object' && !(data instanceof Date)) {\n\t var newData = {};\n\t for (var key in data) {\n\t newData[key] = _deconstructPacket(data[key], buffers);\n\t }\n\t return newData;\n\t }\n\t return data;\n\t}\n\t\n\t/**\n\t * Reconstructs a binary packet from its placeholder packet and buffers\n\t *\n\t * @param {Object} packet - event packet with placeholders\n\t * @param {Array} buffers - binary buffers to put in placeholder positions\n\t * @return {Object} reconstructed packet\n\t * @api public\n\t */\n\t\n\texports.reconstructPacket = function(packet, buffers) {\n\t packet.data = _reconstructPacket(packet.data, buffers);\n\t packet.attachments = undefined; // no longer useful\n\t return packet;\n\t};\n\t\n\tfunction _reconstructPacket(data, buffers) {\n\t if (!data) return data;\n\t\n\t if (data && data._placeholder) {\n\t return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n\t } else if (isArray(data)) {\n\t for (var i = 0; i < data.length; i++) {\n\t data[i] = _reconstructPacket(data[i], buffers);\n\t }\n\t } else if (typeof data === 'object') {\n\t for (var key in data) {\n\t data[key] = _reconstructPacket(data[key], buffers);\n\t }\n\t }\n\t\n\t return data;\n\t}\n\t\n\t/**\n\t * Asynchronously removes Blobs or Files from data via\n\t * FileReader's readAsArrayBuffer method. Used before encoding\n\t * data as msgpack. Calls callback with the blobless data.\n\t *\n\t * @param {Object} data\n\t * @param {Function} callback\n\t * @api private\n\t */\n\t\n\texports.removeBlobs = function(data, callback) {\n\t function _removeBlobs(obj, curKey, containingObject) {\n\t if (!obj) return obj;\n\t\n\t // convert any blob\n\t if ((withNativeBlob && obj instanceof Blob) ||\n\t (withNativeFile && obj instanceof File)) {\n\t pendingBlobs++;\n\t\n\t // async filereader\n\t var fileReader = new FileReader();\n\t fileReader.onload = function() { // this.result == arraybuffer\n\t if (containingObject) {\n\t containingObject[curKey] = this.result;\n\t }\n\t else {\n\t bloblessData = this.result;\n\t }\n\t\n\t // if nothing pending its callback time\n\t if(! --pendingBlobs) {\n\t callback(bloblessData);\n\t }\n\t };\n\t\n\t fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer\n\t } else if (isArray(obj)) { // handle array\n\t for (var i = 0; i < obj.length; i++) {\n\t _removeBlobs(obj[i], i, obj);\n\t }\n\t } else if (typeof obj === 'object' && !isBuf(obj)) { // and object\n\t for (var key in obj) {\n\t _removeBlobs(obj[key], key, obj);\n\t }\n\t }\n\t }\n\t\n\t var pendingBlobs = 0;\n\t var bloblessData = data;\n\t _removeBlobs(bloblessData);\n\t if (!pendingBlobs) {\n\t callback(bloblessData);\n\t }\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports) {\n\n\tvar toString = {}.toString;\n\t\n\tmodule.exports = Array.isArray || function (arr) {\n\t return toString.call(arr) == '[object Array]';\n\t};\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\n\t\n\tmodule.exports = isBuf;\n\t\n\tvar withNativeBuffer = typeof Buffer === 'function' && typeof Buffer.isBuffer === 'function';\n\tvar withNativeArrayBuffer = typeof ArrayBuffer === 'function';\n\t\n\tvar isView = function (obj) {\n\t return typeof ArrayBuffer.isView === 'function' ? ArrayBuffer.isView(obj) : (obj.buffer instanceof ArrayBuffer);\n\t};\n\t\n\t/**\n\t * Returns true if obj is a buffer or an arraybuffer.\n\t *\n\t * @api private\n\t */\n\t\n\tfunction isBuf(obj) {\n\t return (withNativeBuffer && Buffer.isBuffer(obj)) ||\n\t (withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj)));\n\t}\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\t\n\t/**\n\t * Module dependencies.\n\t */\n\t\n\tvar eio = __webpack_require__(13);\n\tvar Socket = __webpack_require__(36);\n\tvar Emitter = __webpack_require__(8);\n\tvar parser = __webpack_require__(7);\n\tvar on = __webpack_require__(38);\n\tvar bind = __webpack_require__(39);\n\tvar debug = __webpack_require__(3)('socket.io-client:manager');\n\tvar indexOf = __webpack_require__(35);\n\tvar Backoff = __webpack_require__(40);\n\t\n\t/**\n\t * IE6+ hasOwnProperty\n\t */\n\t\n\tvar has = Object.prototype.hasOwnProperty;\n\t\n\t/**\n\t * Module exports\n\t */\n\t\n\tmodule.exports = Manager;\n\t\n\t/**\n\t * `Manager` constructor.\n\t *\n\t * @param {String} engine instance or engine uri/opts\n\t * @param {Object} options\n\t * @api public\n\t */\n\t\n\tfunction Manager(uri, opts) {\n\t if (!(this instanceof Manager)) return new Manager(uri, opts);\n\t if (uri && 'object' === (typeof uri === 'undefined' ? 'undefined' : _typeof(uri))) {\n\t opts = uri;\n\t uri = undefined;\n\t }\n\t opts = opts || {};\n\t\n\t opts.path = opts.path || '/socket.io';\n\t this.nsps = {};\n\t this.subs = [];\n\t this.opts = opts;\n\t this.reconnection(opts.reconnection !== false);\n\t this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n\t this.reconnectionDelay(opts.reconnectionDelay || 1000);\n\t this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n\t this.randomizationFactor(opts.randomizationFactor || 0.5);\n\t this.backoff = new Backoff({\n\t min: this.reconnectionDelay(),\n\t max: this.reconnectionDelayMax(),\n\t jitter: this.randomizationFactor()\n\t });\n\t this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n\t this.readyState = 'closed';\n\t this.uri = uri;\n\t this.connecting = [];\n\t this.lastPing = null;\n\t this.encoding = false;\n\t this.packetBuffer = [];\n\t var _parser = opts.parser || parser;\n\t this.encoder = new _parser.Encoder();\n\t this.decoder = new _parser.Decoder();\n\t this.autoConnect = opts.autoConnect !== false;\n\t if (this.autoConnect) this.open();\n\t}\n\t\n\t/**\n\t * Propagate given event to sockets and emit on `this`\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.emitAll = function () {\n\t this.emit.apply(this, arguments);\n\t for (var nsp in this.nsps) {\n\t if (has.call(this.nsps, nsp)) {\n\t this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Update `socket.id` of all sockets\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.updateSocketIds = function () {\n\t for (var nsp in this.nsps) {\n\t if (has.call(this.nsps, nsp)) {\n\t this.nsps[nsp].id = this.generateId(nsp);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * generate `socket.id` for the given `nsp`\n\t *\n\t * @param {String} nsp\n\t * @return {String}\n\t * @api private\n\t */\n\t\n\tManager.prototype.generateId = function (nsp) {\n\t return (nsp === '/' ? '' : nsp + '#') + this.engine.id;\n\t};\n\t\n\t/**\n\t * Mix in `Emitter`.\n\t */\n\t\n\tEmitter(Manager.prototype);\n\t\n\t/**\n\t * Sets the `reconnection` config.\n\t *\n\t * @param {Boolean} true/false if it should automatically reconnect\n\t * @return {Manager} self or value\n\t * @api public\n\t */\n\t\n\tManager.prototype.reconnection = function (v) {\n\t if (!arguments.length) return this._reconnection;\n\t this._reconnection = !!v;\n\t return this;\n\t};\n\t\n\t/**\n\t * Sets the reconnection attempts config.\n\t *\n\t * @param {Number} max reconnection attempts before giving up\n\t * @return {Manager} self or value\n\t * @api public\n\t */\n\t\n\tManager.prototype.reconnectionAttempts = function (v) {\n\t if (!arguments.length) return this._reconnectionAttempts;\n\t this._reconnectionAttempts = v;\n\t return this;\n\t};\n\t\n\t/**\n\t * Sets the delay between reconnections.\n\t *\n\t * @param {Number} delay\n\t * @return {Manager} self or value\n\t * @api public\n\t */\n\t\n\tManager.prototype.reconnectionDelay = function (v) {\n\t if (!arguments.length) return this._reconnectionDelay;\n\t this._reconnectionDelay = v;\n\t this.backoff && this.backoff.setMin(v);\n\t return this;\n\t};\n\t\n\tManager.prototype.randomizationFactor = function (v) {\n\t if (!arguments.length) return this._randomizationFactor;\n\t this._randomizationFactor = v;\n\t this.backoff && this.backoff.setJitter(v);\n\t return this;\n\t};\n\t\n\t/**\n\t * Sets the maximum delay between reconnections.\n\t *\n\t * @param {Number} delay\n\t * @return {Manager} self or value\n\t * @api public\n\t */\n\t\n\tManager.prototype.reconnectionDelayMax = function (v) {\n\t if (!arguments.length) return this._reconnectionDelayMax;\n\t this._reconnectionDelayMax = v;\n\t this.backoff && this.backoff.setMax(v);\n\t return this;\n\t};\n\t\n\t/**\n\t * Sets the connection timeout. `false` to disable\n\t *\n\t * @return {Manager} self or value\n\t * @api public\n\t */\n\t\n\tManager.prototype.timeout = function (v) {\n\t if (!arguments.length) return this._timeout;\n\t this._timeout = v;\n\t return this;\n\t};\n\t\n\t/**\n\t * Starts trying to reconnect if reconnection is enabled and we have not\n\t * started reconnecting yet\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.maybeReconnectOnOpen = function () {\n\t // Only try to reconnect if it's the first time we're connecting\n\t if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {\n\t // keeps reconnection from firing twice for the same reconnection loop\n\t this.reconnect();\n\t }\n\t};\n\t\n\t/**\n\t * Sets the current transport `socket`.\n\t *\n\t * @param {Function} optional, callback\n\t * @return {Manager} self\n\t * @api public\n\t */\n\t\n\tManager.prototype.open = Manager.prototype.connect = function (fn, opts) {\n\t debug('readyState %s', this.readyState);\n\t if (~this.readyState.indexOf('open')) return this;\n\t\n\t debug('opening %s', this.uri);\n\t this.engine = eio(this.uri, this.opts);\n\t var socket = this.engine;\n\t var self = this;\n\t this.readyState = 'opening';\n\t this.skipReconnect = false;\n\t\n\t // emit `open`\n\t var openSub = on(socket, 'open', function () {\n\t self.onopen();\n\t fn && fn();\n\t });\n\t\n\t // emit `connect_error`\n\t var errorSub = on(socket, 'error', function (data) {\n\t debug('connect_error');\n\t self.cleanup();\n\t self.readyState = 'closed';\n\t self.emitAll('connect_error', data);\n\t if (fn) {\n\t var err = new Error('Connection error');\n\t err.data = data;\n\t fn(err);\n\t } else {\n\t // Only do this if there is no fn to handle the error\n\t self.maybeReconnectOnOpen();\n\t }\n\t });\n\t\n\t // emit `connect_timeout`\n\t if (false !== this._timeout) {\n\t var timeout = this._timeout;\n\t debug('connect attempt will timeout after %d', timeout);\n\t\n\t // set timer\n\t var timer = setTimeout(function () {\n\t debug('connect attempt timed out after %d', timeout);\n\t openSub.destroy();\n\t socket.close();\n\t socket.emit('error', 'timeout');\n\t self.emitAll('connect_timeout', timeout);\n\t }, timeout);\n\t\n\t this.subs.push({\n\t destroy: function destroy() {\n\t clearTimeout(timer);\n\t }\n\t });\n\t }\n\t\n\t this.subs.push(openSub);\n\t this.subs.push(errorSub);\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Called upon transport open.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.onopen = function () {\n\t debug('open');\n\t\n\t // clear old subs\n\t this.cleanup();\n\t\n\t // mark as open\n\t this.readyState = 'open';\n\t this.emit('open');\n\t\n\t // add new subs\n\t var socket = this.engine;\n\t this.subs.push(on(socket, 'data', bind(this, 'ondata')));\n\t this.subs.push(on(socket, 'ping', bind(this, 'onping')));\n\t this.subs.push(on(socket, 'pong', bind(this, 'onpong')));\n\t this.subs.push(on(socket, 'error', bind(this, 'onerror')));\n\t this.subs.push(on(socket, 'close', bind(this, 'onclose')));\n\t this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));\n\t};\n\t\n\t/**\n\t * Called upon a ping.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.onping = function () {\n\t this.lastPing = new Date();\n\t this.emitAll('ping');\n\t};\n\t\n\t/**\n\t * Called upon a packet.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.onpong = function () {\n\t this.emitAll('pong', new Date() - this.lastPing);\n\t};\n\t\n\t/**\n\t * Called with data.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.ondata = function (data) {\n\t this.decoder.add(data);\n\t};\n\t\n\t/**\n\t * Called when parser fully decodes a packet.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.ondecoded = function (packet) {\n\t this.emit('packet', packet);\n\t};\n\t\n\t/**\n\t * Called upon socket error.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.onerror = function (err) {\n\t debug('error', err);\n\t this.emitAll('error', err);\n\t};\n\t\n\t/**\n\t * Creates a new socket for the given `nsp`.\n\t *\n\t * @return {Socket}\n\t * @api public\n\t */\n\t\n\tManager.prototype.socket = function (nsp, opts) {\n\t var socket = this.nsps[nsp];\n\t if (!socket) {\n\t socket = new Socket(this, nsp, opts);\n\t this.nsps[nsp] = socket;\n\t var self = this;\n\t socket.on('connecting', onConnecting);\n\t socket.on('connect', function () {\n\t socket.id = self.generateId(nsp);\n\t });\n\t\n\t if (this.autoConnect) {\n\t // manually call here since connecting event is fired before listening\n\t onConnecting();\n\t }\n\t }\n\t\n\t function onConnecting() {\n\t if (!~indexOf(self.connecting, socket)) {\n\t self.connecting.push(socket);\n\t }\n\t }\n\t\n\t return socket;\n\t};\n\t\n\t/**\n\t * Called upon a socket close.\n\t *\n\t * @param {Socket} socket\n\t */\n\t\n\tManager.prototype.destroy = function (socket) {\n\t var index = indexOf(this.connecting, socket);\n\t if (~index) this.connecting.splice(index, 1);\n\t if (this.connecting.length) return;\n\t\n\t this.close();\n\t};\n\t\n\t/**\n\t * Writes a packet.\n\t *\n\t * @param {Object} packet\n\t * @api private\n\t */\n\t\n\tManager.prototype.packet = function (packet) {\n\t debug('writing packet %j', packet);\n\t var self = this;\n\t if (packet.query && packet.type === 0) packet.nsp += '?' + packet.query;\n\t\n\t if (!self.encoding) {\n\t // encode, then write to engine with result\n\t self.encoding = true;\n\t this.encoder.encode(packet, function (encodedPackets) {\n\t for (var i = 0; i < encodedPackets.length; i++) {\n\t self.engine.write(encodedPackets[i], packet.options);\n\t }\n\t self.encoding = false;\n\t self.processPacketQueue();\n\t });\n\t } else {\n\t // add packet to the queue\n\t self.packetBuffer.push(packet);\n\t }\n\t};\n\t\n\t/**\n\t * If packet buffer is non-empty, begins encoding the\n\t * next packet in line.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.processPacketQueue = function () {\n\t if (this.packetBuffer.length > 0 && !this.encoding) {\n\t var pack = this.packetBuffer.shift();\n\t this.packet(pack);\n\t }\n\t};\n\t\n\t/**\n\t * Clean up transport subscriptions and packet buffer.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.cleanup = function () {\n\t debug('cleanup');\n\t\n\t var subsLength = this.subs.length;\n\t for (var i = 0; i < subsLength; i++) {\n\t var sub = this.subs.shift();\n\t sub.destroy();\n\t }\n\t\n\t this.packetBuffer = [];\n\t this.encoding = false;\n\t this.lastPing = null;\n\t\n\t this.decoder.destroy();\n\t};\n\t\n\t/**\n\t * Close the current socket.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.close = Manager.prototype.disconnect = function () {\n\t debug('disconnect');\n\t this.skipReconnect = true;\n\t this.reconnecting = false;\n\t if ('opening' === this.readyState) {\n\t // `onclose` will not fire because\n\t // an open event never happened\n\t this.cleanup();\n\t }\n\t this.backoff.reset();\n\t this.readyState = 'closed';\n\t if (this.engine) this.engine.close();\n\t};\n\t\n\t/**\n\t * Called upon engine close.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.onclose = function (reason) {\n\t debug('onclose');\n\t\n\t this.cleanup();\n\t this.backoff.reset();\n\t this.readyState = 'closed';\n\t this.emit('close', reason);\n\t\n\t if (this._reconnection && !this.skipReconnect) {\n\t this.reconnect();\n\t }\n\t};\n\t\n\t/**\n\t * Attempt a reconnection.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.reconnect = function () {\n\t if (this.reconnecting || this.skipReconnect) return this;\n\t\n\t var self = this;\n\t\n\t if (this.backoff.attempts >= this._reconnectionAttempts) {\n\t debug('reconnect failed');\n\t this.backoff.reset();\n\t this.emitAll('reconnect_failed');\n\t this.reconnecting = false;\n\t } else {\n\t var delay = this.backoff.duration();\n\t debug('will wait %dms before reconnect attempt', delay);\n\t\n\t this.reconnecting = true;\n\t var timer = setTimeout(function () {\n\t if (self.skipReconnect) return;\n\t\n\t debug('attempting reconnect');\n\t self.emitAll('reconnect_attempt', self.backoff.attempts);\n\t self.emitAll('reconnecting', self.backoff.attempts);\n\t\n\t // check again for the case socket closed in above events\n\t if (self.skipReconnect) return;\n\t\n\t self.open(function (err) {\n\t if (err) {\n\t debug('reconnect attempt error');\n\t self.reconnecting = false;\n\t self.reconnect();\n\t self.emitAll('reconnect_error', err.data);\n\t } else {\n\t debug('reconnect success');\n\t self.onreconnect();\n\t }\n\t });\n\t }, delay);\n\t\n\t this.subs.push({\n\t destroy: function destroy() {\n\t clearTimeout(timer);\n\t }\n\t });\n\t }\n\t};\n\t\n\t/**\n\t * Called upon successful reconnect.\n\t *\n\t * @api private\n\t */\n\t\n\tManager.prototype.onreconnect = function () {\n\t var attempt = this.backoff.attempts;\n\t this.reconnecting = false;\n\t this.backoff.reset();\n\t this.updateSocketIds();\n\t this.emitAll('reconnect', attempt);\n\t};\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t\n\tmodule.exports = __webpack_require__(14);\n\t\n\t/**\n\t * Exports parser\n\t *\n\t * @api public\n\t *\n\t */\n\tmodule.exports.parser = __webpack_require__(21);\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Module dependencies.\n\t */\n\t\n\tvar transports = __webpack_require__(15);\n\tvar Emitter = __webpack_require__(8);\n\tvar debug = __webpack_require__(3)('engine.io-client:socket');\n\tvar index = __webpack_require__(35);\n\tvar parser = __webpack_require__(21);\n\tvar parseuri = __webpack_require__(2);\n\tvar parseqs = __webpack_require__(29);\n\t\n\t/**\n\t * Module exports.\n\t */\n\t\n\tmodule.exports = Socket;\n\t\n\t/**\n\t * Socket constructor.\n\t *\n\t * @param {String|Object} uri or options\n\t * @param {Object} options\n\t * @api public\n\t */\n\t\n\tfunction Socket (uri, opts) {\n\t if (!(this instanceof Socket)) return new Socket(uri, opts);\n\t\n\t opts = opts || {};\n\t\n\t if (uri && 'object' === typeof uri) {\n\t opts = uri;\n\t uri = null;\n\t }\n\t\n\t if (uri) {\n\t uri = parseuri(uri);\n\t opts.hostname = uri.host;\n\t opts.secure = uri.protocol === 'https' || uri.protocol === 'wss';\n\t opts.port = uri.port;\n\t if (uri.query) opts.query = uri.query;\n\t } else if (opts.host) {\n\t opts.hostname = parseuri(opts.host).host;\n\t }\n\t\n\t this.secure = null != opts.secure ? opts.secure\n\t : (typeof location !== 'undefined' && 'https:' === location.protocol);\n\t\n\t if (opts.hostname && !opts.port) {\n\t // if no port is specified manually, use the protocol default\n\t opts.port = this.secure ? '443' : '80';\n\t }\n\t\n\t this.agent = opts.agent || false;\n\t this.hostname = opts.hostname ||\n\t (typeof location !== 'undefined' ? location.hostname : 'localhost');\n\t this.port = opts.port || (typeof location !== 'undefined' && location.port\n\t ? location.port\n\t : (this.secure ? 443 : 80));\n\t this.query = opts.query || {};\n\t if ('string' === typeof this.query) this.query = parseqs.decode(this.query);\n\t this.upgrade = false !== opts.upgrade;\n\t this.path = (opts.path || '/engine.io').replace(/\\/$/, '') + '/';\n\t this.forceJSONP = !!opts.forceJSONP;\n\t this.jsonp = false !== opts.jsonp;\n\t this.forceBase64 = !!opts.forceBase64;\n\t this.enablesXDR = !!opts.enablesXDR;\n\t this.timestampParam = opts.timestampParam || 't';\n\t this.timestampRequests = opts.timestampRequests;\n\t this.transports = opts.transports || ['polling', 'websocket'];\n\t this.transportOptions = opts.transportOptions || {};\n\t this.readyState = '';\n\t this.writeBuffer = [];\n\t this.prevBufferLen = 0;\n\t this.policyPort = opts.policyPort || 843;\n\t this.rememberUpgrade = opts.rememberUpgrade || false;\n\t this.binaryType = null;\n\t this.onlyBinaryUpgrades = opts.onlyBinaryUpgrades;\n\t this.perMessageDeflate = false !== opts.perMessageDeflate ? (opts.perMessageDeflate || {}) : false;\n\t\n\t if (true === this.perMessageDeflate) this.perMessageDeflate = {};\n\t if (this.perMessageDeflate && null == this.perMessageDeflate.threshold) {\n\t this.perMessageDeflate.threshold = 1024;\n\t }\n\t\n\t // SSL options for Node.js client\n\t this.pfx = opts.pfx || null;\n\t this.key = opts.key || null;\n\t this.passphrase = opts.passphrase || null;\n\t this.cert = opts.cert || null;\n\t this.ca = opts.ca || null;\n\t this.ciphers = opts.ciphers || null;\n\t this.rejectUnauthorized = opts.rejectUnauthorized === undefined ? true : opts.rejectUnauthorized;\n\t this.forceNode = !!opts.forceNode;\n\t\n\t // detect ReactNative environment\n\t this.isReactNative = (typeof navigator !== 'undefined' && typeof navigator.product === 'string' && navigator.product.toLowerCase() === 'reactnative');\n\t\n\t // other options for Node.js or ReactNative client\n\t if (typeof self === 'undefined' || this.isReactNative) {\n\t if (opts.extraHeaders && Object.keys(opts.extraHeaders).length > 0) {\n\t this.extraHeaders = opts.extraHeaders;\n\t }\n\t\n\t if (opts.localAddress) {\n\t this.localAddress = opts.localAddress;\n\t }\n\t }\n\t\n\t // set on handshake\n\t this.id = null;\n\t this.upgrades = null;\n\t this.pingInterval = null;\n\t this.pingTimeout = null;\n\t\n\t // set on heartbeat\n\t this.pingIntervalTimer = null;\n\t this.pingTimeoutTimer = null;\n\t\n\t this.open();\n\t}\n\t\n\tSocket.priorWebsocketSuccess = false;\n\t\n\t/**\n\t * Mix in `Emitter`.\n\t */\n\t\n\tEmitter(Socket.prototype);\n\t\n\t/**\n\t * Protocol version.\n\t *\n\t * @api public\n\t */\n\t\n\tSocket.protocol = parser.protocol; // this is an int\n\t\n\t/**\n\t * Expose deps for legacy compatibility\n\t * and standalone browser access.\n\t */\n\t\n\tSocket.Socket = Socket;\n\tSocket.Transport = __webpack_require__(20);\n\tSocket.transports = __webpack_require__(15);\n\tSocket.parser = __webpack_require__(21);\n\t\n\t/**\n\t * Creates transport of the given type.\n\t *\n\t * @param {String} transport name\n\t * @return {Transport}\n\t * @api private\n\t */\n\t\n\tSocket.prototype.createTransport = function (name) {\n\t debug('creating transport \"%s\"', name);\n\t var query = clone(this.query);\n\t\n\t // append engine.io protocol identifier\n\t query.EIO = parser.protocol;\n\t\n\t // transport name\n\t query.transport = name;\n\t\n\t // per-transport options\n\t var options = this.transportOptions[name] || {};\n\t\n\t // session id if we already have one\n\t if (this.id) query.sid = this.id;\n\t\n\t var transport = new transports[name]({\n\t query: query,\n\t socket: this,\n\t agent: options.agent || this.agent,\n\t hostname: options.hostname || this.hostname,\n\t port: options.port || this.port,\n\t secure: options.secure || this.secure,\n\t path: options.path || this.path,\n\t forceJSONP: options.forceJSONP || this.forceJSONP,\n\t jsonp: options.jsonp || this.jsonp,\n\t forceBase64: options.forceBase64 || this.forceBase64,\n\t enablesXDR: options.enablesXDR || this.enablesXDR,\n\t timestampRequests: options.timestampRequests || this.timestampRequests,\n\t timestampParam: options.timestampParam || this.timestampParam,\n\t policyPort: options.policyPort || this.policyPort,\n\t pfx: options.pfx || this.pfx,\n\t key: options.key || this.key,\n\t passphrase: options.passphrase || this.passphrase,\n\t cert: options.cert || this.cert,\n\t ca: options.ca || this.ca,\n\t ciphers: options.ciphers || this.ciphers,\n\t rejectUnauthorized: options.rejectUnauthorized || this.rejectUnauthorized,\n\t perMessageDeflate: options.perMessageDeflate || this.perMessageDeflate,\n\t extraHeaders: options.extraHeaders || this.extraHeaders,\n\t forceNode: options.forceNode || this.forceNode,\n\t localAddress: options.localAddress || this.localAddress,\n\t requestTimeout: options.requestTimeout || this.requestTimeout,\n\t protocols: options.protocols || void (0),\n\t isReactNative: this.isReactNative\n\t });\n\t\n\t return transport;\n\t};\n\t\n\tfunction clone (obj) {\n\t var o = {};\n\t for (var i in obj) {\n\t if (obj.hasOwnProperty(i)) {\n\t o[i] = obj[i];\n\t }\n\t }\n\t return o;\n\t}\n\t\n\t/**\n\t * Initializes transport to use and starts probe.\n\t *\n\t * @api private\n\t */\n\tSocket.prototype.open = function () {\n\t var transport;\n\t if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') !== -1) {\n\t transport = 'websocket';\n\t } else if (0 === this.transports.length) {\n\t // Emit error on next tick so it can be listened to\n\t var self = this;\n\t setTimeout(function () {\n\t self.emit('error', 'No transports available');\n\t }, 0);\n\t return;\n\t } else {\n\t transport = this.transports[0];\n\t }\n\t this.readyState = 'opening';\n\t\n\t // Retry with the next transport if the transport is disabled (jsonp: false)\n\t try {\n\t transport = this.createTransport(transport);\n\t } catch (e) {\n\t this.transports.shift();\n\t this.open();\n\t return;\n\t }\n\t\n\t transport.open();\n\t this.setTransport(transport);\n\t};\n\t\n\t/**\n\t * Sets the current transport. Disables the existing one (if any).\n\t *\n\t * @api private\n\t */\n\t\n\tSocket.prototype.setTransport = function (transport) {\n\t debug('setting transport %s', transport.name);\n\t var self = this;\n\t\n\t if (this.transport) {\n\t debug('clearing existing transport %s', this.transport.name);\n\t this.transport.removeAllListeners();\n\t }\n\t\n\t // set up transport\n\t this.transport = transport;\n\t\n\t // set up transport listeners\n\t transport\n\t .on('drain', function () {\n\t self.onDrain();\n\t })\n\t .on('packet', function (packet) {\n\t self.onPacket(packet);\n\t })\n\t .on('error', function (e) {\n\t self.onError(e);\n\t })\n\t .on('close', function () {\n\t self.onClose('transport close');\n\t });\n\t};\n\t\n\t/**\n\t * Probes a transport.\n\t *\n\t * @param {String} transport name\n\t * @api private\n\t */\n\t\n\tSocket.prototype.probe = function (name) {\n\t debug('probing transport \"%s\"', name);\n\t var transport = this.createTransport(name, { probe: 1 });\n\t var failed = false;\n\t var self = this;\n\t\n\t Socket.priorWebsocketSuccess = false;\n\t\n\t function onTransportOpen () {\n\t if (self.onlyBinaryUpgrades) {\n\t var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;\n\t failed = failed || upgradeLosesBinary;\n\t }\n\t if (failed) return;\n\t\n\t debug('probe transport \"%s\" opened', name);\n\t transport.send([{ type: 'ping', data: 'probe' }]);\n\t transport.once('packet', function (msg) {\n\t if (failed) return;\n\t if ('pong' === msg.type && 'probe' === msg.data) {\n\t debug('probe transport \"%s\" pong', name);\n\t self.upgrading = true;\n\t self.emit('upgrading', transport);\n\t if (!transport) return;\n\t Socket.priorWebsocketSuccess = 'websocket' === transport.name;\n\t\n\t debug('pausing current transport \"%s\"', self.transport.name);\n\t self.transport.pause(function () {\n\t if (failed) return;\n\t if ('closed' === self.readyState) return;\n\t debug('changing transport and sending upgrade packet');\n\t\n\t cleanup();\n\t\n\t self.setTransport(transport);\n\t transport.send([{ type: 'upgrade' }]);\n\t self.emit('upgrade', transport);\n\t transport = null;\n\t self.upgrading = false;\n\t self.flush();\n\t });\n\t } else {\n\t debug('probe transport \"%s\" failed', name);\n\t var err = new Error('probe error');\n\t err.transport = transport.name;\n\t self.emit('upgradeError', err);\n\t }\n\t });\n\t }\n\t\n\t function freezeTransport () {\n\t if (failed) return;\n\t\n\t // Any callback called by transport should be ignored since now\n\t failed = true;\n\t\n\t cleanup();\n\t\n\t transport.close();\n\t transport = null;\n\t }\n\t\n\t // Handle any error that happens while probing\n\t function onerror (err) {\n\t var error = new Error('probe error: ' + err);\n\t error.transport = transport.name;\n\t\n\t freezeTransport();\n\t\n\t debug('probe transport \"%s\" failed because of error: %s', name, err);\n\t\n\t self.emit('upgradeError', error);\n\t }\n\t\n\t function onTransportClose () {\n\t onerror('transport closed');\n\t }\n\t\n\t // When the socket is closed while we're probing\n\t function onclose () {\n\t onerror('socket closed');\n\t }\n\t\n\t // When the socket is upgraded while we're probing\n\t function onupgrade (to) {\n\t if (transport && to.name !== transport.name) {\n\t debug('\"%s\" works - aborting \"%s\"', to.name, transport.name);\n\t freezeTransport();\n\t }\n\t }\n\t\n\t // Remove all listeners on the transport and on self\n\t function cleanup () {\n\t transport.removeListener('open', onTransportOpen);\n\t transport.removeListener('error', onerror);\n\t transport.removeListener('close', onTransportClose);\n\t self.removeListener('close', onclose);\n\t self.removeListener('upgrading', onupgrade);\n\t }\n\t\n\t transport.once('open', onTransportOpen);\n\t transport.once('error', onerror);\n\t transport.once('close', onTransportClose);\n\t\n\t this.once('close', onclose);\n\t this.once('upgrading', onupgrade);\n\t\n\t transport.open();\n\t};\n\t\n\t/**\n\t * Called when connection is deemed open.\n\t *\n\t * @api public\n\t */\n\t\n\tSocket.prototype.onOpen = function () {\n\t debug('socket open');\n\t this.readyState = 'open';\n\t Socket.priorWebsocketSuccess = 'websocket' === this.transport.name;\n\t this.emit('open');\n\t this.flush();\n\t\n\t // we check for `readyState` in case an `open`\n\t // listener already closed the socket\n\t if ('open' === this.readyState && this.upgrade && this.transport.pause) {\n\t debug('starting upgrade probes');\n\t for (var i = 0, l = this.upgrades.length; i < l; i++) {\n\t this.probe(this.upgrades[i]);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Handles a packet.\n\t *\n\t * @api private\n\t */\n\t\n\tSocket.prototype.onPacket = function (packet) {\n\t if ('opening' === this.readyState || 'open' === this.readyState ||\n\t 'closing' === this.readyState) {\n\t debug('socket receive: type \"%s\", data \"%s\"', packet.type, packet.data);\n\t\n\t this.emit('packet', packet);\n\t\n\t // Socket is live - any packet counts\n\t this.emit('heartbeat');\n\t\n\t switch (packet.type) {\n\t case 'open':\n\t this.onHandshake(JSON.parse(packet.data));\n\t break;\n\t\n\t case 'pong':\n\t this.setPing();\n\t this.emit('pong');\n\t break;\n\t\n\t case 'error':\n\t var err = new Error('server error');\n\t err.code = packet.data;\n\t this.onError(err);\n\t break;\n\t\n\t case 'message':\n\t this.emit('data', packet.data);\n\t this.emit('message', packet.data);\n\t break;\n\t }\n\t } else {\n\t debug('packet received with socket readyState \"%s\"', this.readyState);\n\t }\n\t};\n\t\n\t/**\n\t * Called upon handshake completion.\n\t *\n\t * @param {Object} handshake obj\n\t * @api private\n\t */\n\t\n\tSocket.prototype.onHandshake = function (data) {\n\t this.emit('handshake', data);\n\t this.id = data.sid;\n\t this.transport.query.sid = data.sid;\n\t this.upgrades = this.filterUpgrades(data.upgrades);\n\t this.pingInterval = data.pingInterval;\n\t this.pingTimeout = data.pingTimeout;\n\t this.onOpen();\n\t // In case open handler closes socket\n\t if ('closed' === this.readyState) return;\n\t this.setPing();\n\t\n\t // Prolong liveness of socket on heartbeat\n\t this.removeListener('heartbeat', this.onHeartbeat);\n\t this.on('heartbeat', this.onHeartbeat);\n\t};\n\t\n\t/**\n\t * Resets ping timeout.\n\t *\n\t * @api private\n\t */\n\t\n\tSocket.prototype.onHeartbeat = function (timeout) {\n\t clearTimeout(this.pingTimeoutTimer);\n\t var self = this;\n\t self.pingTimeoutTimer = setTimeout(function () {\n\t if ('closed' === self.readyState) return;\n\t self.onClose('ping timeout');\n\t }, timeout || (self.pingInterval + self.pingTimeout));\n\t};\n\t\n\t/**\n\t * Pings server every `this.pingInterval` and expects response\n\t * within `this.pingTimeout` or closes connection.\n\t *\n\t * @api private\n\t */\n\t\n\tSocket.prototype.setPing = function () {\n\t var self = this;\n\t clearTimeout(self.pingIntervalTimer);\n\t self.pingIntervalTimer = setTimeout(function () {\n\t debug('writing ping packet - expecting pong within %sms', self.pingTimeout);\n\t self.ping();\n\t self.onHeartbeat(self.pingTimeout);\n\t }, self.pingInterval);\n\t};\n\t\n\t/**\n\t* Sends a ping packet.\n\t*\n\t* @api private\n\t*/\n\t\n\tSocket.prototype.ping = function () {\n\t var self = this;\n\t this.sendPacket('ping', function () {\n\t self.emit('ping');\n\t });\n\t};\n\t\n\t/**\n\t * Called on `drain` event\n\t *\n\t * @api private\n\t */\n\t\n\tSocket.prototype.onDrain = function () {\n\t this.writeBuffer.splice(0, this.prevBufferLen);\n\t\n\t // setting prevBufferLen = 0 is very important\n\t // for example, when upgrading, upgrade packet is sent over,\n\t // and a nonzero prevBufferLen could cause problems on `drain`\n\t this.prevBufferLen = 0;\n\t\n\t if (0 === this.writeBuffer.length) {\n\t this.emit('drain');\n\t } else {\n\t this.flush();\n\t }\n\t};\n\t\n\t/**\n\t * Flush write buffers.\n\t *\n\t * @api private\n\t */\n\t\n\tSocket.prototype.flush = function () {\n\t if ('closed' !== this.readyState && this.transport.writable &&\n\t !this.upgrading && this.writeBuffer.length) {\n\t debug('flushing %d packets in socket', this.writeBuffer.length);\n\t this.transport.send(this.writeBuffer);\n\t // keep track of current length of writeBuffer\n\t // splice writeBuffer and callbackBuffer on `drain`\n\t this.prevBufferLen = this.writeBuffer.length;\n\t this.emit('flush');\n\t }\n\t};\n\t\n\t/**\n\t * Sends a message.\n\t *\n\t * @param {String} message.\n\t * @param {Function} callback function.\n\t * @param {Object} options.\n\t * @return {Socket} for chaining.\n\t * @api public\n\t */\n\t\n\tSocket.prototype.write =\n\tSocket.prototype.send = function (msg, options, fn) {\n\t this.sendPacket('message', msg, options, fn);\n\t return this;\n\t};\n\t\n\t/**\n\t * Sends a packet.\n\t *\n\t * @param {String} packet type.\n\t * @param {String} data.\n\t * @param {Object} options.\n\t * @param {Function} callback function.\n\t * @api private\n\t */\n\t\n\tSocket.prototype.sendPacket = function (type, data, options, fn) {\n\t if ('function' === typeof data) {\n\t fn = data;\n\t data = undefined;\n\t }\n\t\n\t if ('function' === typeof options) {\n\t fn = options;\n\t options = null;\n\t }\n\t\n\t if ('closing' === this.readyState || 'closed' === this.readyState) {\n\t return;\n\t }\n\t\n\t options = options || {};\n\t options.compress = false !== options.compress;\n\t\n\t var packet = {\n\t type: type,\n\t data: data,\n\t options: options\n\t };\n\t this.emit('packetCreate', packet);\n\t this.writeBuffer.push(packet);\n\t if (fn) this.once('flush', fn);\n\t this.flush();\n\t};\n\t\n\t/**\n\t * Closes the connection.\n\t *\n\t * @api private\n\t */\n\t\n\tSocket.prototype.close = function () {\n\t if ('opening' === this.readyState || 'open' === this.readyState) {\n\t this.readyState = 'closing';\n\t\n\t var self = this;\n\t\n\t if (this.writeBuffer.length) {\n\t this.once('drain', function () {\n\t if (this.upgrading) {\n\t waitForUpgrade();\n\t } else {\n\t close();\n\t }\n\t });\n\t } else if (this.upgrading) {\n\t waitForUpgrade();\n\t } else {\n\t close();\n\t }\n\t }\n\t\n\t function close () {\n\t self.onClose('forced close');\n\t debug('socket closing - telling transport to close');\n\t self.transport.close();\n\t }\n\t\n\t function cleanupAndClose () {\n\t self.removeListener('upgrade', cleanupAndClose);\n\t self.removeListener('upgradeError', cleanupAndClose);\n\t close();\n\t }\n\t\n\t function waitForUpgrade () {\n\t // wait for upgrade to finish since we can't send packets while pausing a transport\n\t self.once('upgrade', cleanupAndClose);\n\t self.once('upgradeError', cleanupAndClose);\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Called upon transport error\n\t *\n\t * @api private\n\t */\n\t\n\tSocket.prototype.onError = function (err) {\n\t debug('socket error %j', err);\n\t Socket.priorWebsocketSuccess = false;\n\t this.emit('error', err);\n\t this.onClose('transport error', err);\n\t};\n\t\n\t/**\n\t * Called upon transport close.\n\t *\n\t * @api private\n\t */\n\t\n\tSocket.prototype.onClose = function (reason, desc) {\n\t if ('opening' === this.readyState || 'open' === this.readyState || 'closing' === this.readyState) {\n\t debug('socket close with reason: \"%s\"', reason);\n\t var self = this;\n\t\n\t // clear timers\n\t clearTimeout(this.pingIntervalTimer);\n\t clearTimeout(this.pingTimeoutTimer);\n\t\n\t // stop event from firing again for transport\n\t this.transport.removeAllListeners('close');\n\t\n\t // ensure transport won't stay open\n\t this.transport.close();\n\t\n\t // ignore further transport communication\n\t this.transport.removeAllListeners();\n\t\n\t // set ready state\n\t this.readyState = 'closed';\n\t\n\t // clear session id\n\t this.id = null;\n\t\n\t // emit close event\n\t this.emit('close', reason, desc);\n\t\n\t // clean buffers after, so users can still\n\t // grab the buffers on `close` event\n\t self.writeBuffer = [];\n\t self.prevBufferLen = 0;\n\t }\n\t};\n\t\n\t/**\n\t * Filters upgrades, returning only those matching client transports.\n\t *\n\t * @param {Array} server upgrades\n\t * @api private\n\t *\n\t */\n\t\n\tSocket.prototype.filterUpgrades = function (upgrades) {\n\t var filteredUpgrades = [];\n\t for (var i = 0, j = upgrades.length; i < j; i++) {\n\t if (~index(this.transports, upgrades[i])) filteredUpgrades.push(upgrades[i]);\n\t }\n\t return filteredUpgrades;\n\t};\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Module dependencies\n\t */\n\t\n\tvar XMLHttpRequest = __webpack_require__(16);\n\tvar XHR = __webpack_require__(18);\n\tvar JSONP = __webpack_require__(32);\n\tvar websocket = __webpack_require__(33);\n\t\n\t/**\n\t * Export transports.\n\t */\n\t\n\texports.polling = polling;\n\texports.websocket = websocket;\n\t\n\t/**\n\t * Polling transport polymorphic constructor.\n\t * Decides on xhr vs jsonp based on feature detection.\n\t *\n\t * @api private\n\t */\n\t\n\tfunction polling (opts) {\n\t var xhr;\n\t var xd = false;\n\t var xs = false;\n\t var jsonp = false !== opts.jsonp;\n\t\n\t if (typeof location !== 'undefined') {\n\t var isSSL = 'https:' === location.protocol;\n\t var port = location.port;\n\t\n\t // some user agents have empty `location.port`\n\t if (!port) {\n\t port = isSSL ? 443 : 80;\n\t }\n\t\n\t xd = opts.hostname !== location.hostname || port !== opts.port;\n\t xs = opts.secure !== isSSL;\n\t }\n\t\n\t opts.xdomain = xd;\n\t opts.xscheme = xs;\n\t xhr = new XMLHttpRequest(opts);\n\t\n\t if ('open' in xhr && !opts.forceJSONP) {\n\t return new XHR(opts);\n\t } else {\n\t if (!jsonp) throw new Error('JSONP disabled');\n\t return new JSONP(opts);\n\t }\n\t}\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t// browser shim for xmlhttprequest module\n\t\n\tvar hasCORS = __webpack_require__(17);\n\t\n\tmodule.exports = function (opts) {\n\t var xdomain = opts.xdomain;\n\t\n\t // scheme must be same when usign XDomainRequest\n\t // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx\n\t var xscheme = opts.xscheme;\n\t\n\t // XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.\n\t // https://github.com/Automattic/engine.io-client/pull/217\n\t var enablesXDR = opts.enablesXDR;\n\t\n\t // XMLHttpRequest can be disabled on IE\n\t try {\n\t if ('undefined' !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n\t return new XMLHttpRequest();\n\t }\n\t } catch (e) { }\n\t\n\t // Use XDomainRequest for IE8 if enablesXDR is true\n\t // because loading bar keeps flashing when using jsonp-polling\n\t // https://github.com/yujiosaka/socke.io-ie8-loading-example\n\t try {\n\t if ('undefined' !== typeof XDomainRequest && !xscheme && enablesXDR) {\n\t return new XDomainRequest();\n\t }\n\t } catch (e) { }\n\t\n\t if (!xdomain) {\n\t try {\n\t return new self[['Active'].concat('Object').join('X')]('Microsoft.XMLHTTP');\n\t } catch (e) { }\n\t }\n\t};\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports) {\n\n\t\n\t/**\n\t * Module exports.\n\t *\n\t * Logic borrowed from Modernizr:\n\t *\n\t * - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js\n\t */\n\t\n\ttry {\n\t module.exports = typeof XMLHttpRequest !== 'undefined' &&\n\t 'withCredentials' in new XMLHttpRequest();\n\t} catch (err) {\n\t // if XMLHttp support is disabled in IE then it will throw\n\t // when trying to create\n\t module.exports = false;\n\t}\n\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* global attachEvent */\n\t\n\t/**\n\t * Module requirements.\n\t */\n\t\n\tvar XMLHttpRequest = __webpack_require__(16);\n\tvar Polling = __webpack_require__(19);\n\tvar Emitter = __webpack_require__(8);\n\tvar inherit = __webpack_require__(30);\n\tvar debug = __webpack_require__(3)('engine.io-client:polling-xhr');\n\t\n\t/**\n\t * Module exports.\n\t */\n\t\n\tmodule.exports = XHR;\n\tmodule.exports.Request = Request;\n\t\n\t/**\n\t * Empty function\n\t */\n\t\n\tfunction empty () {}\n\t\n\t/**\n\t * XHR Polling constructor.\n\t *\n\t * @param {Object} opts\n\t * @api public\n\t */\n\t\n\tfunction XHR (opts) {\n\t Polling.call(this, opts);\n\t this.requestTimeout = opts.requestTimeout;\n\t this.extraHeaders = opts.extraHeaders;\n\t\n\t if (typeof location !== 'undefined') {\n\t var isSSL = 'https:' === location.protocol;\n\t var port = location.port;\n\t\n\t // some user agents have empty `location.port`\n\t if (!port) {\n\t port = isSSL ? 443 : 80;\n\t }\n\t\n\t this.xd = (typeof location !== 'undefined' && opts.hostname !== location.hostname) ||\n\t port !== opts.port;\n\t this.xs = opts.secure !== isSSL;\n\t }\n\t}\n\t\n\t/**\n\t * Inherits from Polling.\n\t */\n\t\n\tinherit(XHR, Polling);\n\t\n\t/**\n\t * XHR supports binary\n\t */\n\t\n\tXHR.prototype.supportsBinary = true;\n\t\n\t/**\n\t * Creates a request.\n\t *\n\t * @param {String} method\n\t * @api private\n\t */\n\t\n\tXHR.prototype.request = function (opts) {\n\t opts = opts || {};\n\t opts.uri = this.uri();\n\t opts.xd = this.xd;\n\t opts.xs = this.xs;\n\t opts.agent = this.agent || false;\n\t opts.supportsBinary = this.supportsBinary;\n\t opts.enablesXDR = this.enablesXDR;\n\t\n\t // SSL options for Node.js client\n\t opts.pfx = this.pfx;\n\t opts.key = this.key;\n\t opts.passphrase = this.passphrase;\n\t opts.cert = this.cert;\n\t opts.ca = this.ca;\n\t opts.ciphers = this.ciphers;\n\t opts.rejectUnauthorized = this.rejectUnauthorized;\n\t opts.requestTimeout = this.requestTimeout;\n\t\n\t // other options for Node.js client\n\t opts.extraHeaders = this.extraHeaders;\n\t\n\t return new Request(opts);\n\t};\n\t\n\t/**\n\t * Sends data.\n\t *\n\t * @param {String} data to send.\n\t * @param {Function} called upon flush.\n\t * @api private\n\t */\n\t\n\tXHR.prototype.doWrite = function (data, fn) {\n\t var isBinary = typeof data !== 'string' && data !== undefined;\n\t var req = this.request({ method: 'POST', data: data, isBinary: isBinary });\n\t var self = this;\n\t req.on('success', fn);\n\t req.on('error', function (err) {\n\t self.onError('xhr post error', err);\n\t });\n\t this.sendXhr = req;\n\t};\n\t\n\t/**\n\t * Starts a poll cycle.\n\t *\n\t * @api private\n\t */\n\t\n\tXHR.prototype.doPoll = function () {\n\t debug('xhr poll');\n\t var req = this.request();\n\t var self = this;\n\t req.on('data', function (data) {\n\t self.onData(data);\n\t });\n\t req.on('error', function (err) {\n\t self.onError('xhr poll error', err);\n\t });\n\t this.pollXhr = req;\n\t};\n\t\n\t/**\n\t * Request constructor\n\t *\n\t * @param {Object} options\n\t * @api public\n\t */\n\t\n\tfunction Request (opts) {\n\t this.method = opts.method || 'GET';\n\t this.uri = opts.uri;\n\t this.xd = !!opts.xd;\n\t this.xs = !!opts.xs;\n\t this.async = false !== opts.async;\n\t this.data = undefined !== opts.data ? opts.data : null;\n\t this.agent = opts.agent;\n\t this.isBinary = opts.isBinary;\n\t this.supportsBinary = opts.supportsBinary;\n\t this.enablesXDR = opts.enablesXDR;\n\t this.requestTimeout = opts.requestTimeout;\n\t\n\t // SSL options for Node.js client\n\t this.pfx = opts.pfx;\n\t this.key = opts.key;\n\t this.passphrase = opts.passphrase;\n\t this.cert = opts.cert;\n\t this.ca = opts.ca;\n\t this.ciphers = opts.ciphers;\n\t this.rejectUnauthorized = opts.rejectUnauthorized;\n\t\n\t // other options for Node.js client\n\t this.extraHeaders = opts.extraHeaders;\n\t\n\t this.create();\n\t}\n\t\n\t/**\n\t * Mix in `Emitter`.\n\t */\n\t\n\tEmitter(Request.prototype);\n\t\n\t/**\n\t * Creates the XHR object and sends the request.\n\t *\n\t * @api private\n\t */\n\t\n\tRequest.prototype.create = function () {\n\t var opts = { agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR };\n\t\n\t // SSL options for Node.js client\n\t opts.pfx = this.pfx;\n\t opts.key = this.key;\n\t opts.passphrase = this.passphrase;\n\t opts.cert = this.cert;\n\t opts.ca = this.ca;\n\t opts.ciphers = this.ciphers;\n\t opts.rejectUnauthorized = this.rejectUnauthorized;\n\t\n\t var xhr = this.xhr = new XMLHttpRequest(opts);\n\t var self = this;\n\t\n\t try {\n\t debug('xhr open %s: %s', this.method, this.uri);\n\t xhr.open(this.method, this.uri, this.async);\n\t try {\n\t if (this.extraHeaders) {\n\t xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n\t for (var i in this.extraHeaders) {\n\t if (this.extraHeaders.hasOwnProperty(i)) {\n\t xhr.setRequestHeader(i, this.extraHeaders[i]);\n\t }\n\t }\n\t }\n\t } catch (e) {}\n\t\n\t if ('POST' === this.method) {\n\t try {\n\t if (this.isBinary) {\n\t xhr.setRequestHeader('Content-type', 'application/octet-stream');\n\t } else {\n\t xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n\t }\n\t } catch (e) {}\n\t }\n\t\n\t try {\n\t xhr.setRequestHeader('Accept', '*/*');\n\t } catch (e) {}\n\t\n\t // ie6 check\n\t if ('withCredentials' in xhr) {\n\t xhr.withCredentials = true;\n\t }\n\t\n\t if (this.requestTimeout) {\n\t xhr.timeout = this.requestTimeout;\n\t }\n\t\n\t if (this.hasXDR()) {\n\t xhr.onload = function () {\n\t self.onLoad();\n\t };\n\t xhr.onerror = function () {\n\t self.onError(xhr.responseText);\n\t };\n\t } else {\n\t xhr.onreadystatechange = function () {\n\t if (xhr.readyState === 2) {\n\t try {\n\t var contentType = xhr.getResponseHeader('Content-Type');\n\t if (self.supportsBinary && contentType === 'application/octet-stream') {\n\t xhr.responseType = 'arraybuffer';\n\t }\n\t } catch (e) {}\n\t }\n\t if (4 !== xhr.readyState) return;\n\t if (200 === xhr.status || 1223 === xhr.status) {\n\t self.onLoad();\n\t } else {\n\t // make sure the `error` event handler that's user-set\n\t // does not throw in the same tick and gets caught here\n\t setTimeout(function () {\n\t self.onError(xhr.status);\n\t }, 0);\n\t }\n\t };\n\t }\n\t\n\t debug('xhr data %s', this.data);\n\t xhr.send(this.data);\n\t } catch (e) {\n\t // Need to defer since .create() is called directly fhrom the constructor\n\t // and thus the 'error' event can only be only bound *after* this exception\n\t // occurs. Therefore, also, we cannot throw here at all.\n\t setTimeout(function () {\n\t self.onError(e);\n\t }, 0);\n\t return;\n\t }\n\t\n\t if (typeof document !== 'undefined') {\n\t this.index = Request.requestsCount++;\n\t Request.requests[this.index] = this;\n\t }\n\t};\n\t\n\t/**\n\t * Called upon successful response.\n\t *\n\t * @api private\n\t */\n\t\n\tRequest.prototype.onSuccess = function () {\n\t this.emit('success');\n\t this.cleanup();\n\t};\n\t\n\t/**\n\t * Called if we have data.\n\t *\n\t * @api private\n\t */\n\t\n\tRequest.prototype.onData = function (data) {\n\t this.emit('data', data);\n\t this.onSuccess();\n\t};\n\t\n\t/**\n\t * Called upon error.\n\t *\n\t * @api private\n\t */\n\t\n\tRequest.prototype.onError = function (err) {\n\t this.emit('error', err);\n\t this.cleanup(true);\n\t};\n\t\n\t/**\n\t * Cleans up house.\n\t *\n\t * @api private\n\t */\n\t\n\tRequest.prototype.cleanup = function (fromError) {\n\t if ('undefined' === typeof this.xhr || null === this.xhr) {\n\t return;\n\t }\n\t // xmlhttprequest\n\t if (this.hasXDR()) {\n\t this.xhr.onload = this.xhr.onerror = empty;\n\t } else {\n\t this.xhr.onreadystatechange = empty;\n\t }\n\t\n\t if (fromError) {\n\t try {\n\t this.xhr.abort();\n\t } catch (e) {}\n\t }\n\t\n\t if (typeof document !== 'undefined') {\n\t delete Request.requests[this.index];\n\t }\n\t\n\t this.xhr = null;\n\t};\n\t\n\t/**\n\t * Called upon load.\n\t *\n\t * @api private\n\t */\n\t\n\tRequest.prototype.onLoad = function () {\n\t var data;\n\t try {\n\t var contentType;\n\t try {\n\t contentType = this.xhr.getResponseHeader('Content-Type');\n\t } catch (e) {}\n\t if (contentType === 'application/octet-stream') {\n\t data = this.xhr.response || this.xhr.responseText;\n\t } else {\n\t data = this.xhr.responseText;\n\t }\n\t } catch (e) {\n\t this.onError(e);\n\t }\n\t if (null != data) {\n\t this.onData(data);\n\t }\n\t};\n\t\n\t/**\n\t * Check if it has XDomainRequest.\n\t *\n\t * @api private\n\t */\n\t\n\tRequest.prototype.hasXDR = function () {\n\t return typeof XDomainRequest !== 'undefined' && !this.xs && this.enablesXDR;\n\t};\n\t\n\t/**\n\t * Aborts the request.\n\t *\n\t * @api public\n\t */\n\t\n\tRequest.prototype.abort = function () {\n\t this.cleanup();\n\t};\n\t\n\t/**\n\t * Aborts pending requests when unloading the window. This is needed to prevent\n\t * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n\t * emitted.\n\t */\n\t\n\tRequest.requestsCount = 0;\n\tRequest.requests = {};\n\t\n\tif (typeof document !== 'undefined') {\n\t if (typeof attachEvent === 'function') {\n\t attachEvent('onunload', unloadHandler);\n\t } else if (typeof addEventListener === 'function') {\n\t var terminationEvent = 'onpagehide' in self ? 'pagehide' : 'unload';\n\t addEventListener(terminationEvent, unloadHandler, false);\n\t }\n\t}\n\t\n\tfunction unloadHandler () {\n\t for (var i in Request.requests) {\n\t if (Request.requests.hasOwnProperty(i)) {\n\t Request.requests[i].abort();\n\t }\n\t }\n\t}\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Module dependencies.\n\t */\n\t\n\tvar Transport = __webpack_require__(20);\n\tvar parseqs = __webpack_require__(29);\n\tvar parser = __webpack_require__(21);\n\tvar inherit = __webpack_require__(30);\n\tvar yeast = __webpack_require__(31);\n\tvar debug = __webpack_require__(3)('engine.io-client:polling');\n\t\n\t/**\n\t * Module exports.\n\t */\n\t\n\tmodule.exports = Polling;\n\t\n\t/**\n\t * Is XHR2 supported?\n\t */\n\t\n\tvar hasXHR2 = (function () {\n\t var XMLHttpRequest = __webpack_require__(16);\n\t var xhr = new XMLHttpRequest({ xdomain: false });\n\t return null != xhr.responseType;\n\t})();\n\t\n\t/**\n\t * Polling interface.\n\t *\n\t * @param {Object} opts\n\t * @api private\n\t */\n\t\n\tfunction Polling (opts) {\n\t var forceBase64 = (opts && opts.forceBase64);\n\t if (!hasXHR2 || forceBase64) {\n\t this.supportsBinary = false;\n\t }\n\t Transport.call(this, opts);\n\t}\n\t\n\t/**\n\t * Inherits from Transport.\n\t */\n\t\n\tinherit(Polling, Transport);\n\t\n\t/**\n\t * Transport name.\n\t */\n\t\n\tPolling.prototype.name = 'polling';\n\t\n\t/**\n\t * Opens the socket (triggers polling). We write a PING message to determine\n\t * when the transport is open.\n\t *\n\t * @api private\n\t */\n\t\n\tPolling.prototype.doOpen = function () {\n\t this.poll();\n\t};\n\t\n\t/**\n\t * Pauses polling.\n\t *\n\t * @param {Function} callback upon buffers are flushed and transport is paused\n\t * @api private\n\t */\n\t\n\tPolling.prototype.pause = function (onPause) {\n\t var self = this;\n\t\n\t this.readyState = 'pausing';\n\t\n\t function pause () {\n\t debug('paused');\n\t self.readyState = 'paused';\n\t onPause();\n\t }\n\t\n\t if (this.polling || !this.writable) {\n\t var total = 0;\n\t\n\t if (this.polling) {\n\t debug('we are currently polling - waiting to pause');\n\t total++;\n\t this.once('pollComplete', function () {\n\t debug('pre-pause polling complete');\n\t --total || pause();\n\t });\n\t }\n\t\n\t if (!this.writable) {\n\t debug('we are currently writing - waiting to pause');\n\t total++;\n\t this.once('drain', function () {\n\t debug('pre-pause writing complete');\n\t --total || pause();\n\t });\n\t }\n\t } else {\n\t pause();\n\t }\n\t};\n\t\n\t/**\n\t * Starts polling cycle.\n\t *\n\t * @api public\n\t */\n\t\n\tPolling.prototype.poll = function () {\n\t debug('polling');\n\t this.polling = true;\n\t this.doPoll();\n\t this.emit('poll');\n\t};\n\t\n\t/**\n\t * Overloads onData to detect payloads.\n\t *\n\t * @api private\n\t */\n\t\n\tPolling.prototype.onData = function (data) {\n\t var self = this;\n\t debug('polling got data %s', data);\n\t var callback = function (packet, index, total) {\n\t // if its the first message we consider the transport open\n\t if ('opening' === self.readyState) {\n\t self.onOpen();\n\t }\n\t\n\t // if its a close packet, we close the ongoing requests\n\t if ('close' === packet.type) {\n\t self.onClose();\n\t return false;\n\t }\n\t\n\t // otherwise bypass onData and handle the message\n\t self.onPacket(packet);\n\t };\n\t\n\t // decode payload\n\t parser.decodePayload(data, this.socket.binaryType, callback);\n\t\n\t // if an event did not trigger closing\n\t if ('closed' !== this.readyState) {\n\t // if we got data we're not polling\n\t this.polling = false;\n\t this.emit('pollComplete');\n\t\n\t if ('open' === this.readyState) {\n\t this.poll();\n\t } else {\n\t debug('ignoring poll - transport state \"%s\"', this.readyState);\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * For polling, send a close packet.\n\t *\n\t * @api private\n\t */\n\t\n\tPolling.prototype.doClose = function () {\n\t var self = this;\n\t\n\t function close () {\n\t debug('writing close packet');\n\t self.write([{ type: 'close' }]);\n\t }\n\t\n\t if ('open' === this.readyState) {\n\t debug('transport open - closing');\n\t close();\n\t } else {\n\t // in case we're trying to close while\n\t // handshaking is in progress (GH-164)\n\t debug('transport not open - deferring close');\n\t this.once('open', close);\n\t }\n\t};\n\t\n\t/**\n\t * Writes a packets payload.\n\t *\n\t * @param {Array} data packets\n\t * @param {Function} drain callback\n\t * @api private\n\t */\n\t\n\tPolling.prototype.write = function (packets) {\n\t var self = this;\n\t this.writable = false;\n\t var callbackfn = function () {\n\t self.writable = true;\n\t self.emit('drain');\n\t };\n\t\n\t parser.encodePayload(packets, this.supportsBinary, function (data) {\n\t self.doWrite(data, callbackfn);\n\t });\n\t};\n\t\n\t/**\n\t * Generates uri for connection.\n\t *\n\t * @api private\n\t */\n\t\n\tPolling.prototype.uri = function () {\n\t var query = this.query || {};\n\t var schema = this.secure ? 'https' : 'http';\n\t var port = '';\n\t\n\t // cache busting is forced\n\t if (false !== this.timestampRequests) {\n\t query[this.timestampParam] = yeast();\n\t }\n\t\n\t if (!this.supportsBinary && !query.sid) {\n\t query.b64 = 1;\n\t }\n\t\n\t query = parseqs.encode(query);\n\t\n\t // avoid port if default for schema\n\t if (this.port && (('https' === schema && Number(this.port) !== 443) ||\n\t ('http' === schema && Number(this.port) !== 80))) {\n\t port = ':' + this.port;\n\t }\n\t\n\t // prepend ? to query\n\t if (query.length) {\n\t query = '?' + query;\n\t }\n\t\n\t var ipv6 = this.hostname.indexOf(':') !== -1;\n\t return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n\t};\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Module dependencies.\n\t */\n\t\n\tvar parser = __webpack_require__(21);\n\tvar Emitter = __webpack_require__(8);\n\t\n\t/**\n\t * Module exports.\n\t */\n\t\n\tmodule.exports = Transport;\n\t\n\t/**\n\t * Transport abstract constructor.\n\t *\n\t * @param {Object} options.\n\t * @api private\n\t */\n\t\n\tfunction Transport (opts) {\n\t this.path = opts.path;\n\t this.hostname = opts.hostname;\n\t this.port = opts.port;\n\t this.secure = opts.secure;\n\t this.query = opts.query;\n\t this.timestampParam = opts.timestampParam;\n\t this.timestampRequests = opts.timestampRequests;\n\t this.readyState = '';\n\t this.agent = opts.agent || false;\n\t this.socket = opts.socket;\n\t this.enablesXDR = opts.enablesXDR;\n\t\n\t // SSL options for Node.js client\n\t this.pfx = opts.pfx;\n\t this.key = opts.key;\n\t this.passphrase = opts.passphrase;\n\t this.cert = opts.cert;\n\t this.ca = opts.ca;\n\t this.ciphers = opts.ciphers;\n\t this.rejectUnauthorized = opts.rejectUnauthorized;\n\t this.forceNode = opts.forceNode;\n\t\n\t // results of ReactNative environment detection\n\t this.isReactNative = opts.isReactNative;\n\t\n\t // other options for Node.js client\n\t this.extraHeaders = opts.extraHeaders;\n\t this.localAddress = opts.localAddress;\n\t}\n\t\n\t/**\n\t * Mix in `Emitter`.\n\t */\n\t\n\tEmitter(Transport.prototype);\n\t\n\t/**\n\t * Emits an error.\n\t *\n\t * @param {String} str\n\t * @return {Transport} for chaining\n\t * @api public\n\t */\n\t\n\tTransport.prototype.onError = function (msg, desc) {\n\t var err = new Error(msg);\n\t err.type = 'TransportError';\n\t err.description = desc;\n\t this.emit('error', err);\n\t return this;\n\t};\n\t\n\t/**\n\t * Opens the transport.\n\t *\n\t * @api public\n\t */\n\t\n\tTransport.prototype.open = function () {\n\t if ('closed' === this.readyState || '' === this.readyState) {\n\t this.readyState = 'opening';\n\t this.doOpen();\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Closes the transport.\n\t *\n\t * @api private\n\t */\n\t\n\tTransport.prototype.close = function () {\n\t if ('opening' === this.readyState || 'open' === this.readyState) {\n\t this.doClose();\n\t this.onClose();\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Sends multiple packets.\n\t *\n\t * @param {Array} packets\n\t * @api private\n\t */\n\t\n\tTransport.prototype.send = function (packets) {\n\t if ('open' === this.readyState) {\n\t this.write(packets);\n\t } else {\n\t throw new Error('Transport not open');\n\t }\n\t};\n\t\n\t/**\n\t * Called upon open\n\t *\n\t * @api private\n\t */\n\t\n\tTransport.prototype.onOpen = function () {\n\t this.readyState = 'open';\n\t this.writable = true;\n\t this.emit('open');\n\t};\n\t\n\t/**\n\t * Called with data.\n\t *\n\t * @param {String} data\n\t * @api private\n\t */\n\t\n\tTransport.prototype.onData = function (data) {\n\t var packet = parser.decodePacket(data, this.socket.binaryType);\n\t this.onPacket(packet);\n\t};\n\t\n\t/**\n\t * Called with a decoded packet.\n\t */\n\t\n\tTransport.prototype.onPacket = function (packet) {\n\t this.emit('packet', packet);\n\t};\n\t\n\t/**\n\t * Called upon close.\n\t *\n\t * @api private\n\t */\n\t\n\tTransport.prototype.onClose = function () {\n\t this.readyState = 'closed';\n\t this.emit('close');\n\t};\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\n\t * Module dependencies.\n\t */\n\t\n\tvar keys = __webpack_require__(22);\n\tvar hasBinary = __webpack_require__(23);\n\tvar sliceBuffer = __webpack_require__(24);\n\tvar after = __webpack_require__(25);\n\tvar utf8 = __webpack_require__(26);\n\t\n\tvar base64encoder;\n\tif (typeof ArrayBuffer !== 'undefined') {\n\t base64encoder = __webpack_require__(27);\n\t}\n\t\n\t/**\n\t * Check if we are running an android browser. That requires us to use\n\t * ArrayBuffer with polling transports...\n\t *\n\t * http://ghinda.net/jpeg-blob-ajax-android/\n\t */\n\t\n\tvar isAndroid = typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent);\n\t\n\t/**\n\t * Check if we are running in PhantomJS.\n\t * Uploading a Blob with PhantomJS does not work correctly, as reported here:\n\t * https://github.com/ariya/phantomjs/issues/11395\n\t * @type boolean\n\t */\n\tvar isPhantomJS = typeof navigator !== 'undefined' && /PhantomJS/i.test(navigator.userAgent);\n\t\n\t/**\n\t * When true, avoids using Blobs to encode payloads.\n\t * @type boolean\n\t */\n\tvar dontSendBlobs = isAndroid || isPhantomJS;\n\t\n\t/**\n\t * Current protocol version.\n\t */\n\t\n\texports.protocol = 3;\n\t\n\t/**\n\t * Packet types.\n\t */\n\t\n\tvar packets = exports.packets = {\n\t open: 0 // non-ws\n\t , close: 1 // non-ws\n\t , ping: 2\n\t , pong: 3\n\t , message: 4\n\t , upgrade: 5\n\t , noop: 6\n\t};\n\t\n\tvar packetslist = keys(packets);\n\t\n\t/**\n\t * Premade error packet.\n\t */\n\t\n\tvar err = { type: 'error', data: 'parser error' };\n\t\n\t/**\n\t * Create a blob api even for blob builder when vendor prefixes exist\n\t */\n\t\n\tvar Blob = __webpack_require__(28);\n\t\n\t/**\n\t * Encodes a packet.\n\t *\n\t * [ ]\n\t *\n\t * Example:\n\t *\n\t * 5hello world\n\t * 3\n\t * 4\n\t *\n\t * Binary is encoded in an identical principle\n\t *\n\t * @api private\n\t */\n\t\n\texports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {\n\t if (typeof supportsBinary === 'function') {\n\t callback = supportsBinary;\n\t supportsBinary = false;\n\t }\n\t\n\t if (typeof utf8encode === 'function') {\n\t callback = utf8encode;\n\t utf8encode = null;\n\t }\n\t\n\t var data = (packet.data === undefined)\n\t ? undefined\n\t : packet.data.buffer || packet.data;\n\t\n\t if (typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) {\n\t return encodeArrayBuffer(packet, supportsBinary, callback);\n\t } else if (typeof Blob !== 'undefined' && data instanceof Blob) {\n\t return encodeBlob(packet, supportsBinary, callback);\n\t }\n\t\n\t // might be an object with { base64: true, data: dataAsBase64String }\n\t if (data && data.base64) {\n\t return encodeBase64Object(packet, callback);\n\t }\n\t\n\t // Sending data as a utf-8 string\n\t var encoded = packets[packet.type];\n\t\n\t // data fragment is optional\n\t if (undefined !== packet.data) {\n\t encoded += utf8encode ? utf8.encode(String(packet.data), { strict: false }) : String(packet.data);\n\t }\n\t\n\t return callback('' + encoded);\n\t\n\t};\n\t\n\tfunction encodeBase64Object(packet, callback) {\n\t // packet data is an object { base64: true, data: dataAsBase64String }\n\t var message = 'b' + exports.packets[packet.type] + packet.data.data;\n\t return callback(message);\n\t}\n\t\n\t/**\n\t * Encode packet helpers for binary types\n\t */\n\t\n\tfunction encodeArrayBuffer(packet, supportsBinary, callback) {\n\t if (!supportsBinary) {\n\t return exports.encodeBase64Packet(packet, callback);\n\t }\n\t\n\t var data = packet.data;\n\t var contentArray = new Uint8Array(data);\n\t var resultBuffer = new Uint8Array(1 + data.byteLength);\n\t\n\t resultBuffer[0] = packets[packet.type];\n\t for (var i = 0; i < contentArray.length; i++) {\n\t resultBuffer[i+1] = contentArray[i];\n\t }\n\t\n\t return callback(resultBuffer.buffer);\n\t}\n\t\n\tfunction encodeBlobAsArrayBuffer(packet, supportsBinary, callback) {\n\t if (!supportsBinary) {\n\t return exports.encodeBase64Packet(packet, callback);\n\t }\n\t\n\t var fr = new FileReader();\n\t fr.onload = function() {\n\t exports.encodePacket({ type: packet.type, data: fr.result }, supportsBinary, true, callback);\n\t };\n\t return fr.readAsArrayBuffer(packet.data);\n\t}\n\t\n\tfunction encodeBlob(packet, supportsBinary, callback) {\n\t if (!supportsBinary) {\n\t return exports.encodeBase64Packet(packet, callback);\n\t }\n\t\n\t if (dontSendBlobs) {\n\t return encodeBlobAsArrayBuffer(packet, supportsBinary, callback);\n\t }\n\t\n\t var length = new Uint8Array(1);\n\t length[0] = packets[packet.type];\n\t var blob = new Blob([length.buffer, packet.data]);\n\t\n\t return callback(blob);\n\t}\n\t\n\t/**\n\t * Encodes a packet with binary data in a base64 string\n\t *\n\t * @param {Object} packet, has `type` and `data`\n\t * @return {String} base64 encoded message\n\t */\n\t\n\texports.encodeBase64Packet = function(packet, callback) {\n\t var message = 'b' + exports.packets[packet.type];\n\t if (typeof Blob !== 'undefined' && packet.data instanceof Blob) {\n\t var fr = new FileReader();\n\t fr.onload = function() {\n\t var b64 = fr.result.split(',')[1];\n\t callback(message + b64);\n\t };\n\t return fr.readAsDataURL(packet.data);\n\t }\n\t\n\t var b64data;\n\t try {\n\t b64data = String.fromCharCode.apply(null, new Uint8Array(packet.data));\n\t } catch (e) {\n\t // iPhone Safari doesn't let you apply with typed arrays\n\t var typed = new Uint8Array(packet.data);\n\t var basic = new Array(typed.length);\n\t for (var i = 0; i < typed.length; i++) {\n\t basic[i] = typed[i];\n\t }\n\t b64data = String.fromCharCode.apply(null, basic);\n\t }\n\t message += btoa(b64data);\n\t return callback(message);\n\t};\n\t\n\t/**\n\t * Decodes a packet. Changes format to Blob if requested.\n\t *\n\t * @return {Object} with `type` and `data` (if any)\n\t * @api private\n\t */\n\t\n\texports.decodePacket = function (data, binaryType, utf8decode) {\n\t if (data === undefined) {\n\t return err;\n\t }\n\t // String data\n\t if (typeof data === 'string') {\n\t if (data.charAt(0) === 'b') {\n\t return exports.decodeBase64Packet(data.substr(1), binaryType);\n\t }\n\t\n\t if (utf8decode) {\n\t data = tryDecode(data);\n\t if (data === false) {\n\t return err;\n\t }\n\t }\n\t var type = data.charAt(0);\n\t\n\t if (Number(type) != type || !packetslist[type]) {\n\t return err;\n\t }\n\t\n\t if (data.length > 1) {\n\t return { type: packetslist[type], data: data.substring(1) };\n\t } else {\n\t return { type: packetslist[type] };\n\t }\n\t }\n\t\n\t var asArray = new Uint8Array(data);\n\t var type = asArray[0];\n\t var rest = sliceBuffer(data, 1);\n\t if (Blob && binaryType === 'blob') {\n\t rest = new Blob([rest]);\n\t }\n\t return { type: packetslist[type], data: rest };\n\t};\n\t\n\tfunction tryDecode(data) {\n\t try {\n\t data = utf8.decode(data, { strict: false });\n\t } catch (e) {\n\t return false;\n\t }\n\t return data;\n\t}\n\t\n\t/**\n\t * Decodes a packet encoded in a base64 string\n\t *\n\t * @param {String} base64 encoded message\n\t * @return {Object} with `type` and `data` (if any)\n\t */\n\t\n\texports.decodeBase64Packet = function(msg, binaryType) {\n\t var type = packetslist[msg.charAt(0)];\n\t if (!base64encoder) {\n\t return { type: type, data: { base64: true, data: msg.substr(1) } };\n\t }\n\t\n\t var data = base64encoder.decode(msg.substr(1));\n\t\n\t if (binaryType === 'blob' && Blob) {\n\t data = new Blob([data]);\n\t }\n\t\n\t return { type: type, data: data };\n\t};\n\t\n\t/**\n\t * Encodes multiple messages (payload).\n\t *\n\t * :data\n\t *\n\t * Example:\n\t *\n\t * 11:hello world2:hi\n\t *\n\t * If any contents are binary, they will be encoded as base64 strings. Base64\n\t * encoded strings are marked with a b before the length specifier\n\t *\n\t * @param {Array} packets\n\t * @api private\n\t */\n\t\n\texports.encodePayload = function (packets, supportsBinary, callback) {\n\t if (typeof supportsBinary === 'function') {\n\t callback = supportsBinary;\n\t supportsBinary = null;\n\t }\n\t\n\t var isBinary = hasBinary(packets);\n\t\n\t if (supportsBinary && isBinary) {\n\t if (Blob && !dontSendBlobs) {\n\t return exports.encodePayloadAsBlob(packets, callback);\n\t }\n\t\n\t return exports.encodePayloadAsArrayBuffer(packets, callback);\n\t }\n\t\n\t if (!packets.length) {\n\t return callback('0:');\n\t }\n\t\n\t function setLengthHeader(message) {\n\t return message.length + ':' + message;\n\t }\n\t\n\t function encodeOne(packet, doneCallback) {\n\t exports.encodePacket(packet, !isBinary ? false : supportsBinary, false, function(message) {\n\t doneCallback(null, setLengthHeader(message));\n\t });\n\t }\n\t\n\t map(packets, encodeOne, function(err, results) {\n\t return callback(results.join(''));\n\t });\n\t};\n\t\n\t/**\n\t * Async array map using after\n\t */\n\t\n\tfunction map(ary, each, done) {\n\t var result = new Array(ary.length);\n\t var next = after(ary.length, done);\n\t\n\t var eachWithIndex = function(i, el, cb) {\n\t each(el, function(error, msg) {\n\t result[i] = msg;\n\t cb(error, result);\n\t });\n\t };\n\t\n\t for (var i = 0; i < ary.length; i++) {\n\t eachWithIndex(i, ary[i], next);\n\t }\n\t}\n\t\n\t/*\n\t * Decodes data when a payload is maybe expected. Possible binary contents are\n\t * decoded from their base64 representation\n\t *\n\t * @param {String} data, callback method\n\t * @api public\n\t */\n\t\n\texports.decodePayload = function (data, binaryType, callback) {\n\t if (typeof data !== 'string') {\n\t return exports.decodePayloadAsBinary(data, binaryType, callback);\n\t }\n\t\n\t if (typeof binaryType === 'function') {\n\t callback = binaryType;\n\t binaryType = null;\n\t }\n\t\n\t var packet;\n\t if (data === '') {\n\t // parser error - ignoring payload\n\t return callback(err, 0, 1);\n\t }\n\t\n\t var length = '', n, msg;\n\t\n\t for (var i = 0, l = data.length; i < l; i++) {\n\t var chr = data.charAt(i);\n\t\n\t if (chr !== ':') {\n\t length += chr;\n\t continue;\n\t }\n\t\n\t if (length === '' || (length != (n = Number(length)))) {\n\t // parser error - ignoring payload\n\t return callback(err, 0, 1);\n\t }\n\t\n\t msg = data.substr(i + 1, n);\n\t\n\t if (length != msg.length) {\n\t // parser error - ignoring payload\n\t return callback(err, 0, 1);\n\t }\n\t\n\t if (msg.length) {\n\t packet = exports.decodePacket(msg, binaryType, false);\n\t\n\t if (err.type === packet.type && err.data === packet.data) {\n\t // parser error in individual packet - ignoring payload\n\t return callback(err, 0, 1);\n\t }\n\t\n\t var ret = callback(packet, i + n, l);\n\t if (false === ret) return;\n\t }\n\t\n\t // advance cursor\n\t i += n;\n\t length = '';\n\t }\n\t\n\t if (length !== '') {\n\t // parser error - ignoring payload\n\t return callback(err, 0, 1);\n\t }\n\t\n\t};\n\t\n\t/**\n\t * Encodes multiple messages (payload) as binary.\n\t *\n\t * <1 = binary, 0 = string>[...]\n\t *\n\t * Example:\n\t * 1 3 255 1 2 3, if the binary contents are interpreted as 8 bit integers\n\t *\n\t * @param {Array} packets\n\t * @return {ArrayBuffer} encoded payload\n\t * @api private\n\t */\n\t\n\texports.encodePayloadAsArrayBuffer = function(packets, callback) {\n\t if (!packets.length) {\n\t return callback(new ArrayBuffer(0));\n\t }\n\t\n\t function encodeOne(packet, doneCallback) {\n\t exports.encodePacket(packet, true, true, function(data) {\n\t return doneCallback(null, data);\n\t });\n\t }\n\t\n\t map(packets, encodeOne, function(err, encodedPackets) {\n\t var totalLength = encodedPackets.reduce(function(acc, p) {\n\t var len;\n\t if (typeof p === 'string'){\n\t len = p.length;\n\t } else {\n\t len = p.byteLength;\n\t }\n\t return acc + len.toString().length + len + 2; // string/binary identifier + separator = 2\n\t }, 0);\n\t\n\t var resultArray = new Uint8Array(totalLength);\n\t\n\t var bufferIndex = 0;\n\t encodedPackets.forEach(function(p) {\n\t var isString = typeof p === 'string';\n\t var ab = p;\n\t if (isString) {\n\t var view = new Uint8Array(p.length);\n\t for (var i = 0; i < p.length; i++) {\n\t view[i] = p.charCodeAt(i);\n\t }\n\t ab = view.buffer;\n\t }\n\t\n\t if (isString) { // not true binary\n\t resultArray[bufferIndex++] = 0;\n\t } else { // true binary\n\t resultArray[bufferIndex++] = 1;\n\t }\n\t\n\t var lenStr = ab.byteLength.toString();\n\t for (var i = 0; i < lenStr.length; i++) {\n\t resultArray[bufferIndex++] = parseInt(lenStr[i]);\n\t }\n\t resultArray[bufferIndex++] = 255;\n\t\n\t var view = new Uint8Array(ab);\n\t for (var i = 0; i < view.length; i++) {\n\t resultArray[bufferIndex++] = view[i];\n\t }\n\t });\n\t\n\t return callback(resultArray.buffer);\n\t });\n\t};\n\t\n\t/**\n\t * Encode as Blob\n\t */\n\t\n\texports.encodePayloadAsBlob = function(packets, callback) {\n\t function encodeOne(packet, doneCallback) {\n\t exports.encodePacket(packet, true, true, function(encoded) {\n\t var binaryIdentifier = new Uint8Array(1);\n\t binaryIdentifier[0] = 1;\n\t if (typeof encoded === 'string') {\n\t var view = new Uint8Array(encoded.length);\n\t for (var i = 0; i < encoded.length; i++) {\n\t view[i] = encoded.charCodeAt(i);\n\t }\n\t encoded = view.buffer;\n\t binaryIdentifier[0] = 0;\n\t }\n\t\n\t var len = (encoded instanceof ArrayBuffer)\n\t ? encoded.byteLength\n\t : encoded.size;\n\t\n\t var lenStr = len.toString();\n\t var lengthAry = new Uint8Array(lenStr.length + 1);\n\t for (var i = 0; i < lenStr.length; i++) {\n\t lengthAry[i] = parseInt(lenStr[i]);\n\t }\n\t lengthAry[lenStr.length] = 255;\n\t\n\t if (Blob) {\n\t var blob = new Blob([binaryIdentifier.buffer, lengthAry.buffer, encoded]);\n\t doneCallback(null, blob);\n\t }\n\t });\n\t }\n\t\n\t map(packets, encodeOne, function(err, results) {\n\t return callback(new Blob(results));\n\t });\n\t};\n\t\n\t/*\n\t * Decodes data when a payload is maybe expected. Strings are decoded by\n\t * interpreting each byte as a key code for entries marked to start with 0. See\n\t * description of encodePayloadAsBinary\n\t *\n\t * @param {ArrayBuffer} data, callback method\n\t * @api public\n\t */\n\t\n\texports.decodePayloadAsBinary = function (data, binaryType, callback) {\n\t if (typeof binaryType === 'function') {\n\t callback = binaryType;\n\t binaryType = null;\n\t }\n\t\n\t var bufferTail = data;\n\t var buffers = [];\n\t\n\t while (bufferTail.byteLength > 0) {\n\t var tailArray = new Uint8Array(bufferTail);\n\t var isString = tailArray[0] === 0;\n\t var msgLength = '';\n\t\n\t for (var i = 1; ; i++) {\n\t if (tailArray[i] === 255) break;\n\t\n\t // 310 = char length of Number.MAX_VALUE\n\t if (msgLength.length > 310) {\n\t return callback(err, 0, 1);\n\t }\n\t\n\t msgLength += tailArray[i];\n\t }\n\t\n\t bufferTail = sliceBuffer(bufferTail, 2 + msgLength.length);\n\t msgLength = parseInt(msgLength);\n\t\n\t var msg = sliceBuffer(bufferTail, 0, msgLength);\n\t if (isString) {\n\t try {\n\t msg = String.fromCharCode.apply(null, new Uint8Array(msg));\n\t } catch (e) {\n\t // iPhone Safari doesn't let you apply to typed arrays\n\t var typed = new Uint8Array(msg);\n\t msg = '';\n\t for (var i = 0; i < typed.length; i++) {\n\t msg += String.fromCharCode(typed[i]);\n\t }\n\t }\n\t }\n\t\n\t buffers.push(msg);\n\t bufferTail = sliceBuffer(bufferTail, msgLength);\n\t }\n\t\n\t var total = buffers.length;\n\t buffers.forEach(function(buffer, i) {\n\t callback(exports.decodePacket(buffer, binaryType, true), i, total);\n\t });\n\t};\n\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\n\t\n\t/**\n\t * Gets the keys for an object.\n\t *\n\t * @return {Array} keys\n\t * @api private\n\t */\n\t\n\tmodule.exports = Object.keys || function keys (obj){\n\t var arr = [];\n\t var has = Object.prototype.hasOwnProperty;\n\t\n\t for (var i in obj) {\n\t if (has.call(obj, i)) {\n\t arr.push(i);\n\t }\n\t }\n\t return arr;\n\t};\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* global Blob File */\n\t\n\t/*\n\t * Module requirements.\n\t */\n\t\n\tvar isArray = __webpack_require__(10);\n\t\n\tvar toString = Object.prototype.toString;\n\tvar withNativeBlob = typeof Blob === 'function' ||\n\t typeof Blob !== 'undefined' && toString.call(Blob) === '[object BlobConstructor]';\n\tvar withNativeFile = typeof File === 'function' ||\n\t typeof File !== 'undefined' && toString.call(File) === '[object FileConstructor]';\n\t\n\t/**\n\t * Module exports.\n\t */\n\t\n\tmodule.exports = hasBinary;\n\t\n\t/**\n\t * Checks for binary data.\n\t *\n\t * Supports Buffer, ArrayBuffer, Blob and File.\n\t *\n\t * @param {Object} anything\n\t * @api public\n\t */\n\t\n\tfunction hasBinary (obj) {\n\t if (!obj || typeof obj !== 'object') {\n\t return false;\n\t }\n\t\n\t if (isArray(obj)) {\n\t for (var i = 0, l = obj.length; i < l; i++) {\n\t if (hasBinary(obj[i])) {\n\t return true;\n\t }\n\t }\n\t return false;\n\t }\n\t\n\t if ((typeof Buffer === 'function' && Buffer.isBuffer && Buffer.isBuffer(obj)) ||\n\t (typeof ArrayBuffer === 'function' && obj instanceof ArrayBuffer) ||\n\t (withNativeBlob && obj instanceof Blob) ||\n\t (withNativeFile && obj instanceof File)\n\t ) {\n\t return true;\n\t }\n\t\n\t // see: https://github.com/Automattic/has-binary/pull/4\n\t if (obj.toJSON && typeof obj.toJSON === 'function' && arguments.length === 1) {\n\t return hasBinary(obj.toJSON(), true);\n\t }\n\t\n\t for (var key in obj) {\n\t if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n\t return true;\n\t }\n\t }\n\t\n\t return false;\n\t}\n\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports) {\n\n\t/**\n\t * An abstraction for slicing an arraybuffer even when\n\t * ArrayBuffer.prototype.slice is not supported\n\t *\n\t * @api public\n\t */\n\t\n\tmodule.exports = function(arraybuffer, start, end) {\n\t var bytes = arraybuffer.byteLength;\n\t start = start || 0;\n\t end = end || bytes;\n\t\n\t if (arraybuffer.slice) { return arraybuffer.slice(start, end); }\n\t\n\t if (start < 0) { start += bytes; }\n\t if (end < 0) { end += bytes; }\n\t if (end > bytes) { end = bytes; }\n\t\n\t if (start >= bytes || start >= end || bytes === 0) {\n\t return new ArrayBuffer(0);\n\t }\n\t\n\t var abv = new Uint8Array(arraybuffer);\n\t var result = new Uint8Array(end - start);\n\t for (var i = start, ii = 0; i < end; i++, ii++) {\n\t result[ii] = abv[i];\n\t }\n\t return result.buffer;\n\t};\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports) {\n\n\tmodule.exports = after\n\t\n\tfunction after(count, callback, err_cb) {\n\t var bail = false\n\t err_cb = err_cb || noop\n\t proxy.count = count\n\t\n\t return (count === 0) ? callback() : proxy\n\t\n\t function proxy(err, result) {\n\t if (proxy.count <= 0) {\n\t throw new Error('after called too many times')\n\t }\n\t --proxy.count\n\t\n\t // after first error, rest are passed to err_cb\n\t if (err) {\n\t bail = true\n\t callback(err)\n\t // future error callbacks will go to error handler\n\t callback = err_cb\n\t } else if (proxy.count === 0 && !bail) {\n\t callback(null, result)\n\t }\n\t }\n\t}\n\t\n\tfunction noop() {}\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports) {\n\n\t/*! https://mths.be/utf8js v2.1.2 by @mathias */\n\t\n\tvar stringFromCharCode = String.fromCharCode;\n\t\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2decode(string) {\n\t\tvar output = [];\n\t\tvar counter = 0;\n\t\tvar length = string.length;\n\t\tvar value;\n\t\tvar extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\t\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2encode(array) {\n\t\tvar length = array.length;\n\t\tvar index = -1;\n\t\tvar value;\n\t\tvar output = '';\n\t\twhile (++index < length) {\n\t\t\tvalue = array[index];\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t}\n\t\treturn output;\n\t}\n\t\n\tfunction checkScalarValue(codePoint, strict) {\n\t\tif (codePoint >= 0xD800 && codePoint <= 0xDFFF) {\n\t\t\tif (strict) {\n\t\t\t\tthrow Error(\n\t\t\t\t\t'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +\n\t\t\t\t\t' is not a scalar value'\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\t/*--------------------------------------------------------------------------*/\n\t\n\tfunction createByte(codePoint, shift) {\n\t\treturn stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n\t}\n\t\n\tfunction encodeCodePoint(codePoint, strict) {\n\t\tif ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n\t\t\treturn stringFromCharCode(codePoint);\n\t\t}\n\t\tvar symbol = '';\n\t\tif ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n\t\t}\n\t\telse if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n\t\t\tif (!checkScalarValue(codePoint, strict)) {\n\t\t\t\tcodePoint = 0xFFFD;\n\t\t\t}\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\telse if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n\t\t\tsymbol += createByte(codePoint, 12);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\tsymbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n\t\treturn symbol;\n\t}\n\t\n\tfunction utf8encode(string, opts) {\n\t\topts = opts || {};\n\t\tvar strict = false !== opts.strict;\n\t\n\t\tvar codePoints = ucs2decode(string);\n\t\tvar length = codePoints.length;\n\t\tvar index = -1;\n\t\tvar codePoint;\n\t\tvar byteString = '';\n\t\twhile (++index < length) {\n\t\t\tcodePoint = codePoints[index];\n\t\t\tbyteString += encodeCodePoint(codePoint, strict);\n\t\t}\n\t\treturn byteString;\n\t}\n\t\n\t/*--------------------------------------------------------------------------*/\n\t\n\tfunction readContinuationByte() {\n\t\tif (byteIndex >= byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\t\n\t\tvar continuationByte = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\t\n\t\tif ((continuationByte & 0xC0) == 0x80) {\n\t\t\treturn continuationByte & 0x3F;\n\t\t}\n\t\n\t\t// If we end up here, it’s not a continuation byte\n\t\tthrow Error('Invalid continuation byte');\n\t}\n\t\n\tfunction decodeSymbol(strict) {\n\t\tvar byte1;\n\t\tvar byte2;\n\t\tvar byte3;\n\t\tvar byte4;\n\t\tvar codePoint;\n\t\n\t\tif (byteIndex > byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\t\n\t\tif (byteIndex == byteCount) {\n\t\t\treturn false;\n\t\t}\n\t\n\t\t// Read first byte\n\t\tbyte1 = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\t\n\t\t// 1-byte sequence (no continuation bytes)\n\t\tif ((byte1 & 0x80) == 0) {\n\t\t\treturn byte1;\n\t\t}\n\t\n\t\t// 2-byte sequence\n\t\tif ((byte1 & 0xE0) == 0xC0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x1F) << 6) | byte2;\n\t\t\tif (codePoint >= 0x80) {\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\t\n\t\t// 3-byte sequence (may include unpaired surrogates)\n\t\tif ((byte1 & 0xF0) == 0xE0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n\t\t\tif (codePoint >= 0x0800) {\n\t\t\t\treturn checkScalarValue(codePoint, strict) ? codePoint : 0xFFFD;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\t\n\t\t// 4-byte sequence\n\t\tif ((byte1 & 0xF8) == 0xF0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tbyte4 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |\n\t\t\t\t(byte3 << 0x06) | byte4;\n\t\t\tif (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n\t\t\t\treturn codePoint;\n\t\t\t}\n\t\t}\n\t\n\t\tthrow Error('Invalid UTF-8 detected');\n\t}\n\t\n\tvar byteArray;\n\tvar byteCount;\n\tvar byteIndex;\n\tfunction utf8decode(byteString, opts) {\n\t\topts = opts || {};\n\t\tvar strict = false !== opts.strict;\n\t\n\t\tbyteArray = ucs2decode(byteString);\n\t\tbyteCount = byteArray.length;\n\t\tbyteIndex = 0;\n\t\tvar codePoints = [];\n\t\tvar tmp;\n\t\twhile ((tmp = decodeSymbol(strict)) !== false) {\n\t\t\tcodePoints.push(tmp);\n\t\t}\n\t\treturn ucs2encode(codePoints);\n\t}\n\t\n\tmodule.exports = {\n\t\tversion: '2.1.2',\n\t\tencode: utf8encode,\n\t\tdecode: utf8decode\n\t};\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports) {\n\n\t/*\n\t * base64-arraybuffer\n\t * https://github.com/niklasvh/base64-arraybuffer\n\t *\n\t * Copyright (c) 2012 Niklas von Hertzen\n\t * Licensed under the MIT license.\n\t */\n\t(function(){\n\t \"use strict\";\n\t\n\t var chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\t\n\t // Use a lookup table to find the index.\n\t var lookup = new Uint8Array(256);\n\t for (var i = 0; i < chars.length; i++) {\n\t lookup[chars.charCodeAt(i)] = i;\n\t }\n\t\n\t exports.encode = function(arraybuffer) {\n\t var bytes = new Uint8Array(arraybuffer),\n\t i, len = bytes.length, base64 = \"\";\n\t\n\t for (i = 0; i < len; i+=3) {\n\t base64 += chars[bytes[i] >> 2];\n\t base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n\t base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n\t base64 += chars[bytes[i + 2] & 63];\n\t }\n\t\n\t if ((len % 3) === 2) {\n\t base64 = base64.substring(0, base64.length - 1) + \"=\";\n\t } else if (len % 3 === 1) {\n\t base64 = base64.substring(0, base64.length - 2) + \"==\";\n\t }\n\t\n\t return base64;\n\t };\n\t\n\t exports.decode = function(base64) {\n\t var bufferLength = base64.length * 0.75,\n\t len = base64.length, i, p = 0,\n\t encoded1, encoded2, encoded3, encoded4;\n\t\n\t if (base64[base64.length - 1] === \"=\") {\n\t bufferLength--;\n\t if (base64[base64.length - 2] === \"=\") {\n\t bufferLength--;\n\t }\n\t }\n\t\n\t var arraybuffer = new ArrayBuffer(bufferLength),\n\t bytes = new Uint8Array(arraybuffer);\n\t\n\t for (i = 0; i < len; i+=4) {\n\t encoded1 = lookup[base64.charCodeAt(i)];\n\t encoded2 = lookup[base64.charCodeAt(i+1)];\n\t encoded3 = lookup[base64.charCodeAt(i+2)];\n\t encoded4 = lookup[base64.charCodeAt(i+3)];\n\t\n\t bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n\t bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n\t bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n\t }\n\t\n\t return arraybuffer;\n\t };\n\t})();\n\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports) {\n\n\t/**\r\n\t * Create a blob builder even when vendor prefixes exist\r\n\t */\r\n\t\r\n\tvar BlobBuilder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :\r\n\t typeof WebKitBlobBuilder !== 'undefined' ? WebKitBlobBuilder :\r\n\t typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :\r\n\t typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : \r\n\t false;\r\n\t\r\n\t/**\r\n\t * Check if Blob constructor is supported\r\n\t */\r\n\t\r\n\tvar blobSupported = (function() {\r\n\t try {\r\n\t var a = new Blob(['hi']);\r\n\t return a.size === 2;\r\n\t } catch(e) {\r\n\t return false;\r\n\t }\r\n\t})();\r\n\t\r\n\t/**\r\n\t * Check if Blob constructor supports ArrayBufferViews\r\n\t * Fails in Safari 6, so we need to map to ArrayBuffers there.\r\n\t */\r\n\t\r\n\tvar blobSupportsArrayBufferView = blobSupported && (function() {\r\n\t try {\r\n\t var b = new Blob([new Uint8Array([1,2])]);\r\n\t return b.size === 2;\r\n\t } catch(e) {\r\n\t return false;\r\n\t }\r\n\t})();\r\n\t\r\n\t/**\r\n\t * Check if BlobBuilder is supported\r\n\t */\r\n\t\r\n\tvar blobBuilderSupported = BlobBuilder\r\n\t && BlobBuilder.prototype.append\r\n\t && BlobBuilder.prototype.getBlob;\r\n\t\r\n\t/**\r\n\t * Helper function that maps ArrayBufferViews to ArrayBuffers\r\n\t * Used by BlobBuilder constructor and old browsers that didn't\r\n\t * support it in the Blob constructor.\r\n\t */\r\n\t\r\n\tfunction mapArrayBufferViews(ary) {\r\n\t return ary.map(function(chunk) {\r\n\t if (chunk.buffer instanceof ArrayBuffer) {\r\n\t var buf = chunk.buffer;\r\n\t\r\n\t // if this is a subarray, make a copy so we only\r\n\t // include the subarray region from the underlying buffer\r\n\t if (chunk.byteLength !== buf.byteLength) {\r\n\t var copy = new Uint8Array(chunk.byteLength);\r\n\t copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));\r\n\t buf = copy.buffer;\r\n\t }\r\n\t\r\n\t return buf;\r\n\t }\r\n\t\r\n\t return chunk;\r\n\t });\r\n\t}\r\n\t\r\n\tfunction BlobBuilderConstructor(ary, options) {\r\n\t options = options || {};\r\n\t\r\n\t var bb = new BlobBuilder();\r\n\t mapArrayBufferViews(ary).forEach(function(part) {\r\n\t bb.append(part);\r\n\t });\r\n\t\r\n\t return (options.type) ? bb.getBlob(options.type) : bb.getBlob();\r\n\t};\r\n\t\r\n\tfunction BlobConstructor(ary, options) {\r\n\t return new Blob(mapArrayBufferViews(ary), options || {});\r\n\t};\r\n\t\r\n\tif (typeof Blob !== 'undefined') {\r\n\t BlobBuilderConstructor.prototype = Blob.prototype;\r\n\t BlobConstructor.prototype = Blob.prototype;\r\n\t}\r\n\t\r\n\tmodule.exports = (function() {\r\n\t if (blobSupported) {\r\n\t return blobSupportsArrayBufferView ? Blob : BlobConstructor;\r\n\t } else if (blobBuilderSupported) {\r\n\t return BlobBuilderConstructor;\r\n\t } else {\r\n\t return undefined;\r\n\t }\r\n\t})();\r\n\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports) {\n\n\t/**\r\n\t * Compiles a querystring\r\n\t * Returns string representation of the object\r\n\t *\r\n\t * @param {Object}\r\n\t * @api private\r\n\t */\r\n\t\r\n\texports.encode = function (obj) {\r\n\t var str = '';\r\n\t\r\n\t for (var i in obj) {\r\n\t if (obj.hasOwnProperty(i)) {\r\n\t if (str.length) str += '&';\r\n\t str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\r\n\t }\r\n\t }\r\n\t\r\n\t return str;\r\n\t};\r\n\t\r\n\t/**\r\n\t * Parses a simple querystring into an object\r\n\t *\r\n\t * @param {String} qs\r\n\t * @api private\r\n\t */\r\n\t\r\n\texports.decode = function(qs){\r\n\t var qry = {};\r\n\t var pairs = qs.split('&');\r\n\t for (var i = 0, l = pairs.length; i < l; i++) {\r\n\t var pair = pairs[i].split('=');\r\n\t qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\r\n\t }\r\n\t return qry;\r\n\t};\r\n\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports) {\n\n\t\n\tmodule.exports = function(a, b){\n\t var fn = function(){};\n\t fn.prototype = b.prototype;\n\t a.prototype = new fn;\n\t a.prototype.constructor = a;\n\t};\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\t\n\tvar alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')\n\t , length = 64\n\t , map = {}\n\t , seed = 0\n\t , i = 0\n\t , prev;\n\t\n\t/**\n\t * Return a string representing the specified number.\n\t *\n\t * @param {Number} num The number to convert.\n\t * @returns {String} The string representation of the number.\n\t * @api public\n\t */\n\tfunction encode(num) {\n\t var encoded = '';\n\t\n\t do {\n\t encoded = alphabet[num % length] + encoded;\n\t num = Math.floor(num / length);\n\t } while (num > 0);\n\t\n\t return encoded;\n\t}\n\t\n\t/**\n\t * Return the integer value specified by the given string.\n\t *\n\t * @param {String} str The string to convert.\n\t * @returns {Number} The integer value represented by the string.\n\t * @api public\n\t */\n\tfunction decode(str) {\n\t var decoded = 0;\n\t\n\t for (i = 0; i < str.length; i++) {\n\t decoded = decoded * length + map[str.charAt(i)];\n\t }\n\t\n\t return decoded;\n\t}\n\t\n\t/**\n\t * Yeast: A tiny growing id generator.\n\t *\n\t * @returns {String} A unique id.\n\t * @api public\n\t */\n\tfunction yeast() {\n\t var now = encode(+new Date());\n\t\n\t if (now !== prev) return seed = 0, prev = now;\n\t return now +'.'+ encode(seed++);\n\t}\n\t\n\t//\n\t// Map each character to its index.\n\t//\n\tfor (; i < length; i++) map[alphabet[i]] = i;\n\t\n\t//\n\t// Expose the `yeast`, `encode` and `decode` functions.\n\t//\n\tyeast.encode = encode;\n\tyeast.decode = decode;\n\tmodule.exports = yeast;\n\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {/**\n\t * Module requirements.\n\t */\n\t\n\tvar Polling = __webpack_require__(19);\n\tvar inherit = __webpack_require__(30);\n\t\n\t/**\n\t * Module exports.\n\t */\n\t\n\tmodule.exports = JSONPPolling;\n\t\n\t/**\n\t * Cached regular expressions.\n\t */\n\t\n\tvar rNewline = /\\n/g;\n\tvar rEscapedNewline = /\\\\n/g;\n\t\n\t/**\n\t * Global JSONP callbacks.\n\t */\n\t\n\tvar callbacks;\n\t\n\t/**\n\t * Noop.\n\t */\n\t\n\tfunction empty () { }\n\t\n\t/**\n\t * Until https://github.com/tc39/proposal-global is shipped.\n\t */\n\tfunction glob () {\n\t return typeof self !== 'undefined' ? self\n\t : typeof window !== 'undefined' ? window\n\t : typeof global !== 'undefined' ? global : {};\n\t}\n\t\n\t/**\n\t * JSONP Polling constructor.\n\t *\n\t * @param {Object} opts.\n\t * @api public\n\t */\n\t\n\tfunction JSONPPolling (opts) {\n\t Polling.call(this, opts);\n\t\n\t this.query = this.query || {};\n\t\n\t // define global callbacks array if not present\n\t // we do this here (lazily) to avoid unneeded global pollution\n\t if (!callbacks) {\n\t // we need to consider multiple engines in the same page\n\t var global = glob();\n\t callbacks = global.___eio = (global.___eio || []);\n\t }\n\t\n\t // callback identifier\n\t this.index = callbacks.length;\n\t\n\t // add callback to jsonp global\n\t var self = this;\n\t callbacks.push(function (msg) {\n\t self.onData(msg);\n\t });\n\t\n\t // append to query string\n\t this.query.j = this.index;\n\t\n\t // prevent spurious errors from being emitted when the window is unloaded\n\t if (typeof addEventListener === 'function') {\n\t addEventListener('beforeunload', function () {\n\t if (self.script) self.script.onerror = empty;\n\t }, false);\n\t }\n\t}\n\t\n\t/**\n\t * Inherits from Polling.\n\t */\n\t\n\tinherit(JSONPPolling, Polling);\n\t\n\t/*\n\t * JSONP only supports binary as base64 encoded strings\n\t */\n\t\n\tJSONPPolling.prototype.supportsBinary = false;\n\t\n\t/**\n\t * Closes the socket.\n\t *\n\t * @api private\n\t */\n\t\n\tJSONPPolling.prototype.doClose = function () {\n\t if (this.script) {\n\t this.script.parentNode.removeChild(this.script);\n\t this.script = null;\n\t }\n\t\n\t if (this.form) {\n\t this.form.parentNode.removeChild(this.form);\n\t this.form = null;\n\t this.iframe = null;\n\t }\n\t\n\t Polling.prototype.doClose.call(this);\n\t};\n\t\n\t/**\n\t * Starts a poll cycle.\n\t *\n\t * @api private\n\t */\n\t\n\tJSONPPolling.prototype.doPoll = function () {\n\t var self = this;\n\t var script = document.createElement('script');\n\t\n\t if (this.script) {\n\t this.script.parentNode.removeChild(this.script);\n\t this.script = null;\n\t }\n\t\n\t script.async = true;\n\t script.src = this.uri();\n\t script.onerror = function (e) {\n\t self.onError('jsonp poll error', e);\n\t };\n\t\n\t var insertAt = document.getElementsByTagName('script')[0];\n\t if (insertAt) {\n\t insertAt.parentNode.insertBefore(script, insertAt);\n\t } else {\n\t (document.head || document.body).appendChild(script);\n\t }\n\t this.script = script;\n\t\n\t var isUAgecko = 'undefined' !== typeof navigator && /gecko/i.test(navigator.userAgent);\n\t\n\t if (isUAgecko) {\n\t setTimeout(function () {\n\t var iframe = document.createElement('iframe');\n\t document.body.appendChild(iframe);\n\t document.body.removeChild(iframe);\n\t }, 100);\n\t }\n\t};\n\t\n\t/**\n\t * Writes with a hidden iframe.\n\t *\n\t * @param {String} data to send\n\t * @param {Function} called upon flush.\n\t * @api private\n\t */\n\t\n\tJSONPPolling.prototype.doWrite = function (data, fn) {\n\t var self = this;\n\t\n\t if (!this.form) {\n\t var form = document.createElement('form');\n\t var area = document.createElement('textarea');\n\t var id = this.iframeId = 'eio_iframe_' + this.index;\n\t var iframe;\n\t\n\t form.className = 'socketio';\n\t form.style.position = 'absolute';\n\t form.style.top = '-1000px';\n\t form.style.left = '-1000px';\n\t form.target = id;\n\t form.method = 'POST';\n\t form.setAttribute('accept-charset', 'utf-8');\n\t area.name = 'd';\n\t form.appendChild(area);\n\t document.body.appendChild(form);\n\t\n\t this.form = form;\n\t this.area = area;\n\t }\n\t\n\t this.form.action = this.uri();\n\t\n\t function complete () {\n\t initIframe();\n\t fn();\n\t }\n\t\n\t function initIframe () {\n\t if (self.iframe) {\n\t try {\n\t self.form.removeChild(self.iframe);\n\t } catch (e) {\n\t self.onError('jsonp polling iframe removal error', e);\n\t }\n\t }\n\t\n\t try {\n\t // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n\t var html = '