[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n"
  },
  {
    "path": ".gitignore",
    "content": "\n.vs\nbin\nobj\npackages"
  },
  {
    "path": "App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <configSections>\n        <sectionGroup name=\"userSettings\" type=\"System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n            <section name=\"Garry.Control4.Jailbreak.Properties.Settings\" type=\"System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" allowExeDefinition=\"MachineToLocalUser\" requirePermission=\"false\" />\n        </sectionGroup>\n    </configSections>\n    <startup>\n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.7.2\" />\n    </startup>\n    <userSettings>\n        <Garry.Control4.Jailbreak.Properties.Settings>\n            <setting name=\"BlockSplitIoChecked\" serializeAs=\"String\">\n                <value>True</value>\n            </setting>\n        </Garry.Control4.Jailbreak.Properties.Settings>\n    </userSettings>\n</configuration>"
  },
  {
    "path": "CLAUDE.local.md",
    "content": "# Control4 Jailbreak Tool - Technical Knowledge Base\n\n## Project Overview\nA WinForms C# app that enables DIY users to use Control4 Composer Pro without a dealer account. It patches certificates, configs, and feature flags to bypass authentication and licensing checks.\n\n## Architecture\n\n### How Composer Authentication Works\n1. **Certificates**: Composer connects to the controller's Director service over TLS. The controller validates the Composer certificate against its CA store at `/etc/mosquitto/certs/ca-chain.pem`. The jailbreak tool generates a self-signed CA + Composer cert and deploys them to both sides.\n2. **Dead Proxy**: `ComposerPro.exe.config` is patched with `<defaultProxy>` pointing to `http://127.0.0.1:31337/` which blocks outbound HTTP (license validation, dealer auth). A `<bypasslist>` allows `services.control4.com`, `update2.control4.com`, and `c4updates.control4.com` through for updates.\n3. **Feature Flags**: Control4 uses Split.io SDK for feature flags. When split.io is blocked or unreachable, `FeatureOffline` reads cached values from `%AppData%/Control4/Composer/FeaturesConfiguration.json`.\n4. **Dealer Account**: A fake `dealeraccount.xml` with username=`no` password=`way` prevents login loops.\n\n### Key File Locations (Windows VM)\n- Composer install: `C:\\Program Files (x86)\\Control4\\Composer\\Pro\\`\n- Composer config: `ComposerPro.exe.config` (in install dir)\n- Feature flags cache: `%AppData%\\Control4\\Composer\\FeaturesConfiguration.json`\n- Dealer account: `%AppData%\\Control4\\dealeraccount.xml`\n- Composer cert: `%AppData%\\Control4\\Composer\\cacert-dev.pem`\n- Update settings: `%AppData%\\Control4\\Composer\\ComposerUpdateManagerSettings.Config`\n- OpenSSL config: `Certs\\openssl.cfg` (in jailbreak tool dir)\n\n### Key File Locations (Controller - Linux)\n- CA cert chain: `/etc/mosquitto/certs/ca-chain.pem`\n- SSH access: root user, used for deploying certs\n\n## Feature Flag System\n\n### How It Works\n1. `FeatureFlag.cs` (online): Calls `SplitFactory.Client().GetTreatment(key, featureName)`\n2. If split.io returns `\"control\"` (SDK can't reach servers), falls back to `FeatureOffline`\n3. `FeatureOffline.cs`: Reads `FeaturesConfiguration.json` as `Dictionary<string, ConfigurationResult>`\n4. Lookup tries `key/featureName` first (where key = dealer username), then just `featureName`\n5. If no cached value exists, returns `null` which resolves to `false`\n6. `ConfigurationResult` = `{ Result: bool, Config: string }`\n7. When split.io IS reachable, results are cached to JSON via `RefreshOfflineConfiguration()`\n8. `BlockUntilReady(10000)` - 10-second timeout on split.io SDK initialization\n\n### Known Feature Flags (from FeatureV2.cs)\n| Flag Name | Purpose | Required Value |\n|---|---|---|\n| `composer-x4-updatemanger-restrict-override` | Skips cloud-based dealer auth in Update Manager | `true` (Config: null) |\n| `connection-whitelist` | Controls connection restrictions in native RT DLL | `false` (Config: \"[]\") |\n| `os-pack-on-connect` | Enables management pack check on connect | `true` (Config: null) |\n| `completely-disable-terminal` | Controls terminal access | varies |\n| `refactor-startup` | Affects startup/connection flow | unclear |\n| `refactor-project-properties` | Project properties UI | unused |\n| `composer-disable-zigbee-modification-delay` | ZigBee timing | varies |\n| `enable-remove-registration` | Registration removal UI | varies |\n| `composer-gen4-lux-lighting` | Gen4 Lux lighting features | varies |\n| `update-manager-report` | Update manager reporting | varies |\n| `composer-enable-light-4766-changes` | Light driver changes | varies |\n\n### Current FeaturesConfiguration.json\n```json\n{\n  \"composer-x4-updatemanger-restrict-override\": {\"Result\": true, \"Config\": null},\n  \"connection-whitelist\": {\"Result\": false, \"Config\": \"[]\"},\n  \"os-pack-on-connect\": {\"Result\": true, \"Config\": null}\n}\n```\n**CRITICAL**: `connection-whitelist` must be `false` with `Config: \"[]\"`. Setting it to `true` or omitting it causes \"Unable to communicate with project\" in the Connect to Project dialog.\n\n### What Happens When Split.io is Blocked\n- Hosts file: `127.0.0.1  split.io sdk.split.io`\n- SDK `BlockUntilReady(10000)` times out after 10 seconds\n- `GetTreatment()` returns `\"control\"` for all flags\n- Falls back to `FeatureOffline` which reads the JSON file\n- Any flag NOT in the JSON returns `false` by default\n- This is why we must pre-populate ALL required flags in the JSON\n\n## Update Manager\n\n### Version Fetching Flow\n1. On load, checks `composer-x4-updatemanger-restrict-override` flag\n2. If flag is FALSE (normal flow): calls `GetConnectStatusAsync()` which authenticates with cloud services and returns `ConnectStatus` containing `UpdateManagerUrl`, `X4UpdatesUrl`, `LegacyUpdatesUrl`\n3. If flag is TRUE (our override): skips cloud auth, uses `Services.UpdatesUrl` as default (the old `Updates2x` endpoint)\n4. `RefreshVersions()` calls `GetVersions(URL)` which calls `GetAuthorizedVersions(commonName, systemVersion, includeEarlierVersions, userAgent)` via SOAP\n\n### Update Service URLs\n| URL | Purpose |\n|---|---|\n| `https://services.control4.com/Updates2x/v2_0/Updates.asmx` | Legacy SOAP endpoint (default in code) |\n| `https://services.control4.com/Updates2x-experience/v2_0/Updates.asmx` | X4+ SOAP endpoint (returned by cloud service) |\n| `http://update2.control4.com/release/{version}/win/{PackageName}.exe` | Management pack download URL |\n| `https://c4updates.control4.com/update` | Apt update server |\n\n### The `-experience` URL Problem\n- `ConnectStatus.UpdateManagerUrl` provides the `-experience` URL\n- Since we bypass `GetConnectStatusAsync()`, we never get this URL\n- Both endpoints return X4 versions via `GetVersions`, BUT `GetAuthorizedVersions` (which the Update Manager uses) requires a real registered controller and the experience endpoint is more permissive with authorization\n- `Services.UpdatesUrl` is implemented in native `Control4ClientRT.dll` and **ignores config overrides** - adding `UpdatesURL` to `<UpdateManager>` config section does NOT work\n- **Fix**: Write `ComposerUpdateManagerSettings.Config` with BinaryFormatter-serialized Hashtable containing `UpdateURLList30` = ArrayList with the experience URL. This pre-populates the dropdown. User must select it once (persists after that).\n- The default URL in the dropdown will still be the old `Updates2x` endpoint (hardcoded in native DLL), but the experience URL appears as an option\n\n### Standard vs Experience Endpoint Comparison\n- **Standard (`Updates2x`)**: 58 versions, full 3.x-4.x catalog, uses strict `GetAuthorizedVersions` check\n- **Experience (`Updates2x-experience`)**: 9 versions, curated 4.x+ list, more permissive authorization, includes intermediate builds (4.1.0.743847-res, 4.1.0.742633-res+Composer, 4.0.0.734549-res) not on standard endpoint\n- Both share: 2025.11.26.463, 2025.10.1.425, 2025.8.20.386, 4.1.0.744089, 4.0.0.734960, 3.4.3.741643\n\n### SOAP Service (Updates2x)\n- Namespace: `http://services.control4.com/updates/v2_0/`\n- No authentication required for basic operations\n- 10 operations: GetAuthorizedVersions, GetVersions, GetPackagesByVersion, GetAllVersions, GetLanguagePackagesByVersion, GetLanguagePackagesByBaseVersion, GetLanguagePackagesByVersionAndName, GetPackagesVersionsByName, GetPackagesVersionsByNameAndByVersions, GetUpdateInfoByVersion\n- Version strings ending in `+Composer` return Windows packages (ComposerPro, ComposerHE, Drivers EXEs)\n- Version strings ending in `-res` (without `+Composer`) return controller `.deb` packages\n- Example: `GetPackagesByVersion(\"4.1.0.744089-res+Composer\")` returns `Drivers-4.1.0.744089-res.exe`\n\n### Management Packs\n- Windows EXE installers containing driver definitions\n- Downloaded from `http://update2.control4.com/release/{version}/win/{PackageName}.exe`\n- Must be installed BEFORE launching Composer if the dead proxy blocks downloads\n- `GetPackagesByVersion` returns package name, URL, size, and MD5 checksum\n- The jailbreak tool has a built-in management pack download/install feature\n\n## Dead Proxy Configuration\n\n### What It Blocks\nEverything except:\n- `services.control4.com` (SOAP version queries)\n- `update2.control4.com` (firmware/pack downloads)\n- `c4updates.control4.com` (apt updates)\n- Local addresses (bypassonlocal=true)\n\n### What It Allows Through (via bypasslist)\nThese are needed for the Update Manager to function:\n- Version queries (SOAP calls to services.control4.com)\n- Firmware downloads (from update2.control4.com)\n- Controller apt updates (from c4updates.control4.com)\n\n### Services Still Blocked\n- `my.control4.com` - customer portal / licensing\n- `apis.control4.com` - cloud API services\n- `drivers.control4.com` - driver downloads (may need bypass if online driver search is desired)\n- Split.io domains (if also using hosts block)\n\n## Decompiled Code Locations\nMost decompiled code is at `/Users/demiller/Downloads/`:\n- `DesignerDecompiled/Control4.Designer.decompiled.cs` - Connection flow, startup, management packs\n- `OSUpdateManagerDecompiled/OSUpdateManager.decompiled.cs` - Update Manager form\n- `ClientDecompiled/Control4.Client/` - Feature flags, services, connection models\n- `FeaturesDecompiled/Control4.Features/` - Split.io integration, offline fallback\n- `ComposerDecompiled/` - Main Composer app (heavily obfuscated)\n- `CommonDecompiled/Control4.Common.decompiled.cs` - Common utilities\n\n### Native RT DLL\n`Control4ClientRT.dll` / `Control4ClientRT64.dll` is a native (non-.NET) DLL that contains the actual implementations of many methods marked with `[MethodImpl(MethodImplOptions.NoInlining)]`. It cannot be decompiled with ILSpy/dnSpy. Key functionality in native code:\n- `Services.UpdatesUrl` and all `Services.*Url` properties\n- `FeatureV2.Initialize()`\n- `connection-whitelist` and `refactor-startup` flag consumption\n- `ComposerRestriction.GetConnectionRestriction()` - controls \"Unable to communicate\" error\n- `ControllerConnectionRestriction.CanConnect` and `.ErrorMessage`\n- `C4System.Instance.WhatsUp()` - startup/init\n\n### Decompile Command (PowerShell)\n```powershell\n$composerDir = \"$env:LOCALAPPDATA\\Control4\\Composer\"\n$outDir = \"$env:USERPROFILE\\Downloads\\AllDecompiled\"\nNew-Item -ItemType Directory -Force -Path $outDir\nGet-ChildItem \"$composerDir\\*.dll\",\"$composerDir\\*.exe\" | ForEach-Object {\n    $name = $_.BaseName\n    Write-Host \"Decompiling $name...\"\n    ilspycmd $_.FullName -o \"$outDir\\$name\" 2>$null\n}\n```\n\n## Known Issues & Fixes\n\n### \"Integrator account not authorized\" (Update Manager red text)\n- **Cause**: `GetConnectStatusAsync()` fails because fake dealer credentials can't authenticate\n- **Fix**: Set `composer-x4-updatemanger-restrict-override` = true in FeaturesConfiguration.json\n\n### \"Unable to communicate with project\" (Connect to Project dialog)\n- **Cause**: `connection-whitelist` flag has no cached value when split.io is blocked; native code in RT DLL treats missing value as restrictive\n- **Fix**: Set `connection-whitelist` = false with Config = \"[]\" in FeaturesConfiguration.json\n- **Key insight**: This flag must be `false` (disabled), NOT `true`. The whitelist being disabled means no restrictions. An empty config \"[]\" is an empty exclusion list.\n\n### No update versions shown in Update Manager\n- **Cause**: Dead proxy blocks the SOAP call to services.control4.com, AND/OR the default URL (`Updates2x`) doesn't return X4 versions (need `Updates2x-experience`)\n- **Fix**: Added bypasslist to dead proxy for services.control4.com; inject `UpdatesURL` into `<UpdateManager>` config section pointing to the `-experience` endpoint\n- **Fallback**: User can manually enter `https://services.control4.com/Updates2x-experience/v2_0/Updates.asmx` in the URL combo box\n\n### Management packs section goes off end of GUI\n- **Fix**: Added `AutoScroll = true` to the Composer UserControl in Designer.cs\n\n## OS 4.1 Specific Notes\n- The `os-4.1-support` branch had WIP work including MQTT cert chain patching and feature flags\n- OS 4.1 version string: `4.1.0.744089-res`\n- Drivers pack: `Drivers-4.1.0.744089-res.exe` (~127MB)\n- The `+Composer` suffix on version strings is needed to get Windows packages from the SOAP service\n\n## Split.io API Key\nEncrypted and stored in `app.config`:\n```xml\n<add key=\"SplitIOEncryptedKey\" value=\"CZDWphNkIYmiXdSpnQ4Km1OaIxEGwUBGqYeLTxhRw4NXhRGxsnhQbg==\" />\n```\nRetrieved via `C4SystemInformation.GetSplitIoApiKey()`.\n\n## ConnectStatus Cloud Service Response Fields\n| Field | Type | Purpose |\n|---|---|---|\n| `connectRequired` | bool | Whether Connect license is needed |\n| `dealerIsConnectEligible` | bool | Whether dealer has Connect eligibility |\n| `ovrcCreated` | bool | Whether OVRC account exists |\n| `noConnect` | bool | No Connect flag |\n| `updateManagerUrl` | string | The `-experience` SOAP URL for version queries |\n| `legacyUpdatesUrl` | string | Legacy update URL |\n| `x4UpdatesUrl` | string | X4-specific update URL |\n\n## Jailbreak Tool File Structure\n- `Constants.cs` - All hardcoded values (URLs, cert names, paths)\n- `UI/Composer.cs` - Main Composer tab logic (patching, cert gen, management packs)\n- `UI/Composer.Designer.cs` - WinForms UI layout\n- `UI/Certificates.cs` - Certificate tab\n- `UI/DirectorPatch.cs` - Director/controller patching tab\n- `Resources/openssl.cfg` - OpenSSL config for cert generation"
  },
  {
    "path": "Constants.cs",
    "content": "namespace Garry.Control4.Jailbreak\n{\n    public static class Constants\n    {\n        public const int Version = 8;\n\n        /// <summary>\n        /// The cert for composer needs to be named cacert-*.pem\n        /// </summary>\n        public const string ComposerCertName = \"cacert-dev.pem\";\n\n        /// <summary>\n        /// Needs to start with Composer_ and can be anything after\n        /// </summary>\n        public const string CertificateCn = \"Composer_tech@control4.com_dev\";\n\n        /// <summary>\n        /// Should always be this unless they change something internally\n        /// </summary>\n        public const string CertPassword = \"R8lvpqtgYiAeyO8j8Pyd\";\n\n        /// <summary>\n        /// Where the CA and composer certs are stored\n        /// </summary>\n        public const string CertsFolder = \"Certs\";\n\n        /// <summary>\n        /// Where ssh keys are stored\n        /// </summary>\n        public const string KeysFolder = \"Keys - DO NOT DELETE\";\n\n        /// <summary>\n        /// How many days until the certificate expires. Doesn't seem any harm in setting this to\n        /// a huge value so you don't have to re-crack every year.\n        /// </summary>\n        public const int CertificateExpireDays = 3650;\n\n        /// <summary>\n        /// Where OpenSSL's Config is located (it's installed with Composer)\n        /// </summary>\n        public const string OpenSslConfig = @\"Certs\\openssl.cfg\";\n\n        /// <summary>\n        /// The OS version this tool was tested against.\n        /// </summary>\n        public const string TargetOsVersion = @\"4.2.0.753182\";\n\n        /// <summary>\n        /// The Composer version this tool was tested against.\n        /// </summary>\n        public const string TargetComposerVersion = @\"2026.3.18\";\n\n        /// <summary>\n        /// The file path to the Windows Hosts file, typically used for mapping hostnames to IP addresses.\n        /// </summary>\n        public const string WindowsHostsFile = @\"C:\\Windows\\System32\\drivers\\etc\\hosts\";\n\n        /// <summary>\n        /// Represents the host entry for Split.io to be added to the system's hosts file,\n        /// redirecting \"split.io\" and \"sdk.split.io\" to localhost.\n        /// </summary>\n        public const string BlockSplitIoHostsEntry = @\"127.0.0.1  split.io sdk.split.io\";\n\n        /// <summary>\n        /// The SOAP endpoint for the Control4 Updates service that provides package listings.\n        /// Used by the jailbreak tool's own management pack download feature.\n        /// </summary>\n        public const string UpdatesServiceUrl = \"https://services.control4.com/Updates2x/v2_0/Updates.asmx\";\n\n        /// <summary>\n        /// The \"experience\" Updates SOAP endpoint that returns X4+ versions.\n        /// Normally provided by the cloud service's ConnectStatus.UpdateManagerUrl,\n        /// but since we skip cloud auth, we write this into ComposerUpdateManagerSettings.Config.\n        /// </summary>\n        public const string UpdatesExperienceUrl = \"https://services.control4.com/Updates2x-experience/v2_0/Updates.asmx\";\n\n        /// <summary>\n        /// The XML namespace used in SOAP requests/responses for the Updates service.\n        /// </summary>\n        public const string UpdatesSoapNamespace = \"http://services.control4.com/updates/v2_0/\";\n\n        /// <summary>\n        /// Bump this when cert generation parameters change (openssl.cfg, key size, subject, etc.).\n        /// Stored in Certs/.schema-version. Missing or mismatched triggers root CA regeneration.\n        /// </summary>\n        public const int CertSchemaVersion = 1;\n\n        /// <summary>\n        /// Marker file on the controller written after cert changes. Lives in /tmp so it's\n        /// cleared on reboot, letting us detect whether a pending reboot has been completed.\n        /// </summary>\n        public const string RebootMarkerPath = \"/tmp/.jailbreak-reboot-pending\";\n    }\n}\n"
  },
  {
    "path": "Control4.Jailbreak.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{ABA795E1-3A9C-4EF2-BDF5-C4ACAE48670F}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <RootNamespace>Garry.Control4.Jailbreak</RootNamespace>\n    <AssemblyName>C4Jailbreak</AssemblyName>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <Deterministic>true</Deterministic>\n    <PublishUrl>publish\\</PublishUrl>\n    <Install>true</Install>\n    <InstallFrom>Disk</InstallFrom>\n    <UpdateEnabled>false</UpdateEnabled>\n    <UpdateMode>Foreground</UpdateMode>\n    <UpdateInterval>7</UpdateInterval>\n    <UpdateIntervalUnits>Days</UpdateIntervalUnits>\n    <UpdatePeriodically>false</UpdatePeriodically>\n    <UpdateRequired>false</UpdateRequired>\n    <MapFileExtensions>true</MapFileExtensions>\n    <ApplicationRevision>0</ApplicationRevision>\n    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>\n    <IsWebBootstrapper>false</IsWebBootstrapper>\n    <UseApplicationTrust>false</UseApplicationTrust>\n    <BootstrapperEnabled>true</BootstrapperEnabled>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <PathMap>$(MSBuildProjectDirectory)=Control4.Jailbreak</PathMap>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <PathMap>$(MSBuildProjectDirectory)=Control4.Jailbreak</PathMap>\n  </PropertyGroup>\n  <PropertyGroup />\n  <PropertyGroup>\n    <ApplicationManifest>app.manifest</ApplicationManifest>\n  </PropertyGroup>\n  <PropertyGroup>\n    <ApplicationIcon>Resources\\four.ico</ApplicationIcon>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject>\n    </StartupObject>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Renci.SshNet, Version=2023.0.0.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL\">\n      <HintPath>packages\\SSH.NET.2023.0.0\\lib\\net462\\Renci.SshNet.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.Composition\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.IO.Compression.FileSystem\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Numerics\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Deployment\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Web.Extensions\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Constants.cs\" />\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"UI\\Jailbreak.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"UI\\Jailbreak.Designer.cs\">\n      <DependentUpon>Jailbreak.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"UI\\Director.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Include=\"UI\\LogWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"UI\\LogWindow.Designer.cs\">\n      <DependentUpon>LogWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"UI\\LoginDialog.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"UI\\MainWindow.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"UI\\MainWindow.Designer.cs\">\n      <DependentUpon>MainWindow.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Utility\\Sddp.cs\" />\n    <Compile Include=\"Utility\\Sddp.DeviceResponse.cs\" />\n    <EmbeddedResource Include=\"UI\\Jailbreak.resx\">\n      <DependentUpon>Jailbreak.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"UI\\LogWindow.resx\">\n      <DependentUpon>LogWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"UI\\MainWindow.resx\">\n      <DependentUpon>MainWindow.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <SubType>Designer</SubType>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <None Include=\"app.manifest\" />\n    <None Include=\"packages.config\" />\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\download.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\openssl.cfg\" />\n    <None Include=\"Resources\\patch.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\four.ico\" />\n  </ItemGroup>\n  <ItemGroup>\n    <BootstrapperPackage Include=\".NETFramework,Version=v4.7.2\">\n      <Visible>False</Visible>\n      <ProductName>Microsoft .NET Framework 4.7.2 %28x86 and x64%29</ProductName>\n      <Install>true</Install>\n    </BootstrapperPackage>\n    <BootstrapperPackage Include=\"Microsoft.Net.Framework.3.5.SP1\">\n      <Visible>False</Visible>\n      <ProductName>.NET Framework 3.5 SP1</ProductName>\n      <Install>false</Install>\n    </BootstrapperPackage>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\loupe.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\cup-cake.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\folder.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\database.png\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Control4.Jailbreak.csproj.user",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"Current\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <PublishUrlHistory>publish\\</PublishUrlHistory>\n    <InstallUrlHistory />\n    <SupportUrlHistory />\n    <UpdateUrlHistory />\n    <BootstrapperUrlHistory />\n    <ErrorReportUrlHistory />\n    <FallbackCulture>en-US</FallbackCulture>\n    <VerifyUploadedFiles>false</VerifyUploadedFiles>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "Control4.Jailbreak.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.29411.108\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Control4.Jailbreak\", \"Control4.Jailbreak.csproj\", \"{ABA795E1-3A9C-4EF2-BDF5-C4ACAE48670F}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{ABA795E1-3A9C-4EF2-BDF5-C4ACAE48670F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{ABA795E1-3A9C-4EF2-BDF5-C4ACAE48670F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{ABA795E1-3A9C-4EF2-BDF5-C4ACAE48670F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{ABA795E1-3A9C-4EF2-BDF5-C4ACAE48670F}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {DF3DE388-B315-4AB1-8043-C4EB6ED31E0C}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Garry Newman\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Program.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\nusing Garry.Control4.Jailbreak.UI;\n\nnamespace Garry.Control4.Jailbreak\n{\n    internal static class Program\n    {\n        /// <summary>\n        /// The main entry point for the application.\n        /// </summary>\n        [STAThread]\n        private static void Main()\n        {\n            Application.EnableVisualStyles();\n            Application.SetCompatibleTextRenderingDefault(false);\n            Application.Run(new MainWindow());\n        }\n    }\n}"
  },
  {
    "path": "Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle( \"Control4 Jailbreaker\" )]\n[assembly: AssemblyDescription( \"\" )]\n[assembly: AssemblyConfiguration( \"\" )]\n[assembly: AssemblyCompany( \"\" )]\n[assembly: AssemblyProduct( \"Control4 Jailbreaker\" )]\n[assembly: AssemblyCopyright( \"Copyright ©  2020\" )]\n[assembly: AssemblyTrademark( \"\" )]\n[assembly: AssemblyCulture( \"\" )]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible( false )]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid( \"aba795e1-3a9c-4ef2-bdf5-c4acae48670f\" )]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion( \"1.0.0.0\" )]\n[assembly: AssemblyFileVersion( \"1.0.0.0\" )]\n"
  },
  {
    "path": "Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace Garry.Control4.Jailbreak.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"Garry.Control4.Jailbreak.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap cup_cake {\n            get {\n                object obj = ResourceManager.GetObject(\"cup-cake\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap database {\n            get {\n                object obj = ResourceManager.GetObject(\"database\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap download {\n            get {\n                object obj = ResourceManager.GetObject(\"download\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap folder {\n            get {\n                object obj = ResourceManager.GetObject(\"folder\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).\n        /// </summary>\n        internal static System.Drawing.Icon four {\n            get {\n                object obj = ResourceManager.GetObject(\"four\", resourceCulture);\n                return ((System.Drawing.Icon)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap loupe {\n            get {\n                object obj = ResourceManager.GetObject(\"loupe\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Byte[].\n        /// </summary>\n        internal static byte[] openssl {\n            get {\n                object obj = ResourceManager.GetObject(\"openssl\", resourceCulture);\n                return ((byte[])(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap patch {\n            get {\n                object obj = ResourceManager.GetObject(\"patch\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        internal static System.Drawing.Bitmap reddit {\n            get {\n                object obj = ResourceManager.GetObject(\"reddit\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"patch\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\patch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"cup-cake\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\cup-cake.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"four\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\four.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"loupe\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\loupe.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"folder\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"reddit\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\reddit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"download\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\download.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"database\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\database.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"openssl\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\openssl.cfg;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n</root>"
  },
  {
    "path": "Properties/Settings.Designer.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace Garry.Control4.Jailbreak.Properties {\n\n\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"15.9.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n\n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n\n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"True\")]\n        public bool BlockSplitIoChecked {\n            get {\n                return ((bool)(this[\"BlockSplitIoChecked\"]));\n            }\n            set {\n                this[\"BlockSplitIoChecked\"] = value;\n            }\n        }\n\n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"\")]\n        public string ComposerInstallDir {\n            get {\n                return ((string)(this[\"ComposerInstallDir\"]));\n            }\n            set {\n                this[\"ComposerInstallDir\"] = value;\n            }\n        }\n\n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"\")]\n        public string LastIpAddress {\n            get {\n                return ((string)(this[\"LastIpAddress\"]));\n            }\n            set {\n                this[\"LastIpAddress\"] = value;\n            }\n        }\n\n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"root\")]\n        public string LastUsername {\n            get {\n                return ((string)(this[\"LastUsername\"]));\n            }\n            set {\n                this[\"LastUsername\"] = value;\n            }\n        }\n\n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"\")]\n        public string LastPassword {\n            get {\n                return ((string)(this[\"LastPassword\"]));\n            }\n            set {\n                this[\"LastPassword\"] = value;\n            }\n        }\n\n        [global::System.Configuration.UserScopedSettingAttribute()]\n        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n        [global::System.Configuration.DefaultSettingValueAttribute(\"\")]\n        public string LastMacAddress {\n            get {\n                return ((string)(this[\"LastMacAddress\"]));\n            }\n            set {\n                this[\"LastMacAddress\"] = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Properties/Settings.settings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings>\n    <Setting Name=\"BlockSplitIoChecked\" Type=\"System.Boolean\" Scope=\"User\">\n      <Value Profile=\"(Default)\">True</Value>\n    </Setting>\n    <Setting Name=\"ComposerInstallDir\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\" />\n    </Setting>\n    <Setting Name=\"LastIpAddress\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\" />\n    </Setting>\n    <Setting Name=\"LastUsername\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\">root</Value>\n    </Setting>\n    <Setting Name=\"LastPassword\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\" />\n    </Setting>\n    <Setting Name=\"LastMacAddress\" Type=\"System.String\" Scope=\"User\">\n      <Value Profile=\"(Default)\" />\n    </Setting>\n  </Settings>\n</SettingsFile>\n"
  },
  {
    "path": "README.md",
    "content": "# What\n\nJailbreak tool for Control4 3.2.1 - allowing add/rename/move rooms/drivers/devices without being a dealer.\n\n# Why\n\nI'm a nerd. I got home automation in my house so I could play with it, so I could write my own drivers and make it do cool stuff. By default you can't do that without being an authorized dealer - unless you jailbreak your Director.\n\nThere are a few dodgy tools floating around that achieve the same thing, but the process is over-complicated, error prone and out of date.\n\nI thought it would be safer/easier in the long run to write something open source.\n\n# How\n\nHead over to the [releases page](https://github.com/garrynewman/Control4.Jailbreak/releases) and download the zip (not the source). Unzip and run C4Jailbreak.exe.\n\n## Follow Each Step\n\n![Steps](https://files.facepunch.com/garry/aba22fcf-672e-41e1-8184-f74d4d8a0b53.png)\n\n## Enjoy\n\nYou're all done\n\n# Other stuff\n\nEverything is at your own risk, obviously. If this tool leads to your house burning down you can't blame me.\n\nTo Control4 - please don't be angry at this tool. I love my control4 automated house and would spend a ton more time and money with you guys if I didn't have to do it through a dealer every time. If you want to contact me I'm at garrynewman@gmail.com <3\n\nWe have a small reddit group for Control4 DIY over at https://www.reddit.com/r/C4diy/ - feel free to ask for help here.\n"
  },
  {
    "path": "Resources/openssl.cfg",
    "content": "HOME\t\t\t= .\nRANDFILE\t\t= $ENV::HOME/.rnd\noid_section\t\t= new_oids\n[ new_oids ]\n\ntsa_policy1 = 1.2.3.4.1\ntsa_policy2 = 1.2.3.4.5.6\ntsa_policy3 = 1.2.3.4.5.7\n\n####################################################################\n[ ca ]\ndefault_ca\t= CA_default\t\t# The default ca section\n\n####################################################################\n[ CA_default ]\n\ndir\t\t= ./ca\t\t\t# Where everything is kept\ncerts\t\t= $dir/certs\t\t# Where the issued certs are kept\ncrl_dir\t\t= $dir/crl\t\t# Where the issued crl are kept\ndatabase\t= $dir/index.txt\t# database index file.\n#unique_subject\t= no\t\t\t# Set to 'no' to allow creation of\n\t\t\t\t\t# several ctificates with same subject.\nnew_certs_dir\t= $dir/newcerts\t\t# default place for new certs.\n\ncertificate\t= $dir/cacert.pem \t# The CA certificate\nserial\t\t= $dir/serial \t\t# The current serial number\ncrlnumber\t= $dir/crlnumber\t# the current crl number\n\t\t\t\t\t# must be commented out to leave a V1 CRL\ncrl\t\t= $dir/crl.pem \t\t# The current CRL\nprivate_key\t= $dir/private/cakey.pem# The private key\nRANDFILE\t= $dir/private/.rand\t# private random number file\n\nx509_extensions\t= usr_cert\t\t# The extentions to add to the cert\n\n# Comment out the following two lines for the \"traditional\"\n# (and highly broken) format.\nname_opt \t= ca_default\t\t# Subject Name options\ncert_opt \t= ca_default\t\t# Certificate field options\n\n# Extension copying option: use with caution.\n# copy_extensions = copy\n\n# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs\n# so this is commented out by default to leave a V1 CRL.\n# crlnumber must also be commented out to leave a V1 CRL.\n# crl_extensions\t= crl_ext\n\ndefault_days\t= 365\t\t\t# how long to certify for\ndefault_crl_days= 30\t\t\t# how long before next CRL\ndefault_md\t= default\t\t# use public key default MD\npreserve\t= no\t\t\t# keep passed DN ordering\n\n# A few difference way of specifying how similar the request should look\n# For type CA, the listed attributes must be the same, and the optional\n# and supplied fields are just that :-)\npolicy\t\t= policy_match\n\n# For the CA policy\n[ policy_match ]\ncountryName\t\t= optional\nstateOrProvinceName\t= optional\norganizationName\t= optional\norganizationalUnitName\t= optional\ncommonName\t\t= optional\nemailAddress\t\t= optional\n\n[ policy_anything ]\ncountryName\t\t= optional\nstateOrProvinceName\t= optional\nlocalityName\t\t= optional\norganizationName\t= optional\norganizationalUnitName\t= optional\ncommonName\t\t= optional\nemailAddress\t\t= optional\n\n####################################################################\n[ req ]\ndefault_bits\t\t= 2048\ndefault_keyfile \t= privkey.pem\ndistinguished_name\t= req_distinguished_name\nattributes\t\t= req_attributes\nx509_extensions\t= v3_ca\t# The extentions to add to the self signed cert\nstring_mask = utf8only\n\n[ req_distinguished_name ]\ncountryName\t\t\t= Country Name (2 letter code)\ncountryName_default\t\t= AU\ncountryName_min\t\t\t= 2\ncountryName_max\t\t\t= 2\n\nstateOrProvinceName\t\t= State or Province Name (full name)\nstateOrProvinceName_default\t= Some-State\n\nlocalityName\t\t\t= Locality Name (eg, city)\n\n0.organizationName\t\t= Organization Name (eg, company)\n0.organizationName_default\t= Internet Widgits Pty Ltd\n\n# we can do this but it is not needed normally :-)\n#1.organizationName\t\t= Second Organization Name (eg, company)\n#1.organizationName_default\t= World Wide Web Pty Ltd\n\norganizationalUnitName\t\t= Organizational Unit Name (eg, section)\n#organizationalUnitName_default\t=\n\ncommonName\t\t\t= Common Name (e.g. server FQDN or YOUR name)\ncommonName_max\t\t\t= 64\n\nemailAddress\t\t\t= Email Address\nemailAddress_max\t\t= 64\n\n# SET-ex3\t\t\t= SET extension number 3\n\n[ req_attributes ]\nchallengePassword\t\t= A challenge password\nchallengePassword_min\t\t= 4\nchallengePassword_max\t\t= 20\n\nunstructuredName\t\t= An optional company name\n\n[ usr_cert ]\n\nbasicConstraints=CA:FALSE\n\nnsComment\t\t\t= \"OpenSSL Generated Certificate\"\n\nsubjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid,issuer\n\n[ v3_req ]\n\nbasicConstraints = CA:FALSE\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\n\n[ v3_ca ]\n\nsubjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid:always,issuer\nbasicConstraints = CA:true\nkeyUsage=digitalSignature, keyCertSign, cRLSign\n\n[ crl_ext ]\nauthorityKeyIdentifier=keyid:always\n\n[ proxy_cert_ext ]\nbasicConstraints=CA:FALSE\nnsComment\t\t\t= \"OpenSSL Generated Certificate\"\nsubjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid,issuer\nproxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo\n\n"
  },
  {
    "path": "Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace C4Mod {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"C4Mod.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "UI/Director.cs",
    "content": "namespace Garry.Control4.Jailbreak.UI\n{\n    public class Director\n    {\n        private readonly MainWindow _mainWindow;\n\n        public Director(MainWindow mainWindow)\n        {\n            _mainWindow = mainWindow;\n        }\n\n        public void RefreshList()\n        {\n            using (var sddp = new Utility.Sddp())\n            {\n                sddp.OnResponse = r =>\n                {\n                    if (r.St != \"c4:director\")\n                        return;\n\n                    _ = Connect(r);\n                };\n\n                sddp.Search(\"c4:director\");\n            }\n        }\n\n        private bool Connect(Utility.Sddp.DeviceResponse connection)\n        {\n            try\n            {\n                _mainWindow.Jailbreak.IpAddress.Text = connection.EndPoint.Address.ToString();\n                return true;\n            }\n            catch (System.Exception)\n            {\n                return false;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "UI/Jailbreak.Designer.cs",
    "content": "namespace Garry.Control4.Jailbreak.UI\n{\n    partial class Jailbreak\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Jailbreak));\n            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n            this.labelGettingComposer = new System.Windows.Forms.Label();\n            this.labelGettingComposerDesc = new System.Windows.Forms.Label();\n            this.buttonSearchGoogle = new System.Windows.Forms.Button();\n            this.buttonReddit = new System.Windows.Forms.Button();\n            this.labelJailbreak = new System.Windows.Forms.Label();\n            this.labelJailbreakDesc = new System.Windows.Forms.Label();\n            this.labelIpAddress = new System.Windows.Forms.Label();\n            this.IpAddress = new System.Windows.Forms.TextBox();\n            this.labelUsername = new System.Windows.Forms.Label();\n            this.Username = new System.Windows.Forms.TextBox();\n            this.labelPassword = new System.Windows.Forms.Label();\n            this.Password = new System.Windows.Forms.TextBox();\n            this.labelMacAddress = new System.Windows.Forms.Label();\n            this.MacAddress = new System.Windows.Forms.TextBox();\n            this.checkBoxBlockSplitIo = new System.Windows.Forms.CheckBox();\n            this.buttonJailbreak = new System.Windows.Forms.Button();\n            this.labelManagementPack = new System.Windows.Forms.Label();\n            this.labelManagementPackDesc = new System.Windows.Forms.Label();\n            this.buttonInstallMgmtPack = new System.Windows.Forms.Button();\n            this.panelCredentials = new System.Windows.Forms.Panel();\n            this.panelMac = new System.Windows.Forms.Panel();\n            this.panelJailbreakRow = new System.Windows.Forms.Panel();\n            this.toolTip = new System.Windows.Forms.ToolTip();\n            this.toolTip.AutoPopDelay = 15000;\n            this.tableLayoutPanel1.SuspendLayout();\n            this.panelCredentials.SuspendLayout();\n            this.panelMac.SuspendLayout();\n            this.panelJailbreakRow.SuspendLayout();\n            this.SuspendLayout();\n            //\n            // tableLayoutPanel1\n            //\n            this.tableLayoutPanel1.ColumnCount = 2;\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\n            this.tableLayoutPanel1.Controls.Add(this.labelGettingComposer, 0, 0);\n            this.tableLayoutPanel1.Controls.Add(this.labelGettingComposerDesc, 0, 1);\n            this.tableLayoutPanel1.Controls.Add(this.buttonSearchGoogle, 1, 1);\n            this.tableLayoutPanel1.Controls.Add(this.buttonReddit, 1, 2);\n            this.tableLayoutPanel1.Controls.Add(this.labelJailbreak, 0, 3);\n            this.tableLayoutPanel1.Controls.Add(this.labelJailbreakDesc, 0, 4);\n            this.tableLayoutPanel1.Controls.Add(this.panelCredentials, 0, 5);\n            this.tableLayoutPanel1.Controls.Add(this.panelMac, 0, 6);\n            this.tableLayoutPanel1.Controls.Add(this.panelJailbreakRow, 0, 8);\n            this.tableLayoutPanel1.Controls.Add(this.labelManagementPack, 0, 9);\n            this.tableLayoutPanel1.Controls.Add(this.labelManagementPackDesc, 0, 10);\n            this.tableLayoutPanel1.Controls.Add(this.buttonInstallMgmtPack, 1, 10);\n            this.tableLayoutPanel1.Location = new System.Drawing.Point(24, 31);\n            this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\n            this.tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n            this.tableLayoutPanel1.RowCount = 12;\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n            this.tableLayoutPanel1.AutoSize = true;\n            this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.tableLayoutPanel1.Size = new System.Drawing.Size(952, 1100);\n            this.tableLayoutPanel1.TabIndex = 0;\n            //\n            // labelGettingComposer\n            //\n            this.labelGettingComposer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n            | System.Windows.Forms.AnchorStyles.Left)\n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.labelGettingComposer.AutoSize = true;\n            this.tableLayoutPanel1.SetColumnSpan(this.labelGettingComposer, 2);\n            this.labelGettingComposer.Font = new System.Drawing.Font(\"Microsoft YaHei\", 16F, System.Drawing.FontStyle.Bold);\n            this.labelGettingComposer.ForeColor = System.Drawing.SystemColors.Highlight;\n            this.labelGettingComposer.Location = new System.Drawing.Point(0, 14);\n            this.labelGettingComposer.Margin = new System.Windows.Forms.Padding(0, 14, 0, 28);\n            this.labelGettingComposer.Name = \"labelGettingComposer\";\n            this.labelGettingComposer.Size = new System.Drawing.Size(952, 57);\n            this.labelGettingComposer.TabIndex = 0;\n            this.labelGettingComposer.Text = \"GETTING COMPOSER PRO\";\n            //\n            // labelGettingComposerDesc\n            //\n            this.labelGettingComposerDesc.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n            | System.Windows.Forms.AnchorStyles.Left)\n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.labelGettingComposerDesc.Location = new System.Drawing.Point(6, 99);\n            this.labelGettingComposerDesc.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);\n            this.labelGettingComposerDesc.Name = \"labelGettingComposerDesc\";\n            this.tableLayoutPanel1.SetRowSpan(this.labelGettingComposerDesc, 2);\n            this.labelGettingComposerDesc.Size = new System.Drawing.Size(670, 154);\n            this.labelGettingComposerDesc.TabIndex = 1;\n            this.labelGettingComposerDesc.Text = \"Composer and OS versions are now released independently. You need a Composer versi\" +\n    \"on that supports your controller\\'s OS version.\\r\\n\\r\\nIt doesn\\'t feel right linking \" +\n    \"to Composer Pro downloads but they\\'re quite easy to find if you know the filename.\";\n            //\n            // buttonSearchGoogle\n            //\n            this.buttonSearchGoogle.Anchor = System.Windows.Forms.AnchorStyles.Right;\n            this.buttonSearchGoogle.Image = global::Garry.Control4.Jailbreak.Properties.Resources.loupe;\n            this.buttonSearchGoogle.Location = new System.Drawing.Point(700, 105);\n            this.buttonSearchGoogle.Margin = new System.Windows.Forms.Padding(6);\n            this.buttonSearchGoogle.Name = \"buttonSearchGoogle\";\n            this.buttonSearchGoogle.Size = new System.Drawing.Size(246, 65);\n            this.buttonSearchGoogle.TabIndex = 2;\n            this.buttonSearchGoogle.Text = \" Search Google\";\n            this.buttonSearchGoogle.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            this.buttonSearchGoogle.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\n            this.buttonSearchGoogle.UseVisualStyleBackColor = true;\n            this.buttonSearchGoogle.Click += new System.EventHandler(this.SearchGoogleForComposer);\n            //\n            // buttonReddit\n            //\n            this.buttonReddit.Anchor = System.Windows.Forms.AnchorStyles.Right;\n            this.buttonReddit.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.buttonReddit.Image = global::Garry.Control4.Jailbreak.Properties.Resources.reddit;\n            this.buttonReddit.Location = new System.Drawing.Point(700, 182);\n            this.buttonReddit.Margin = new System.Windows.Forms.Padding(6);\n            this.buttonReddit.Name = \"buttonReddit\";\n            this.buttonReddit.Size = new System.Drawing.Size(246, 65);\n            this.buttonReddit.TabIndex = 3;\n            this.buttonReddit.Text = \" r/c4diy\";\n            this.buttonReddit.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            this.buttonReddit.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\n            this.buttonReddit.UseVisualStyleBackColor = true;\n            this.buttonReddit.Click += new System.EventHandler(this.OpenControl4Reddit);\n            //\n            // labelJailbreak\n            //\n            this.labelJailbreak.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n            | System.Windows.Forms.AnchorStyles.Left)\n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.labelJailbreak.AutoSize = true;\n            this.tableLayoutPanel1.SetColumnSpan(this.labelJailbreak, 2);\n            this.labelJailbreak.Font = new System.Drawing.Font(\"Microsoft YaHei\", 16F, System.Drawing.FontStyle.Bold);\n            this.labelJailbreak.ForeColor = System.Drawing.SystemColors.Highlight;\n            this.labelJailbreak.Location = new System.Drawing.Point(0, 267);\n            this.labelJailbreak.Margin = new System.Windows.Forms.Padding(0, 14, 0, 28);\n            this.labelJailbreak.Name = \"labelJailbreak\";\n            this.labelJailbreak.Size = new System.Drawing.Size(952, 57);\n            this.labelJailbreak.TabIndex = 4;\n            this.labelJailbreak.Text = \"JAILBREAK\";\n            //\n            // labelJailbreakDesc\n            //\n            this.labelJailbreakDesc.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n            | System.Windows.Forms.AnchorStyles.Left)\n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tableLayoutPanel1.SetColumnSpan(this.labelJailbreakDesc, 2);\n            this.labelJailbreakDesc.Location = new System.Drawing.Point(6, 352);\n            this.labelJailbreakDesc.Margin = new System.Windows.Forms.Padding(6, 0, 6, 14);\n            this.labelJailbreakDesc.Name = \"labelJailbreakDesc\";\n            this.labelJailbreakDesc.Size = new System.Drawing.Size(940, 100);\n            this.labelJailbreakDesc.TabIndex = 5;\n            this.labelJailbreakDesc.Text = resources.GetString(\"labelJailbreakDesc.Text\");\n            //\n            // panelCredentials — row with IP Address, Username, Password\n            //\n            this.panelCredentials.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tableLayoutPanel1.SetColumnSpan(this.panelCredentials, 2);\n            this.panelCredentials.Controls.Add(this.labelIpAddress);\n            this.panelCredentials.Controls.Add(this.IpAddress);\n            this.panelCredentials.Controls.Add(this.labelUsername);\n            this.panelCredentials.Controls.Add(this.Username);\n            this.panelCredentials.Controls.Add(this.labelPassword);\n            this.panelCredentials.Controls.Add(this.Password);\n            this.panelCredentials.Location = new System.Drawing.Point(6, 472);\n            this.panelCredentials.Margin = new System.Windows.Forms.Padding(6, 6, 6, 0);\n            this.panelCredentials.Name = \"panelCredentials\";\n            this.panelCredentials.Size = new System.Drawing.Size(940, 70);\n            this.panelCredentials.TabIndex = 6;\n            //\n            // labelIpAddress\n            //\n            this.labelIpAddress.AutoSize = true;\n            this.labelIpAddress.Location = new System.Drawing.Point(0, 0);\n            this.labelIpAddress.Name = \"labelIpAddress\";\n            this.labelIpAddress.Size = new System.Drawing.Size(116, 25);\n            this.labelIpAddress.TabIndex = 0;\n            this.labelIpAddress.Text = \"IP Address\";\n            //\n            // IpAddress\n            //\n            this.IpAddress.Location = new System.Drawing.Point(0, 28);\n            this.IpAddress.Name = \"IpAddress\";\n            this.IpAddress.Size = new System.Drawing.Size(256, 31);\n            this.IpAddress.TabIndex = 1;\n            this.IpAddress.Text = \"127.0.0.1\";\n            this.IpAddress.TextChanged += new System.EventHandler(this.OnIpAddressChanged);\n            //\n            // labelUsername\n            //\n            this.labelUsername.AutoSize = true;\n            this.labelUsername.Location = new System.Drawing.Point(272, 0);\n            this.labelUsername.Name = \"labelUsername\";\n            this.labelUsername.Size = new System.Drawing.Size(110, 25);\n            this.labelUsername.TabIndex = 2;\n            this.labelUsername.Text = \"Username\";\n            this.labelUsername.ForeColor = System.Drawing.SystemColors.GrayText;\n            //\n            // Username\n            //\n            this.Username.Location = new System.Drawing.Point(272, 28);\n            this.Username.Name = \"Username\";\n            this.Username.Size = new System.Drawing.Size(170, 31);\n            this.Username.TabIndex = 3;\n            this.Username.Text = \"root\";\n            //\n            // labelPassword\n            //\n            this.labelPassword.AutoSize = true;\n            this.labelPassword.Location = new System.Drawing.Point(458, 0);\n            this.labelPassword.Name = \"labelPassword\";\n            this.labelPassword.Size = new System.Drawing.Size(218, 25);\n            this.labelPassword.TabIndex = 4;\n            this.labelPassword.Text = \"Password\";\n            this.labelPassword.ForeColor = System.Drawing.SystemColors.GrayText;\n            //\n            // Password\n            //\n            this.Password.Location = new System.Drawing.Point(458, 28);\n            this.Password.Name = \"Password\";\n            this.Password.Size = new System.Drawing.Size(470, 31);\n            this.Password.TabIndex = 5;\n            //\n            // panelMac — row with MAC Address\n            //\n            this.panelMac.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tableLayoutPanel1.SetColumnSpan(this.panelMac, 2);\n            this.panelMac.Controls.Add(this.labelMacAddress);\n            this.panelMac.Controls.Add(this.MacAddress);\n            this.panelMac.Location = new System.Drawing.Point(6, 538);\n            this.panelMac.Margin = new System.Windows.Forms.Padding(6, 6, 6, 14);\n            this.panelMac.Name = \"panelMac\";\n            this.panelMac.Size = new System.Drawing.Size(940, 70);\n            this.panelMac.TabIndex = 7;\n            //\n            // labelMacAddress\n            //\n            this.labelMacAddress.AutoSize = true;\n            this.labelMacAddress.Location = new System.Drawing.Point(0, 0);\n            this.labelMacAddress.Name = \"labelMacAddress\";\n            this.labelMacAddress.Size = new System.Drawing.Size(144, 25);\n            this.labelMacAddress.TabIndex = 0;\n            this.labelMacAddress.Text = \"MAC Address\";\n            this.labelMacAddress.ForeColor = System.Drawing.SystemColors.GrayText;\n            //\n            // MacAddress\n            //\n            this.MacAddress.Location = new System.Drawing.Point(0, 28);\n            this.MacAddress.MaxLength = 17;\n            this.MacAddress.Name = \"MacAddress\";\n            this.MacAddress.ReadOnly = true;\n            this.MacAddress.Size = new System.Drawing.Size(256, 31);\n            this.MacAddress.TabIndex = 1;\n            this.MacAddress.TabStop = false;\n            this.MacAddress.TextChanged += new System.EventHandler(this.OnMacAddressChanged);\n            //\n            // panelJailbreakRow — checkbox + button on same row\n            //\n            this.panelJailbreakRow.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.tableLayoutPanel1.SetColumnSpan(this.panelJailbreakRow, 2);\n            this.panelJailbreakRow.Controls.Add(this.checkBoxBlockSplitIo);\n            this.panelJailbreakRow.Controls.Add(this.buttonJailbreak);\n            this.panelJailbreakRow.Location = new System.Drawing.Point(6, 663);\n            this.panelJailbreakRow.Margin = new System.Windows.Forms.Padding(6, 6, 6, 14);\n            this.panelJailbreakRow.Name = \"panelJailbreakRow\";\n            this.panelJailbreakRow.Size = new System.Drawing.Size(940, 71);\n            this.panelJailbreakRow.TabIndex = 9;\n            //\n            // checkBoxBlockSplitIo\n            //\n            this.checkBoxBlockSplitIo.Anchor = System.Windows.Forms.AnchorStyles.Left;\n            this.checkBoxBlockSplitIo.AutoSize = true;\n            this.checkBoxBlockSplitIo.Location = new System.Drawing.Point(0, 23);\n            this.checkBoxBlockSplitIo.Name = \"checkBoxBlockSplitIo\";\n            this.checkBoxBlockSplitIo.Size = new System.Drawing.Size(165, 29);\n            this.checkBoxBlockSplitIo.TabIndex = 0;\n            this.checkBoxBlockSplitIo.Text = \"Block cloud feature service (?)\";\n            this.checkBoxBlockSplitIo.UseVisualStyleBackColor = true;\n            this.toolTip.SetToolTip(this.checkBoxBlockSplitIo,\n                \"Checked (Recommended): Composer reads feature flags from a local cache\\r\\n\" +\n                \"that the jailbreak controls, enabling functionality like controller updates.\\r\\n\\r\\n\" +\n                \"Unchecked: Composer contacts Control4's cloud service (split.io) for feature\\r\\n\" +\n                \"flags. Some features may be restricted or not work at all.\");\n            //\n            // buttonJailbreak\n            //\n            this.buttonJailbreak.Anchor = System.Windows.Forms.AnchorStyles.Right;\n            this.buttonJailbreak.Image = global::Garry.Control4.Jailbreak.Properties.Resources.cup_cake;\n            this.buttonJailbreak.Location = new System.Drawing.Point(676, 3);\n            this.buttonJailbreak.Margin = new System.Windows.Forms.Padding(6);\n            this.buttonJailbreak.Name = \"buttonJailbreak\";\n            this.buttonJailbreak.Size = new System.Drawing.Size(258, 65);\n            this.buttonJailbreak.TabIndex = 1;\n            this.buttonJailbreak.Text = \" Jailbreak\";\n            this.buttonJailbreak.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            this.buttonJailbreak.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\n            this.buttonJailbreak.UseVisualStyleBackColor = true;\n            this.buttonJailbreak.Click += new System.EventHandler(this.DoJailbreak);\n            //\n            // labelManagementPack\n            //\n            this.labelManagementPack.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n            | System.Windows.Forms.AnchorStyles.Left)\n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.labelManagementPack.AutoSize = true;\n            this.tableLayoutPanel1.SetColumnSpan(this.labelManagementPack, 2);\n            this.labelManagementPack.Font = new System.Drawing.Font(\"Microsoft YaHei\", 16F, System.Drawing.FontStyle.Bold);\n            this.labelManagementPack.ForeColor = System.Drawing.SystemColors.Highlight;\n            this.labelManagementPack.Location = new System.Drawing.Point(0, 762);\n            this.labelManagementPack.Margin = new System.Windows.Forms.Padding(0, 14, 0, 28);\n            this.labelManagementPack.Name = \"labelManagementPack\";\n            this.labelManagementPack.Size = new System.Drawing.Size(952, 57);\n            this.labelManagementPack.TabIndex = 10;\n            this.labelManagementPack.Text = \"MANAGEMENT PACKS\";\n            //\n            // labelManagementPackDesc\n            //\n            this.labelManagementPackDesc.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n            | System.Windows.Forms.AnchorStyles.Left)\n            | System.Windows.Forms.AnchorStyles.Right)));\n            this.labelManagementPackDesc.Location = new System.Drawing.Point(6, 847);\n            this.labelManagementPackDesc.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);\n            this.labelManagementPackDesc.Name = \"labelManagementPackDesc\";\n            this.labelManagementPackDesc.Size = new System.Drawing.Size(670, 65);\n            this.labelManagementPackDesc.TabIndex = 11;\n            this.labelManagementPackDesc.Text = \"Management packs contain driver definitions that Composer needs for your OS versio\" +\n    \"n. Download and install the matching pack before launching Composer.\";\n            //\n            // buttonInstallMgmtPack\n            //\n            this.buttonInstallMgmtPack.Anchor = System.Windows.Forms.AnchorStyles.Right;\n            this.buttonInstallMgmtPack.Image = global::Garry.Control4.Jailbreak.Properties.Resources.download;\n            this.buttonInstallMgmtPack.Location = new System.Drawing.Point(688, 850);\n            this.buttonInstallMgmtPack.Margin = new System.Windows.Forms.Padding(6);\n            this.buttonInstallMgmtPack.Name = \"buttonInstallMgmtPack\";\n            this.buttonInstallMgmtPack.Size = new System.Drawing.Size(258, 65);\n            this.buttonInstallMgmtPack.TabIndex = 12;\n            this.buttonInstallMgmtPack.Text = \" Install Pack\";\n            this.buttonInstallMgmtPack.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            this.buttonInstallMgmtPack.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\n            this.buttonInstallMgmtPack.UseVisualStyleBackColor = true;\n            this.buttonInstallMgmtPack.Click += new System.EventHandler(this.InstallManagementPack);\n            //\n            // Jailbreak\n            //\n            this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.AutoSize = true;\n            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n            this.BackColor = System.Drawing.SystemColors.Window;\n            this.Controls.Add(this.tableLayoutPanel1);\n            this.Margin = new System.Windows.Forms.Padding(6);\n            this.Name = \"Jailbreak\";\n            this.Size = new System.Drawing.Size(1000, 923);\n            this.tableLayoutPanel1.ResumeLayout(false);\n            this.tableLayoutPanel1.PerformLayout();\n            this.panelCredentials.ResumeLayout(false);\n            this.panelCredentials.PerformLayout();\n            this.panelMac.ResumeLayout(false);\n            this.panelMac.PerformLayout();\n            this.panelJailbreakRow.ResumeLayout(false);\n            this.panelJailbreakRow.PerformLayout();\n            this.ResumeLayout(false);\n        }\n\n        #endregion\n\n        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n        private System.Windows.Forms.Label labelGettingComposer;\n        private System.Windows.Forms.Label labelGettingComposerDesc;\n        private System.Windows.Forms.Button buttonSearchGoogle;\n        private System.Windows.Forms.Button buttonReddit;\n        private System.Windows.Forms.Label labelJailbreak;\n        private System.Windows.Forms.Label labelJailbreakDesc;\n        private System.Windows.Forms.Label labelIpAddress;\n        public System.Windows.Forms.TextBox IpAddress;\n        private System.Windows.Forms.Label labelUsername;\n        private System.Windows.Forms.TextBox Username;\n        private System.Windows.Forms.Label labelPassword;\n        private System.Windows.Forms.TextBox Password;\n        private System.Windows.Forms.Label labelMacAddress;\n        public System.Windows.Forms.TextBox MacAddress;\n        public System.Windows.Forms.CheckBox checkBoxBlockSplitIo;\n        private System.Windows.Forms.Button buttonJailbreak;\n        private System.Windows.Forms.Label labelManagementPack;\n        private System.Windows.Forms.Label labelManagementPackDesc;\n        private System.Windows.Forms.Button buttonInstallMgmtPack;\n        private System.Windows.Forms.Panel panelCredentials;\n        private System.Windows.Forms.Panel panelMac;\n        private System.Windows.Forms.Panel panelJailbreakRow;\n        private System.Windows.Forms.ToolTip toolTip;\n    }\n}\n"
  },
  {
    "path": "UI/Jailbreak.cs",
    "content": "using Renci.SshNet;\nusing Renci.SshNet.Common;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Security.Cryptography;\nusing System.Security.Cryptography.X509Certificates;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Web.Script.Serialization;\nusing System.Windows.Forms;\nusing System.Xml.Linq;\nusing Microsoft.Win32;\n\nnamespace Garry.Control4.Jailbreak.UI\n{\n    public partial class Jailbreak : UserControl\n    {\n        private readonly MainWindow _mainWindow;\n        private string _cachedJwtToken;\n        private bool _loading;\n        private string _directorVersion;\n        private string _controllerCommonName;\n        private string _lastCheckedIp;\n        private readonly Timer _connectionTimer = new Timer { Interval = 10000 };\n        private readonly Timer _debounceTimer = new Timer { Interval = 800 };\n\n        // Composer install path detection\n        public string ComposerInstallDir { get; private set; }\n\n        private string OpenSslExe => ComposerInstallDir != null\n            ? Path.Combine(ComposerInstallDir, @\"RemoteAccess\\bin\\openssl.exe\")\n            : null;\n\n        private static readonly string[] WellKnownInstallPaths =\n        {\n            @\"C:\\Program Files (x86)\\Control4\\Composer\\Pro\",\n            @\"C:\\Program Files\\Control4\\Composer\\Pro\"\n        };\n\n        private static string DetectComposerInstallDir()\n        {\n            foreach (var path in WellKnownInstallPaths)\n            {\n                if (ValidateInstallDir(path))\n                    return path;\n            }\n\n            return DetectFromRegistry();\n        }\n\n        private static bool ValidateInstallDir(string dir)\n        {\n            if (string.IsNullOrEmpty(dir) || !Directory.Exists(dir))\n                return false;\n            return File.Exists(Path.Combine(dir, \"ComposerPro.exe\")) &&\n                   File.Exists(Path.Combine(dir, @\"RemoteAccess\\bin\\openssl.exe\"));\n        }\n\n        private static string DetectFromRegistry()\n        {\n            const string uninstallPath = @\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\";\n            var views = new[] { RegistryView.Registry32, RegistryView.Registry64 };\n\n            foreach (var view in views)\n            {\n                try\n                {\n                    using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, view))\n                    using (var key = hklm.OpenSubKey(uninstallPath))\n                    {\n                        if (key == null) continue;\n                        foreach (var subKeyName in key.GetSubKeyNames())\n                        {\n                            try\n                            {\n                                using (var subKey = key.OpenSubKey(subKeyName))\n                                {\n                                    var displayName = subKey?.GetValue(\"DisplayName\")?.ToString() ?? \"\";\n                                    if (displayName.IndexOf(\"Composer Pro\", StringComparison.OrdinalIgnoreCase) >= 0)\n                                    {\n                                        var installLocation = subKey?.GetValue(\"InstallLocation\")?.ToString();\n                                        if (!string.IsNullOrEmpty(installLocation) && ValidateInstallDir(installLocation))\n                                            return installLocation.TrimEnd('\\\\');\n                                    }\n                                }\n                            }\n                            catch\n                            {\n                                // ignored\n                            }\n                        }\n                    }\n                }\n                catch\n                {\n                    // ignored\n                }\n            }\n\n            return null;\n        }\n\n        public Jailbreak(MainWindow mainWindow)\n        {\n            _mainWindow = mainWindow;\n\n            InitializeComponent();\n            checkBoxBlockSplitIo.CheckedChanged += checkBoxBlockSplitIo_CheckedChanged;\n            Username.TextChanged += OnUsernameChanged;\n            Password.TextChanged += OnPasswordChanged;\n            _connectionTimer.Tick += (s, ev) => _ = CheckConnection();\n            _debounceTimer.Tick += (s, ev) => { _debounceTimer.Stop(); _ = CheckConnection(); };\n            Load += Jailbreak_Load;\n        }\n\n        private void Jailbreak_Load(object sender, EventArgs e)\n        {\n            _loading = true;\n\n            checkBoxBlockSplitIo.Checked = Properties.Settings.Default.BlockSplitIoChecked;\n\n            // Restore cached input values before auto-derivation kicks in\n            var settings = Properties.Settings.Default;\n            if (!string.IsNullOrEmpty(settings.LastIpAddress))\n                IpAddress.Text = settings.LastIpAddress;\n            if (!string.IsNullOrEmpty(settings.LastUsername))\n                Username.Text = settings.LastUsername;\n            if (!string.IsNullOrEmpty(settings.LastMacAddress))\n                MacAddress.Text = settings.LastMacAddress;\n            if (!string.IsNullOrEmpty(settings.LastPassword))\n                Password.Text = settings.LastPassword;\n\n            _loading = false;\n\n            // Check connection to restored IP and start periodic refresh\n            _ = CheckConnection();\n            _connectionTimer.Start();\n\n            // Auto-detect Composer install path\n            var savedDir = settings.ComposerInstallDir;\n            if (!string.IsNullOrEmpty(savedDir) && ValidateInstallDir(savedDir))\n            {\n                ComposerInstallDir = savedDir;\n            }\n            else\n            {\n                ComposerInstallDir = DetectComposerInstallDir();\n            }\n\n        }\n\n        private void checkBoxBlockSplitIo_CheckedChanged(object sender, EventArgs e)\n        {\n            Properties.Settings.Default.BlockSplitIoChecked = checkBoxBlockSplitIo.Checked;\n            Properties.Settings.Default.Save();\n        }\n\n        // -------------------------------------------------------------------\n        // Jailbreak button — the one-click orchestrator\n        // -------------------------------------------------------------------\n\n        private void DoJailbreak(object sender, EventArgs e)\n        {\n            var log = new LogWindow(_mainWindow, \"Jailbreak\");\n            var warnings = new List<string>();\n\n            try\n            {\n                // 1. Find Composer install dir\n                if (!FindComposerInstallDir(log))\n                    return;\n\n                // 2. Validate prerequisites\n                if (!File.Exists(OpenSslExe))\n                {\n                    log.WriteError($\"Couldn't find {OpenSslExe} - is Composer installed?\\n\");\n                    return;\n                }\n\n                if (!File.Exists(Constants.OpenSslConfig))\n                {\n                    log.WriteError($\"Couldn't find {Constants.OpenSslConfig}\\n\");\n                    return;\n                }\n\n                if (Process.GetProcessesByName(\"ComposerPro\").Length > 0)\n                {\n                    log.WriteError(\"ComposerPro.exe is currently running. Please close Composer and try again.\\n\");\n                    return;\n                }\n\n                // 3. Ensure root CA certs exist (idempotent via schema version)\n                log.WriteHeader(\"ROOT CA\");\n                if (!EnsureRootCaCerts(log))\n                    return;\n\n                // 4. Generate Composer cert (always regenerate — short-lived)\n                log.WriteHeader(\"COMPOSER CERTIFICATE\");\n                if (!GenerateComposerCert(log))\n                    return;\n\n                // 5. Ensure MQTT JWT signing keypair exists (OS 4.2+)\n                log.WriteHeader(\"JWT SIGNING KEYPAIR\");\n                if (!EnsureJwtSigningKeyPair(log))\n                    return;\n\n                // 6. Patch ComposerPro.exe.config (idempotent)\n                log.WriteHeader(\"PATCH CONFIG\");\n                PatchConfigFile(log);\n\n                // 7-11. Deploy files + settings\n                log.WriteHeader(\"DEPLOY FILES\");\n\n                var configFolder = GetComposerConfigFolder();\n                DeployComposerFiles(log, configFolder);\n                WriteFeatureFlags(log, configFolder);\n                UpdateUpdateManagerSettings(log, configFolder);\n                ConfigureSplitIoBlock(log, checkBoxBlockSplitIo.Checked);\n                EnsureDealerAccount(log, configFolder);\n                WriteLicenseFile(log, configFolder);\n\n                // 11. Patch Director (SSH)\n                log.WriteHeader(\"PATCH DIRECTOR\");\n\n                bool directorModified;\n                try\n                {\n                    directorModified = PatchDirector(log, warnings);\n                }\n                catch (Exception ex)\n                {\n                    log.WriteError(\"Director patching failed:\\n\");\n                    log.WriteError(ex);\n                    log.WriteNormal(\"\\nLocal Composer patching succeeded. Run the jailbreak again to retry director patching.\\n\");\n                    return;\n                }\n\n                // Write MQTT JWT cache (OS 4.2+). Harmless on earlier OS — Composer only\n                // consults this cache when the controller advertises SupportsMqtt.\n                log.WriteHeader(\"JWT CACHE\");\n                WriteJwtCache(log, configFolder, _controllerCommonName);\n\n                // 12. Reboot Director if cert chains were modified or a previous reboot is pending\n                if (directorModified)\n                {\n                    log.WriteNormal(\"Director needs a reboot to apply certificate changes.\\n\");\n\n                    DialogResult rebootChoice = DialogResult.None;\n                    void AskReboot()\n                    {\n                        rebootChoice = MessageBox.Show(\n                            FindForm(),\n                            \"The director needs to reboot for certificate changes to take effect.\\n\\n\" +\n                            \"This will temporarily take your Control4 system offline.\\n\\n\" +\n                            \"Reboot now?\",\n                            \"Director Reboot Required\",\n                            MessageBoxButtons.YesNo,\n                            MessageBoxIcon.Question);\n                    }\n\n                    if (InvokeRequired)\n                        Invoke((Action)AskReboot);\n                    else\n                        AskReboot();\n\n                    if (rebootChoice == DialogResult.Yes)\n                    {\n                        RebootDirector(log, warnings);\n                        _directorVersion = null;\n                    }\n                    else\n                    {\n                        log.WriteNormal(\"Skipping reboot for now.\\n\");\n                        warnings.Add(\n                            \"Director reboot is still needed for cert changes to take effect. \" +\n                            \"Power cycle the controller or run the jailbreak again to be prompted.\\n\");\n                    }\n                }\n                else\n                {\n                    log.WriteTrace(\"Director certs already up to date — no reboot needed.\\n\");\n                }\n\n                log.WriteHeader(\"DONE\");\n                log.WriteSuccess(\"Jailbreak complete!\\n\");\n                log.WriteNormal(\n                    \"If Composer shows a registration renewal warning, close Composer and run this again.\\n\");\n            }\n            catch (Exception ex)\n            {\n                log.WriteError(ex);\n            }\n            finally\n            {\n                if (warnings.Count > 0)\n                {\n                    log.WriteHeader(\"WARNINGS\");\n                    for (var i = 0; i < warnings.Count; i++)\n                    {\n                        if (i > 0) log.WriteNormal(\"\\n\");\n                        log.WriteWarning(warnings[i]);\n                    }\n                }\n            }\n        }\n\n        // -------------------------------------------------------------------\n        // Composer install dir detection\n        // -------------------------------------------------------------------\n\n        private bool FindComposerInstallDir(LogWindow log)\n        {\n            if (ComposerInstallDir != null && ValidateInstallDir(ComposerInstallDir))\n            {\n                log.WriteNormal($\"Composer install: {ComposerInstallDir}\\n\");\n                return true;\n            }\n\n            // Try auto-detection\n            var detected = DetectComposerInstallDir();\n            if (detected != null)\n            {\n                ComposerInstallDir = detected;\n                Properties.Settings.Default.ComposerInstallDir = detected;\n                Properties.Settings.Default.Save();\n\n                log.WriteNormal($\"Auto-detected Composer at: {detected}\\n\");\n                return true;\n            }\n\n            // Ask user to browse\n            log.WriteNormal(\"Composer not found in standard locations. Please locate ComposerPro.exe.\\n\");\n\n            string selectedDir = null;\n            void AskUser()\n            {\n                using (var open = new OpenFileDialog())\n                {\n                    open.Filter = @\"ComposerPro|ComposerPro.exe\";\n                    open.Title = @\"Locate ComposerPro.exe\";\n                    open.InitialDirectory = @\"C:\\Program Files (x86)\";\n                    if (open.ShowDialog() == DialogResult.OK && !string.IsNullOrEmpty(open.FileName))\n                    {\n                        selectedDir = Path.GetDirectoryName(open.FileName);\n                    }\n                }\n            }\n\n            if (InvokeRequired)\n                Invoke((Action)AskUser);\n            else\n                AskUser();\n\n            if (selectedDir == null)\n            {\n                log.WriteError(\"Cancelled.\\n\");\n                return false;\n            }\n\n            if (!ValidateInstallDir(selectedDir))\n            {\n                log.WriteError($\"{selectedDir} doesn't contain ComposerPro.exe and openssl.exe\\n\");\n                return false;\n            }\n\n            ComposerInstallDir = selectedDir;\n            Properties.Settings.Default.ComposerInstallDir = selectedDir;\n            Properties.Settings.Default.Save();\n            log.WriteNormal($\"Using Composer at: {selectedDir}\\n\");\n            return true;\n        }\n\n        // -------------------------------------------------------------------\n        // Root CA certificate generation (idempotent via schema version)\n        // -------------------------------------------------------------------\n\n        private bool EnsureRootCaCerts(LogWindow log)\n        {\n            if (!Directory.Exists(Constants.CertsFolder))\n            {\n                log.WriteTrace($\"Creating {Constants.CertsFolder} folder\\n\");\n                Directory.CreateDirectory(Constants.CertsFolder);\n            }\n\n            var schemaFile = $\"{Constants.CertsFolder}/.schema-version\";\n            var needsRegeneration = true;\n\n            if (File.Exists($\"{Constants.CertsFolder}/public.pem\") &&\n                File.Exists($\"{Constants.CertsFolder}/private.key\"))\n            {\n                if (File.Exists(schemaFile))\n                {\n                    var storedVersion = File.ReadAllText(schemaFile).Trim();\n                    if (storedVersion == Constants.CertSchemaVersion.ToString())\n                    {\n                        log.WriteTrace(\"Root CA certs exist and schema version matches — skipping.\\n\");\n                        needsRegeneration = false;\n                    }\n                    else\n                    {\n                        log.WriteNormal($\"Schema version changed ({storedVersion} -> {Constants.CertSchemaVersion}) — regenerating.\\n\");\n                    }\n                }\n                else\n                {\n                    log.WriteNormal(\"No schema version file — regenerating.\\n\");\n                }\n            }\n            else\n            {\n                log.WriteNormal(\"Root CA certs not found — generating.\\n\");\n            }\n\n            if (needsRegeneration)\n            {\n                log.WriteNormal(\"Generating private + public keys...\\n\");\n                var exitCode = RunProcessPrintOutput(\n                    log,\n                    OpenSslExe,\n                    \"req -new -x509 -sha256 -nodes \" +\n                    $\"-days {Constants.CertificateExpireDays} \" +\n                    \"-newkey rsa:2048 \" +\n                    $\"-keyout \\\"{Constants.CertsFolder}/private.key\\\" \" +\n                    \"-extensions v3_ca \" +\n                    \"-subj \\\"/C=US/ST=Utah/L=Draper/O=Control4 Corporation/CN=Control4 Corporation CA/emailAddress=pki@control4.com/\\\" \" +\n                    $\"-out \\\"{Constants.CertsFolder}/public.pem\\\"\"\n                );\n\n                if (exitCode != 0)\n                {\n                    log.WriteError(\"Root CA generation failed.\\n\");\n                    return false;\n                }\n\n                File.WriteAllText(schemaFile, Constants.CertSchemaVersion.ToString());\n                log.WriteSuccess(\"Root CA generated.\\n\");\n            }\n\n            log.WriteNormal($\"Creating {Constants.ComposerCertName}... \");\n            var output = RunProcessGetOutput(\n                OpenSslExe,\n                $\"x509 -in \\\"{Constants.CertsFolder}/public.pem\\\" -text\"\n            );\n            File.WriteAllText($\"{Constants.CertsFolder}/{Constants.ComposerCertName}\", output);\n            log.WriteSuccess(\"done\\n\");\n\n            return true;\n        }\n\n        // -------------------------------------------------------------------\n        // Composer cert generation (always regenerated)\n        // -------------------------------------------------------------------\n\n        private bool GenerateComposerCert(LogWindow log)\n        {\n            log.WriteNormal(\"Creating signing request + key...\\n\");\n            var exitCode = RunProcessPrintOutput(\n                log,\n                OpenSslExe,\n                \"req -new -nodes \" +\n                $\"-newkey rsa:2048 -keyout {Constants.CertsFolder}/composer.key \" +\n                $\"-subj \\\"/C=US/ST=Utah/L=Draper/CN={Constants.CertificateCn}\\\" \" +\n                $\"-out {Constants.CertsFolder}/composer.csr\"\n            );\n\n            if (exitCode != 0)\n            {\n                log.WriteError(\"Failed.\\n\");\n                return false;\n            }\n\n            File.WriteAllText($\"{Constants.CertsFolder}/ext.conf\",\n                @\"[v3_client]\\n\" +\n                $@\"subjectAltName=DNS:{Constants.CertificateCn}\\n\" +\n                @\"extendedKeyUsage=clientAuth,serverAuth\\n\" +\n                @\"basicConstraints=CA:FALSE\\n\" +\n                @\"keyUsage=digitalSignature,keyEncipherment\");\n\n            log.WriteNormal(\"Signing certificate...\\n\");\n            exitCode = RunProcessPrintOutput(\n                log,\n                OpenSslExe,\n                \"x509 -req \" +\n                $\"-in {Constants.CertsFolder}/composer.csr \" +\n                $\"-CA {Constants.CertsFolder}/public.pem \" +\n                $\"-CAkey {Constants.CertsFolder}/private.key \" +\n                \"-CAcreateserial \" +\n                $\"-out {Constants.CertsFolder}/composer.pem \" +\n                \"-days 1095 \" +\n                \"-sha256 \" +\n                $\"-extfile {Constants.CertsFolder}/ext.conf -extensions v3_client\"\n            );\n            if (exitCode != 0)\n            {\n                log.WriteError(\"Failed.\\n\");\n                return false;\n            }\n\n            log.WriteNormal(\"Creating composer.p12...\\n\");\n            exitCode = RunProcessPrintOutput(\n                log,\n                OpenSslExe,\n                \"pkcs12 \" +\n                \"-export \" +\n                $\"-out \\\"{Constants.CertsFolder}/composer.p12\\\" \" +\n                $\"-inkey \\\"{Constants.CertsFolder}/composer.key\\\" \" +\n                $\"-in \\\"{Constants.CertsFolder}/composer.pem\\\" \" +\n                $\"-certfile \\\"{Constants.CertsFolder}/public.pem\\\" \" +\n                $\"-passout pass:{Constants.CertPassword}\"\n            );\n\n            if (exitCode != 0)\n            {\n                log.WriteError(\"Failed.\\n\");\n                return false;\n            }\n\n            log.WriteSuccess(\"Composer certificate generated.\\n\");\n            return true;\n        }\n\n        // -------------------------------------------------------------------\n        // JWT signing keypair — used to forge MQTT auth tokens on OS 4.2+\n        // -------------------------------------------------------------------\n\n        private bool EnsureJwtSigningKeyPair(LogWindow log)\n        {\n            var keyPath = $\"{Constants.CertsFolder}/jailbreak_api.key\";\n            var pemPath = $\"{Constants.CertsFolder}/jailbreak_api.pem\";\n\n            if (File.Exists(keyPath) && File.Exists(pemPath))\n            {\n                log.WriteTrace(\"JWT signing keypair already exists — skipping.\\n\");\n                return true;\n            }\n\n            log.WriteNormal(\"Generating JWT signing private key...\\n\");\n            var exitCode = RunProcessPrintOutput(log, OpenSslExe,\n                $\"genrsa -out \\\"{keyPath}\\\" 2048\");\n            if (exitCode != 0)\n            {\n                log.WriteError(\"Key generation failed.\\n\");\n                return false;\n            }\n\n            log.WriteNormal(\"Generating JWT signing certificate...\\n\");\n            exitCode = RunProcessPrintOutput(log, OpenSslExe,\n                \"req -new -x509 \" +\n                $\"-key \\\"{keyPath}\\\" \" +\n                $\"-out \\\"{pemPath}\\\" \" +\n                \"-days 36500 \" +\n                \"-subj \\\"/C=US/ST=Utah/L=Draper/O=Control4 Corporation/CN=composerexpress_auth/emailAddress=pki@control4.com\\\"\");\n            if (exitCode != 0)\n            {\n                log.WriteError(\"Certificate generation failed.\\n\");\n                return false;\n            }\n\n            log.WriteSuccess(\"JWT signing keypair generated.\\n\");\n            return true;\n        }\n\n        // -------------------------------------------------------------------\n        // Config file patching (dead proxy + bypasslist)\n        // -------------------------------------------------------------------\n\n        private void PatchConfigFile(LogWindow log)\n        {\n            var configPath = Path.Combine(ComposerInstallDir, \"ComposerPro.exe.config\");\n            if (!File.Exists(configPath))\n            {\n                log.WriteError($\"Config file not found: {configPath}\\n\");\n                return;\n            }\n\n            log.WriteNormal($\"Patching {configPath}...\\n\");\n\n            try\n            {\n                var xmlDoc = XDocument.Load(configPath);\n\n                var systemNet = xmlDoc.Root?.Element(\"system.net\");\n                if (systemNet == null)\n                {\n                    log.WriteError(\"Could not find the <system.net> node in the configuration file.\\n\");\n                    return;\n                }\n\n                var desiredProxy = new XElement(\"defaultProxy\",\n                    new XElement(\"proxy\",\n                        new XAttribute(\"usesystemdefault\", \"false\"),\n                        new XAttribute(\"proxyaddress\", \"http://127.0.0.1:31337/\"),\n                        new XAttribute(\"bypassonlocal\", \"true\")\n                    ),\n                    new XElement(\"bypasslist\",\n                        new XElement(\"add\",\n                            new XAttribute(\"address\", @\"services\\.control4\\.com\")),\n                        new XElement(\"add\",\n                            new XAttribute(\"address\", @\"update2\\.control4\\.com\")),\n                        new XElement(\"add\",\n                            new XAttribute(\"address\", @\"c4updates\\.control4\\.com\"))\n                    )\n                );\n\n                var existingProxy = systemNet.Element(\"defaultProxy\");\n                if (existingProxy != null &&\n                    XNode.DeepEquals(existingProxy, desiredProxy))\n                {\n                    log.WriteTrace(\"Config file already patched.\\n\");\n                    return;\n                }\n\n                existingProxy?.Remove();\n                systemNet.Add(desiredProxy);\n\n                // Only back up once — skip if a backup already exists\n                var backupPath = configPath + \".backup\";\n                if (!File.Exists(backupPath))\n                {\n                    log.WriteNormal(\"Writing backup...\\n\");\n                    File.Copy(configPath, backupPath);\n                }\n\n                log.WriteNormal(\"Writing patched config...\\n\");\n                xmlDoc.Save(configPath);\n\n                log.WriteSuccess(\"Config file patched.\\n\");\n            }\n            catch (Exception ex)\n            {\n                log.WriteError($\"Config patch error: {ex.Message}\\n\");\n            }\n        }\n\n        // -------------------------------------------------------------------\n        // Composer file deployment + settings\n        // -------------------------------------------------------------------\n\n        private static string GetComposerConfigFolder()\n        {\n            var configFolder = $\"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}/Control4\";\n            Directory.CreateDirectory($\"{configFolder}/Composer\");\n            return configFolder;\n        }\n\n        private static void DeployComposerFiles(LogWindow log, string configFolder)\n        {\n            CopyFile(log, $\"{Constants.CertsFolder}/{Constants.ComposerCertName}\",\n                $\"{configFolder}/Composer/{Constants.ComposerCertName}\");\n            CopyFile(log, $\"{Constants.CertsFolder}/composer.p12\", $\"{configFolder}/Composer/composer.p12\");\n        }\n\n        private static void WriteFeatureFlags(LogWindow log, string configFolder)\n        {\n            WriteFile(log, $\"{configFolder}/Composer/FeaturesConfiguration.json\",\n                @\"{\" +\n                @\"\"\"composer-x4-updatemanger-restrict-override\"\":{\"\"Result\"\":true,\"\"Config\"\":null},\" +\n                @\"\"\"connection-whitelist\"\":{\"\"Result\"\":false,\"\"Config\"\":\"\"[]\"\"},\" +\n                @\"\"\"os-pack-on-connect\"\":{\"\"Result\"\":true,\"\"Config\"\":null}\" +\n                @\"}\");\n        }\n\n        private static void UpdateUpdateManagerSettings(LogWindow log, string configFolder)\n        {\n            log.WriteNormal(\"Setting Update Manager URL... \");\n            var settingsPath = $\"{configFolder}/Composer/ComposerUpdateManagerSettings.Config\";\n            try\n            {\n                var settingsDoc = File.Exists(settingsPath) ? XDocument.Load(settingsPath) : XDocument.Parse(\"<settings/>\");\n\n                var root = settingsDoc.Root ?? new XElement(\"settings\");\n                XNamespace xsi = \"http://www.w3.org/2001/XMLSchema-instance\";\n                XNamespace xsd = \"http://www.w3.org/2001/XMLSchema\";\n\n                root.Element(\"UpdateURLList30\")?.Remove();\n                root.Add(new XElement(\"UpdateURLList30\",\n                    new XAttribute(\"type\", \"System.Collections.ArrayList\"),\n                    new XElement(\"ArrayOfAnyType\",\n                        new XAttribute(XNamespace.Xmlns + \"xsi\", xsi),\n                        new XAttribute(XNamespace.Xmlns + \"xsd\", xsd),\n                        new XElement(\"anyType\",\n                            new XAttribute(xsi + \"type\", \"xsd:string\"),\n                            Constants.UpdatesExperienceUrl))));\n\n                settingsDoc.Save(settingsPath);\n                log.WriteSuccess(\"done\\n\");\n            }\n            catch (Exception ex)\n            {\n                log.WriteError($\"Could not update settings: {ex.Message}\\n\");\n                log.WriteWarning($\"Manually enter this URL in the Update Manager:\\n\");\n                log.WriteNormal($\"  {Constants.UpdatesExperienceUrl}\\n\");\n            }\n        }\n\n        private static void ConfigureSplitIoBlock(LogWindow log, bool blockSplitIo)\n        {\n            if (blockSplitIo)\n            {\n                AddLineToFile(log, Constants.WindowsHostsFile, Constants.BlockSplitIoHostsEntry);\n            }\n            else\n            {\n                RemoveLineFromFile(log, Constants.WindowsHostsFile, Constants.BlockSplitIoHostsEntry);\n            }\n        }\n\n        private static void WriteLicenseFile(LogWindow log, string configFolder)\n        {\n            // Composer 2026.x aborts at startup if this file is missing.\n            // Contents aren't validated when OnlineServicesAvailable=false — existence is enough.\n            var path = $\"{configFolder}/Composer/license.xml\";\n            if (File.Exists(path))\n            {\n                log.WriteTrace(\"license.xml already exists\\n\");\n                return;\n            }\n            WriteFile(log, path, @\"<?xml version=\"\"1.0\"\" encoding=\"\"utf-8\"\"?>\n<License>\n  <Name>Composer Pro</Name>\n  <Code>ProLicense</Code>\n  <Expiration>2099-01-01</Expiration>\n  <Status>Active</Status>\n  <Purchased>2024-01-01</Purchased>\n</License>\");\n        }\n\n        private static void EnsureDealerAccount(LogWindow log, string configFolder)\n        {\n            log.WriteNormal(\"Checking dealer account... \");\n            if (!File.Exists($\"{configFolder}/dealeraccount.xml\"))\n            {\n                log.WriteNormal(\"creating\\n\");\n                WriteFile(log, $\"{configFolder}/dealeraccount.xml\", @\"<?xml version=\"\"1.0\"\" encoding=\"\"utf-8\"\"?>\n<DealerAccount>\n  <Username>no</Username>\n  <Employee>False</Employee>\n  <Password>+bJjU5zcsEI=</Password>\n  <UserHash>9390298f3fb0c5b160498935d79cb139aef28e1c47358b4bbba61862b9c26e59</UserHash>\n</DealerAccount>\");\n            }\n            else\n            {\n                log.WriteTrace(\"already exists\\n\");\n            }\n        }\n\n        // -------------------------------------------------------------------\n        // SSH / Director patching — returns true if cert chains were modified\n        // -------------------------------------------------------------------\n\n        private ConnectionInfo SshConnection()\n        {\n            var authMethods = new List<AuthenticationMethod>\n            {\n                new PasswordAuthenticationMethod(Username.Text, Password.Text),\n                new PasswordAuthenticationMethod(Username.Text, \"t0talc0ntr0l4!\")\n            };\n\n            var privateKeyFiles = new List<IPrivateKeySource>();\n            if (Directory.Exists(Constants.KeysFolder))\n            {\n                foreach (var folder in Directory.EnumerateDirectories(Constants.KeysFolder))\n                {\n                    var sshKeyFiles = Directory.EnumerateFiles(folder, \"ssh_host_*_key\");\n                    foreach (var sshKeyFile in sshKeyFiles)\n                    {\n                        privateKeyFiles.Add(new PrivateKeyFile(sshKeyFile));\n                    }\n                }\n            }\n\n            if (privateKeyFiles.Count > 0)\n            {\n                authMethods.Add(new PrivateKeyAuthenticationMethod(\"root\", privateKeyFiles.ToArray()));\n            }\n\n            var sshConnectionInfo = new ConnectionInfo(\n                IpAddress.Text,\n                Username.Text,\n                authMethods.ToArray()\n            )\n            {\n                RetryAttempts = 1,\n                Timeout = TimeSpan.FromSeconds(5)\n            };\n\n            return sshConnectionInfo;\n        }\n\n        /// <summary>\n        /// Patches the director's cert chains via SSH.\n        /// Returns true if a reboot is needed (either from new cert changes or a previous pending reboot).\n        /// </summary>\n        private bool PatchDirector(LogWindow log, List<string> warnings)\n        {\n            if (!File.Exists($\"{Constants.CertsFolder}/public.pem\"))\n            {\n                log.WriteError($\"Couldn't find {Constants.CertsFolder}/public.pem - have you generated certificates?\\n\");\n                return false;\n            }\n\n            var macAddress = MacAddress.Text;\n            var localKeysFolder = $\"{Constants.KeysFolder}/{macAddress}\";\n            if (!string.IsNullOrEmpty(macAddress))\n            {\n                if (!Directory.Exists(localKeysFolder))\n                {\n                    log.WriteTrace($\"Creating {localKeysFolder} Folder\\n\");\n                    Directory.CreateDirectory(localKeysFolder);\n                }\n            }\n\n            var anyModified = false;\n            ScpClient scp = null;\n\n            try\n            {\n                scp = new ScpClient(SshConnection());\n\n                log.WriteNormal(\"Connecting to director via SCP... \");\n                try\n                {\n                    scp.Connect();\n                }\n                catch (Exception)\n                {\n                    log.WriteWarning(\"failed — attempting to restore SSH access\\n\");\n\n                    log.WriteNormal(\"Restoring SSH password authentication... \");\n                    ApplySshRestoreExploit(GetWritableDriverId());\n                    log.WriteSuccess(\"done\\n\");\n\n                    log.WriteNormal(\"Reloading SSH service... \");\n                    ReloadSshService();\n                    log.WriteSuccess(\"done\\n\");\n\n                    log.WriteNormal(\"Waiting for SSH to reload... \");\n                    System.Threading.Thread.Sleep(1000);\n                    log.WriteSuccess(\"done\\n\");\n\n                    log.WriteNormal(\"Reconnecting via SCP... \");\n                    scp.Dispose();\n                    scp = new ScpClient(SshConnection());\n                    scp.Connect();\n                }\n                log.WriteSuccess(\"connected\\n\");\n\n                _controllerCommonName = FetchControllerCommonName(scp);\n\n                SyncControllerClock(log, scp);\n\n                if (DownloadRootDeviceSshKeys(log, scp, localKeysFolder, warnings))\n                {\n                    PatchDirectorySshAuthorizedKeysFile(log, scp, localKeysFolder);\n                }\n\n                log.WriteNormal($\"Reading {Constants.CertsFolder}/public.pem... \");\n                var localCert = File.ReadAllText($\"{Constants.CertsFolder}/public.pem\").Trim();\n                log.WriteSuccess(\"done\\n\");\n\n                anyModified |= PatchRemoteCertChain(log, scp, \"/etc/openvpn/clientca-prod.pem\", localCert);\n                anyModified |= PatchRemoteCertChain(log, scp, \"/opt/control4/etc/ssl/certs/clientca-prod.pem\", localCert);\n                anyModified |= PatchRemoteCertChain(log, scp, \"/etc/mosquitto/certs/ca-chain.pem\", localCert);\n\n                PatchControllerApiPem(log, scp);\n\n                if (anyModified)\n                {\n                    // Write reboot marker — /tmp is cleared on reboot\n                    log.WriteTrace(\"Writing reboot marker...\\n\");\n                    UploadFile(scp, Constants.RebootMarkerPath, DateTime.UtcNow.ToString(\"o\"));\n                }\n                else\n                {\n                    // Check if a previous reboot is still pending\n                    try\n                    {\n                        DownloadFile(scp, Constants.RebootMarkerPath);\n                        log.WriteNormal(\"Previous reboot is still pending.\\n\");\n                        anyModified = true;\n                    }\n                    catch (ScpException)\n                    {\n                        // Marker gone — controller was rebooted\n                    }\n                }\n            }\n            finally\n            {\n                scp?.Dispose();\n            }\n\n            return anyModified;\n        }\n\n        /// <summary>\n        /// Appends jailbreak_api.pem to /opt/control4/etc/ssl/certs/api.pem so the mosquitto-jwt-auth\n        /// plugin (OS 4.2+) accepts JWTs signed with our keypair. Unlike the CA chain patches,\n        /// this is a per-cert append (the plugin's pem_parser iterates every BEGIN CERTIFICATE block)\n        /// and we must kill the daemon to pick up the new key — it only reads the PEM at startup.\n        /// No reboot required — sysmand respawns the daemon within ~10 seconds.\n        ///\n        /// Dedupe strategy: strip any self-signed cert with CN=composerexpress_auth before appending,\n        /// which cleans up orphaned jailbreak certs from previous runs where the local keypair was\n        /// regenerated. The production cert shares the CN but is issued by \"Control4 Primary Root CA\"\n        /// (Subject != Issuer), so it survives the filter.\n        /// </summary>\n        private static void PatchControllerApiPem(LogWindow log, ScpClient scp)\n        {\n            const string remoteFile = \"/opt/control4/etc/ssl/certs/api.pem\";\n            var localPemPath = $\"{Constants.CertsFolder}/jailbreak_api.pem\";\n\n            log.WriteNormal($\"Patching {remoteFile}:\\n\");\n\n            if (!File.Exists(localPemPath))\n            {\n                log.WriteWarning($\"  {localPemPath} missing — skipping\\n\");\n                return;\n            }\n\n            string remotePem;\n            try\n            {\n                log.WriteNormal($\"  Downloading {remoteFile}... \");\n                remotePem = DownloadFile(scp, remoteFile);\n                log.WriteSuccess(\"done\\n\");\n            }\n            catch (ScpException)\n            {\n                log.WriteTrace(\"  file doesn't exist (pre-OS 4.2) — skipping\\n\");\n                return;\n            }\n\n            var ourPem = File.ReadAllText(localPemPath).Trim();\n\n            var kept = ExtractPemBlocks(remotePem)\n                .Where(pem => !IsOrphanJailbreakCert(pem))\n                .ToList();\n\n            var rebuilt = string.Join(\"\\n\", kept.Concat(new[] { ourPem })).Trim() + \"\\n\";\n            var original = string.Join(\"\\n\", ExtractPemBlocks(remotePem)).Trim() + \"\\n\";\n\n            if (rebuilt == original)\n            {\n                log.WriteTrace(\"  (already patched)\\n\");\n                return;\n            }\n\n            var backupFilename = $\"api.pem.{DateTime.Now:yyyy-dd-M--HH-mm-ss}.backup\";\n            log.WriteNormal($\"  Saving remote backup to /opt/control4/etc/ssl/certs/{backupFilename}... \");\n            UploadFile(scp, $\"/opt/control4/etc/ssl/certs/{backupFilename}\", remotePem);\n            log.WriteSuccess(\"done\\n\");\n\n            log.WriteNormal($\"  Saving local backup to {Constants.CertsFolder}/{backupFilename}... \");\n            File.WriteAllText($\"{Constants.CertsFolder}/{backupFilename}\", remotePem);\n            log.WriteSuccess(\"done\\n\");\n\n            log.WriteNormal($\"  Updating {remoteFile}... \");\n            UploadFile(scp, remoteFile, rebuilt);\n            log.WriteSuccess(\"done\\n\");\n\n            log.WriteNormal(\"  Restarting mosquitto-jwt-auth... \");\n            using (var ssh = new SshClient(scp.ConnectionInfo))\n            {\n                ssh.Connect();\n                // Plugin loads the PEM only at startup; sysmand respawns the process within ~10s.\n                ssh.RunCommand(\"pidof mosquitto-jwt-auth | xargs -r kill -9\");\n                ssh.Disconnect();\n            }\n            log.WriteSuccess(\"done\\n\");\n        }\n\n        private static IEnumerable<string> ExtractPemBlocks(string pemText)\n        {\n            const string beginMarker = \"-----BEGIN CERTIFICATE-----\";\n            const string endMarker = \"-----END CERTIFICATE-----\";\n            var startIdx = 0;\n            while ((startIdx = pemText.IndexOf(beginMarker, startIdx, StringComparison.Ordinal)) >= 0)\n            {\n                var endIdx = pemText.IndexOf(endMarker, startIdx, StringComparison.Ordinal);\n                if (endIdx < 0) yield break;\n                yield return pemText.Substring(startIdx, endIdx - startIdx + endMarker.Length).Trim();\n                startIdx = endIdx + endMarker.Length;\n            }\n        }\n\n        private static bool IsOrphanJailbreakCert(string pem)\n        {\n            try\n            {\n                var cert = new X509Certificate2(Encoding.UTF8.GetBytes(pem));\n                var isSelfSigned = cert.Subject == cert.Issuer;\n                var isOurCn = cert.Subject.IndexOf(\"CN=composerexpress_auth\", StringComparison.Ordinal) >= 0;\n                return isSelfSigned && isOurCn;\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Returns true if the cert chain was actually modified, false if already patched or the file doesn't exist.\n        /// </summary>\n        private static bool PatchRemoteCertChain(LogWindow log, ScpClient scp, string remoteFile, string localCert)\n        {\n            log.WriteNormal($\"Patching {remoteFile}:\\n\");\n\n            string remoteCertChain;\n            try\n            {\n                log.WriteNormal($\"  Downloading {remoteFile}... \");\n                remoteCertChain = DownloadFile(scp, remoteFile).Trim();\n                log.WriteSuccess(\"done\\n\");\n            }\n            catch (ScpException)\n            {\n                log.WriteTrace(\"  file doesn't exist - skipping\\n\");\n                return false;\n            }\n\n            var dedupedRemoteCertChain = DedupeX509CertChain(remoteCertChain);\n            if (remoteCertChain == dedupedRemoteCertChain && remoteCertChain.Contains(localCert))\n            {\n                log.WriteTrace(\"  (already patched)\\n\");\n                return false;\n            }\n\n            var directory = (Path.GetDirectoryName(remoteFile) ?? \"\").Replace(\"\\\\\", \"/\");\n            var fileName = Path.GetFileName(remoteFile);\n            var backupFilename = $\"{fileName}.{DateTime.Now:yyyy-dd-M--HH-mm-ss}.backup\";\n\n            log.WriteNormal($\"  Saving remote backup to {directory}/{backupFilename}... \");\n            UploadFile(scp, $\"{directory}/{backupFilename}\", remoteCertChain);\n            log.WriteSuccess(\"done\\n\");\n\n            log.WriteNormal($\"  Saving local backup to {Constants.CertsFolder}/{backupFilename}... \");\n            File.WriteAllText($\"{Constants.CertsFolder}/{backupFilename}\", remoteCertChain);\n            log.WriteSuccess(\"done\\n\");\n\n            remoteCertChain = DedupeX509CertChain(dedupedRemoteCertChain + \"\\n\" + localCert);\n\n            log.WriteNormal($\"  Updating {remoteFile}... \");\n            UploadFile(scp, remoteFile, remoteCertChain);\n            log.WriteSuccess(\"done\\n\");\n\n            return true;\n        }\n\n        private static string DedupeX509CertChain(string certChain)\n        {\n            // Extract complete PEM certificate blocks, skipping any truncated/malformed entries\n            var certs = new List<string>();\n            const string beginMarker = \"-----BEGIN CERTIFICATE-----\";\n            const string endMarker = \"-----END CERTIFICATE-----\";\n            var startIdx = 0;\n            while ((startIdx = certChain.IndexOf(beginMarker, startIdx, StringComparison.Ordinal)) >= 0)\n            {\n                var endIdx = certChain.IndexOf(endMarker, startIdx, StringComparison.Ordinal);\n                if (endIdx < 0) break; // Truncated cert — skip\n                var pem = certChain.Substring(startIdx, endIdx - startIdx + endMarker.Length).Trim();\n                certs.Add(pem);\n                startIdx = endIdx + endMarker.Length;\n            }\n\n            return string.Join(\"\\n\", certs\n                    .GroupBy(cert =>\n                    {\n                        try { return new X509Certificate2(Encoding.UTF8.GetBytes(cert)).Subject; }\n                        catch { return cert; } // Fallback: keep unparseable certs, dedupe by content\n                    })\n                    .Select(group => group.Last()))\n                .Trim();\n        }\n\n        private static bool DownloadRootDeviceSshKeys(LogWindow log, ScpClient scp, string localKeysFolder, List<string> warnings)\n        {\n            log.WriteNormal(\"Downloading ssh keys from device:\\n\");\n            var files = new List<string>\n            {\n                \"ssh_host_rsa_key\",\n                \"ssh_host_rsa_key.pub\",\n                \"ssh_host_ed25519_key\",\n                \"ssh_host_ed25519_key.pub\"\n            };\n            var keysDownloaded = false;\n            var keysExist = false;\n            foreach (var file in files)\n            {\n                var localFile = $\"{localKeysFolder}/{file}\";\n                var remoteFile = $\"/etc/ssh/{file}\";\n                log.WriteNormal($\"  Downloading {remoteFile}... \");\n\n                string key;\n                try\n                {\n                    key = DownloadFile(scp, remoteFile);\n                }\n                catch (ScpException)\n                {\n                    log.WriteTrace(\"ignoring - file doesnt exist\\n\");\n                    continue;\n                }\n\n                keysExist = true;\n\n                if (File.Exists(localFile) && File.ReadAllText(localFile) == key)\n                {\n                    log.WriteTrace(\"already exists\\n\");\n                    continue;\n                }\n\n                File.WriteAllText(localFile, key);\n                log.WriteSuccess(\"done\\n\");\n                keysDownloaded = true;\n            }\n\n            if (keysDownloaded)\n            {\n                warnings.Add(\n                    $\"If you lose the '{Constants.KeysFolder}' folder, connecting to X4 systems \" +\n                    \"becomes more difficult! While SSH password authentication can currently be \" +\n                    \"restored using customer credentials, this capability may not always be \" +\n                    \"available in future firmware versions. Back up this folder somewhere safe.\\n\");\n            }\n            return keysExist;\n        }\n\n        private static void PatchDirectorySshAuthorizedKeysFile(LogWindow log, ScpClient scp, string localKeysFolder)\n        {\n            var localPubKeyFiles = new List<string>\n            {\n                $\"{localKeysFolder}/ssh_host_rsa_key.pub\",\n                $\"{localKeysFolder}/ssh_host_ed25519_key.pub\"\n            }.Where(File.Exists).ToArray();\n            if (localPubKeyFiles.Length == 0)\n            {\n                return;\n            }\n\n            var localAuthorizedKeysFile = $\"{localKeysFolder}/authorized_keys\";\n            const string remoteAuthorizedKeysFile = \"/home/root/.ssh/authorized_keys\";\n\n            log.WriteNormal(\"Patching authorized_keys file on director:\\n\");\n            var localPubKeys = new List<string>();\n            foreach (var localPubKeyFile in localPubKeyFiles)\n            {\n                if (!File.Exists(localPubKeyFile))\n                {\n                    continue;\n                }\n\n                log.WriteNormal($\"  Reading {localPubKeyFile}... \");\n                localPubKeys.Add(File.ReadAllText(localPubKeyFile).Trim());\n                log.WriteSuccess(\"done\\n\");\n            }\n\n            log.WriteNormal($\"  Downloading {remoteAuthorizedKeysFile}... \");\n            var authorizedKeys = \"\";\n            try\n            {\n                authorizedKeys = DownloadFile(scp, remoteAuthorizedKeysFile);\n                log.WriteSuccess(\"done\\n\");\n            }\n            catch (ScpException)\n            {\n                log.WriteTrace(\"ignoring - file doesnt exist\\n\");\n            }\n\n            if (localPubKeys.All(localPubKey => authorizedKeys.Contains(localPubKey)))\n            {\n                log.WriteTrace(\"  (already patched)\\n\");\n                return;\n            }\n\n            var backupSuffix = $\".{DateTime.Now:yyyy-dd-M--HH-mm-ss}.backup\";\n\n            log.WriteNormal($\"  Saving remote backup to {remoteAuthorizedKeysFile}{backupSuffix}... \");\n            UploadFile(scp, $\"{remoteAuthorizedKeysFile}{backupSuffix}\", authorizedKeys);\n            log.WriteSuccess(\"done\\n\");\n\n            log.WriteNormal($\"  Saving local backup to {localAuthorizedKeysFile}{backupSuffix}... \");\n            File.WriteAllText($\"{localAuthorizedKeysFile}{backupSuffix}\", authorizedKeys);\n            log.WriteSuccess(\"done\\n\");\n\n            foreach (var localPubKey in localPubKeys)\n            {\n                if (!authorizedKeys.Contains(localPubKey))\n                {\n                    authorizedKeys = authorizedKeys.Trim() + \"\\n\" + localPubKey.Trim();\n                }\n            }\n\n            log.WriteNormal(\"  Updating remote authorized_keys file... \");\n            UploadFile(scp, remoteAuthorizedKeysFile, authorizedKeys);\n            log.WriteSuccess(\"done\\n\");\n        }\n\n        private void RebootDirector(LogWindow log, List<string> warnings)\n        {\n            try\n            {\n                log.WriteNormal(\"Connecting to director... \");\n\n                using (var ssh = new SshClient(SshConnection()))\n                {\n                    ssh.Connect();\n                    log.WriteSuccess(\"connected\\n\");\n\n                    log.WriteNormal(\"Running reboot command... \");\n                    ssh.RunCommand(\"nohup sh -c '( sleep 2 ; reboot )' >/dev/null 2>&1 &\");\n                    ssh.Disconnect();\n                    log.WriteSuccess(\"done\\n\");\n\n                    warnings.Add(\n                        \"Your system is rebooting — it can take a while. Don't panic, give it 10 minutes!\\n\");\n                }\n            }\n            catch (Exception ex)\n            {\n                log.WriteError(\"Reboot failed:\\n\");\n                log.WriteError(ex);\n            }\n        }\n\n        /// <summary>\n        /// Checks the controller's clock and corrects it if it's more than 24 hours off.\n        /// A wrong clock (e.g. dead CMOS battery) causes TLS certificate validation failures.\n        /// </summary>\n        private static void SyncControllerClock(LogWindow log, ScpClient scp)\n        {\n            try\n            {\n                using (var ssh = new SshClient(scp.ConnectionInfo))\n                {\n                    ssh.Connect();\n\n                    var result = ssh.RunCommand(\"date +%s\");\n                    if (result.ExitStatus != 0 || !long.TryParse(result.Result.Trim(), out var remoteEpoch))\n                    {\n                        ssh.Disconnect();\n                        return;\n                    }\n\n                    var localEpoch = DateTimeOffset.UtcNow.ToUnixTimeSeconds();\n                    var drift = Math.Abs(localEpoch - remoteEpoch);\n\n                    if (drift > 120) // More than 2 minutes off\n                    {\n                        var utcNow = DateTime.UtcNow.ToString(\"yyyy-MM-dd HH:mm:ss\");\n                        log.WriteNormal($\"Controller clock is off by {TimeSpan.FromSeconds(drift):d'd 'h'h 'm'm'} — correcting... \");\n                        ssh.RunCommand($\"date -u -s \\\"{utcNow}\\\"\");\n                        log.WriteSuccess(\"done\\n\");\n                    }\n\n                    log.WriteTrace(\"Syncing hardware clock... \");\n                    ssh.RunCommand(\"hwclock -w 2>/dev/null\");\n                    log.WriteTrace(\"done\\n\");\n\n                    ssh.Disconnect();\n                }\n            }\n            catch\n            {\n                // Non-fatal — don't block the jailbreak if clock sync fails\n            }\n        }\n\n        /// <summary>\n        /// Fetches the controller's common name (control4_{model}_{mac}) by reading the subject CN\n        /// from its own cert. This is what Composer uses to look up the JWT cache and what the\n        /// mosquitto-jwt-auth plugin expects in the signed JWT's CommonName claim.\n        /// NOTE: the Linux hostname uses a different format (hyphen-separated, no model prefix)\n        /// and is NOT what we want.\n        /// </summary>\n        private static string FetchControllerCommonName(ScpClient scp)\n        {\n            // agent.pem and client.pem both carry the controller's CN; agent.pem is the canonical one.\n            foreach (var remote in new[]\n                     {\n                         \"/opt/control4/etc/ssl/certs/agent.pem\",\n                         \"/opt/control4/etc/ssl/certs/client.pem\"\n                     })\n            {\n                try\n                {\n                    var pem = DownloadFile(scp, remote);\n                    var block = ExtractPemBlocks(pem).FirstOrDefault();\n                    if (block == null) continue;\n                    var cert = new X509Certificate2(Encoding.UTF8.GetBytes(block));\n                    var cn = cert.GetNameInfo(X509NameType.SimpleName, false);\n                    if (!string.IsNullOrEmpty(cn)) return cn;\n                }\n                catch\n                {\n                    // try next\n                }\n            }\n            return null;\n        }\n\n        // -------------------------------------------------------------------\n        // JWT cache (OS 4.2+ — bypasses the ControllersForm cloud-status gate)\n        // -------------------------------------------------------------------\n\n        private bool WriteJwtCache(LogWindow log, string configFolder, string commonName)\n        {\n            if (string.IsNullOrEmpty(commonName))\n            {\n                log.WriteWarning(\"Controller common name unknown — skipping JWT cache write.\\n\");\n                return false;\n            }\n\n            var cacheDir = $\"{configFolder}/JwtCache\";\n            Directory.CreateDirectory(cacheDir);\n            var cachePath = $\"{cacheDir}/{commonName}.jwtcache\";\n\n            // Idempotency: skip if a non-stale entry is already present.\n            if (File.Exists(cachePath) && IsJwtCacheFresh(cachePath))\n            {\n                log.WriteTrace($\"JWT cache for {commonName} already fresh — skipping.\\n\");\n                return true;\n            }\n\n            var dealerUsername = ReadDealerUsername(configFolder) ?? \"no\";\n            log.WriteNormal($\"Signing MQTT JWT for {commonName}... \");\n\n            var jwt = SignMqttJwt(log, commonName);\n            if (jwt == null)\n            {\n                log.WriteError(\"failed\\n\");\n                return false;\n            }\n            log.WriteSuccess(\"done\\n\");\n\n            var json =\n                \"{\\\"entries\\\":{\\\"\" + JsonEscape(dealerUsername) + \"\\\":{\" +\n                \"\\\"token\\\":\\\"\" + jwt + \"\\\",\" +\n                \"\\\"expiresUtc\\\":\\\"2099-01-01T00:00:00Z\\\"}}}\";\n\n            WriteFile(log, cachePath, json);\n            return true;\n        }\n\n        private static bool IsJwtCacheFresh(string path)\n        {\n            try\n            {\n                var text = File.ReadAllText(path);\n                var parsed = new System.Web.Script.Serialization.JavaScriptSerializer()\n                    .DeserializeObject(text) as Dictionary<string, object>;\n                if (parsed == null || !(parsed[\"entries\"] is Dictionary<string, object> entries))\n                    return false;\n                foreach (var entry in entries.Values.OfType<Dictionary<string, object>>())\n                {\n                    if (!entry.TryGetValue(\"expiresUtc\", out var expiresUtc)) continue;\n                    if (!DateTime.TryParse(expiresUtc?.ToString(), null,\n                            System.Globalization.DateTimeStyles.AssumeUniversal |\n                            System.Globalization.DateTimeStyles.AdjustToUniversal, out var expiry))\n                        continue;\n                    if (expiry > DateTime.UtcNow.AddDays(1))\n                        return true;\n                }\n                return false;\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n        private static string ReadDealerUsername(string configFolder)\n        {\n            var path = $\"{configFolder}/dealeraccount.xml\";\n            if (!File.Exists(path)) return null;\n            try\n            {\n                return XDocument.Load(path).Root?.Element(\"Username\")?.Value;\n            }\n            catch\n            {\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Builds and signs an RS256 JWT matching the shape the controller's mosquitto-jwt-auth\n        /// plugin (OS 4.2+) expects. Uses jailbreak_api.key via OpenSSL for the signature.\n        /// </summary>\n        private string SignMqttJwt(LogWindow log, string commonName)\n        {\n            var keyPath = $\"{Constants.CertsFolder}/jailbreak_api.key\";\n            if (!File.Exists(keyPath))\n            {\n                log.WriteError($\"{keyPath} missing.\\n\");\n                return null;\n            }\n\n            var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();\n            var exp = now + 30 * 24 * 60 * 60; // 30 days\n\n            var header = \"{\\\"alg\\\":\\\"RS256\\\",\\\"typ\\\":\\\"JWT\\\"}\";\n            var payload =\n                \"{\\\"CommonName\\\":\\\"\" + JsonEscape(commonName) + \"\\\",\" +\n                \"\\\"Services\\\":\\\"director,sysman\\\",\" +\n                \"\\\"UserName\\\":\\\"CN=\" + Constants.CertificateCn + \",L=Draper,ST=Utah,C=US\\\",\" +\n                \"\\\"Permissions\\\":\\\"/sysman,/director\\\",\" +\n                \"\\\"iat\\\":\" + now + \",\" +\n                \"\\\"exp\\\":\" + exp + \"}\";\n\n            var headerB64 = Base64Url(Encoding.UTF8.GetBytes(header));\n            var payloadB64 = Base64Url(Encoding.UTF8.GetBytes(payload));\n            var signingInput = headerB64 + \".\" + payloadB64;\n\n            var tempInput = Path.GetTempFileName();\n            var tempSig = Path.GetTempFileName();\n            try\n            {\n                File.WriteAllBytes(tempInput, Encoding.UTF8.GetBytes(signingInput));\n\n                var exitCode = RunProcessPrintOutput(log, OpenSslExe,\n                    $\"dgst -sha256 -sign \\\"{keyPath}\\\" -binary -out \\\"{tempSig}\\\" \\\"{tempInput}\\\"\");\n                if (exitCode != 0) return null;\n\n                var sigBytes = File.ReadAllBytes(tempSig);\n                return signingInput + \".\" + Base64Url(sigBytes);\n            }\n            finally\n            {\n                try { File.Delete(tempInput); } catch { /* ignore */ }\n                try { File.Delete(tempSig); } catch { /* ignore */ }\n            }\n        }\n\n        private static string Base64Url(byte[] data)\n        {\n            return Convert.ToBase64String(data)\n                .TrimEnd('=')\n                .Replace('+', '-')\n                .Replace('/', '_');\n        }\n\n        private static string JsonEscape(string s)\n        {\n            return s.Replace(\"\\\\\", \"\\\\\\\\\").Replace(\"\\\"\", \"\\\\\\\"\");\n        }\n\n        // -------------------------------------------------------------------\n        // SSH helpers and network operations\n        // -------------------------------------------------------------------\n\n        private static string DownloadFile(ScpClient scp, string remoteFilename)\n        {\n            using (var stream = new MemoryStream())\n            {\n                scp.Download(remoteFilename, stream);\n                stream.Position = 0;\n                using (var reader = new StreamReader(stream))\n                {\n                    return reader.ReadToEnd();\n                }\n            }\n        }\n\n        private static void UploadFile(ScpClient scp, string remoteFilename, string fileContents)\n        {\n            var remoteDirectory = Path.GetDirectoryName(remoteFilename);\n\n            using (var ssh = new SshClient(scp.ConnectionInfo))\n            {\n                ssh.Connect();\n                ssh.RunCommand($\"mkdir -p {remoteDirectory}\");\n                ssh.Disconnect();\n            }\n\n            using (var stream = new MemoryStream())\n            {\n                using (var writer = new StreamWriter(stream))\n                {\n                    writer.Write(fileContents);\n                    writer.Flush();\n                    stream.Position = 0;\n                    scp.Upload(stream, remoteFilename);\n                }\n            }\n        }\n\n        private void OnIpAddressChanged(object sender, EventArgs e)\n        {\n            SaveInputSettings();\n            if (_loading) return;\n            MacAddress.Text = \"\";\n            _mainWindow.SetStatusRight(\"Not connected\");\n            _debounceTimer.Stop();\n            _debounceTimer.Start();\n        }\n\n        private async Task CheckConnection()\n        {\n            var ipAddress = IpAddress.Text;\n            if (string.IsNullOrEmpty(ipAddress) || !IPAddress.TryParse(ipAddress, out _))\n            {\n                _mainWindow.SetStatusRight(\"Not connected\");\n                _directorVersion = null;\n                _lastCheckedIp = null;\n                return;\n            }\n\n            // If IP changed, clear the cached version\n            if (ipAddress != _lastCheckedIp)\n            {\n                _directorVersion = null;\n                _lastCheckedIp = ipAddress;\n            }\n\n            var result = await Task.Run(() =>\n            {\n                try\n                {\n                    using (var client = new WebClient())\n                    {\n                        // Ignore TLS cert errors (self-signed controller cert)\n                        ServicePointManager.ServerCertificateValidationCallback = (s, c, ch, e) => true;\n                        var json = client.DownloadString($\"https://{ipAddress}/api/v1/platform_status\");\n                        return new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(json);\n                    }\n                }\n                catch\n                {\n                    // OS 3.3 and earlier: no HTTPS on 443, try the node API directly on port 3000\n                    try\n                    {\n                        using (var client = new WebClient())\n                        {\n                            var json = client.DownloadString($\"http://{ipAddress}:3000/api/v1/platform_status\");\n                            return new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(json);\n                        }\n                    }\n                    catch\n                    {\n                        return null;\n                    }\n                }\n            });\n\n            if (IpAddress.Text != ipAddress) return;\n\n            if (result != null)\n            {\n                // Extract Director version from versions array\n                // JavaScriptSerializer returns arrays as ArrayList\n                if (result.ContainsKey(\"versions\") && result[\"versions\"] is System.Collections.ArrayList versions)\n                {\n                    foreach (var item in versions)\n                    {\n                        if (item is Dictionary<string, object> v &&\n                            v.ContainsKey(\"name\") && v[\"name\"]?.ToString() == \"Director\" &&\n                            v.TryGetValue(\"version\", out var directorVersion))\n                        {\n                            _directorVersion = directorVersion?.ToString();\n                            break;\n                        }\n                    }\n                }\n\n                // Autopopulate MAC address from API\n                if (result.TryGetValue(\"directorMAC\", out var directorMac))\n                {\n                    var mac = directorMac?.ToString();\n                    if (!string.IsNullOrEmpty(mac) && MacAddress.Text != mac)\n                    {\n                        MacAddress.Text = mac;\n                    }\n                }\n\n                var name = result.TryGetValue(\"directorName\", out var directorName) ? directorName?.ToString() : ipAddress;\n                var status = _directorVersion != null\n                    ? $\"{name} ({_directorVersion})\"\n                    : name;\n\n                if (_directorVersion != null)\n                {\n                    var installed = GetInstalledManagementPackVersions();\n                    status += IsPackInstalled(_directorVersion, installed)\n                        ? \" | Management pack installed\"\n                        : \" | Management pack not installed\";\n                }\n\n                _mainWindow.SetStatusRight(status);\n            }\n            else\n            {\n                _mainWindow.SetStatusRight($\"Cannot reach {ipAddress}\");\n            }\n        }\n\n        private void OnMacAddressChanged(object sender, EventArgs e)\n        {\n            SaveInputSettings();\n            if (_loading) return;\n            WorkoutPassword();\n        }\n\n        private void OnUsernameChanged(object sender, EventArgs e)\n        {\n            SaveInputSettings();\n        }\n\n        private void OnPasswordChanged(object sender, EventArgs e)\n        {\n            SaveInputSettings();\n        }\n\n        private void SaveInputSettings()\n        {\n            if (_loading) return;\n            var settings = Properties.Settings.Default;\n            settings.LastIpAddress = IpAddress.Text;\n            settings.LastUsername = Username.Text;\n            settings.LastPassword = Password.Text;\n            settings.LastMacAddress = MacAddress.Text;\n            settings.Save();\n        }\n\n        private void WorkoutPassword()\n        {\n            var macAddress = MacAddress.Text;\n            var password = GetDirectorRootPassword(macAddress);\n\n            void UpdatePassword()\n            {\n                if (MacAddress.Text == macAddress)\n                {\n                    Password.Text = password;\n                }\n            }\n\n            if (InvokeRequired)\n            {\n                Invoke((Action)UpdatePassword);\n            }\n            else\n            {\n                UpdatePassword();\n            }\n        }\n\n        private static string GetDirectorRootPassword(string macAddress)\n        {\n            if (string.IsNullOrEmpty(macAddress) || macAddress.Length != 12)\n            {\n                return null;\n            }\n\n            var salt = Convert.FromBase64String(\"STlqJGd1fTkjI25CWz1hK1YuMURseXA/UnU5QGp6cF4=\");\n            return Convert.ToBase64String(\n                new Rfc2898DeriveBytes(macAddress, salt, macAddress.Length * 397, HashAlgorithmName.SHA384)\n                    .GetBytes(33));\n        }\n\n        // -------------------------------------------------------------------\n        // SSH restore exploit + JWT auth\n        // -------------------------------------------------------------------\n\n        private static System.Net.Http.HttpClient CreateHttpClient()\n        {\n            var handler = new System.Net.Http.HttpClientHandler\n            {\n                ServerCertificateCustomValidationCallback = (s, cert, chain, sslPolicyErrors) => true\n            };\n            return new System.Net.Http.HttpClient(handler);\n        }\n\n        private string GetWritableDriverId()\n        {\n            using (var client = CreateHttpClient())\n            {\n                client.DefaultRequestHeaders.Add(\"Accept\", \"application/json\");\n                client.DefaultRequestHeaders.Add(\"Authorization\", $\"Bearer {GetJwtToken()}\");\n\n                var response = client.GetAsync($\"https://{IpAddress.Text}:443/api/v1/items\").Result;\n                response.EnsureSuccessStatusCode();\n\n                var content = response.Content.ReadAsStringAsync().Result;\n\n                var serializer = new JavaScriptSerializer\n                {\n                    MaxJsonLength = int.MaxValue\n                };\n                if (serializer.DeserializeObject(content) is object[] items)\n                {\n                    foreach (var item in items)\n                    {\n                        if (item is Dictionary<string, object> itemDict &&\n                            itemDict.TryGetValue(\"name\", out var nameObj))\n                        {\n                            var name = nameObj.ToString();\n                            if (name == \"Data Analytics Agent\" || name == \"Stations\")\n                            {\n                                if (itemDict.TryGetValue(\"id\", out var idObj))\n                                {\n                                    return idObj.ToString();\n                                }\n                            }\n                        }\n                    }\n                }\n\n                throw new Exception(\"No writable driver found in project!\");\n            }\n        }\n\n        private void ApplySshRestoreExploit(string driverId)\n        {\n            const string luaExploit = @\"-- Only modify sshd_config to enable password authentication\nlocal ssh_path = '/etc/ssh/sshd_config'\n\n-- Read & patch sshd_config to enable password authentication\nlocal ssh_lines = {}\nfor line in io.lines(ssh_path) do\n  if line:match('^%s*PasswordAuthentication%s+no') then\n    ssh_lines[#ssh_lines+1] = 'PasswordAuthentication yes'\n  else\n    ssh_lines[#ssh_lines+1] = line\n  end\nend\n\n-- Write back sshd_config\nlocal f = assert(io.open(ssh_path, 'w'))\nfor _, l in ipairs(ssh_lines) do\n  f:write(l, '\\n')\nend\nf:close()\n\";\n\n            using (var client = CreateHttpClient())\n            {\n                client.DefaultRequestHeaders.Add(\"Accept\", \"application/json\");\n                client.DefaultRequestHeaders.Add(\"Authorization\", $\"Bearer {GetJwtToken()}\");\n\n                var serializer = new JavaScriptSerializer();\n                var commandData = new\n                {\n                    command = \"LUA_COMMANDS\",\n                    async = false,\n                    tParams = new\n                    {\n                        COMMANDS = luaExploit\n                    }\n                };\n                var json = serializer.Serialize(commandData);\n                var content = new System.Net.Http.StringContent(json, Encoding.UTF8, \"application/json\");\n\n                var response = client\n                    .PostAsync($\"https://{IpAddress.Text}:443/api/v1/items/{driverId}/commands\", content).Result;\n                response.EnsureSuccessStatusCode();\n            }\n        }\n\n        private void ReloadSshService()\n        {\n            using (var client = CreateHttpClient())\n            {\n                client.DefaultRequestHeaders.Add(\"Accept\", \"application/json\");\n                client.DefaultRequestHeaders.Add(\"Authorization\", $\"Bearer {GetJwtToken()}\");\n\n                var response = client\n                    .GetAsync($\"https://{IpAddress.Text}:443/api/v1/sysman/ssh?command=pkill%20-HUP%20sshd\").Result;\n                response.EnsureSuccessStatusCode();\n            }\n        }\n\n        private string GetJwtToken()\n        {\n            if (!string.IsNullOrEmpty(_cachedJwtToken))\n            {\n                return _cachedJwtToken;\n            }\n\n            string customerEmail = null;\n            string customerPassword = null;\n\n            void ShowLoginDialog()\n            {\n                using (var loginDialog = new LoginDialog())\n                {\n                    if (loginDialog.ShowDialog(FindForm()) == DialogResult.OK)\n                    {\n                        customerEmail = loginDialog.Username;\n                        customerPassword = loginDialog.Password;\n                    }\n                }\n            }\n\n            if (InvokeRequired)\n            {\n                Invoke((Action)ShowLoginDialog);\n            }\n            else\n            {\n                ShowLoginDialog();\n            }\n\n            if (string.IsNullOrEmpty(customerEmail) || string.IsNullOrEmpty(customerPassword))\n            {\n                throw new Exception(\"No customer credentials provided!\");\n            }\n\n            using (var client = CreateHttpClient())\n            {\n                client.DefaultRequestHeaders.Add(\"Accept\", \"application/json\");\n\n                var serializer = new JavaScriptSerializer();\n                var requestData = new\n                {\n                    applicationkey = \"78f6791373d61bea49fdb9fb8897f1f3af193f11\",\n                    env = \"Prod\",\n                    email = customerEmail,\n                    pwd = customerPassword,\n                    dev = false\n                };\n                var json = serializer.Serialize(requestData);\n                var content = new System.Net.Http.StringContent(json, Encoding.UTF8, \"application/json\");\n\n                var response = client.PostAsync($\"https://{IpAddress.Text}:443/api/v1/jwt\", content).Result;\n                var responseContent = response.Content.ReadAsStringAsync().Result;\n\n                if (!response.IsSuccessStatusCode)\n                {\n                    throw new Exception($\"JWT auth failed (HTTP {(int)response.StatusCode}): {responseContent}\");\n                }\n\n                if (serializer.DeserializeObject(responseContent) is Dictionary<string, object> responseData &&\n                    responseData.TryGetValue(\"token\", out var value))\n                {\n                    _cachedJwtToken = value.ToString();\n                    return _cachedJwtToken;\n                }\n\n                throw new Exception($\"JWT response did not contain a token: {responseContent}\");\n            }\n        }\n\n        // -------------------------------------------------------------------\n        // Management pack installation\n        // -------------------------------------------------------------------\n\n        private async void InstallManagementPack(object sender, EventArgs e)\n        {\n            var log = new LogWindow(_mainWindow, \"Install Management Pack\");\n            try\n            {\n                if (_directorVersion == null)\n                {\n                    log.WriteError(\"Controller OS version not detected.\\n\");\n                    log.WriteError(\"Enter the controller IP address and wait for it to connect, then try again.\\n\");\n                    return;\n                }\n\n                var versionParts = _directorVersion.Split('.');\n                var shortVersion = string.Join(\".\", versionParts.Take(3));\n\n                log.WriteNormal($\"Director OS version: {_directorVersion}\\n\");\n\n                // Check if already installed\n                log.WriteNormal(\"Checking installed management packs... \");\n                var installedVersions = GetInstalledManagementPackVersions();\n                if (IsPackInstalled(_directorVersion, installedVersions))\n                {\n                    log.WriteSuccess($\"Management pack for {shortVersion} is already installed.\\n\");\n                    return;\n                }\n                log.WriteSuccess(\"not yet installed\\n\");\n\n                // Find a matching SOAP version\n                log.WriteNormal(\"Querying Control4 update service... \");\n                var versions = await Task.Run(() => GetComposerVersions());\n                if (versions == null || versions.Length == 0)\n                {\n                    log.WriteError(\"No versions found from update service.\\n\");\n                    return;\n                }\n                log.WriteSuccess(\"done\\n\");\n\n                var matchedVersion = versions.FirstOrDefault(v => v.StartsWith(shortVersion));\n                if (matchedVersion == null)\n                {\n                    log.WriteError($\"No management pack found for OS {shortVersion}.\\n\");\n                    return;\n                }\n                log.WriteNormal($\"Matched version: {matchedVersion}\\n\");\n\n                log.WriteHeader(\"PACKAGE INFO\");\n                log.WriteNormal(\"Querying packages... \");\n                string pkgName = null, pkgUrl = null, pkgChecksum = null;\n                long pkgSize = 0;\n                var found = await Task.Run(() => GetDriversPackageInfo(matchedVersion, out pkgName, out pkgUrl, out pkgSize, out pkgChecksum));\n                if (!found)\n                {\n                    log.WriteError(\"No management pack package found for this version.\\n\");\n                    return;\n                }\n\n                log.WriteSuccess(\"done\\n\");\n                log.WriteNormal($\"Package: {pkgName}\\n\");\n                log.WriteNormal($\"URL: {pkgUrl}\\n\");\n                log.WriteNormal($\"Size: {pkgSize / 1024 / 1024} MB\\n\");\n\n                log.WriteHeader(\"DOWNLOAD\");\n                var tempFile = Path.Combine(Path.GetTempPath(), pkgName);\n                log.WriteNormal($\"Downloading to {tempFile}...\\n\");\n                log.WriteNormal(\"This may take a few minutes for large files.\\n\");\n\n                using (var client = new WebClient())\n                {\n                    client.Proxy = null; // Bypass system/dead proxy\n                    var lastPercent = -1;\n                    client.DownloadProgressChanged += (s, args) =>\n                    {\n                        if (args.ProgressPercentage == lastPercent) return;\n                        lastPercent = args.ProgressPercentage;\n                        BeginInvoke((Action)(() =>\n                            log.WriteProgress($\"Downloading... {args.ProgressPercentage}% ({args.BytesReceived / 1024 / 1024} MB / {args.TotalBytesToReceive / 1024 / 1024} MB)\")));\n                    };\n                    log.FormClosing += (s, args) =>\n                    {\n                        client.CancelAsync();\n                    };\n                    await client.DownloadFileTaskAsync(pkgUrl, tempFile);\n                }\n\n                log.WriteSuccess(\"\\nDownload complete!\\n\");\n\n                if (!string.IsNullOrEmpty(pkgChecksum))\n                {\n                    log.WriteNormal(\"Verifying MD5 checksum... \");\n                    var md5 = ComputeMd5(tempFile);\n                    if (string.Equals(md5, pkgChecksum, StringComparison.OrdinalIgnoreCase))\n                    {\n                        log.WriteSuccess(\"OK\\n\");\n                    }\n                    else\n                    {\n                        log.WriteError($\"Checksum mismatch! Expected {pkgChecksum}, got {md5}\\n\");\n                        log.WriteError(\"The download may be corrupted. Aborting.\\n\");\n                        return;\n                    }\n                }\n\n                log.WriteHeader(\"INSTALL\");\n                log.WriteNormal(\"Launching installer... \");\n                Process.Start(tempFile);\n                log.WriteSuccess(\"done\\n\");\n                log.WriteNormal(\"Follow the prompts to complete installation.\\n\");\n            }\n            catch (Exception ex)\n            {\n                log.WriteError($\"Error: {ex.Message}\\n\");\n            }\n        }\n\n        private static XDocument CallSoapService(string action, string innerXml)\n        {\n            var soapBody = \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\" +\n                \"<soap:Envelope xmlns:soap=\\\"http://schemas.xmlsoap.org/soap/envelope/\\\" \" +\n                \"xmlns:upd=\\\"\" + Constants.UpdatesSoapNamespace + \"\\\">\" +\n                \"<soap:Body>\" +\n                innerXml +\n                \"</soap:Body></soap:Envelope>\";\n\n            using (var client = new WebClient())\n            {\n                client.Headers[\"Content-Type\"] = \"text/xml; charset=utf-8\";\n                client.Headers[\"SOAPAction\"] = \"\\\"\" + Constants.UpdatesSoapNamespace + action + \"\\\"\";\n\n                var response = client.UploadString(Constants.UpdatesServiceUrl, soapBody);\n                return XDocument.Parse(response);\n            }\n        }\n\n        private static string[] GetComposerVersions()\n        {\n            var doc = CallSoapService(\"GetVersions\",\n                \"<upd:GetVersions>\" +\n                \"<upd:currentVersion>3.0.0</upd:currentVersion>\" +\n                \"</upd:GetVersions>\");\n\n            var ns = XNamespace.Get(Constants.UpdatesSoapNamespace);\n\n            return doc.Descendants(ns + \"string\")\n                .Select(x => x.Value)\n                .Where(v => v.EndsWith(\"+Composer\"))\n                .OrderByDescending(v => v)\n                .ToArray();\n        }\n\n        private static bool GetDriversPackageInfo(string version,\n            out string name, out string url, out long size, out string checksum)\n        {\n            name = url = checksum = null;\n            size = 0;\n\n            var escapedVersion = System.Security.SecurityElement.Escape(version);\n            var doc = CallSoapService(\"GetPackagesByVersion\",\n                \"<upd:GetPackagesByVersion>\" +\n                \"<upd:version>\" + escapedVersion + \"</upd:version>\" +\n                \"</upd:GetPackagesByVersion>\");\n\n            var ns = XNamespace.Get(Constants.UpdatesSoapNamespace);\n\n            foreach (var pkg in doc.Descendants(ns + \"Package\"))\n            {\n                var pkgName = pkg.Element(ns + \"Name\")?.Value ?? \"\";\n                if (pkgName.StartsWith(\"Drivers-\", StringComparison.OrdinalIgnoreCase))\n                {\n                    name = pkgName;\n                    url = (pkg.Element(ns + \"Url\")?.Value ?? \"\").Replace(\"http://\", \"https://\");\n                    long.TryParse(pkg.Element(ns + \"Size\")?.Value ?? \"0\", out size);\n                    checksum = pkg.Element(ns + \"Checksum\")?.Value ?? \"\";\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Scans the Windows registry for installed Control4 management packs.\n        /// Returns a set of version strings that are installed (e.g. \"3.4.3.741643\").\n        /// </summary>\n        private static HashSet<string> GetInstalledManagementPackVersions()\n        {\n            var installed = new HashSet<string>(StringComparer.OrdinalIgnoreCase);\n            const string uninstallPath = @\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\";\n\n            // Scan both 32-bit and 64-bit registry views to find installed packs\n            // regardless of whether this process is 32-bit or 64-bit\n            var views = new[] { RegistryView.Registry32, RegistryView.Registry64 };\n\n            foreach (var view in views)\n            {\n                try\n                {\n                    using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, view))\n                    using (var key = hklm.OpenSubKey(uninstallPath))\n                    {\n                        if (key == null) continue;\n                        foreach (var subKeyName in key.GetSubKeyNames())\n                        {\n                            try\n                            {\n                                using (var subKey = key.OpenSubKey(subKeyName))\n                                {\n                                    var displayName = subKey?.GetValue(\"DisplayName\")?.ToString() ?? \"\";\n                                    // Match \"Drivers-3.4.3.741643-res\" → \"3.4.3.741643\"\n                                    if (displayName.StartsWith(\"Drivers-\", StringComparison.OrdinalIgnoreCase))\n                                    {\n                                        var ver = displayName.Substring(8);\n                                        var dashIdx = ver.IndexOf('-');\n                                        if (dashIdx > 0)\n                                            ver = ver.Substring(0, dashIdx);\n                                        installed.Add(ver);\n                                    }\n                                    // Match \"Composer OS Management Package 4.1.0\" → \"4.1.0\"\n                                    else if (displayName.StartsWith(\"Composer OS Management Package \", StringComparison.OrdinalIgnoreCase))\n                                    {\n                                        var ver = displayName.Substring(\"Composer OS Management Package \".Length).Trim();\n                                        if (!string.IsNullOrEmpty(ver))\n                                            installed.Add(ver);\n                                    }\n                                }\n                            }\n                            catch\n                            {\n                                // Skip unreadable subkeys\n                            }\n                        }\n                    }\n                }\n                catch\n                {\n                    // Skip inaccessible registry views\n                }\n            }\n\n            return installed;\n        }\n\n        /// <summary>\n        /// Checks if a SOAP version has a matching installed management pack.\n        /// Handles both full versions (\"4.1.0.744089\") and short versions (\"4.1.0\") from registry.\n        /// </summary>\n        private static bool IsPackInstalled(string soapVersion, HashSet<string> installedVersions)\n        {\n            if (installedVersions.Contains(soapVersion)) return true;\n            foreach (var iv in installedVersions)\n            {\n                if (soapVersion.StartsWith(iv + \".\") || soapVersion == iv)\n                    return true;\n            }\n            return false;\n        }\n\n        private static string ComputeMd5(string filename)\n        {\n            using (var md5 = MD5.Create())\n            using (var stream = File.OpenRead(filename))\n            {\n                var hash = md5.ComputeHash(stream);\n                return BitConverter.ToString(hash).Replace(\"-\", \"\").ToLowerInvariant();\n            }\n        }\n\n        // -------------------------------------------------------------------\n        // UI button handlers\n        // -------------------------------------------------------------------\n\n        private void SearchGoogleForComposer(object sender, EventArgs e)\n        {\n            Process.Start(\"https://www.google.com/search?q=ComposerPro-3.1.3.574885-res.exe\");\n        }\n\n        private void OpenControl4Reddit(object sender, EventArgs e)\n        {\n            Process.Start(\"https://www.reddit.com/r/C4diy/\");\n        }\n\n        // -------------------------------------------------------------------\n        // File utility helpers\n        // -------------------------------------------------------------------\n\n        private static void CopyFile(LogWindow log, string a, string b)\n        {\n            log.WriteNormal($\"Copying {Path.GetFileName(a)}... \");\n            File.Copy(a, b, true);\n            log.WriteSuccess(\"done\\n\");\n        }\n\n        private static void WriteFile(LogWindow log, string file, string content)\n        {\n            log.WriteNormal($\"Writing {Path.GetFileName(file)}... \");\n            File.WriteAllText(file, content);\n            log.WriteSuccess(\"done\\n\");\n        }\n\n        private static void RemoveLineFromFile(LogWindow log, string file, string line, bool ignoreWhitespace = true)\n        {\n            if (!File.Exists(file))\n            {\n                log.WriteTrace($\"Removing line from {Path.GetFileName(file)}... file not found, skipping\\n\");\n                return;\n            }\n\n            log.WriteNormal($\"Removing line from {Path.GetFileName(file)}... \");\n            var lines = File.ReadAllLines(file);\n            var newLines = lines.Where(s => ignoreWhitespace\n                ? s.Trim() != line.Trim()\n                : s != line).ToArray();\n\n            if (newLines.Length != lines.Length)\n            {\n                File.WriteAllLines(file, newLines);\n                log.WriteSuccess(\"done\\n\");\n            }\n            else\n            {\n                log.WriteTrace(\"already removed\\n\");\n            }\n        }\n\n        private static void AddLineToFile(LogWindow log, string file, string line, bool ignoreWhitespace = true)\n        {\n            log.WriteNormal($\"Adding line to {Path.GetFileName(file)}... \");\n\n            if (File.Exists(file))\n            {\n                var lines = File.ReadAllLines(file);\n                if (!lines.Select(s => ignoreWhitespace ? s.Trim() : s).Contains(ignoreWhitespace ? line.Trim() : line))\n                {\n                    File.AppendAllText(file, line.TrimEnd() + Environment.NewLine);\n                    log.WriteSuccess(\"done\\n\");\n                }\n                else\n                {\n                    log.WriteTrace(\"already present\\n\");\n                }\n            }\n            else\n            {\n                File.WriteAllText(file, line.TrimEnd() + Environment.NewLine);\n                log.WriteSuccess(\"done\\n\");\n            }\n        }\n\n        private static int RunProcessPrintOutput(LogWindow log, string exe, string arguments)\n        {\n            log.WriteTrace($\"{Path.GetFileName(exe)} {arguments}\\n\");\n\n            var startInfo = new ProcessStartInfo(exe, arguments)\n            {\n                WorkingDirectory = Environment.CurrentDirectory,\n                CreateNoWindow = true,\n                UseShellExecute = false,\n                RedirectStandardOutput = true,\n                RedirectStandardError = true,\n                EnvironmentVariables = { [\"OPENSSL_CONF\"] = Path.GetFullPath(Constants.OpenSslConfig) }\n            };\n\n            var process = Process.Start(startInfo);\n            if (process == null)\n            {\n                log.WriteError($\"Failed to start {exe} {arguments}\\n\");\n                return -1;\n            }\n\n            log.WriteTrace(process.StandardOutput.ReadToEnd());\n            log.WriteTrace(process.StandardError.ReadToEnd());\n\n            process.WaitForExit();\n\n            log.WriteTrace(process.StandardError.ReadToEnd());\n            log.WriteTrace(process.StandardOutput.ReadToEnd());\n\n            return process.ExitCode;\n        }\n\n        private static string RunProcessGetOutput(string exe, string arguments)\n        {\n            var startInfo = new ProcessStartInfo(exe, arguments)\n            {\n                CreateNoWindow = true,\n                UseShellExecute = false,\n                RedirectStandardOutput = true,\n                EnvironmentVariables = { [\"OPENSSL_CONF\"] = Path.GetFullPath(Constants.OpenSslConfig) }\n            };\n\n            var process = Process.Start(startInfo);\n\n            return process?.StandardOutput.ReadToEnd();\n        }\n    }\n}\n"
  },
  {
    "path": "UI/Jailbreak.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!--\n    Microsoft ResX Schema\n\n    Version 2.0\n\n    The primary goals of this format is to allow a simple XML format\n    that is mostly human readable. The generation and parsing of the\n    various data types are done through the TypeConverter classes\n    associated with the data types.\n\n    Example:\n\n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n\n    There are any number of \"resheader\" rows that contain simple\n    name/value pairs.\n\n    Each data row contains a name, and value. The row also contains a\n    type or mimetype. Type corresponds to a .NET class that support\n    text/value conversion through the TypeConverter architecture.\n    Classes that don't support this are serialized and stored with the\n    mimetype set.\n\n    The mimetype is used for serialized objects, and tells the\n    ResXResourceReader how to depersist the object. This is currently not\n    extensible. For a given mimetype the value must be set accordingly:\n\n    Note - application/x-microsoft.net.object.binary.base64 is the format\n    that the ResXResourceWriter will generate, however the reader can\n    read any of the formats listed below.\n\n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array\n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"labelJailbreakDesc.Text\" xml:space=\"preserve\">\n    <value>This will generate certificates, patch your Composer config, deploy certs, set feature flags, and patch your Director all in one step. Make sure the IP address below points to your controller. The password is auto-derived from the MAC address.</value>\n  </data>\n</root>\n"
  },
  {
    "path": "UI/LogWindow.Designer.cs",
    "content": "﻿namespace  Garry.Control4.Jailbreak.UI\n{\n\tpartial class LogWindow\n\t{\n\t\t/// <summary>\n\t\t/// Required designer variable.\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.IContainer components = null;\n\n\t\t/// <summary>\n\t\t/// Clean up any resources being used.\n\t\t/// </summary>\n\t\t/// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif ( disposing && (components != null) )\n\t\t\t{\n\t\t\t\tcomponents.Dispose();\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows Form Designer generated code\n\n\t\t/// <summary>\n\t\t/// Required method for Designer support - do not modify\n\t\t/// the contents of this method with the code editor.\n\t\t/// </summary>\n\t\tprivate void InitializeComponent(string title = \"LogWindow\")\n\t\t{\n\t\t\tthis.button1 = new System.Windows.Forms.Button();\n\t\t\tthis.textBox = new System.Windows.Forms.RichTextBox();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// button1\n\t\t\t// \n\t\t\tthis.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.button1.Location = new System.Drawing.Point(790, 482);\n\t\t\tthis.button1.Name = \"button1\";\n\t\t\tthis.button1.Size = new System.Drawing.Size(99, 23);\n\t\t\tthis.button1.TabIndex = 0;\n\t\t\tthis.button1.Text = \"Close\";\n\t\t\tthis.button1.UseVisualStyleBackColor = true;\n\t\t\tthis.button1.Click += new System.EventHandler(this.button1_Click);\n\t\t\t// \n\t\t\t// textBox\n\t\t\t// \n\t\t\tthis.textBox.AcceptsTab = true;\n\t\t\tthis.textBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n\t\t\tthis.textBox.AutoWordSelection = true;\n\t\t\tthis.textBox.BackColor = System.Drawing.Color.White;\n\t\t\tthis.textBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\n\t\t\tthis.textBox.Font = new System.Drawing.Font(\"Consolas\", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n\t\t\tthis.textBox.HideSelection = false;\n\t\t\tthis.textBox.Location = new System.Drawing.Point(12, 12);\n\t\t\tthis.textBox.Name = \"textBox\";\n\t\t\tthis.textBox.ReadOnly = true;\n\t\t\tthis.textBox.Size = new System.Drawing.Size(877, 454);\n\t\t\tthis.textBox.TabIndex = 1;\n\t\t\tthis.textBox.Text = \"\";\n\t\t\t// \n\t\t\t// LogWindow\n\t\t\t// \n\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n\t\t\tthis.ClientSize = new System.Drawing.Size(901, 514);\n\t\t\tthis.Controls.Add(this.textBox);\n\t\t\tthis.Controls.Add(this.button1);\n\t\t\tthis.Name = title;\n\t\t\tthis.Text = title;\n\t\t\tthis.ResumeLayout(false);\n\n\t\t}\n\n\t\t#endregion\n\n\t\tprivate System.Windows.Forms.Button button1;\n\t\tprivate System.Windows.Forms.RichTextBox textBox;\n\t}\n}"
  },
  {
    "path": "UI/LogWindow.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace Garry.Control4.Jailbreak.UI\n{\n    public partial class LogWindow : Form\n    {\n        public LogWindow(Form mainWindow, string title = \"LogWindow\")\n        {\n            Owner = mainWindow;\n            InitializeComponent(title);\n\n            CenterToParent();\n            Show();\n        }\n\n        private void Write(string v)\n        {\n            _progressLineStart = -1;\n            textBox.AppendText(v);\n\n            textBox.ScrollToCaret();\n            textBox.Refresh();\n        }\n\n        internal void WriteNormal(string v)\n        {\n            textBox.SelectionColor = Color.Black;\n            Write(v);\n        }\n\n        internal void WriteSuccess(string v)\n        {\n            textBox.SelectionColor = Color.Green;\n            Write(v);\n        }\n\n        // ReSharper disable once UnusedMember.Global\n        internal void WriteWarning(string v)\n        {\n            textBox.SelectionColor = Color.Orange;\n            Write(v);\n        }\n\n        internal void WriteError(Exception v)\n        {\n            WriteError($\"\\n{v.Message}\\n\");\n            WriteNormal($\"{v.StackTrace}\\n\");\n        }\n\n        internal void WriteError(string v)\n        {\n            textBox.SelectionColor = Color.Red;\n            Write(v);\n        }\n\n        internal void WriteTrace(string v)\n        {\n            textBox.SelectionColor = Color.Gray;\n            Write(v);\n        }\n\n        internal void WriteHighlight(string v)\n        {\n            textBox.SelectionColor = Color.Blue;\n            Write(v);\n        }\n\n        private int _progressLineStart = -1;\n\n        internal void WriteProgress(string v)\n        {\n            if (_progressLineStart >= 0)\n            {\n                // Replace the previous progress text in-place\n                textBox.Select(_progressLineStart, textBox.TextLength - _progressLineStart);\n                textBox.SelectionColor = Color.Gray;\n                textBox.SelectedText = v;\n                _progressLineStart = textBox.TextLength - v.Length;\n            }\n            else\n            {\n                _progressLineStart = textBox.TextLength;\n                textBox.SelectionColor = Color.Gray;\n                textBox.AppendText(v);\n            }\n\n            textBox.ScrollToCaret();\n            textBox.Refresh();\n        }\n\n        internal void WriteHeader(string title)\n        {\n            var line = new string('\\u2500', 50 - title.Length);\n            textBox.SelectionColor = Color.Blue;\n            Write($\"\\n\\u2500\\u2500 {title} {line}\\n\");\n        }\n\n        private void button1_Click(object sender, EventArgs e)\n        {\n            Close();\n        }\n\n        protected override void OnClosed(EventArgs e)\n        {\n            base.OnClosed(e);\n\n            Owner.Enabled = true;\n        }\n    }\n}"
  },
  {
    "path": "UI/LogWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "UI/LoginDialog.cs",
    "content": "using System;\nusing System.Windows.Forms;\n\nnamespace Garry.Control4.Jailbreak.UI\n{\n    public class LoginDialog : Form\n    {\n        public string Username { get; private set; }\n        public string Password { get; private set; }\n\n        private TextBox _usernameTextBox;\n        private TextBox _passwordTextBox;\n        private Button _okButton;\n        private Button _cancelButton;\n\n        public LoginDialog()\n        {\n            InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            Text = @\"Control4 Customer Login\";\n            Size = new System.Drawing.Size(350, 270);\n            StartPosition = FormStartPosition.CenterParent;\n            FormBorderStyle = FormBorderStyle.FixedDialog;\n            MaximizeBox = false;\n            MinimizeBox = false;\n\n            var explanationLabel = new Label\n            {\n                Text = @\"SSH password authentication has been disabled by a system update. \" +\n                       @\"Your Control4 customer account credentials (from customer.control4.com) \" +\n                       @\"are needed to authenticate with the controller's local API in order to \" +\n                       @\"restore SSH access. Credentials are not stored.\",\n                Location = new System.Drawing.Point(12, 12),\n                Size = new System.Drawing.Size(310, 70),\n                AutoSize = false\n            };\n\n            var usernameLabel = new Label\n            {\n                Text = @\"Email:\",\n                Location = new System.Drawing.Point(12, 85),\n                Size = new System.Drawing.Size(150, 23)\n            };\n\n            _usernameTextBox = new TextBox\n            {\n                Location = new System.Drawing.Point(12, 105),\n                Size = new System.Drawing.Size(310, 23),\n                TabIndex = 0\n            };\n\n            var passwordLabel = new Label\n            {\n                Text = @\"Password:\",\n                Location = new System.Drawing.Point(12, 135),\n                Size = new System.Drawing.Size(150, 23)\n            };\n\n            _passwordTextBox = new TextBox\n            {\n                Location = new System.Drawing.Point(12, 155),\n                Size = new System.Drawing.Size(310, 23),\n                UseSystemPasswordChar = true,\n                TabIndex = 1\n            };\n\n            _okButton = new Button\n            {\n                Text = @\"OK\",\n                Location = new System.Drawing.Point(167, 195),\n                Size = new System.Drawing.Size(75, 23),\n                DialogResult = DialogResult.OK,\n                TabIndex = 2\n            };\n\n            _cancelButton = new Button\n            {\n                Text = @\"Cancel\",\n                Location = new System.Drawing.Point(247, 195),\n                Size = new System.Drawing.Size(75, 23),\n                DialogResult = DialogResult.Cancel,\n                TabIndex = 3\n            };\n\n            _okButton.Click += OkButton_Click;\n\n            Controls.Add(explanationLabel);\n            Controls.Add(usernameLabel);\n            Controls.Add(_usernameTextBox);\n            Controls.Add(passwordLabel);\n            Controls.Add(_passwordTextBox);\n            Controls.Add(_okButton);\n            Controls.Add(_cancelButton);\n\n            AcceptButton = _okButton;\n            CancelButton = _cancelButton;\n        }\n\n        private void OkButton_Click(object sender, EventArgs e)\n        {\n            if (string.IsNullOrWhiteSpace(_usernameTextBox.Text) || string.IsNullOrWhiteSpace(_passwordTextBox.Text))\n            {\n                MessageBox.Show(@\"Please enter both email and password.\", @\"Validation Error\", MessageBoxButtons.OK,\n                    MessageBoxIcon.Warning);\n                return;\n            }\n\n            Username = _usernameTextBox.Text.Trim();\n            Password = _passwordTextBox.Text;\n        }\n    }\n}"
  },
  {
    "path": "UI/MainWindow.Designer.cs",
    "content": "namespace Garry.Control4.Jailbreak.UI\n{\n    partial class MainWindow\n    {\n        /// <summary>\n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary>\n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Windows Form Designer generated code\n\n        /// <summary>\n        /// Required method for Designer support - do not modify\n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWindow));\n            this.menuStrip1 = new System.Windows.Forms.MenuStrip();\n            this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.quitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.foldersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.composerFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.composerSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.rc4diyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\n            this.splitContainer3 = new System.Windows.Forms.SplitContainer();\n            this.StatusTextLeft = new System.Windows.Forms.Label();\n            this.StatusTextRight = new System.Windows.Forms.Label();\n            this.menuStrip1.SuspendLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit();\n            this.splitContainer3.Panel2.SuspendLayout();\n            this.splitContainer3.SuspendLayout();\n            this.SuspendLayout();\n            //\n            // menuStrip1\n            //\n            this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.fileToolStripMenuItem,\n            this.foldersToolStripMenuItem,\n            this.helpToolStripMenuItem});\n            this.menuStrip1.Location = new System.Drawing.Point(0, 0);\n            this.menuStrip1.Name = \"menuStrip1\";\n            this.menuStrip1.Size = new System.Drawing.Size(504, 24);\n            this.menuStrip1.TabIndex = 1;\n            this.menuStrip1.Text = \"menuStrip1\";\n            //\n            // fileToolStripMenuItem\n            //\n            this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.quitToolStripMenuItem});\n            this.fileToolStripMenuItem.Name = \"fileToolStripMenuItem\";\n            this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);\n            this.fileToolStripMenuItem.Text = \"File\";\n            //\n            // quitToolStripMenuItem\n            //\n            this.quitToolStripMenuItem.Name = \"quitToolStripMenuItem\";\n            this.quitToolStripMenuItem.Size = new System.Drawing.Size(97, 22);\n            this.quitToolStripMenuItem.Text = \"Quit\";\n            this.quitToolStripMenuItem.Click += new System.EventHandler(this.FileAndQuit);\n            //\n            // foldersToolStripMenuItem\n            //\n            this.foldersToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.composerFolderToolStripMenuItem,\n            this.composerSettingsToolStripMenuItem});\n            this.foldersToolStripMenuItem.Name = \"foldersToolStripMenuItem\";\n            this.foldersToolStripMenuItem.Size = new System.Drawing.Size(57, 20);\n            this.foldersToolStripMenuItem.Text = \"Folders\";\n            //\n            // composerFolderToolStripMenuItem\n            //\n            this.composerFolderToolStripMenuItem.Name = \"composerFolderToolStripMenuItem\";\n            this.composerFolderToolStripMenuItem.Size = new System.Drawing.Size(174, 22);\n            this.composerFolderToolStripMenuItem.Text = \"Composer Folder\";\n            this.composerFolderToolStripMenuItem.Click += new System.EventHandler(this.OpenComposerFolder);\n            //\n            // composerSettingsToolStripMenuItem\n            //\n            this.composerSettingsToolStripMenuItem.Name = \"composerSettingsToolStripMenuItem\";\n            this.composerSettingsToolStripMenuItem.Size = new System.Drawing.Size(174, 22);\n            this.composerSettingsToolStripMenuItem.Text = \"Composer Settings\";\n            this.composerSettingsToolStripMenuItem.Click += new System.EventHandler(this.OpenComposerSettingsFolder);\n            //\n            // helpToolStripMenuItem\n            //\n            this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\n            this.aboutToolStripMenuItem,\n            this.rc4diyToolStripMenuItem});\n            this.helpToolStripMenuItem.Name = \"helpToolStripMenuItem\";\n            this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);\n            this.helpToolStripMenuItem.Text = \"Help\";\n            //\n            // aboutToolStripMenuItem\n            //\n            this.aboutToolStripMenuItem.Name = \"aboutToolStripMenuItem\";\n            this.aboutToolStripMenuItem.Size = new System.Drawing.Size(183, 22);\n            this.aboutToolStripMenuItem.Text = \"View On GitHub\";\n            this.aboutToolStripMenuItem.Click += new System.EventHandler(this.ViewOnGithub);\n            //\n            // rc4diyToolStripMenuItem\n            //\n            this.rc4diyToolStripMenuItem.Name = \"rc4diyToolStripMenuItem\";\n            this.rc4diyToolStripMenuItem.Size = new System.Drawing.Size(183, 22);\n            this.rc4diyToolStripMenuItem.Text = \"Visit C4diy on Reddit\";\n            this.rc4diyToolStripMenuItem.Click += new System.EventHandler(this.VisitC4Diy);\n            //\n            // splitContainer3\n            //\n            this.splitContainer3.Dock = System.Windows.Forms.DockStyle.Fill;\n            this.splitContainer3.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\n            this.splitContainer3.IsSplitterFixed = true;\n            this.splitContainer3.Location = new System.Drawing.Point(0, 24);\n            this.splitContainer3.Name = \"splitContainer3\";\n            this.splitContainer3.Orientation = System.Windows.Forms.Orientation.Horizontal;\n            //\n            // splitContainer3.Panel1\n            //\n            this.splitContainer3.Panel1.Margin = new System.Windows.Forms.Padding(5);\n            this.splitContainer3.Panel1.Padding = new System.Windows.Forms.Padding(5, 5, 5, 0);\n            //\n            // splitContainer3.Panel2\n            //\n            this.splitContainer3.Panel2.Controls.Add(this.StatusTextLeft);\n            this.splitContainer3.Panel2.Controls.Add(this.StatusTextRight);\n            this.splitContainer3.Panel2.Padding = new System.Windows.Forms.Padding(4);\n            this.splitContainer3.Panel2MinSize = 20;\n            this.splitContainer3.Size = new System.Drawing.Size(504, 537);\n            this.splitContainer3.SplitterDistance = 511;\n            this.splitContainer3.SplitterWidth = 1;\n            this.splitContainer3.TabIndex = 2;\n            //\n            // StatusTextLeft\n            //\n            this.StatusTextLeft.AutoSize = true;\n            this.StatusTextLeft.BackColor = System.Drawing.Color.Transparent;\n            this.StatusTextLeft.Dock = System.Windows.Forms.DockStyle.Left;\n            this.StatusTextLeft.Location = new System.Drawing.Point(4, 4);\n            this.StatusTextLeft.Name = \"StatusTextLeft\";\n            this.StatusTextLeft.Size = new System.Drawing.Size(0, 13);\n            this.StatusTextLeft.TabIndex = 0;\n            this.StatusTextLeft.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\n            //\n            // StatusTextRight\n            //\n            this.StatusTextRight.AutoSize = true;\n            this.StatusTextRight.BackColor = System.Drawing.Color.Transparent;\n            this.StatusTextRight.Dock = System.Windows.Forms.DockStyle.Right;\n            this.StatusTextRight.Location = new System.Drawing.Point(500, 4);\n            this.StatusTextRight.Name = \"StatusTextRight\";\n            this.StatusTextRight.Size = new System.Drawing.Size(0, 13);\n            this.StatusTextRight.TabIndex = 1;\n            this.StatusTextRight.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\n            //\n            // MainWindow\n            //\n            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.ClientSize = new System.Drawing.Size(504, 561);\n            this.Controls.Add(this.splitContainer3);\n            this.Controls.Add(this.menuStrip1);\n            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\n            this.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n            this.MainMenuStrip = this.menuStrip1;\n            this.Name = \"MainWindow\";\n            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;\n            this.Text = \"Garry\\'s Control4 Jailbreak\";\n            this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.OnFormClosed);\n            this.menuStrip1.ResumeLayout(false);\n            this.menuStrip1.PerformLayout();\n            this.splitContainer3.Panel2.ResumeLayout(false);\n            this.splitContainer3.Panel2.PerformLayout();\n            ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).EndInit();\n            this.splitContainer3.ResumeLayout(false);\n            this.ResumeLayout(false);\n            this.PerformLayout();\n        }\n\n        #endregion\n        private System.Windows.Forms.MenuStrip menuStrip1;\n        private System.Windows.Forms.SplitContainer splitContainer3;\n        private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem quitToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;\n        private System.Windows.Forms.Label StatusTextLeft;\n        private System.Windows.Forms.Label StatusTextRight;\n        private System.Windows.Forms.ToolStripMenuItem foldersToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem composerFolderToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem composerSettingsToolStripMenuItem;\n        private System.Windows.Forms.ToolStripMenuItem rc4diyToolStripMenuItem;\n    }\n}\n"
  },
  {
    "path": "UI/MainWindow.cs",
    "content": "using System;\nusing System.Windows.Forms;\nusing Garry.Control4.Jailbreak.Properties;\n\nnamespace Garry.Control4.Jailbreak.UI\n{\n    public partial class MainWindow : Form\n    {\n        public Jailbreak Jailbreak { get; }\n        private Director Director { get; }\n\n\n        public MainWindow()\n        {\n            InitializeComponent();\n\n            if (!System.IO.Directory.Exists(Constants.CertsFolder))\n            {\n                System.IO.Directory.CreateDirectory(Constants.CertsFolder);\n            }\n\n            if (!System.IO.Directory.Exists(Constants.KeysFolder))\n            {\n                System.IO.Directory.CreateDirectory(Constants.KeysFolder);\n            }\n\n            System.IO.File.WriteAllBytes($\"{Constants.CertsFolder}/openssl.cfg\", Resources.openssl);\n\n            Text += $@\" v{Constants.Version} ({Constants.TargetComposerVersion} / {Constants.TargetOsVersion})\";\n\n            Director = new Director(this);\n\n            Jailbreak = new Jailbreak(this);\n            Jailbreak.Dock = DockStyle.Fill;\n            splitContainer3.Panel1.Controls.Add(Jailbreak);\n\n            // Size window to fit the Jailbreak content\n            var contentSize = Jailbreak.PreferredSize;\n            var chromeWidth = Width - ClientSize.Width;\n            var chromeHeight = Height - ClientSize.Height;\n            var menuHeight = menuStrip1.Height;\n            var statusHeight = splitContainer3.Height - splitContainer3.SplitterDistance;\n            Width = contentSize.Width + chromeWidth + Jailbreak.Margin.Horizontal + 10;\n            Height = contentSize.Height + chromeHeight + menuHeight + statusHeight + 10;\n            MaximizeBox = false;\n\n            CenterToScreen();\n\n            Load += OnLoaded;\n        }\n\n        public sealed override string Text\n        {\n            get => base.Text;\n            set => base.Text = value;\n        }\n\n        private void OnLoaded(object sender, EventArgs e)\n        {\n            Director.RefreshList();\n        }\n\n        private void OnFormClosed(object sender, FormClosedEventArgs e)\n        {\n            Application.Exit();\n        }\n\n        public void SetStatusRight(string txt)\n        {\n            StatusTextRight.Text = txt;\n        }\n\n        private void OpenComposerFolder(object sender, EventArgs e)\n        {\n            var dir = Jailbreak.ComposerInstallDir ?? @\"C:\\Program Files (x86)\\Control4\\Composer\\Pro\";\n            System.Diagnostics.Process.Start(dir);\n        }\n\n        private void OpenComposerSettingsFolder(object sender, EventArgs e)\n        {\n            System.Diagnostics.Process.Start(\n                $\"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\\\Control4\");\n        }\n\n        private void ViewOnGithub(object sender, EventArgs e)\n        {\n            System.Diagnostics.Process.Start(\"https://github.com/garrynewman/Control4.Jailbreak\");\n        }\n\n        private void FileAndQuit(object sender, EventArgs e)\n        {\n            Application.Exit();\n        }\n\n        private void VisitC4Diy(object sender, EventArgs e)\n        {\n            System.Diagnostics.Process.Start(\"https://www.reddit.com/r/C4diy/\");\n        }\n    }\n}\n"
  },
  {
    "path": "UI/MainWindow.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <metadata name=\"menuStrip1.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAEAlpYAAAEAIABwawEAFgAAACgAAACWAAAALAEAAAEAIAAAAAAAkF8BAMMOAADDDgAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACws/wAoKP8ALS3/Dyws/0YsLP+BLCz/tSws\n        /9osLP/xLCz//Cws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//Cws\n        //EsLP/aLCz/tCws/4EtLf9GLS3/DyUl/wAsLP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtLf8ALS3/AC0t/xgsLP9kLCz/uiws/+ksLP/9LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//0sLP/pLCz/uiws/2IsLP8YKir/ACws/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACws/wAsLP8ILCz/Tiws/78sLP/6LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//osLP++LCz/TS0t/wgtLf8AAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAALCz/ACws/xMsLP+DLCz/7Cws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz/7Cws/4IsLP8TKir/AAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAC4u/wAsLP8ALCz/Fyws/54sLP/5LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//ksLP+fLCz/Fyoq/wA1Nf8AAAAAAAAA\n        AAAAAAAAAAAAACws/wAsLP8TLCz/niws//wsLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP/8LCz/nS0t/xItLf8AAAAAAAAA\n        AAAAAAAAKyv/ACoq/wYsLP+CLCz/+iws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz/+Sws/4IsLP8HLCz/AAAA\n        AAAAAAAALCz/ACsr/04sLP/rLCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws/+ssLP9OLCz/AAAA\n        AAArK/8AKyv/GCws/78sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP+/LCz/GCws\n        /wAqKv8ALCz/ZCws//osLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP/6LCz/Yysr\n        /wAtLf8PLCz/uiws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz/uiws\n        /w8sLP9HLCz/6Cws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz/6Cws\n        /0YsLP+CLCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//iws\n        /4EsLP+1LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        /7QsLP/bLCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        /9ksLP/yLCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //EsLP/8LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //wsLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//y4u//8wMP//MDD//zAw//8wMP//MDD//zAw\n        //8wMP//MDD//zAw//8wMP//MDD//zAw//8wMP//MDD//zAw//8vL///LS3//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LS3//4SE//+2tv//tbX//7W1//+1tf//tbX//7W1\n        //+1tf//tbX//7W1//+1tf//tbX//7W1//+1tf//tbX//7a2//+hof//QUH//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7a2////////////////////////////////\n        ///////////////////////////////////////////////////i4v//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yoq//8qKv//Kir//yoq//8qKv//Kir//yoq//8qKv//Kir//yoq\n        //8qKv//Kir//yoq//8qKv//Kir//yoq//8qKv//Kir//yoq//8qKv//Kir//yoq//8qKv//Kir//yoq\n        //8qKv//Kir//yoq//8qKv//Kir//yoq//8qKv//LCz//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8rK///Nzf//2pq//91df//dHT//3R0//90dP//dHT//3R0//90dP//dHT//3R0\n        //90dP//dHT//3R0//90dP//dHT//3R0//90dP//dHT//3R0//90dP//dHT//3R0//90dP//dHT//3R0\n        //90dP//dHT//3R0//90dP//dHT//3R0//90dP//dXX//87O////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//9/f///+/v///f3///39///9/f///f3///39///9/f///f3///39\n        ///9/f///f3///39///9/f///f3///39///9/f///f3///39///9/f///f3///39///9/f///f3///39\n        ///9/f///f3///39///9/f///f3///39///9/f///f3///7+////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ////////////////////////////////////////////////////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ///////////////////////////////////+/v///f3///39///9/f///f3///39///9/f///f3///39\n        ///9/f///f3///39///9/f///f3///39///9/f///f3///7+////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        ///////////////////////////////////Ozv//dXX//3R0//90dP//dHT//3R0//90dP//dHT//3R0\n        //90dP//dHT//3R0//90dP//dHT//3R0//90dP//dXX//87O////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//LCz//yoq//8qKv//Kir//yoq//8qKv//Kir//yoq\n        //8qKv//Kir//yoq//8qKv//Kir//yoq//8qKv//LCz//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Hh////////////////////////////////////////////////\n        //////////////////////////////////+0tP//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7S0////////////////////////////////\n        ///////////////////////////////////////////////////h4f//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//TEz//+Li////////////////////////////////////////////////\n        //////////////////////////////////+2tv//Li7//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//Li7//7a2////////////////////////////////\n        ///////////////////////////////////////////////////i4v//TEz//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8qKv//QUH//6Gh//+2tv//tbX//7W1//+1tf//tbX//7W1//+1tf//tbX//7W1\n        //+1tf//tbX//7W1//+1tf//tbX//7a2//+EhP//LS3//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LS3//4SE//+2tv//tbX//7W1//+1tf//tbX//7W1\n        //+1tf//tbX//7W1//+1tf//tbX//7W1//+1tf//tbX//7a2//+hof//QUH//yoq//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LS3//y8v//8wMP//MDD//zAw//8wMP//MDD//zAw//8wMP//MDD//zAw\n        //8wMP//MDD//zAw//8wMP//MDD//zAw//8uLv//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//y4u//8wMP//MDD//zAw//8wMP//MDD//zAw\n        //8wMP//MDD//zAw//8wMP//MDD//zAw//8wMP//MDD//zAw//8vL///LS3//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP/8LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //wsLP/yLCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //EsLP/bLCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        /9ksLP+1LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        /7QsLP+CLCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//iws\n        /4ErK/9ILCz/6Sws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz/6Cws\n        /0YrK/8QLCz/uyws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz/ui0t\n        /w8rK/8ALCz/ZSws//osLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP/6LCz/ZCws\n        /wAsLP8ALS3/GSws/8EsLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP/ALCz/GSws\n        /wAAAAAALCz/AC0t/1AsLP/sLCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws/+wsLP9PLCz/AAAA\n        AAAAAAAALCz/ACws/wcsLP+FLCz/+iws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz/+iws/4MrK/8HKyv/AAAA\n        AAAAAAAAAAAAAC0t/wAtLf8TLCz/nyws//wsLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP/8LCz/nysr/xQrK/8AAAAAAAAA\n        AAAAAAAAAAAAACws/wAsLP8ALCz/GCws/58sLP/5LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//ksLP+gLCz/GCsr/wAuLv8AAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAALS3/AC0t/xQsLP+ELCz/7Sws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz/7Sws/4UsLP8TLCz/AAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACws/wArK/8ILS3/UCws/8EsLP/6LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//osLP/ALCz/Tyoq/wkrK/8AAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArK/8AMTH/ACws/xksLP9lLCz/uyws/+ksLP/9LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//0sLP/pLCz/uyws/2QtLf8YLy//ACws/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACws/wAwMP8AKyv/ECws/0csLP+DLCz/tiws\n        /9ssLP/yLCz//Cws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws\n        //8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//yws//8sLP//LCz//Cws\n        //IsLP/bLCz/tiws/4IsLP9HLCz/EDo6/wAuLv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAD/gAAAAAAAAAAAAAAAAAAAAAf8AP8AAAAAAAAAAAAAAAAAAAAAA/wA/AAAAAAAAAAAAAAAAAAAAAAA\n        /AD4AAAAAAAAAAAAAAAAAAAAAAB8APAAAAAAAAAAAAAAAAAAAAAAADwA4AAAAAAAAAAAAAAAAAAAAAAA\n        HADAAAAAAAAAAAAAAAAAAAAAAAAMAMAAAAAAAAAAAAAAAAAAAAAAAAwAgAAAAAAAAAAAAAAAAAAAAAAA\n        BACAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAA\n        BACAAAAAAAAAAAAAAAAAAAAAAAAEAMAAAAAAAAAAAAAAAAAAAAAAAAwAwAAAAAAAAAAAAAAAAAAAAAAA\n        DADgAAAAAAAAAAAAAAAAAAAAAAAcAPAAAAAAAAAAAAAAAAAAAAAAADwA+AAAAAAAAAAAAAAAAAAAAAAA\n        fAD8AAAAAAAAAAAAAAAAAAAAAAD8AP8AAAAAAAAAAAAAAAAAAAAAA/wA/4AAAAAAAAAAAAAAAAAAAAAH\n        /AA=\n</value>\n  </data>\n</root>"
  },
  {
    "path": "Utility/Sddp.DeviceResponse.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Net;\n\nnamespace Garry.Control4.Jailbreak.Utility\n{\n    internal partial class Sddp\n    {\n        public class DeviceResponse\n        {\n            public Dictionary<string, string> FullHeaders;\n            public IPEndPoint EndPoint;\n\n            // ReSharper disable UnusedMember.Global\n            public string Location => GetHeader(\"Location\");\n            public string Server => GetHeader(\"SERVER\");\n            public string St => GetHeader(\"ST\");\n            public string Usn => GetHeader(\"USN\");\n            public string Host => GetHeader(\"Host\");\n            public string Nts => GetHeader(\"NTS\");\n            // ReSharper restore UnusedMember.Global\n\n            private string GetHeader(string name)\n            {\n                FullHeaders.TryGetValue(name, out var value);\n                return value;\n            }\n\n            public override string ToString() => $\"{EndPoint.Address}\";\n        }\n    }\n}"
  },
  {
    "path": "Utility/Sddp.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Sockets;\nusing System.Text;\n\nnamespace Garry.Control4.Jailbreak.Utility\n{\n    internal partial class Sddp : IDisposable\n    {\n        private Socket SearchSocket { get; set; }\n        private readonly byte[] _receiveBytes = new byte[1024];\n\n        public Action<DeviceResponse> OnResponse;\n\n        private EndPoint _endPoint;\n\n        public Sddp()\n        {\n            _endPoint = new IPEndPoint(IPAddress.Any, 0);\n\n            SearchSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);\n            SearchSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);\n            SearchSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 3);\n            SearchSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,\n                new MulticastOption(IPAddress.Parse(\"239.255.255.250\")));\n            SearchSocket.Bind(_endPoint);\n            SearchSocket.BeginReceiveFrom(_receiveBytes, 0, _receiveBytes.Length, SocketFlags.None, ref _endPoint,\n                SearchSocketRecv, this);\n        }\n\n        public void Dispose()\n        {\n            SearchSocket?.Shutdown(SocketShutdown.Both);\n            SearchSocket = null;\n        }\n\n        public void Search(string target)\n        {\n            SendMessage(\n                $\"M-SEARCH * HTTP/1.1\\r\\nHOST: 239.255.255.250:1900\\r\\nMAN: \\\"ssdp:discover\\\"\\r\\nMX: 5\\r\\nST: {target}\\r\\n\\r\\n\\0\");\n        }\n\n        private void SendMessage(string message)\n        {\n            var bytes = Encoding.UTF8.GetBytes(message);\n            var hostByName = Dns.GetHostEntry(Dns.GetHostName());\n            var addressList = hostByName.AddressList;\n            var remoteEp = new IPEndPoint(IPAddress.Parse(\"239.255.255.250\"), 1900);\n            foreach (var iPAddress in addressList)\n            {\n                var addressBytes = iPAddress.GetAddressBytes();\n                if (addressBytes.Length > 4) continue;\n\n                var optionValue = addressBytes[0] + (addressBytes[1] << 8) + (addressBytes[2] << 16) +\n                                  (addressBytes[3] << 24);\n\n                SearchSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, optionValue);\n                SearchSocket.SendTo(bytes, 0, bytes.Length, SocketFlags.None, remoteEp);\n            }\n        }\n\n        private void SearchSocketRecv(IAsyncResult result)\n        {\n            if (SearchSocket == null)\n                return;\n\n            try\n            {\n                EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);\n                var num = SearchSocket.EndReceiveFrom(result, ref endPoint);\n\n                if (num <= 0) return;\n                var msg = Encoding.UTF8.GetString(_receiveBytes, 0, num);\n\n                var lines = msg.Split('\\n', '\\r');\n\n                var headers = lines.Where(x => x.Contains(\":\"))\n                    .ToDictionary(\n                        x => x.Substring(0, x.IndexOf(':')).Trim(),\n                        x => x.Substring(x.IndexOf(':') + 1).Trim());\n\n                if (headers.Count == 0)\n                    return;\n\n                var response = new DeviceResponse\n                {\n                    FullHeaders = headers,\n                    EndPoint = endPoint as IPEndPoint\n                };\n\n                OnResponse?.Invoke(response);\n            }\n            finally\n            {\n                SearchSocket.BeginReceiveFrom(_receiveBytes, 0, _receiveBytes.Length, SocketFlags.None, ref _endPoint,\n                    SearchSocketRecv, this);\n            }\n        }\n    }\n}"
  },
  {
    "path": "app.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n  <assemblyIdentity version=\"1.0.0.0\" name=\"MyApplication.app\"/>\n  <trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\">\n    <security>\n      <requestedPrivileges xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n        <!-- UAC Manifest Options\n             If you want to change the Windows User Account Control level replace the \n             requestedExecutionLevel node with one of the following.\n\n        <requestedExecutionLevel  level=\"asInvoker\" uiAccess=\"false\" />\n        <requestedExecutionLevel  level=\"requireAdministrator\" uiAccess=\"false\" />\n        <requestedExecutionLevel  level=\"highestAvailable\" uiAccess=\"false\" />        \n\n            Specifying requestedExecutionLevel element will disable file and registry virtualization. \n            Remove this element if your application requires this virtualization for backwards\n            compatibility.\n        -->\n        <requestedExecutionLevel level=\"highestAvailable\" uiAccess=\"false\" />\n      </requestedPrivileges>\n    </security>\n  </trustInfo>\n\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- A list of the Windows versions that this application has been tested on\n           and is designed to work with. Uncomment the appropriate elements\n           and Windows will automatically select the most compatible environment. -->\n\n      <!-- Windows Vista -->\n      <!--<supportedOS Id=\"{e2011457-1546-43c5-a5fe-008deee3d3f0}\" />-->\n\n      <!-- Windows 7 -->\n      <!--<supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" />-->\n\n      <!-- Windows 8 -->\n      <!--<supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" />-->\n\n      <!-- Windows 8.1 -->\n      <!--<supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" />-->\n\n      <!-- Windows 10 -->\n      <!--<supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />-->\n\n    </application>\n  </compatibility>\n\n  <!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher\n       DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need \n       to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should \n       also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->\n  <!--\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\n    <windowsSettings>\n      <dpiAware xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">true</dpiAware>\n    </windowsSettings>\n  </application>\n  -->\n\n  <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->\n  <!--\n  <dependency>\n    <dependentAssembly>\n      <assemblyIdentity\n          type=\"win32\"\n          name=\"Microsoft.Windows.Common-Controls\"\n          version=\"6.0.0.0\"\n          processorArchitecture=\"*\"\n          publicKeyToken=\"6595b64144ccf1df\"\n          language=\"*\"\n        />\n    </dependentAssembly>\n  </dependency>\n  -->\n\n</assembly>\n"
  },
  {
    "path": "packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"SSH.NET\" version=\"2023.0.0\" targetFramework=\"net472\" />\n</packages>"
  }
]