├── requirements.txt ├── README.md ├── test_sw.yaml ├── LICENSE ├── test_dlab.yaml ├── tasmota.py ├── .gitignore ├── telnet.py ├── test_zftlab.yaml ├── ipctool_test.py └── uget.sh /requirements.txt: -------------------------------------------------------------------------------- 1 | pytest 2 | pyyaml 3 | pexpect 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PoC for determine good CI practice for the project 2 | 3 | ## Installation 4 | 5 | Disable host checking: 6 | 7 | In your ~/.ssh/config (if this file doesn't exist, just create it): 8 | 9 | ``` 10 | Host * 11 | StrictHostKeyChecking no 12 | ConnectTimeout 10 13 | ``` 14 | 15 | ## Usage 16 | 17 | * To run only test against specific hardware add parameter with site and 18 | specific id `"ipc_chip_test.py::test_zftlab[HI3518EV200+JXF22]"` 19 | -------------------------------------------------------------------------------- /test_sw.yaml: -------------------------------------------------------------------------------- 1 | - 2 | hostname: IPG-53X13PA-S.dlab 3 | connection: telnet 4 | output: 5 | - "Chip: Xiongmai XM510" 6 | - "Sensor: ON Semiconductor AR0130" 7 | id: "IPG-53X13PA-S, XM510+AR0130" 8 | - 9 | hostname: IPG-50X10PT-S.dlab 10 | connection: telnet 11 | output: 12 | - "Chip: Xiongmai XM510" 13 | - "Sensor: Silicon Optronics JXH62" 14 | id: "IPG-50X10PT-S, XM510+H62" 15 | - 16 | hostname: IPG-53X13PT-S.dlab 17 | connection: telnet 18 | output: 19 | - "Chip: Xiongmai XM510" 20 | - "Sensor: Silicon Optronics JXH65" 21 | id: "IPG-53X13PT-S, XM510+H65" 22 | - 23 | hostname: IVG-85X50PYA-S.dlab 24 | connection: telnet 25 | output: 26 | - "Chip: Xiongmai XM530" 27 | - "Sensor: Sony IMX335" 28 | id: "IVG-85X50PYA-S, XM530+IMX335" 29 | - 30 | hostname: IVG-83X50PS-S.dlab 31 | connection: telnet 32 | output: 33 | - "Chip: Xiongmai XM530" 34 | - "Sensor: SmartSens SC5300" 35 | id: "IVG-83X50PS-S, XM530+SC5300" 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 OpenIPC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test_dlab.yaml: -------------------------------------------------------------------------------- 1 | - 2 | hostname: ivg-hp203y-ae.dlab 3 | connection: telnet 4 | output: 5 | - "Chip: HiSilicon 3516cv300" 6 | - "Sensor: Sony IMX291" 7 | id: "HI3516CV300+IMX291" 8 | - 9 | hostname: ivg-85hg50pya-s.dlab 10 | connection: telnet 11 | output: 12 | - "Chip: HiSilicon 3516ev300" 13 | - "Sensor: Sony IMX335" 14 | id: "HI3516EV300+IMX335" 15 | - 16 | hostname: ipg-80h20ps-s.dlab 17 | connection: telnet 18 | output: 19 | - "Chip: HiSilicon 3516cv300" 20 | - "Sensor: SmartSens SC2235P" 21 | id: "HI3516CV300+SC2235P" 22 | - 23 | hostname: ivg-85hf20pya-s.dlab 24 | connection: telnet 25 | output: 26 | - "Chip: HiSilicon 3516ev200" 27 | - "Sensor: Sony IMX307" 28 | id: "HI3516EV200+IMX307" 29 | - 30 | hostname: ivg-85hf30ps-s.dlab 31 | connection: telnet 32 | output: 33 | - "Chip: HiSilicon 3516ev200" 34 | - "Sensor: SmartSens SC4239" 35 | id: "Hi3516EV200+SC4239" 36 | marks: ['xfail'] 37 | - 38 | hostname: ipg-53h20py-s.dlab 39 | connection: ssh 40 | output: 41 | - "Chip: HiSilicon 3516cv200" 42 | - "Sensor: Sony IMX323" 43 | id: "Hi3516CV200+IMX323" 44 | -------------------------------------------------------------------------------- /tasmota.py: -------------------------------------------------------------------------------- 1 | from contextlib import contextmanager 2 | import time 3 | import os 4 | import requests 5 | 6 | 7 | def check_ping(hostname): 8 | """Run ping and return 1 if success""" 9 | 10 | attempts = 1 11 | response = os.system("ping -c {} {} >/dev/null".format(attempts, hostname)) 12 | # and then check the response... 13 | if response == 0: 14 | # Network is active 15 | return attempts 16 | return 0 17 | 18 | 19 | def turn(host, req): 20 | """Send request to Tasmota device to turn it on/off""" 21 | 22 | response = requests.get("http://{}/cm?cmnd=Power%20{}".format(host, req)) 23 | if response.status_code != 200: 24 | raise ValueError 25 | print(response.json()) 26 | 27 | 28 | @contextmanager 29 | def updown(swname, controlip, **kwds): 30 | """Context manager for power on/off switch with `swname` and check its 31 | availability via pinging `controlip`""" 32 | 33 | warmup = kwds["warmup"] 34 | print("Turn on switch") 35 | turn(swname, "On") 36 | print("Waiting for {} seconds".format(warmup)) 37 | try: 38 | time.sleep(kwds["warmup"]) 39 | pings = 0 40 | total = 5 41 | for _ in range(total): 42 | pings += check_ping(controlip) 43 | print("{}/{} pings are successful".format(pings, total)) 44 | if pings < 3: 45 | print("Pings are lower threshold") 46 | raise ConnectionError 47 | print("Start tests") 48 | yield None 49 | finally: 50 | print("Turn off switch") 51 | turn(swname, "Off") 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /telnet.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import pexpect 4 | import sys 5 | import time 6 | import socket 7 | import subprocess 8 | import os 9 | 10 | username = "root" 11 | password = "xmhdipc" 12 | 13 | 14 | def alloc_port(): 15 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 16 | s.bind(("", 0)) 17 | addr = s.getsockname() 18 | s.close() 19 | return addr[1] 20 | 21 | 22 | class Telnet: 23 | prompt = "[#$] " 24 | 25 | def __init__(self, ipaddr, debug=False, proxy=None, proxy_type=None): 26 | if proxy and proxy_type == "ssh": 27 | port = str(alloc_port()) 28 | self.ssh_proxy = subprocess.Popen( 29 | ["ssh", "-N", "-L", "127.0.0.1:" + port + ":" + ipaddr + ":23", proxy,] 30 | ) 31 | time.sleep(5) 32 | ipaddr = "127.0.0.1 " + port 33 | else: 34 | self.ssh_proxy = None 35 | 36 | self.conn = pexpect.spawn("telnet " + ipaddr, timeout=10) 37 | self.debug = debug 38 | if debug: 39 | self.conn.logfile = sys.stdout.buffer 40 | 41 | def close(self): 42 | if self.ssh_proxy: 43 | self.ssh_proxy.terminate() 44 | self.ssh_proxy = None 45 | 46 | def login(self): 47 | self.conn.expect(":") 48 | self.conn.sendline(username) 49 | self.conn.expect(":") 50 | self.conn.sendline(password) 51 | i = self.conn.expect(["Login incorrect", Telnet.prompt]) 52 | if i == 0: 53 | if self.debug: 54 | print("Login incorrect") 55 | return False 56 | elif i == 1: 57 | if self.debug: 58 | print("Authentication Sucess") 59 | self.conn.sendline("PS1='# '") 60 | self.conn.expect(Telnet.prompt) 61 | return True 62 | 63 | def ls(self): 64 | self.conn.sendline("ls") 65 | self.conn.expect(Telnet.prompt) 66 | print(self.conn.before) 67 | 68 | def upload_uget(self): 69 | with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), "uget.sh")) as f: 70 | lines = f.readlines() 71 | for i in lines: 72 | self.conn.send(i) 73 | self.conn.expect(Telnet.prompt) 74 | 75 | def file_exists(self, filename): 76 | self.conn.sendline("test -f " + filename + "; echo $?") 77 | self.conn.expect("[01]") 78 | res = self.conn.after 79 | self.conn.expect(Telnet.prompt) 80 | return res == b"0" 81 | 82 | def run_command(self, cmdline): 83 | self.conn.sendline(cmdline) 84 | self.conn.expect(Telnet.prompt, timeout=60) 85 | s = self.conn.before.decode("utf-8") 86 | return s[s.find("\n") + 1 : -1] 87 | -------------------------------------------------------------------------------- /test_zftlab.yaml: -------------------------------------------------------------------------------- 1 | - 2 | hostname: hi3518ev200-ar0130-2.zft 3 | connection: ssh 4 | output: 5 | - "Chip: HiSilicon 3518ev200" 6 | - "Sensor: ON Semiconductor AR0130" 7 | id: "HI3518EV200+AR0130" 8 | - 9 | hostname: hi3518ev200-sc2235.zft 10 | connection: ssh 11 | output: 12 | - "Chip: HiSilicon 3518ev200" 13 | - "Sensor: SmartSens SC2235" 14 | id: "HI3518EV200+SC2235" 15 | - 16 | hostname: hi3518ev200-ar0130.zft 17 | connection: ssh 18 | output: 19 | - "Chip: HiSilicon 3518ev200" 20 | - "Sensor: ON Semiconductor AR0130" 21 | id: "HI3518EV200+AR0130_2" 22 | - 23 | hostname: hi3518ev200-jxf22.zft 24 | connection: ssh 25 | output: 26 | - "Chip: HiSilicon 3518ev200" 27 | - "Sensor: Silicon Optronics JXF22" 28 | id: "HI3518EV200+JXF22" 29 | - 30 | hostname: hi3518ev200-imx222.zft 31 | connection: ssh 32 | output: 33 | - "Chip: HiSilicon 3518ev200" 34 | - "Sensor: Sony IMX222" 35 | id: "JVT-S323H16VF, HI3518EV200+IMX222" 36 | # SPI 37 | marks: ['xfail'] 38 | - 39 | hostname: 172.17.32.51 40 | connection: telnet 41 | proxy: root@caramel.zft 42 | proxy_type: ssh 43 | output: 44 | - "Chip: HiSilicon 3516cv300" 45 | - "Sensor: Sony IMX323" 46 | id: "HI3516CV300+IMX323" 47 | - 48 | # [DEBUG]: ~~~~~~~~~~SC2235_init JJ ~~~~~~~~~ 49 | hostname: 172.17.32.52 50 | connection: telnet 51 | proxy: root@caramel.zft 52 | proxy_type: ssh 53 | output: 54 | - "Chip: HiSilicon 3516cv300" 55 | - "Sensor: Sony IMX323" 56 | id: "HI3516CV300+IMX323" 57 | marks: ['xfail'] 58 | - 59 | # OV9712_Init 60 | hostname: 172.17.32.53 61 | connection: telnet 62 | proxy: root@caramel.zft 63 | proxy_type: ssh 64 | output: 65 | - "Chip: HiSilicon 3518ev100" 66 | - "Sensor: OmniVision 9712" 67 | id: "HI3518EV100+OV9712" 68 | marks: ['xfail'] 69 | - 70 | # DEBUG: SC307E! 71 | # DEBUG: sensor_get_chip: 72 | # 0x30 0x2 0x1 0x45 73 | hostname: 172.17.32.133 74 | connection: telnet 75 | proxy: root@caramel.zft 76 | proxy_type: ssh 77 | output: 78 | - "Chip: Xiongmai XM530" 79 | - "Sensor: SmartSens SC2315E" 80 | id: "IVG-85X20PS-S, XM530+SC307E" 81 | # need Sofia to check ID detection procedure 82 | marks: ['xfail'] 83 | - 84 | hostname: RS-H726-A0.zft 85 | connection: ssh 86 | output: 87 | - "Chip: HiSilicon 3518ev200" 88 | - "Sensor: Silicon Optronics JXF23" 89 | id: "RS-H726-A0, Hi3516EV200+JXF23" 90 | - 91 | hostname: 172.17.32.135 92 | connection: telnet 93 | proxy: root@caramel.zft 94 | proxy_type: ssh 95 | output: 96 | - "Chip: HiSilicon 3518ev200" 97 | - "Sensor: SmartSens SC2135" 98 | id: "IPG-50HV20PES-S, Hi3516EV200+SC2135" 99 | - 100 | hostname: 172.17.32.132 101 | connection: telnet 102 | proxy: root@caramel.zft 103 | proxy_type: ssh 104 | output: 105 | - "Chip: HiSilicon 3518ev200" 106 | - "Sensor: SmartSens SC2045" 107 | id: "50HV20PSA-S, Hi3516EV200+SC2045" 108 | -------------------------------------------------------------------------------- /ipctool_test.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import pytest 4 | from subprocess import Popen, PIPE 5 | import os 6 | import yaml 7 | from telnet import Telnet 8 | import tasmota 9 | 10 | 11 | def pytest_generate_tests(metafunc): 12 | def generate_id(input_data, level): 13 | level += 1 14 | 15 | # Choose how it will look 16 | INDENTS = { 17 | # level: (levelmark, addition_indent) 18 | 1: ("_", ["", ""]), 19 | 2: ("-", ["[", "]"]), 20 | } 21 | COMMON_INDENT = ("-", ["[", "]"]) 22 | 23 | levelmark, additional_indent = INDENTS.get(level, COMMON_INDENT) 24 | 25 | # If deeper than 2 level, let's take data type as id 26 | if level > 3: 27 | return ( 28 | additional_indent[0] + type(input_data).__name__ + additional_indent[1] 29 | ) 30 | 31 | # Return trivial data types 32 | elif isinstance(input_data, (str, bool, float, int)): 33 | return str(input_data) 34 | 35 | # Parse collection types 36 | elif isinstance(input_data, (list, set, tuple)): 37 | # Traverse list to check data inside 38 | list_repr = levelmark.join( 39 | [generate_id(input_value, level=level) for input_value in input_data] 40 | ) 41 | return additional_indent[0] + list_repr + additional_indent[1] 42 | 43 | # Convert dictionary keys to string 44 | elif isinstance(input_data, dict): 45 | return "{" + levelmark.join(input_data.keys()) + "}" 46 | 47 | # Or do nothing 48 | else: 49 | return None 50 | 51 | if "test_case" not in metafunc.fixturenames: 52 | return 53 | 54 | dir_path = os.path.dirname(os.path.abspath(metafunc.module.__file__)) 55 | 56 | file_path = os.path.join(dir_path, metafunc.function.__name__ + ".yaml") 57 | with open(file_path) as f: 58 | raw_test_cases = yaml.full_load(f) 59 | 60 | if not raw_test_cases: 61 | raise ValueError("Test cases not loaded") 62 | 63 | test_cases = [] 64 | 65 | # Traverse raw data 66 | for case_id, test_case in enumerate(raw_test_cases): 67 | # Search list of markers 68 | marks = [getattr(pytest.mark, name) for name in test_case.get("marks", [])] 69 | 70 | # Get specied id or generate it 71 | case_id = test_case.get("id", generate_id(test_case["hostname"], level=0)) 72 | 73 | # Add test to ready cases 74 | test_cases.append(pytest.param(test_case, marks=marks, id=case_id,)) 75 | 76 | return metafunc.parametrize("test_case", test_cases) 77 | 78 | 79 | def do_test(test_case): 80 | host = test_case["hostname"] 81 | expected = test_case["output"] 82 | connection = test_case.get("connection", "ssh") 83 | 84 | hash = os.environ["SHA"] 85 | binary = "ipctool-{}".format(hash) 86 | durl = "openipc.s3-eu-west-1.amazonaws.com/{}".format(binary) 87 | 88 | if connection == "telnet": 89 | UGET = "/tmp/uget" 90 | proxy = test_case.get("proxy") 91 | proxy_type = test_case.get("proxy_type", None) 92 | t = Telnet(host, debug=False, proxy_type=proxy_type, proxy=proxy) 93 | t.login() 94 | if not t.file_exists(UGET): 95 | t.upload_uget() 96 | output = t.run_command(UGET + " run " + durl).splitlines() 97 | t.close() 98 | assert output == expected 99 | 100 | elif connection == "ssh": 101 | run_cmd = "cd /tmp; rm -f {0}; wget -q http://{1}; chmod +x {0}; ./{0}; rm {0}".format( 102 | binary, durl 103 | ) 104 | with Popen(["ssh", "root@{}".format(host), run_cmd], stdout=PIPE) as proc: 105 | output = [i.decode("utf-8") for i in proc.stdout.read().splitlines()] 106 | assert output == expected 107 | 108 | 109 | def test_zftlab(test_case): 110 | do_test(**locals()) 111 | 112 | 113 | def test_dlab(test_case): 114 | do_test(**locals()) 115 | 116 | 117 | @pytest.fixture(scope='session') 118 | def tasmota_50803B(): 119 | print() 120 | with tasmota.updown("tasmota_50803B.dlab", "10.216.128.5", warmup=250) as resource: 121 | yield 122 | print() 123 | 124 | 125 | def test_sw(test_case, tasmota_50803B): 126 | do_test(test_case) 127 | -------------------------------------------------------------------------------- /uget.sh: -------------------------------------------------------------------------------- 1 | cd /tmp;F=uget;true>$F;chmod +x $F 2 | printf "\x7F\x45\x4C\x46\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00\x01\x00\x00\x00\x44\x09\x01\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x05\x34\x00\x20\x00\x03\x00\x28\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x8C\x13\x00\x00\x8C\x13\x00\x00\x05\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x54\x21\x00\x00\x06\x00\x00\x00\x00\x00\x01\x00\x51\xE5\x74\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x10\x00\x00\x00\x72\x76\x1C\xF9\x55\x50\x58\x21\x54\x0A\x0D\x17\x00\x00\x00\x00\x1C\x25\x00\x00\x1C\x25\x00\x00\xF4\x00\x00\x00\x85\x00\x00\x00\x03\x00\x00\x00\xF9\x7F\x45\x4C\x46\x01\x64\x00\x3F\x02\x00\x28\x00\x7E\x0D\x88\x08\xDB\x05\x34\x07\xB6\xFC\x21\x14\x36\x05\x0B\xF7\x20\x00\x06\x1B\x77\x14\x00\x13\x07\x58\x00\x1B\xEF\x34\x00\x23\x6F\x03\xC0\x00\x00\x23\x05\x34\x04\xD3\x03\x48\xF4\xC8\x01\xF2\x14\x00\x00\x2F\x1B">$F 3 | printf "\xB0\x01\x03\x59\x00\xB3\x0D\xEC\xFC\x1E\x00\x03\x6C\x05\x13\x16\x1F\x37\x20\x03\xC8\x02\xDD\x38\x10\x54\x75\x03\x06\x82\x1F\xEE\x15\x00\x0C\x20\xF9\x03\x02\x1E\xB8\x00\x00\x46\x06\xC1\x63\xFB\x51\xE5\x74\x64\x00\x00\x00\x5F\x1F\x10\x70\x03\x00\x00\x00\x00\x00\x24\xFF\x08\x1E\x00\x00\x6F\x07\x00\x00\x03\x50\x00\x00\xF6\x2F\x6C\x69\x62\x03\xFB\x64\x2D\x75\x43\x08\xBF\x63\x2E\x73\x6F\x2E\x30\xED\x00\x11\x00\x00\xBA\x23\x03\x14\x69\x06\xA6\x18\x9A\x21\x1F\x69\x03\xA6\x22\x9A\x17\x0B\x69\x20\xA6\x10\x99\x1D\xF7\x00\x1B\x03\x4D\x05\x1A\x36\x1E\x00\xC0\x00\xAE\x09\xE9\x03\x0A\xA6\x01\xB0\x02\x13\x6E\x0D\x03\x9A\x0F\x0C\x69\x08\xAC\x0E\x2F\x06\x11\xC1\x07\xBA\x16\x03\x15\xC1\x0B\xBA\x07\x03\x12\x6B\x04\x0F\x06\x19\xC1\x07\xBA\x13\x03\x1C\xC0\x73\x1B\xDE\x03\xB6\x54\x21\x6D\x1B\x51\x6E\xCF\x05\xB0\x38\x0F\x1B\xDD\x1F\x21\x92\xC3\x19\xE9\x21\x90\xBC\x90\xB6\x15\xF1\x1F\x43\x53\x60\x7B\x2F\xA7\xB2\x65\x0F\x19\x3E\x21\x92\x7E\x19\xA1\x21\x92\x6D\x19\x58\x21\x92\xB6\x19\x38\x21\x90\xF6\x10\xF6\xC7">>$F 4 | printf "\x79\x1F\x43\xC8\x76\x03\x88\x08\x16\x91\x50\xC4\x0F\x2D\x81\xAF\x90\x1F\xD9\x93\x0F\x0C\x26\x90\xC9\x72\x0C\x4B\x90\xC9\xA8\x0C\x85\x90\xC9\x31\x0C\x9A\x90\xC9\x12\x0C\x1A\x90\xC9\x0B\x0E\x0E\x01\xC2\xEF\xEC\x2B\x1F\x86\x45\xC8\x0F\x69\x00\x12\x2F\x73\x74\xFE\x72\x6C\x65\x39\x01\x6D\x6B\xDF\x08\x65\x6D\x70\x00\xFF\x67\x65\x74\x61\x64\x64\x72\x69\xF6\x6E\x66\x6F\x00\x02\xFF\x72\x6B\x00\x63\x6C\x6F\x73\x0B\xCE\x6D\x6B\x1B\x05\x7B\x74\x00\x77\x18\x5A\x25\xDF\x17\x63\x68\x6D\x6F\x85\x64\x04\xDC\x61\x69\x19\xEE\x3F\x6E\x63\x61\xDF\x1A\x72\x65\x63\x76\x6B\x19\x05\x6C\x65\x3E\x9F\x63\x6F\x6E\x6E\x6B\x14\x19\x5B\x24\x6E\x6E\x2C\x73\x73\xD6\x24\x14\xB6\x40\x61\x57\x4C\xE1\x63\x70\x92\x74\x5F\x5F\x9E\x9A\x5F\x6D\xDF\x14\x6E\x00\x75\x6E\x6E\x0B\x6E\x6B\xFB\x4E\x63\x86\x9B\x9A\x63\xBB\x6B\x6F\x65\x78\x6E\x40\x6C\x70\xF7\x14\x02\x76\x00\x61\x62\x90\xB7\x13\x5F\x65\xB6\x64\x6E\x61\xEB\x3D\x62\x53\x6D\x5F\x16\xEC\x61\x72\x74\x0B\x0D\xAC\x0A\x0D\x17\x74\x31\x0B\x60\x07\xBD\x83\xBB\x07\x64\x65\xA0\x77">>$F 5 | printf "\x67\x69\xE9\x6D\x72\x5F\xAA\xB6\x61\x87\x5F\xC5\xA8\xAC\x17\x15\x03\xC6\xD0\x20\xDF\xD3\x16\x9C\x5F\xD4\x07\x09\x2C\xD8\xF2\x0A\xCF\xDC\x0B\x2C\xE0\xF2\x0C\xCF\xE4\x0D\x2C\xE8\xF2\x0E\xCF\xEC\x0F\x2C\xF0\xF2\x10\xCF\xF4\x11\x2C\xF8\xF2\x12\xCE\xFC\xBD\x80\x35\x3F\x16\x35\xE0\x04\xE9\x07\xEC\xAF\x08\x07\x5D\x7C\x0C\x7A\x07\xEB\x98\x10\x07\xD3\xE8\x5E\x14\x07\x3A\x00\x18\xF5\x07\xD7\x84\x1C\x07\xA6\xF4\xBE\x20\x07\x1D\x59\x24\xE5\x1E\x9E\x28\x1F\x59\x2C\xE5\x20\x9E\x30\x21\x59\x34\xD7\xD8\x7F\x0D\xC0\xA0\xE1\xF0\xDF\x2D\xFF\xE9\x04\xB0\x4C\xE2\xF0\xAF\x1B\x6F\x07\xE0\x2D\xE5\x6F\x03\x9F\xE5\x0E\xFF\xE0\x8F\xE0\x08\xF0\xBE\xE5\xA0\x8E\x1A\x44\xFF\xC6\x8F\xE2\x11\xCA\x8C\xE2\xA0\xEC\xFA\xBC\xE5\x0B\x39\x98\x01\x90\x90\x19\x88\x01\x90\x80\x19\x78\x01\x90\x70\x19\x68\x01\x90\x60\x19\x58\x01\x90\x50\x19\x48\x01\x90\x40\x19\x38\x01\x90\x30\x19\x28\x01\x90\x20\x19\x18\x01\x90\x10\x19\x08\x01\x90\x00\x1C\xF8\xF9\x97\xF0\x20\x32\xE8\x03\xE0\x20\x33\xD8\x61\xF0\x40\x57\x57\x4D\x7C\xE3\x1C\xD0\x4D">>$F 6 | printf "\xE2\x76\x1A\xDA\x03\xEC\x0B\x01\x50\x2F\x6F\x00\x40\xA0\xED\x13\x01\x30\x03\x1D\x46\x1A\xED\x04\x10\x91\x27\x85\x00\x6F\xB7\x84\x28\xEB\x00\x7B\x1F\x1B\x72\x03\x02\xC3\x03\x75\x6D\x0A\x06\x0B\xDB\xE3\x2E\x07\xEA\xFB\x03\x71\x95\xE7\x07\x13\x7B\xE1\x03\x10\x03\x7D\x01\x20\xD3\xE4\xBD\x12\x52\xE3\x02\xBB\x47\x01\x04\x23\xAE\x2F\x0B\xE3\xF8\xFF\xFF\x09\x5A\x1F\xEB\x5B\x81\xB3\x7E\x30\xC1\xE5\x10\x20\xDD\x0B\xA0\x10\xAD\x53\x5F\xEC\x8D\xE2\x54\x57\x6D\x54\x1B\xB9\x60\x57\xCF\x2F\x13\x9D\x87\xBB\x0F\xE1\x05\x27\x77\xE1\x07\x53\x03\xF3\x5B\x03\x45\xBB\x02\x13\x50\x50\xD6\xE2\x15\x56\x2D\x2F\x1D\xA2\x0A\xDA\x05\x1D\x47\xFB\x1B\x51\x2F\x9F\x07\x93\x35\x72\xF6\x3B\x20\x27\xDD\x05\x1F\x04\x75\x4B\x69\xDD\x0F\x05\x50\xDD\x8D\x6B\x6F\xD7\x0B\x07\xAF\x6D\x08\x10\x0B\xBA\x01\x2F\x7B\xEB\x0F\x04\x07\x9A\xFF\xDF\x0F\xF0\x80\xBD\xE8\x7D\x57\xF4\xD6\xAB\x05\xD7\xDD\xE1\xB3\xEA\xDB\xE3\x1E\x20\xE7\x76\x03\x00\xB0\xD4\x67\xAD\x38\x03\x0B\x0B\x9D\xDD\xE4\x0D\x93\x04\x8E\x20\x83\xB7\x00\x03\x10\xC0\x6E\xC3">>$F 7 | printf "\x04\xC0\xDC\x07\x0C\x00\xBB\x0C\x30\x03\x6E\x8F\x33\xBA\x60\x53\xB0\xBB\xD8\x60\x07\x6E\x03\x04\x06\x5B\x1C\x17\xAE\x1C\x1F\x6E\xF7\x43\xE0\xDB\xA3\x53\x52\x7D\xFF\x2F\x91\x10\xD6\x13\x00\x0B\x7B\x01\x13\x03\x7C\xE1\x3B\x21\x02\x19\xA7\x30\x24\xD7\x17\x24\x2F\xFD\x10\x41\xE0\x41\x11\xBF\x6B\xA1\x1F\x81\xE0\xC1\xEF\x10\xB0\xE1\x2B\x64\x37\x72\x38\x03\x10\x0D\xCB\x2C\xBE\x40\x67\xD4\xC6\x23\x10\xDD\xCF\x18\xF2\xD6\x8B\x1C\x33\x08\x7B\xAF\x14\x57\xAE\x66\x13\x0C\xDB\xDE\xCF\x30\xC4\xE5\xEB\x23\xE8\x3F\x0E\xF8\xEB\xE7\x40\x2B\x9E\x47\xF9\x2F\x02\xAE\x34\x8B\xBA\x34\x33\x90\x6B\x30\xC3\x1B\x90\x4B\x0E\x1A\xD6\x27\x3B\xDC\xD3\xEF\xC3\x5F\xB7\xFA\x0B\x0A\x33\x70\x93\x77\x37\x4F\xDC\x3C\x57\xFD\x53\x08\x20\x9A\x5F\x7C\xB7\x02\xDA\x6C\x67\x14\x76\x6B\x01\x3A\x15\x6F\xB1\xCB\x83\xD3\x0B\x8D\x34\x0B\x2B\x3B\x03\x6E\x18\x6B\xBC\x75\x9B\x72\x63\xE8\xA5\xD3\x5D\x53\x9D\xC5\xB3\x2F\x8D\x37\x03\x04\xF0\x0B\x77\xC0\x76\x4B\xF0\x4F\x38\xAF\x76\x17\x01\x90\x39\x4B\xD3\x4B\x34\x6D\x30\x40\x1F\x6B\xFC\xCF">>$F 8 | printf "\xAD\xA0\x17\xDB\x02\x70\x03\x10\x0D\xE7\x20\x1D\x5F\x81\x77\x4B\x24\x30\x44\xBF\xE2\x5F\xF8\x11\x68\x5B\xFF\x1F\x18\x90\x04\xE5\x9E\x8A\x30\x56\x66\xEF\xE0\x03\x7F\xFC\x24\xB0\x14\x05\x05\x80\x6D\xAB\x0F\xD7\xEF\x03\x57\x47\x63\x1F\x0D\x23\xEF\x9B\xE9\x57\x27\x95\x50\xD6\x0F\xBA\x43\xFB\x9B\xE5\x14\x10\x03\x69\x4E\x03\x05\x0D\x83\xAA\x8C\x05\x6F\x1A\x08\x6B\x2F\x04\x37\xB6\x1C\xB0\x1F\xB7\x16\x5B\xE3\x8E\xEF\x3F\x0B\xBF\x14\xD8\xE5\x5D\x2B\xF7\x55\xE3\x4F\x3F\x5D\x06\x8F\x78\x70\x83\xF1\x6B\xF8\xEF\x70\x21\x71\xDF\xFB\xBB\x84\xE2\xA7\xDB\x22\x57\x7D\x53\x0A\xF7\x1F\x8D\x0F\x7F\xFF\x2E\x60\xE2\x0F\x20\x82\x8F\xE2\xFB\x7C\x13\x78\x60\xA7\xBF\x1B\x38\x71\x6D\x3B\x38\xC3\x4B\xE3\x76\x47\xE0\x1B\x47\x06\x73\x2F\x17\x00\xEC\x0C\x2F\x21\x4E\x93\x9E\x67\x00\x3D\xD3\xCF\x3B\xD3\xB1\x5A\x8F\xB5\x56\x0B\xB0\xD3\x13\x34\x8E\x1A\x33\x6F\x23\x61\x80\x6F\xAD\x7A\x03\xD3\xC4\xB0\xB3\x26\xE7\xB0\x07\x2F\x19\x4B\xE9\x90\x97\x1B\x0A\x37\xB7\xE3\x21\x07\x58\x0B\xB7\x37\x6C\x1B\xCA\x10\xD0\x2B\xBD\x67\xF0">>$F 9 | printf "\xFF\xFF\x8D\xDF\x34\x37\xC7\xC8\x20\x40\x0D\x57\x52\x62\x7B\x99\x53\x30\x3F\xB6\x4A\x64\x1A\x0F\xD9\xEB\x1B\x0A\x07\xA8\x91\xD8\x7D\xE0\x78\xAF\x61\x51\xA1\xBE\x0F\x90\x89\xE0\x09\xE0\x0B\xB3\xEF\x8D\x26\xA7\x8D\x8F\x77\x86\x02\x6F\x8E\xA2\x67\x6D\x3B\x81\xB4\x5B\x20\xAD\x27\x0F\xB5\x49\x23\xD7\x93\x0A\x27\x56\x63\x3B\x2D\x53\xB1\xD4\x1F\x49\xC7\xC7\xC9\x3B\x53\xC0\x93\x43\xFA\xE4\x5D\xFF\x03\xCC\x75\x0F\xDE\x3E\xD7\x00\x51\x35\x27\xDE\xAF\x01\xC0\x20\xE0\xDD\xA7\x61\x42\x6C\xBB\x51\x0A\xFB\xFA\xC7\x30\x56\x6F\x03\xDA\x60\x0F\x37\xD7\xE1\x6F\x73\x9B\x96\x7B\x11\xE1\x71\x17\xBF\x13\x2F\x6F\xE1\x11\x0F\x6D\x03\x02\xBF\xBF\xE0\x1F\x20\x72\xE2\x85\x82\xA3\x5C\x86\xDE\x8B\x02\xF1\x8F\xFE\x07\xE1\x81\x0F\xD7\x2F\x07\x7E\xE0\x81\x3F\x43\x20\x01\xC1\x0B\x9B\x01\x81\x0E\x60\x17\xCD\x3E\x0E\x20\xCD\x3E\x0D\x20\xCD\x3D\x0D\x20\xCD\x3D\x0C\x20\xCD\x3C\x0C\x20\xCD\x3C\x0B\x20\xCD\x3B\x0B\x20\xCD\x3B\x0A\x20\xCD\x3A\x0A\x20\xCD\x3A\x09\x20\xCD\x39\x09\x20\xCD\x39\x08\x20\xCD\x38\x08\x20\xCD\x38\x07">>$F 10 | printf "\x20\xCD\x37\x07\x20\xCD\x37\x06\x20\xCD\x36\x06\x20\xCD\x36\x05\x20\xCD\x35\x05\x20\xCD\x35\x04\x20\xCD\x34\x04\x20\xCD\x34\x03\x20\xCD\x33\x03\x20\xCD\x33\x02\x20\xCD\x32\x02\x20\xCD\x32\x01\x20\xCD\x31\x01\x20\xCD\x31\x00\x20\xCD\x30\x00\x20\xB9\x0B\xB5\x07\x5C\xC1\x3B\xB7\x40\xCE\x1F\x13\xD9\x3C\xE1\x0B\x7E\xA0\x33\xCC\x0F\x95\xE3\xBB\x2B\x80\x03\x0F\xE1\x11\xC7\x82\xBF\xEF\x62\xE2\x2F\xEC\x33\x02\xA0\x27\x05\x2F\xDB\x02\x01\xE0\xB7\xC3\x03\xA0\xB3\x07\x27\x8F\x1F\x8E\xF9\xB7\x81\x03\x13\xA3\xDB\x9B\xAB\x06\xF3\xBA\x92\x00\x03\xD0\x38\x33\x9B\x2F\xEE\x02\x17\x86\x08\xFF\x8E\x96\x73\x81\x02\x4B\x85\x91\xAB\xFE\x47\x45\x54\x20\x2F\x00\xCA\x00\xAA\xA3\x25\x55\x15\xFD\x25\x73\x20\x25\x64\xBF\x02\x73\x00\x38\x30\x00\xFF\x20\x48\x54\x54\x50\x2F\x31\x2E\xFF\x30\x0D\x0A\x48\x6F\x73\x74\x3A\xDA\x20\x00\x08\xDF\x01\x00\x72\x75\x6E\xFE\x00\x2F\x74\x6D\x70\x2F\x75\xA3\xC2\x6C\x58\x00\x59\x3B\x80\x00\x00\x00\x00\x02\x40\xFF\x38\x01\x00\x00\x71\x00\x00\x00\x03\x00\x00\x00\xFB\x70\x09\x01\x00\x2C">>$F 11 | printf "\x03\x9F\x00\x01\x60\x03\xCD\x0C\x04\xB6\x06\x09\x0D\xEC\x07\xB0\x0E\xB7\x19\x1C\xFB\x20\x02\x00\x1B\x17\xDD\x03\x1A\x7B\x07\x0F\xA4\x1C\x17\x03\xED\x08\x01\x27\xBB\x05\x07\x10\x04\x2C\x06\xD7\xE0\x0F\x5D\x0A\x07\x24\x75\x50\x0B\xEE\x17\x03\xD9\x15\x00\x00\xDD\x03\x03\xC4\x75\x3F\x02\xD7\x07\xD0\x03\x4D\x14\x11\x34\x17\xDE\x34\x05\x01\x00\xC2\x00\x8F\x0C\x20\xC8\x02\x00\x7D\x14\x06\x01\x90\x03\x12\x00\x00\x00\x00\x00\x09\xFF\x00\x00\x00\xAC\x00\x00\x00\x3C\x09\x00\x00\x22\x00\x00\x00\x18\xD0\x4D\xE2\xA5\x00\x00\xEB\x00\x10\x81\xE0\x3E\x40\x2D\xE9\x00\x50\xE0\xE3\x02\x41\xA0\xE3\x1D\x00\x00\xEA\x1A\x00\xBD\xE8\x01\x00\x40\xE0\x03\x20\x42\xE0\x00\x20\x84\xE5\x00\x40\xA0\xE1\x03\x00\xA0\xE1\x02\x10\x83\xE0\x00\x20\xA0\xE3\x07\xC0\xA0\xE1\x02\x70\xA0\xE3\x0F\x78\x87\xE3\x00\x00\x00\xEF\x0C\x70\xA0\xE1\x04\x00\xA0\xE1\x30\x80\xBD\xE8\x04\x40\x94\xE0\x0E\xF0\xA0\x11\x01\x40\xD0\xE4\x04\x40\xA4\xE0\x04\x4C\xB0\xE1\x0E\xF0\xA0\xE1\x01\x10\xA0\xE3\x0E\xC0\xA0\xE1\xF6\xFF\xFF\xEB\x01\x10\xB1\xE0">>$F 12 | printf "\xF4\xFF\xFF\xEB\xFB\xFF\xFF\x3A\x0C\xF0\xA0\xE1\x01\x30\xD0\xE4\x01\x30\xC2\xE4\xEF\xFF\xFF\xEB\xFB\xFF\xFF\x2A\xF3\xFF\xFF\xEB\x03\x30\x51\xE2\x00\x10\xA0\xE3\x03\x00\x00\x3A\x01\x50\xD0\xE4\x03\x54\x85\xE1\x05\x50\xF0\xE1\xD7\xFF\xFF\x0A\xE5\xFF\xFF\xEB\x01\x10\xB1\xE0\xE3\xFF\xFF\xEB\x01\x10\xB1\xE0\x01\x00\x00\x1A\xE6\xFF\xFF\xEB\x02\x10\x81\xE2\x0D\x0C\x75\xE3\x01\x10\x81\x32\x05\x30\xD2\xE7\x01\x10\x51\xE2\x01\x30\xC2\xE4\xFB\xFF\xFF\x2A\xE7\xFF\xFF\xEA\x0A\x00\x24\x49\x6E\x66\x6F\x3A\x20\x54\x68\x69\x73\x20\x66\x69\x6C\x65\x20\x69\x73\x20\x70\x61\x63\x6B\x65\x64\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x55\x50\x58\x20\x65\x78\x65\x63\x75\x74\x61\x62\x6C\x65\x20\x70\x61\x63\x6B\x65\x72\x20\x68\x74\x74\x70\x3A\x2F\x2F\x75\x70\x78\x2E\x73\x66\x2E\x6E\x65\x74\x20\x24\x0A\x00\x24\x49\x64\x3A\x20\x55\x50\x58\x20\x33\x2E\x39\x36\x20\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x31\x39\x39\x36\x2D\x32\x30\x32\x30\x20\x74\x68\x65\x20\x55\x50\x58\x20\x54\x65\x61\x6D\x2E\x20\x41">>$F 13 | printf "\x6C\x6C\x20\x52\x69\x67\x68\x74\x73\x20\x52\x65\x73\x65\x72\x76\x65\x64\x2E\x20\x24\x0A\x00\x00\x00\x00\x14\x30\x8D\xE5\x00\xA0\xA0\xE3\x06\xA0\x4A\xE0\x04\x60\x8E\xE2\x0A\xE0\x86\xE0\x00\x10\x96\xE5\x00\x50\xA0\xE3\x00\x40\xE0\xE3\x03\x20\xA0\xE3\x0E\x10\x81\xE0\x00\x00\xA0\xE3\x0C\x10\x8D\xE5\xC0\x70\xA0\xE3\x00\x00\x00\xEF\x08\x00\x8D\xE5\x04\x10\x96\xE5\x04\x40\x9D\xE5\x12\x30\xA0\xE3\x0E\x10\x81\xE0\xC0\x70\xA0\xE3\x00\x00\x00\xEF\x0A\xA0\x80\xE0\x00\x30\x96\xE5\x04\x30\x2D\xE5\x0D\x30\xA0\xE1\x08\x00\xD6\xE5\x04\x00\x2D\xE5\x0A\x20\x86\xE0\x04\x10\x96\xE5\x0C\x00\x86\xE2\x02\x40\xA0\xE1\x0F\xE0\xA0\xE1\x18\xF0\x9D\xE5\x04\xD0\x8D\xE2\x04\x30\x9D\xE4\x14\x10\x9D\xE5\x00\x10\x84\xE5\x10\x00\x9D\xE5\x06\x10\x83\xE0\x0A\x00\x80\xE0\x0A\x10\x81\xE0\x10\x00\x8D\xE5\x20\x06\xA0\xE1\x05\x20\xA0\xE3\x00\x06\xA0\xE1\x00\x10\x41\xE0\x7D\x70\xA0\xE3\x00\x00\x00\xEF\x04\x10\x16\xE5\x08\x00\x9D\xE5\x01\x40\x49\xE0\x01\x50\x80\xE0\x04\x60\x86\xE2\x00\xE0\x8F\xE2\x0A\xF0\x86\xE0\x2F\x70\x72\x6F">>$F 14 | printf "\x63\x2F\x73\x65\x6C\x66\x2F\x65\x78\x65\x00\x00\x0E\x20\xA0\xE3\x1C\x10\x4F\xE2\x02\x00\xA0\xE3\x04\x70\xA0\xE3\x00\x00\x00\xEF\x7F\x00\xA0\xE3\x01\x70\xA0\xE3\x00\x00\x00\xEF\x10\x00\x1E\xE5\x10\x60\x4E\xE2\x10\xE0\x8D\xE5\x00\x60\x46\xE0\x00\x60\x8D\xE5\x00\x90\xA0\xE1\x50\x00\x4F\xE2\x00\x10\xA0\xE3\x05\x70\xA0\xE3\x00\x00\x00\xEF\x00\x00\x50\xE3\xEB\xFF\xFF\xBA\x04\x00\x8D\xE5\x0C\x30\x1E\xE5\xAD\xFF\xFF\xEB\xAC\x00\x00\x00\xE0\x0A\x00\x00\x5C\x07\x00\x00\x03\x50\x00\x00\xCB\x22\x00\xC0\xFF\x1F\xBD\xE8\x0D\x10\xA0\xE1\x01\xFB\xDA\x4D\xE2\x0D\x00\x07\x7F\xF0\x1F\x2D\xE9\x04\x30\xDB\x91\xE4\x19\x53\xB7\xE3\x07\x80\xE4\xFD\xFB\xFF\xFF\x1A\x00\x40\xAF\x17\x0B\x64\x17\x79\x01\x50\x7D\x0C\x00\xB1\xE8\xBB\x13\x52\xE3\x07\x76\xA0\xE8\x13\x32\x60\xEE\x00\x90\x4F\xF7\x2A\xA0\xE3\x00\x57\x5D\x0E\x53\x01\xF6\x20\x42\xE2\x8B\x24\xFE\xEB\x01\x0A\x70\xE3\x0E\xD9\x13\x21\xBF\x23\x00\x20\x81\xE0\x06\x76\x1B\x00\x30\xDF\x27\x01\x30\x60\xE5\x6C\x03\x72\xCD\x07\xF7\x02\x00\x51\xE1\x47\xD8\x3D\x17\x36">>$F 15 | printf "\x20\x1F\x4B\x03\x36\x46\xDB\x84\x13\x01\x73\x37\x03\xFB\x30\x26\xE0\x8B\x76\x03\xE2\x03\xF6\x23\xE2\x03\xA4\xB6\x4F\x30\xDF\x03\x05\x30\x83\xE0\xBB\x09\x77\x18\x50\xFF\x9D\xE5\x18\x00\x8D\xE5\x04\x20\xEE\x31\xE5\x0D\x53\x6E\x07\x20\xE5\xC6\xCB\xD0\xDD\x1B\x10\x0C\xBB\xF3\x0A\xDC\xEF\x7B\x04\x90\x9A\x1B\x6E\x80\x47\xB7\x70\x07\x9C\x60\xFF\x8F\xE2\x0C\x90\x89\xE2\xF8\x0F\x6E\xFF\x0F\x00\xDB\x1F\x22\x88\x7E\xEB\x14\xD0\x8D\xE2\xD6\x27\x03\xDF\x10\x47\x40\xB5\x9D\xFB\xBD\xEF\xE3\x30\x00\xB7\x1F\x02\x93\xDD\x20\x03\x1A\x73\xE3\xC3\x77\xE3\x6A\xDB\x5D\x03\x33\x3E\x76\x07\x07\x40\x57\xD3\x86\x33\xBF\xE3\x2F\x00\x60\x74\x03\x80\xD3\x90\x4D\xA0\xB0\x75\x37\xC7\xBD\x7B\x20\x70\x1D\xB6\x4F\x70\x57\xB6\x03\x9D\xEE\x9F\x5C\xE1\xFA\xDE\x9B\x3A\x01\xD7\xD0\x6B\xAD\x90\x1F\xDB\x5B\x70\x03\x04\xFF\xF0\x12\xE5\x2F\x70\x72\x6F\x63\xFF\x2F\x73\x65\x6C\x66\x2F\x65\x78\xB6\x65\x5C\xFF\xE8\xEB\x50\x6F\x7F\x0E\xF0\xA0\x11\xED\x21\x11\xB0\xB7\x6D\x60\x13\xDF\x0B\x01\x01\x10\x41\xE2\xFF\x01\x21\x90\xE7\x0F\x34">>$F 16 | printf "\x02\xE2\xC3\x0B\x04\x9F\x37\x18\x1A\xFF\x70\x0B\x6F\x77\xE0\xFF\x24\xC2\xF0\xE3\x03\x20\x82\xBD\x83\x21\x80\xE7\xBC\x16\x51\xE3\xF3\x33\x03\x33\x82\xE7\xF7\x01\xF0\xE7\x07\xDA\x07\x6F\xDB\x1B\x70\xC7\xFD\x00\xEF\x0C\x70\x9C\x0F\x03\x80\xB0\x23\xEC\x04\x13\x01\x90\x05\x06\x06\x40\x19\x0A\x00\x64\x14\x01\x90\x2D\x06\x55\x40\x19\x5B\x00\x64\x7D\x86\x00\x19\x9F\xF3\x17\x02\x76\x0F\x78\x87\x1B\x12\x34\x26\x2C\xC3\x10\x74\x1F\x0C\x2F\xD3\xE5\x25\x56\x67\x3F\xC0\x20\x23\xDE\x42\xC3\xFB\x68\x00\x1F\xE5\x2B\x0F\x30\x43\x68\x0B\x71\xCB\xB6\x67\x83\x57\x8D\x62\xC2\xE3\xF2\x43\xE1\xEA\x00\x37\xC2\x77\xDD\xE0\x67\xE1\xFF\x80\x01\x90\xE0\x81\x11\xA1\xE0\xEC\xA2\x1E\x81\x0F\x72\x00\x02\xE5\x01\x12\x90\x22\xE6\x04\x9A\x14\x1C\x41\x9A\x08\x18\x69\x18\x7F\x8C\x0F\x50\xE0\xAC\x10\xD2\xC1\xE0\x3F\xB5\x13\xBB\x7E\xA1\xE2\xBB\x16\x6C\xFC\xE3\x1E\xFF\x2F\x01\x6C\x47\x90\x68\xF3\x5C\xEF\xE1\x08\x6C\x40\x12\x78\xBB\xDD\xC3\x80\xE5\xCE\x17\x1F\xB3\x9F\x07\xB5\xF0\x14\xFD\x23\x04\xE0\x2D\x33\x37\x27\x6E\x04\x0B">>$F 17 | printf "\xC3\x02\xE0\xBF\x37\x9B\x21\x02\x6C\x67\x21\x6F\x93\x00\x2A\x7F\x1D\x9F\x85\x6A\x26\x5D\x7B\x30\x5C\x36\x3F\x41\xE5\x9D\x8B\xB1\x53\x72\xBB\x83\xC0\x8C\x07\x71\x10\x81\xAC\xEF\x57\x5A\x37\xF8\x47\x0E\xDF\x27\xE0\x03\x30\x6E\x68\x87\x5B\x00\xE5\x6B\xC6\x83\x8D\xF3\xB9\xF0\xFF\xC1\xFB\xAF\x63\xD0\xB3\x70\x01\x40\x8B\x4F\x5F\x53\xE3\x5B\x42\x5B\xEA\xC6\x04\x10\xAF\xD3\x05\xC3\x43\x0C\x6B\x5C\xDC\x63\xD0\x87\xBB\x4F\x08\x10\x03\x5B\x1A\x5E\xC7\xE3\x06\x83\x6D\xF8\x30\xA7\x6A\x83\x5B\x7B\x05\x0B\x9B\x53\x95\x70\x17\xDB\x9B\x02\x0B\xAE\x36\x3B\x1F\x8B\x01\x73\x0B\x9F\xEE\x5D\x3B\xA4\x0E\xF7\xED\x8A\x27\xBB\x94\x33\x5E\xE1\x75\x97\x8A\xF7\x13\x1F\xC3\x76\x0C\xC0\xDD\x8B\xEE\x00\x95\x93\x6E\x1B\x10\x30\x9A\x8F\xE0\x9A\x37\xC0\xD8\x03\x37\x44\x0B\x2D\x2B\xED\xD7\xC3\x10\x77\x36\xFF\x9D\xC6\x6F\xE9\xEE\x0F\x0D\x20\xDD\xE8\x6F\x52\x6C\xD3\x56\x13\x2F\x3F\x00\x0A\x02\xDE\x0C\x51\x7B\xC4\x5F\x38\x53\x6A\x1B\x1A\x60\xC7\xBB\x33\x00\x94\xF7\x9B\x2B\x36\x75\x4B\x08\xCD\x3F\xB7\xD3\x95\xE8\x2F\x05\x9F">>$F 18 | printf "\xD7\x10\x63\x9F\x6E\x85\xE8\x27\xA6\xEA\xEB\xBD\xE1\xE7\xAD\xEF\x2B\xBD\xA2\xE7\x8C\x27\x94\x80\xEF\x84\xE8\x57\x7D\xDF\xB9\xCB\x7B\x37\xE3\xF0\x43\xBF\x55\x50\x58\x21\xF0\x4F\x0B\x3F\x01\x5D\x63\xB0\xFF\xC1\xD8\xE1\x1C\x10\x91\xE5\xBC\xB6\xE2\x07\x38\x19\x4B\xB6\x8B\x5C\xFF\xF5\x50\x88\xE0\xF0\x5B\x10\xAD\xAF\x66\x6F\x03\x13\x01\xE0\x85\x4E\x4F\xC6\x10\xA0\x63\x2B\x57\xC2\x57\xB5\x1B\xAD\x93\x03\x87\x0D\x2F\xDF\x30\x91\xB7\xE3\x9A\x08\x14\xE7\x0B\x6B\x86\x57\xED\x0A\x08\x20\x0B\x6A\xC7\xD6\xF3\x40\xDD\x50\xD3\xA0\xB6\x31\x57\x54\x14\xA3\x2E\xA7\x21\x20\x19\xDB\xE1\x4F\x8B\xED\xEF\x93\xF4\xAA\xFF\x4E\xC4\xB6\x07\x40\x03\xB6\x47\x64\xB7\x13\x3E\x83\xDB\xE2\x0F\x33\xE2\x6E\x07\xC3\xE3\x56\x03\xDD\x28\x63\x04\x0E\xC7\x1A\x0F\x28\x1C\xBF\x35\xCF\x40\xD5\xE7\x34\xF6\xC7\x90\x2F\xFD\x99\x03\x03\xE0\x1C\xDE\xA7\x20\x50\x85\xE2\xFB\x97\x24\x2F\x80\xF7\x5B\xAB\x97\x42\x0C\xEF\x37\x51\x97\xC0\x0A\xBD\xAB\x15\xE5\x06\x9F\x97\x1A\x18\x20\x6B\x0B\x13\x5A\x1B\x36\x87\x89\xD6\x9B\xD3\xEE\xE3\x49\x4F">>$F 19 | printf "\xB9\x9B\x2F\xEF\x23\xC7\xBA\x98\x23\x0C\xE7\x0B\xC7\xDC\x95\x3B\xD7\xEB\x47\x85\xAF\xBA\x11\x0B\x1C\xC1\x17\xB9\x0E\x23\xBB\x0B\x98\xE5\x4B\xDE\x43\x1D\x6F\xEF\x4F\x57\xB9\x35\x4F\xE1\x07\x2F\xB8\xE3\xBC\x22\x5B\x53\x31\x0F\x06\x04\x69\xBA\xA7\x2D\x76\x47\xB8\x22\x36\x83\x07\x06\x37\xDB\x03\x31\xDB\x32\x83\x43\x17\x9C\x13\x34\x4F\x75\x27\x30\xB7\x47\x14\xC7\x5D\x10\x5B\x14\x76\x37\x03\x3A\xEB\xFF\x10\x0B\x6E\x23\x07\x68\x76\x58\x9B\x30\x6B\x7B\x34\xE3\xB6\x03\xA0\x73\xFE\x07\xB0\x04\xE2\x2C\x10\x3A\x73\x60\x15\xEB\xD0\x93\x0A\x7C\xB7\x0A\x33\xA7\x8F\x5B\x6B\x10\x0D\x23\xF5\xB4\xFE\x6B\x76\x67\xE1\x52\xEB\xAF\x60\xC7\x86\x1F\xC2\x14\xDF\xB7\x17\x11\x0C\x75\x57\x30\x35\x23\x10\xD7\x13\x2C\x8F\x5D\x0B\xFF\x1C\x87\xC0\x23\x75\x6B\xC0\xB8\x4B\x04\xC0\x76\xFB\x1B\xBE\x4B\x0B\x3A\x63\x12\x1D\x6F\xD6\x13\xD6\x4F\x0D\x3E\x23\x37\x6A\x6D\xBB\x7A\x37\x77\x00\x1B\xE3\xBA\x27\x07\x07\xE6\x7F\x02\xC2\x57\xFB\x2D\x37\xB6\x86\x9B\x20\x24\x43\x1C\x20\x52\x2E\xEF\x30\xC1\x24\x97\x5E\x77\x9E\x17\x30\xEB">>$F 20 | printf "\x23\xCC\x4B\x83\x73\xDC\x20\xCB\x1E\x77\x23\xE0\x53\xED\x17\x0B\xE1\x13\xE3\x20\x77\x16\x0B\xDD\x10\x0F\x18\x70\xFB\xDE\x3F\x52\xE1\x4B\xE6\x1F\x47\xAF\x07\x1A\x1F\x1F\x23\x03\x40\x8F\xC3\x33\x87\xE2\x1F\x0F\x1B\x07\x72\x43\x6B\xFB\x9A\x84\x86\x93\xC3\xE0\x93\xBE\xB3\xE0\x18\xAB\x0C\x0F\x26\x0F\xBF\x22\xC3\x50\x8D\xCE\xE8\xA5\x36\x30\xE2\xF8\xC3\x06\x71\xF7\xD8\x27\x30\x31\x56\x8B\x37\xA5\x2B\x1E\x6B\xB7\x27\x84\xE2\xBA\x95\x23\x41\xE0\x1B\x86\x4F\x1E\x03\x8B\xC5\xFB\xB7\xBB\x01\x9B\x2F\x1B\xBA\x56\x0F\x14\x1C\x3F\x30\x27\x58\xC7\x8A\x16\x27\x10\xEB\x9B\x40\xF7\x5B\x1F\x54\x0F\x0B\x2A\x4A\x7F\x35\x9F\xEF\x37\x53\x0F\x8B\x92\x62\x3F\xDB\x1B\x00\x3F\x9A\x0A\x05\xA7\x86\x18\x0B\x1E\xB7\xDC\x2F\x80\xE2\x7E\xB3\xBC\x32\x37\x1B\x18\x10\x59\x27\xDB\x4F\x1F\xBA\x18\x77\x6E\xA3\xED\x0A\xB0\x31\x1B\xB9\x03\xDF\x36\xF3\x0A\x28\x9A\xE3\x1C\xE0\x73\xA9\x4B\x5B\x6E\x57\x53\x84\x5C\x53\x14\xBB\x0F\x80\x15\x47\x6E\x98\x0B\x0B\x1B\x38\x4F\xE7\x8F\x28\xC3\xAF\xB6\x24\x4B\x05\x16\xF7\x81\x05\xDE\xF6\x40">>$F 21 | printf "\x83\x02\xC2\x5B\xEE\x0A\xB6\x7F\xB9\x20\x47\x30\x8F\x6B\xA3\x82\xFF\x65\x30\x6C\xF7\x82\x5C\xAF\xD7\x0B\xD7\x84\x07\xDB\xB3\x05\x0D\x43\x4D\x7C\x0F\x20\xCF\x67\x75\x13\x7D\xD7\x0F\xB8\x3F\x78\x40\x62\x51\x73\x91\xAF\xAD\x47\x47\xAE\x0C\x37\xC5\x34\x60\xD1\x23\x90\x22\xB3\xD5\xAB\xC1\x57\x3B\xC7\x9B\x47\xE2\x03\xB5\x02\xC0\x6B\x68\xAB\x34\x3A\xD7\x90\xEB\x3F\x3C\x7B\xAF\x38\xC3\xDD\xE0\x8D\x73\x2E\x1C\xF7\x17\x2B\x06\x20\x09\x6B\xEB\x09\x30\xD3\x36\x1F\x8E\xD7\x03\x4F\x45\x34\xDB\x8B\x04\x80\x03\x61\xD2\x3F\xDD\xAF\x09\x75\x83\x09\x7B\xF3\x2F\xAE\x5A\x13\xED\xBC\x02\xDA\x57\xEF\x20\x8A\xE2\x9B\xAC\x23\x8F\x70\x92\xE5\xF1\x2B\x1E\x8E\x4F\x92\xE5\xC3\xB7\x68\x0E\x50\x2F\x3E\x2F\xF6\xFD\xE8\x47\x50\x51\xFF\x75\x8B\xBA\xFB\x6F\x02\x2C\x1B\x6E\xE7\x13\x02\x87\x84\xDB\xBB\xDF\x23\xC7\x43\x5E\x0E\xF7\xDB\x87\xE2\x97\x03\x1F\x43\xAF\x75\x77\x07\xEE\x53\x8F\x86\x08\xA7\x7D\x8F\x37\xCF\x13\x1F\xB8\xE3\x3B\x0E\x9B\x85\xD6\x83\x82\xC7\x15\xD8\x83\xE1\xD9\x65\xCF\x88\xC7\x79\x97\x87\x40\x00\x00\x00">>$F 22 | printf "\x00\x01\x20\xFF\x04\x01\x00\x00\x0B\x00\x00\x00\x03\x00\x00\x00\x90\x00\x00\x04\x00\x00\x00\x00\x00\x12\xFF\xE4\x03\x00\x00\xC6\x01\x00\x00\x03\x00\x00\x00\xE5\x41\x2D\x00\xFF\x61\x65\x61\x62\x69\x00\x01\x23\x77\x0A\x05\x41\x52\xFF\x4D\x39\x32\x36\x45\x4A\x2D\x53\xFF\x00\x06\x05\x08\x01\x09\x01\x12\xFF\x04\x14\x01\x15\x01\x17\x03\x18\xFF\x01\x1A\x02\x00\x2E\x73\x68\x73\xED\x74\x72\x74\x2E\x6F\x09\x69\x6E\x74\xED\x65\x72\x70\x07\xDA\x68\x61\x13\xDF\x05\x64\x79\x6E\x73\xD9\x79\x6D\x07\xB5\x20\xBF\x07\x72\x65\x6C\x2E\x70\xDF\x6C\x74\x26\x69\x73\x05\x2A\x6E\x78\x05\xB9\x66\x0C\xDD\x1A\x6F\x64\x61\xAD\x41\x07\xFF\x65\x68\x5F\x66\x72\x61\x6D\x65\x67\x23\x5F\xDB\x61\x72\x0C\x79\x66\x23\xC3\x0B\xEC\x6A\x63\x72\x51\x5B\x24\x69\xB7\x63\x08\x67\x6F\x77\x42\x62\x73\x73\x6B\x04\xA3\xAD\x2E\x42\x6F\x66\x69\x62\x75\x6E\x58\x73\x00\xC0\x00\x8E\x0B\xE9\x03\x01\xA6\x02\xBA\xF4\x09\xF4\xEB\x07\x14\x1F\x01\xB0\x01\x07\x61\x13\x07\xD8\x27\x21\x01\x6E\x01\x03\x6D\x07\xD8\xD6\x0B\x03\x1F\x0D\x04\x83\x03\x19">>$F 23 | printf "\x60\x53\xBE\x27\xE0\x69\xE0\xB6\x30\x02\x1B\x76\x01\x23\x0D\x10\xD6\x03\x21\x3B\x0B\x27\xFB\x10\x04\x01\x03\x9B\x07\x24\xB2\x01\x77\xBB\x29\x03\xA6\x09\x9B\x42\x34\x05\x99\x01\xB6\x07\xD0\x3B\x0D\x10\x83\x4F\x08\x75\x03\x32\x83\x33\x06\x7E\x13\x06\x01\xE6\x03\x1F\x76\x00\x9F\x02\xFB\x00\x2D\x27\x01\x9A\x14\x14\xED\x08\x4C\x01\x85\x27\xBE\x03\x38\xC0\x27\x7B\x60\x07\x01\x03\x9B\x07\x50\xB2\x07\x4F\xBB\x3E\x27\x01\xEE\xB0\x0E\x01\x03\x60\x77\x5C\x44\x20\x67\x37\xC0\x27\x4D\xC0\x37\xB2\x10\xEF\xBB\x4C\x27\x01\xEE\xF8\x1E\x01\x03\x65\x43\xB0\x4F\x3B\x56\x03\xA1\x0E\x7F\x0E\x20\xEB\x2D\x20\x27\x2B\x7C\x03\x62\xD6\x0F\x27\x0C\x04\xD2\x04\x10\xD8\x6E\x77\x2F\x27\x9A\x08\x08\x40\x17\x00\xD8\x73\xEB\x2F\x27\x9A\x0C\x0C\x6B\xB8\x1F\x01\x08\x8F\x76\x7C\x4F\x03\xC4\x74\x27\xC4\xD6\x74\x77\x00\xD8\x81\x2F\x2F\x27\xCA\x38\x21\xD6\x03\x07\xD8\x1C\x77\x03\x86\x67\x23\x70\x61\x17\xBE\x27\x2E\x30\xA7\x06\x01\x30\x93\x17\x00\xDD\x66\x27\x96\x20\x08\x00\x00\x00\x00\x00\x24\xFF\x00\x00\x00\x00\x55\x50\x58">>$F 24 | printf "\x21\x00\x00\x00\x00\x00\x00\x00\x55\x50\x58\x21\x0D\x17\x03\x08\xA0\xF3\x14\x14\xEF\xD3\x07\xD7\xE4\x03\x00\x00\xC6\x01\x00\x00\x1C\x25\x00\x00\x50\x00\x00\xE7\xA0\x00\x00\x00">>$F 25 | --------------------------------------------------------------------------------