[
  {
    "path": ".editorconfig",
    "content": "﻿[*]\ncharset = utf-8-bom\nend_of_line = crlf\ntrim_trailing_whitespace = false\ninsert_final_newline = false\nindent_style = space\nindent_size = 4\n\n# Microsoft .NET properties\ncsharp_new_line_before_members_in_object_initializers = false\ncsharp_new_line_before_open_brace = none\ncsharp_preferred_modifier_order = public, private, protected, internal, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async:suggestion\ncsharp_space_after_cast = true\ncsharp_style_expression_bodied_accessors = true:suggestion\ncsharp_style_expression_bodied_methods = true:none\ncsharp_style_expression_bodied_properties = false:suggestion\ncsharp_style_var_elsewhere = true:suggestion\ncsharp_style_var_for_built_in_types = true:suggestion\ncsharp_style_var_when_type_is_apparent = true:suggestion\ndotnet_naming_rule.constants_rule.import_to_resharper = as_predefined\ndotnet_naming_rule.constants_rule.severity = warning\ndotnet_naming_rule.constants_rule.style = upper_camel_case_style\ndotnet_naming_rule.constants_rule.symbols = constants_symbols\ndotnet_naming_rule.public_fields_rule.import_to_resharper = as_predefined\ndotnet_naming_rule.public_fields_rule.severity = warning\ndotnet_naming_rule.public_fields_rule.style = lower_camel_case_style\ndotnet_naming_rule.public_fields_rule.symbols = public_fields_symbols\ndotnet_naming_rule.static_readonly_rule.import_to_resharper = as_predefined\ndotnet_naming_rule.static_readonly_rule.severity = warning\ndotnet_naming_rule.static_readonly_rule.style = upper_camel_case_style\ndotnet_naming_rule.static_readonly_rule.symbols = static_readonly_symbols\ndotnet_naming_rule.unity_serialized_field_rule.import_to_resharper = True\ndotnet_naming_rule.unity_serialized_field_rule.resharper_description = Unity serialized field\ndotnet_naming_rule.unity_serialized_field_rule.resharper_guid = 5f0fdb63-c892-4d2c-9324-15c80b22a7ef\ndotnet_naming_rule.unity_serialized_field_rule.severity = warning\ndotnet_naming_rule.unity_serialized_field_rule.style = lower_camel_case_style\ndotnet_naming_rule.unity_serialized_field_rule.symbols = unity_serialized_field_symbols\ndotnet_naming_style.lower_camel_case_style.capitalization = camel_case\ndotnet_naming_style.upper_camel_case_style.capitalization = pascal_case\ndotnet_naming_symbols.constants_symbols.applicable_accessibilities = public, internal, protected, protected_internal, private_protected\ndotnet_naming_symbols.constants_symbols.applicable_kinds = field\ndotnet_naming_symbols.constants_symbols.required_modifiers = const\ndotnet_naming_symbols.public_fields_symbols.applicable_accessibilities = public, internal, protected, protected_internal, private_protected\ndotnet_naming_symbols.public_fields_symbols.applicable_kinds = field\ndotnet_naming_symbols.static_readonly_symbols.applicable_accessibilities = public, internal, protected, protected_internal, private_protected\ndotnet_naming_symbols.static_readonly_symbols.applicable_kinds = field\ndotnet_naming_symbols.static_readonly_symbols.required_modifiers = static, readonly\ndotnet_naming_symbols.unity_serialized_field_symbols.applicable_accessibilities = *\ndotnet_naming_symbols.unity_serialized_field_symbols.applicable_kinds =\ndotnet_naming_symbols.unity_serialized_field_symbols.resharper_applicable_kinds = unity_serialised_field\ndotnet_naming_symbols.unity_serialized_field_symbols.resharper_required_modifiers = instance\ndotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none\ndotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none\ndotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none\ndotnet_style_predefined_type_for_locals_parameters_members = true:suggestion\ndotnet_style_predefined_type_for_member_access = true:suggestion\ndotnet_style_qualification_for_event = false:suggestion\ndotnet_style_qualification_for_field = false:suggestion\ndotnet_style_qualification_for_method = false:suggestion\ndotnet_style_qualification_for_property = false:suggestion\ndotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion\n\n# ReSharper properties\nresharper_apply_auto_detected_rules = false\nresharper_autodetect_indent_settings = true\nresharper_csharp_empty_block_style = together_same_line\nresharper_csharp_stick_comment = false\nresharper_indent_braces_inside_statement_conditions = false\nresharper_local_function_body = expression_body\nresharper_show_autodetect_configure_formatting_tip = false\nresharper_space_within_single_line_array_initializer_braces = false\nresharper_use_indent_from_vs = false\n\n# ReSharper inspection severities\nresharper_arrange_redundant_parentheses_highlighting = hint\nresharper_arrange_this_qualifier_highlighting = hint\nresharper_arrange_type_member_modifiers_highlighting = hint\nresharper_arrange_type_modifiers_highlighting = hint\nresharper_built_in_type_reference_style_for_member_access_highlighting = hint\nresharper_built_in_type_reference_style_highlighting = hint\nresharper_redundant_base_qualifier_highlighting = warning\nresharper_suggest_var_or_type_built_in_types_highlighting = hint\nresharper_suggest_var_or_type_elsewhere_highlighting = hint\nresharper_suggest_var_or_type_simple_types_highlighting = hint\nresharper_web_config_module_not_resolved_highlighting = warning\nresharper_web_config_type_not_resolved_highlighting = warning\nresharper_web_config_wrong_module_highlighting = warning\n\n[{*.har,*.inputactions,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.stylelintrc,bowerrc,jest.config}]\nindent_style = space\nindent_size = 2\n\n[*.{appxmanifest,asax,ascx,aspx,axaml,build,cg,cginc,compute,cs,cshtml,dtd,fs,fsi,fsscript,fsx,hlsl,hlsli,hlslinc,master,ml,mli,nuspec,paml,razor,resw,resx,shader,skin,usf,ush,vb,xaml,xamlx,xoml,xsd}]\nindent_style = space\nindent_size = 4\ntab_width = 4\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a bug report\ntitle: \"[BUG] \"\nlabels: bug\nassignees: ad2017gd\n\n---\n\n**Describe the bug**\n*A clear and concise description of what the bug is.*\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n...\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Windows version and/or build**\n... (can be a screenshot of winver.exe)\n\n**RainbowTaskbar version**\n...\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ad2017gd\n\n---\n\n**Describe your feature request.**\n...\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/other-issue.md",
    "content": "---\nname: Other issue\nabout: ONLY USE IF NOT A BUG REPORT/FEATURE REQUEST!\ntitle: ''\nlabels: ''\nassignees: ad2017gd\n\n---\n\n\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Mono auto generated files\nmono_crash.*\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\n[Ww][Ii][Nn]32/\n[Aa][Rr][Mm]/\n[Aa][Rr][Mm]64/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n[Ll]ogs/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUnit\n*.VisualState.xml\nTestResult.xml\nnunit-*.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# ASP.NET Scaffolding\nScaffoldingReadMe.txt\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.log\n*.tlog\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Coverlet is a free, cross platform Code Coverage Tool\ncoverage*.json\ncoverage*.xml\ncoverage*.info\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# NuGet Symbol Packages\n*.snupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n*.appxbundle\n*.appxupload\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!?*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n*- [Bb]ackup.rdl\n*- [Bb]ackup ([0-9]).rdl\n*- [Bb]ackup ([0-9][0-9]).rdl\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio 6 auto-generated project file (contains which files were open etc.)\n*.vbp\n\n# Visual Studio 6 workspace and project file (working project files containing files to include in project)\n*.dsw\n*.dsp\n\n# Visual Studio 6 technical files\n*.ncb\n*.aps\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\n# Visual Studio History (VSHistory) files\n.vshistory/\n\n# BeatPulse healthcheck temp database\nhealthchecksdb\n\n# Backup folder for Package Reference Convert tool in Visual Studio 2017\nMigrationBackup/\n\n# Ionide (cross platform F# VS Code tools) working folder\n.ionide/\n\n# Fody - auto-generated XML schema\nFodyWeavers.xsd\n\n# VS Code files for those working on multiple tools\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!.vscode/launch.json\n!.vscode/extensions.json\n*.code-workspace\n\n# Local History for Visual Studio Code\n.history/\n\n# Windows Installer files from build outputs\n*.cab\n*.msi\n*.msix\n*.msm\n*.msp\n\n# JetBrains Rider\n*.sln.iml\n.idea/*\n/RainbowTaskbar/RainbowTaskbar - Backup.csproj\n/vcpkg_installed\n/Output\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2023 ad2017gd\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": "MSIXPkg2/MSIXPkg2.wapproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Condition=\"'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '15.0'\">\n    <VisualStudioVersion>15.0</VisualStudioVersion>\n  </PropertyGroup>\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|x86\">\n      <Configuration>Debug</Configuration>\n      <Platform>x86</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release (MSIX)|AnyCPU\">\n      <Configuration>Release (MSIX)</Configuration>\n      <Platform>AnyCPU</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release (MSIX)|ARM\">\n      <Configuration>Release (MSIX)</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release (MSIX)|ARM64\">\n      <Configuration>Release (MSIX)</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release (MSIX)|x64\">\n      <Configuration>Release (MSIX)</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release (MSIX)|x86\">\n      <Configuration>Release (MSIX)</Configuration>\n      <Platform>x86</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x86\">\n      <Configuration>Release</Configuration>\n      <Platform>x86</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|ARM\">\n      <Configuration>Debug</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|ARM\">\n      <Configuration>Release</Configuration>\n      <Platform>ARM</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|ARM64\">\n      <Configuration>Debug</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|ARM64\">\n      <Configuration>Release</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|AnyCPU\">\n      <Configuration>Debug</Configuration>\n      <Platform>AnyCPU</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|AnyCPU\">\n      <Configuration>Release</Configuration>\n      <Platform>AnyCPU</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup>\n    <WapProjPath Condition=\"'$(WapProjPath)'==''\">$(MSBuildExtensionsPath)\\Microsoft\\DesktopBridge\\</WapProjPath>\n  </PropertyGroup>\n  <Import Project=\"$(WapProjPath)\\Microsoft.DesktopBridge.props\" />\n  <PropertyGroup>\n    <ProjectGuid>eeaf81a9-bb63-40d9-a733-7f25d2313df5</ProjectGuid>\n    <TargetPlatformVersion>10.0.26100.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>\n    <TargetFramework>net8.0-windows17763.0</TargetFramework>\n    <DefaultLanguage>en-US</DefaultLanguage>\n    <AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>\n    <NoWarn>$(NoWarn);NU1702</NoWarn>\n    <EntryPointProjectUniqueName>..\\RainbowTaskbar\\RainbowTaskbar.csproj</EntryPointProjectUniqueName>\n    <AppxBundlePlatforms>x64</AppxBundlePlatforms>\n    <GenerateAppInstallerFile>False</GenerateAppInstallerFile>\n    <PackageCertificateThumbprint>18A14CD3EECA6DA0643255C7613892FF281EC8AA</PackageCertificateThumbprint>\n    <AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>\n    <AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision>\n    <GenerateTestArtifacts>False</GenerateTestArtifacts>\n    <HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>\n    <GenerateTemporaryStoreCertificate>True</GenerateTemporaryStoreCertificate>\n    <AppxSymbolPackageEnabled>False</AppxSymbolPackageEnabled>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|x64'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|ARM'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|ARM64'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x86'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|x86'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x86'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|AnyCPU'\">\n    <AppxBundle>Always</AppxBundle>\n  </PropertyGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"Package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Images\\LargeTile.scale-100.png\" />\n    <Content Include=\"Images\\LargeTile.scale-125.png\" />\n    <Content Include=\"Images\\LargeTile.scale-150.png\" />\n    <Content Include=\"Images\\LargeTile.scale-200.png\" />\n    <Content Include=\"Images\\LargeTile.scale-400.png\" />\n    <Content Include=\"Images\\SmallTile.scale-100.png\" />\n    <Content Include=\"Images\\SmallTile.scale-125.png\" />\n    <Content Include=\"Images\\SmallTile.scale-150.png\" />\n    <Content Include=\"Images\\SmallTile.scale-200.png\" />\n    <Content Include=\"Images\\SmallTile.scale-400.png\" />\n    <Content Include=\"Images\\SplashScreen.scale-100.png\" />\n    <Content Include=\"Images\\SplashScreen.scale-125.png\" />\n    <Content Include=\"Images\\SplashScreen.scale-150.png\" />\n    <Content Include=\"Images\\SplashScreen.scale-200.png\" />\n    <Content Include=\"Images\\LockScreenLogo.scale-200.png\" />\n    <Content Include=\"Images\\SplashScreen.scale-400.png\" />\n    <Content Include=\"Images\\Square150x150Logo.scale-100.png\" />\n    <Content Include=\"Images\\Square150x150Logo.scale-125.png\" />\n    <Content Include=\"Images\\Square150x150Logo.scale-150.png\" />\n    <Content Include=\"Images\\Square150x150Logo.scale-200.png\" />\n    <Content Include=\"Images\\Square150x150Logo.scale-400.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-lightunplated_targetsize-16.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-lightunplated_targetsize-24.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-lightunplated_targetsize-256.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-lightunplated_targetsize-32.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-lightunplated_targetsize-48.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-unplated_targetsize-16.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-unplated_targetsize-256.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-unplated_targetsize-32.png\" />\n    <Content Include=\"Images\\Square44x44Logo.altform-unplated_targetsize-48.png\" />\n    <Content Include=\"Images\\Square44x44Logo.scale-100.png\" />\n    <Content Include=\"Images\\Square44x44Logo.scale-125.png\" />\n    <Content Include=\"Images\\Square44x44Logo.scale-150.png\" />\n    <Content Include=\"Images\\Square44x44Logo.scale-200.png\" />\n    <Content Include=\"Images\\Square44x44Logo.scale-400.png\" />\n    <Content Include=\"Images\\Square44x44Logo.targetsize-16.png\" />\n    <Content Include=\"Images\\Square44x44Logo.targetsize-24.png\" />\n    <Content Include=\"Images\\Square44x44Logo.targetsize-24_altform-unplated.png\" />\n    <Content Include=\"Images\\Square44x44Logo.targetsize-256.png\" />\n    <Content Include=\"Images\\Square44x44Logo.targetsize-32.png\" />\n    <Content Include=\"Images\\Square44x44Logo.targetsize-48.png\" />\n    <Content Include=\"Images\\StoreLogo.scale-100.png\" />\n    <Content Include=\"Images\\StoreLogo.scale-125.png\" />\n    <Content Include=\"Images\\StoreLogo.scale-150.png\" />\n    <Content Include=\"Images\\StoreLogo.scale-200.png\" />\n    <Content Include=\"Images\\StoreLogo.scale-400.png\" />\n    <Content Include=\"Images\\Wide310x150Logo.scale-100.png\" />\n    <Content Include=\"Images\\Wide310x150Logo.scale-125.png\" />\n    <Content Include=\"Images\\Wide310x150Logo.scale-150.png\" />\n    <Content Include=\"Images\\Wide310x150Logo.scale-200.png\" />\n    <Content Include=\"Images\\Wide310x150Logo.scale-400.png\" />\n    <None Include=\"Package.StoreAssociation.xml\" />\n  </ItemGroup>\n  <Import Project=\"$(WapProjPath)\\Microsoft.DesktopBridge.targets\" />\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Windows.SDK.BuildTools\" Version=\"10.0.26100.1742\" PrivateAssets=\"all\" />\n    <PackageReference Include=\"WPF-UI\" Version=\"4.0.3\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\RainbowTaskbar\\RainbowTaskbar.csproj\">\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\RainbowTaskbar\\msix.build.props\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "MSIXPkg2/Package.appxmanifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<Package\n  xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\"\n  xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"\n  xmlns:rescap=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities\"\n  xmlns:uap5=\"http://schemas.microsoft.com/appx/manifest/uap/windows10/5\"\n  IgnorableNamespaces=\"uap rescap\">\n\n  <Identity\n    Name=\"48822ad2017.30397FC5B3C66\"\n    Publisher=\"CN=7F27496D-0310-4FD3-81EF-B816897FD011\"\n    Version=\"3.2.2.0\" />\n\n  <Properties>\n    <DisplayName>RainbowTaskbar.</DisplayName>\n    <PublisherDisplayName>ad2017</PublisherDisplayName>\n    <Logo>Images\\StoreLogo.png</Logo>\n  </Properties>\n\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.0.0\" MaxVersionTested=\"10.0.0.0\" />\n    <TargetDeviceFamily Name=\"Windows.Desktop\" MinVersion=\"10.0.17763.0\" MaxVersionTested=\"10.0.26100.0\" />\n  </Dependencies>\n\n  <Resources>\n    <Resource Language=\"x-generate\"/>\n  </Resources>\n    \n    \n\n  <Applications>\n    <Application Id=\"App\"\n      Executable=\"$targetnametoken$.exe\"\n      EntryPoint=\"$targetentrypoint$\">\n      <uap:VisualElements\n        DisplayName=\"RainbowTaskbar\"\n        Description=\"MSIXPkg\"\n        BackgroundColor=\"transparent\"\n        Square150x150Logo=\"Images\\Square150x150Logo.png\"\n        Square44x44Logo=\"Images\\Square44x44Logo.png\">\n        <uap:DefaultTile Wide310x150Logo=\"Images\\Wide310x150Logo.png\"  Square71x71Logo=\"Images\\SmallTile.png\" Square310x310Logo=\"Images\\LargeTile.png\"/>\n        <uap:SplashScreen Image=\"Images\\SplashScreen.png\" />\n      </uap:VisualElements>\n\n        <Extensions>\n            <uap5:Extension\n              Category=\"windows.startupTask\"\n              Executable=\"RainbowTaskbar\\RainbowTaskbar.exe\"\n              EntryPoint=\"Windows.FullTrustApplication\">\n                <uap5:StartupTask\n                  TaskId=\"RnbTsk_Startup\"\n                  Enabled=\"true\"\n                  DisplayName=\"RainbowTaskbar\" />\n            </uap5:Extension>\n        </Extensions>\n    </Application>\n  </Applications>\n\n  <Capabilities>\n    <Capability Name=\"internetClient\" />\n    <rescap:Capability Name=\"runFullTrust\" />\n    <Capability Name=\"internetClientServer\"/>\n  </Capabilities>\n\n    \n</Package>\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\n   \n[<sub>*</sub>](#microsoft-store)\n[<img src=\"https://get.microsoft.com/images/en-us%20dark.svg\" alt=\"Download from Microsoft Store\" height=\"64\">](https://apps.microsoft.com/detail/9nn78x0674xw)\n[<img src=\"https://github-production-user-asset-6210df.s3.amazonaws.com/39013925/280434808-334b68d6-9568-4cc5-988d-a9bf186c1b8c.png\" alt=\"Download x64\" height=\"64\">](https://github.com/ad2017gd/RainbowTaskbar/releases/download/3.2.2/setup-x64.exe)\n[<img src=\"https://github-production-user-asset-6210df.s3.amazonaws.com/39013925/280435213-f3b1165b-dba6-4f0d-84ac-2cae15ec992a.png\" alt=\"Donate\" height=\"64\">](https://paypal.me/ad2k17)\n\n   <h1><a href=\"https://rnb.ad2017.dev\">RainbowTaskbar</a></h1>\n<p>Useful tool for Windows taskbar customization. Supports web configurations or instruction-like configurations that feature color effects, transitions, blur, images, text, rounded corners, shapes, transparency. Now rewritten in .NET 8!</p>\n   <p><strong>Conflicts with TranslucentTB! Close it before running RainbowTaskbar</strong></p>\n\n   https://www.youtube.com/watch?v=HvbapfQLOZs\n\n   <img style=\"margin: 0 auto; width: 90%;\" src=\"https://github.com/ad2017gd/RainbowTaskbar/assets/39013925/4e5ce6d6-4222-4437-9822-f1a19291e028\">\n\n   <div style=\"margin: 0 auto;\">\n      <img style=\"width: 30%;\" src=\"https://github.com/ad2017gd/RainbowTaskbar/assets/39013925/29a01115-9aff-40eb-afbf-7770aaf346b4\">\n      <img style=\"width: 30%;\" src=\"https://github.com/ad2017gd/RainbowTaskbar/assets/39013925/3effb1a7-8adf-4628-b415-42a303f5090f\">\n   </div>\n   \n\n<br>\n<br>\n</div>\n\n# Getting started\nFirst off, grab yourself the hottest new release at https://github.com/ad2017gd/RainbowTaskbar/releases.\n\nRainbowTaskbar is a portable app, so there's no installing required. There are setups available, but they only install a single file and create a nice shortcut for you. If not already installed, you will be prompted to install the **.NET 8** runtime.\n\nAfter launching the app for the first time, the editor will automatically open. You can find other users' presets in the Browse tab, or you can create your own.\n\n![image](https://github.com/user-attachments/assets/acf1be2d-c5ea-493a-9a63-e266cd909b20)\n\n\nHave fun using RainbowTaskbar!\n\n# Documentation\nhttps://rnb.ad2017.dev/web/docs\nTODO\n\n<div align=\"center\">\n\n# Thank you for 100 stars\n\nA sincere thank you to all the users of RainbowTaskbar! Since the first release of this program in 2021, I would have never expected it to have as many users as it has now.\n\nRainbowTaskbar has really been a passion project of mine all this time. It all started thanks to my friend telling me about the fact that, at the time, there weren't any really good\ntaskbar customization software (actually there were and still are but none would fit my personalization needs).\n\nThe first version of RainbowTaskbar was written in C, which was a pretty bad idea. I didn't realise at the time, but the UI was also pretty much garbage. However, when I saw\nopen source software websites reposting my tool, it really gave me the motivation to still work on this program.\n\nThanks to my other friend, [zCri](https://github.com/zCri), we both rewrote RainbowTaskbar to the (then) current v2 .NET version (now v3!), which allowed me to implement even more\nfeatures with cleaner UI.\n\nAfter the rewrite, RainbowTaskbar received even more attention from people, which also made me continue updating it. However, all the attention has also led to some\ncopies of this software being sold on markets such as the Microsoft Store by other people, stripping it of all the credits.\n\nIf you wish to support me in the future development of this app and, perhaps, other apps, you can [buy RainbowTaskbar from the Microsoft Store](https://www.microsoft.com/store/productId/9NN78X0674XW) \nwhich is actually published by me, or by donating on [PayPal](https://paypal.me/ad2k17). I thank you once again for using this software.\n\n</div>\n\n# License\nSee `LICENSE` for more information.\n\n# Notes\n## Microsoft Store\n*The Microsoft Store version of this software is provided as a means for donations. This software is free and open-source. You can download it for free in the releases tab or by clicking the download button next to the Microsoft Store page button.\n"
  },
  {
    "path": "RainbowTaskbar/App.xaml",
    "content": "﻿<Application x:Class=\"RainbowTaskbar.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" \n             Startup=\"Application_Startup\"\n            xmlns:xctk=\"http://schemas.xceed.com/wpf/xaml/toolkit\"\n             \n             xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\"\n            StartupUri=\"TrayWindow.xaml\">\n    <Application.Resources>\n\n        <ResourceDictionary >\n            <ResourceDictionary.MergedDictionaries >\n                <ui:ThemesDictionary Theme=\"Dark\" />\n                <ui:ControlsDictionary />\n            </ResourceDictionary.MergedDictionaries>\n\n\n        </ResourceDictionary>\n\n    </Application.Resources>\n\n</Application>"
  },
  {
    "path": "RainbowTaskbar/App.xaml.cs",
    "content": "﻿using H.Pipes;\nusing H.Pipes.AccessControl;\nusing Microsoft.Web.WebView2.WinForms;\nusing Microsoft.Win32;\nusing PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Configuration.Web;\nusing RainbowTaskbar.Drawing;\nusing RainbowTaskbar.Editor;\nusing RainbowTaskbar.Helpers;\nusing RainbowTaskbar.HTTPAPI;\nusing RainbowTaskbar.Languages;\nusing RainbowTaskbar.Preferences;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.IO;\nusing System.IO.Pipes;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Runtime.Serialization;\nusing System.Security.AccessControl;\nusing System.Security.Principal;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Serialization.Metadata;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Web;\nusing System.Windows;\nusing System.Windows.Interop;\nusing System.Windows.Threading;\nusing System.Xml;\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement;\nusing Localization = RainbowTaskbar.Languages.Localization;\n\nnamespace RainbowTaskbar;\n\n/// <summary>\n///     Interaction logic for App.xaml\n/// </summary>\npublic partial class App : Application {\n    [DllImport(\"KERNEL32.DLL\", EntryPoint = \"SetProcessWorkingSetSize\", SetLastError = true, CallingConvention = CallingConvention.StdCall)]\n    public static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);\n\n    [DllImport(\"KERNEL32.DLL\", EntryPoint = \"GetCurrentProcess\", SetLastError = true, CallingConvention = CallingConvention.StdCall)]\n    public static extern IntPtr GetCurrentProcess();\n\n\n\n    [StructLayout(LayoutKind.Sequential)]\n    struct Point {\n        public int X;\n        public int Y;\n    }\n\n    [StructLayout(LayoutKind.Sequential)]\n    struct MOUSEHOOKSTRUCT {\n        public Point pt;\n        public IntPtr hwnd;\n        public uint wHitTestCode;\n        public IntPtr dwExtraInfo;\n    }\n\n    public delegate int MouseProc(int nCode, IntPtr wParam, IntPtr lParam);\n\n    [DllImport(\"user32\", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]\n    public static extern int SetWindowsHookEx(int idHook, MouseProc lpfn, int hInstance, int threadId);\n\n    [DllImport(\"user32\", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]\n    public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);\n\n    static int mouseHookId = -1;\n    static MouseProc callback = new MouseProc(HookCallback);\n    const int WH_MOUSE_LL = 14;\n\n    [return: MarshalAs(UnmanagedType.Bool)]\n    [DllImport(\"user32.dll\", SetLastError = true, CharSet = CharSet.Auto)]\n    static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);\n\n    [StructLayout(LayoutKind.Sequential)]\n    public struct POINT {\n        public int X;\n        public int Y;\n    }\n    [DllImport(\"user32.dll\")]\n    static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);\n    static DateTime last = DateTime.MinValue;\n    [DllImport(\"user32.dll\", EntryPoint = \"RealChildWindowFromPoint\", SetLastError = false)]\n    public static extern IntPtr RealChildWindowFromPoint(IntPtr hwndParent, int x, int y);\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    static extern bool UnhookWindowsHookEx(IntPtr hhk);\n\n    public static IntPtr FindLastChildAtPoint(IntPtr parent, int x, int y) {\n        IntPtr neww = RealChildWindowFromPoint(parent, x, y);\n        if (neww != 0 && neww != parent) return FindLastChildAtPoint(neww, x, y);\n        else return parent;\n    }\n    static DateTime lastMove = DateTime.MinValue;\n    private static int HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {\n        var mhs = Marshal.PtrToStructure<MOUSEHOOKSTRUCT>(lParam);\n\n        \n        if (nCode >= 0) {\n\n\n            App.Current.Dispatcher.BeginInvoke(() => {\n\n                try {\n                    if (App.Settings.SelectedConfig is InstructionConfig) return;\n\n                    if (wParam == 0x0201 && trayWindow.TrayIcon.ContextMenu.IsOpen || wParam == 0x0204) return;\n                    if (wParam == 0x0200 /* MOUSEMOVE */) {\n                        if (DateTime.Now - lastMove > TimeSpan.FromMilliseconds(8)) {\n                            lastMove = DateTime.Now;\n                        }\n                        else return;\n\n                    }\n                    var farLeft = (int) (App.taskbars.Count > 0 ? App.taskbars.Min(x => x.Left) : 0);\n                    App.taskbars.ForEach(x => {\n                        if (x.webView is null) return;\n\n                        // passing WM_LBUTTONDOWN interferes with tray icon, too bad\n\n                        var pn = System.Windows.Forms.Control.MousePosition;\n                        var scale = x.windowHelper.scale;\n                        if (!new System.Drawing.Rectangle(new((int) (x.Left * scale), (int) (x.Top * scale)), new((int) (x.ActualWidth * scale), (int) (x.ActualHeight * scale))).Contains(pn)) return;\n\n                        POINT p = new POINT { X = (int) (pn.X), Y = (int) (pn.Y) };\n                        IntPtr cch = FindLastChildAtPoint(x.webView.Handle, 0, 0);\n                        ScreenToClient(App.Settings.GraphicsRepeat ? cch : x.windowHelper.HWND, ref p);\n                        if (!App.Settings.GraphicsRepeat) p.X += (int) x.Left - farLeft;\n                        PostMessage(cch, (uint) wParam, 0x0000, (IntPtr) (((uint) (p.Y) << 16) | ((((ushort) (p.X)) & 0xFFFF))));\n                    });\n                } catch { }\n            });\n            \n\n            \n        }\n\n        return CallNextHookEx(mouseHookId, nCode, wParam, lParam);\n    }\n\n\n    public static List<Taskbar> taskbars = new();\n    public static bool monacoExtracted = false;\n    public static EditorWindow editor = null;\n    public static TrayWindow trayWindow = (TrayWindow) Current.MainWindow;\n    public static Mutex mutex = new(true, \"RainbowTaskbar Mutex\");\n    public static Localization localization;\n    public static EditorViewModel editorViewModel = new();\n    public static bool firstRun = false;\n    public static string rainbowTaskbarDir = Path.Join(Environment.GetEnvironmentVariable(\"AppData\"), \"RainbowTaskbar\");\n    public static string configDir = Path.Join(rainbowTaskbarDir, \"configurations\");\n    public static string monacoDir = Path.Join(rainbowTaskbarDir, \"monaco\");\n    public static LayerManager layers = null;\n    public static Random rnd = new();\n    public static HiddenWebViewHost hiddenWebViewHost = null;\n    public static Microsoft.Web.WebView2.Wpf.WebView2 webView { get => hiddenWebViewHost?.webView_; }\n    public static Mutex webViewReady = new Mutex();\n    public static int farLeft;\n\n    public static List<Config> AllConfigsFromFiles() {\n        List<Config> configs = new();\n\n        if(!Directory.Exists(configDir)) Directory.CreateDirectory(configDir);\n        foreach (string f in Directory.EnumerateFiles(configDir)) {\n            try {\n                Config cfg = Config.FromFile(f);\n                cfg.fileName = f;\n                configs.Add(cfg);\n            } catch { }\n        }\n        return configs;\n    }\n\n    public static ObservableCollection<Config> Configs { get; set; } = new ObservableCollection<Config>(AllConfigsFromFiles().OrderBy(x => x.Created).Reverse());\n    public static Settings Settings { get; set; } = Settings.FromFile();\n\n    public static void LaunchEditor() {\n        if (editor == null) {\n            editor = new EditorWindow();\n        }\n        editor.Show();\n        editor.WindowState = WindowState.Normal;\n        editor.Activate();\n        editor.BringIntoView();\n        editor.Focus();\n    }\n    public App() {\n        localization = new Localization();\n    }\n    \n   \n\n    public new static void Exit() {\n        if(trayWindow is not null) trayWindow.TrayIcon.Dispose();\n\n        StopHook();\n        ExplorerTAP.ExplorerTAP.Reset();\n\n        taskbars.ForEach(t => {\n            t.taskbarHelper.Radius = 0;\n            t.taskbarHelper.UpdateRadius();\n\n            t.Close();\n            t.taskbarHelper.SetAlpha(1);\n            TaskbarHelper.SendMessage(t.taskbarHelper.HWND, TaskbarHelper.WM_DWMCOMPOSITIONCHANGED, 1, null);\n            t.taskbarHelper.Style = TaskbarHelper.TaskbarStyle.ForceDefault;\n            t.taskbarHelper.SetBlur();\n            // win11 fix\n        });\n        Current.Dispatcher.Invoke(() => { Current.Shutdown(); });\n    }\n\n    [StructLayout(LayoutKind.Sequential)]\n    struct MSG {\n        public IntPtr hwnd;\n        public uint message;\n        public IntPtr wParam;\n        public IntPtr lParam;\n        public uint time;\n        public System.Drawing.Point pt;\n    }\n\n    [DllImport(\"user32.dll\")]\n    static extern bool GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);\n\n    [DllImport(\"user32.dll\")]\n    static extern bool TranslateMessage(ref MSG lpMsg);\n\n    [DllImport(\"user32.dll\")]\n    static extern IntPtr DispatchMessage(ref MSG lpMsg);\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);\n\n    public static void StartHook() {\n        Task.Run(() => {\n            Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;\n\n            if (mouseHookId != -1) return;\n            mouseHookId = SetWindowsHookEx(WH_MOUSE_LL, callback, 0, 0);\n\n            MSG msg;\n            while (GetMessage(out msg, IntPtr.Zero, 0, 0)) {\n                TranslateMessage(ref msg);\n                DispatchMessage(ref msg);\n            }\n        });\n    }\n    public static void StopHook() {\n        UnhookWindowsHookEx(mouseHookId);\n        mouseHookId = -1;\n    }\n    private static bool isappfullscreen = false;\n    public static bool IsAppFullscreen { get => isappfullscreen; set {\n            isappfullscreen = value;\n            if(value) {\n                App.taskbars.ForEach(x => x.Hide());\n            } else {\n                App.taskbars.ForEach(x => x.Show());\n            }\n        } }\n\n    public static bool IsAppMicrosoftStore { get => IsMicrosoftStore(); }\n    public static bool IsMicrosoftStore() {\n        return System.Environment.ProcessPath.ToLower().StartsWith(@\"c:\\program files\\windowsapps\");\n       \n    }\n    private void Application_Startup(object sender, StartupEventArgs e) {\n        var exceptionCount = 0;\n        AppDomain.CurrentDomain.UnhandledException += (_, e) => {\n            if (++exceptionCount >= 3) return;\n\n            Exception err = (Exception) e.ExceptionObject;\n            if(App.Settings is not null && App.Settings.workshopAPI is not null && App.Settings.ReportExceptions) {\n                App.Settings.workshopAPI.ReportException(err);\n            }\n            MessageBox.Show(err.Message + \"\\n\" + err.StackTrace, \"RainbowTaskbar - Unhandled exception\", MessageBoxButton.OK, MessageBoxImage.Error);\n            Exit();\n        };\n        if (mutex.WaitOne(TimeSpan.Zero, true)) {\n            if (e.Args.Length > 0 && e.Args[0] == \"shell\") {\n                Task.Run(() => {\n                    Thread.Sleep(500);\n                    Process.Start(Environment.ProcessPath, Environment.GetCommandLineArgs());\n                });\n            }\n\n\n            Task.Run(async () => {\n                await using var pipe = new PipeServer<string>(\"RainbowTaskbar Pipe\");\n                pipe.AddAccessRules(new PipeAccessRule(\"Everyone\", PipeAccessRights.FullControl, AccessControlType.Allow));\n                pipe.MessageReceived += (sender, args) => {\n                    if (args.Message == \"OpenEditor\")\n                        Dispatcher.Invoke(() => {\n                            LaunchEditor();\n                        });\n                    if (args.Message.StartsWith(\"Shell=\")) {\n                        var uri = new Uri(args.Message.Split(\"Shell=\")[1]);\n                        Dispatcher.Invoke(() => {\n                            LaunchEditor();\n                        });\n\n                        if (uri.Host == \"config\") {\n                            var configs = App.Settings.workshopAPI.SearchConfigsAsync(uri.AbsolutePath.Substring(1), Editor.Pages.SortBy.Match).Result;\n                            if(configs.Result && configs.Results.Count == 1) {\n                                var config = configs.Parse().ElementAt(0);\n                                config.CachedBase64Thumbnail = App.Settings.workshopAPI.DownloadThumbnailBase64(config).Result;\n                                config.LoadImage();\n                                Dispatcher.Invoke(() => {\n                                    App.editor.OpenConfig(config);\n                                });\n                            }\n                        }\n\n                    }\n                        \n                };\n                await pipe.StartAsync();\n                await Task.Delay(Timeout.InfiniteTimeSpan);\n            });\n\n\n\n            if (!Settings.GraphicsRepeat) {\n                webViewReady.WaitOne();\n                //App.webView = new();\n            }\n\n\n            App.localization.Switch(Settings.language);\n            if (Settings.CheckUpdate && !IsMicrosoftStore()) AutoUpdate.CheckForUpdate();\n\n\n            // port old config bleh\n\n            var oldconfigpath = Environment.ExpandEnvironmentVariables(\"%appdata%/rnbconf.xml\");\n            var nwoldconfigpath = Environment.ExpandEnvironmentVariables(\"%appdata%/rnbconf.bak.xml\");\n            if (File.Exists(oldconfigpath)) {\n                var res = MessageBox.Show(App.localization.Get(\"msgbox_migrate\"), \"RainbowTaskbar\", MessageBoxButton.YesNo);\n\n                if (res == MessageBoxResult.Yes) {\n                    File.WriteAllText(oldconfigpath, File.ReadAllText(oldconfigpath).Replace(\"RainbowTaskbar.Configuration\", \"RainbowTaskbar.V2Legacy.Configuration\"));\n\n\n                    using var fileStream = new FileStream(oldconfigpath, FileMode.OpenOrCreate);\n                    using var reader = XmlDictionaryReader.CreateTextReader(fileStream, new XmlDictionaryReaderQuotas());\n\n                    var serializerSettings = new DataContractSerializerSettings {\n                        PreserveObjectReferences = true\n                    };\n\n                    var serializer = new DataContractSerializer(typeof(V2Legacy.Configuration.Config), serializerSettings);\n                    var cfg = serializer.ReadObject(reader) as V2Legacy.Configuration.Config;\n\n                    var curcfg = InstructionConfig.FromLegacyConfig(cfg);\n                    curcfg.ToFile();\n                    App.Configs.Add(curcfg);\n                    foreach (var preset in cfg.Presets) {\n                        var portcfg = InstructionConfig.FromLegacyPreset(preset);\n                        portcfg.ToFile();\n                        App.Configs.Add(portcfg);\n                    }\n\n                    reader.Close();\n                    fileStream.Close();\n\n                    File.Delete(oldconfigpath);\n                } else {\n                    File.Delete(oldconfigpath);\n                }\n            }\n\n\n\n\n\n\n            Settings.workshopAPI = new WorkshopAPI() {};\n\n            Settings.OnLoginKeyChanged();\n\n            if (Settings.FirstStart) {\n                Settings.FirstStart = false;\n                Settings.ToFile();\n                firstRun = true;\n            }\n            //TODO:remove this its for debugfging\n            // LaunchEditor();\n\n            if (Settings.WebTouchThrough) StartHook();\n\n            if (App.Settings.Version < Assembly.GetExecutingAssembly().GetName().Version) {\n                if (App.Settings.Version > new Version(\"1.0\")) {\n                    // Valid update\n                    if (App.Settings.Version <= new Version(\"3.1.3\") && App.IsMicrosoftStore()) {\n                        App.Settings.RunAtStartup = true;\n                    }\n                }\n\n                App.Settings.Version = Assembly.GetExecutingAssembly().GetName().Version;\n                App.Settings.SaveChanged();\n            }\n\n            Task.Run(() => {\n                ExplorerTAP.ExplorerTAP.TryInject();\n\n                \n\n                App.Current.Dispatcher.Invoke(() => {\n                    taskbars = FindAllTaskbars();\n                    SetupTaskbars();\n\n                    Taskbar.SetupLayers();\n\n                    Taskbar.SetupWebViews();\n\n                    if(App.Settings.SelectedConfig is not null) App.Settings.SelectedConfig.Start();\n\n                    Settings.OnGlobalOpacityChanged();\n\n                    \n\n\n                    if (firstRun == true) {\n                        Task.Run(() => {\n                            Thread.Sleep(1000); // amazing coding\n                            Dispatcher.Invoke(() => LaunchEditor());\n                        });\n                    }\n\n\n                    // todo: add back?\n                    // API.Start();\n                });\n\n\n\n            });\n\n\n        }\n        else {\n            var shell = false;\n            var shellMessage = \"\";\n            foreach (string s in e.Args) {\n                if(shell == true) {\n                    shellMessage = s;\n                }\n                if(s == \"shell\") {\n                    shell = true;\n                }\n                \n            }\n\n\n            var pipe = new PipeClient<string>(\"RainbowTaskbar Pipe\");\n            pipe.ConnectAsync().Wait();\n            if (shell) {\n                pipe.WriteAsync(\"Shell=\"+shellMessage).Wait();\n            } else {\n                pipe.WriteAsync(\"OpenEditor\").Wait();\n                \n            }\n            pipe.DisconnectAsync().Wait();\n            Environment.Exit(0);\n\n        }\n    }\n\n    public delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);\n\n    [DllImport(\"user32.dll\")]\n    private static extern int EnumWindows(EnumWindowsProc proc, int lParam);\n\n    [DllImport(\"user32.dll\", SetLastError = true, CharSet = CharSet.Auto)]\n    static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);\n\n    public static List<Taskbar> FindAllTaskbars() {\n        List<Taskbar> tsk = new List<Taskbar>();\n\n        var nw = new Taskbar(TaskbarHelper.FindWindow(\"Shell_TrayWnd\", null));\n        nw.Show();\n        tsk.Add(nw);\n\n        EnumWindows(new EnumWindowsProc((hWnd, lParam) =>\n        {\n            StringBuilder className = new StringBuilder(255);\n            GetClassName(hWnd, className, 255);\n            if (className.ToString() == \"Shell_SecondaryTrayWnd\") {\n                var newWindow = new Taskbar(hWnd, true);\n                newWindow.Show();\n                tsk.Add(newWindow);\n            }\n\n            return true;\n        }), 0);\n        \n        return tsk;\n    }\n\n    public static void SetupTaskbars() {\n        \n        taskbars.MinBy(t => t.Left).taskbarHelper.first = true;\n        taskbars.MaxBy(t => t.Left).taskbarHelper.last = true;\n        taskbars.ForEach(t => {\n            t.taskbarHelper.UpdateRadius();\n            int fals = 1;\n            TaskbarHelper.DwmSetWindowAttribute(new WindowInteropHelper(t).EnsureHandle(), TaskbarHelper.DWMWINDOWATTRIBUTE.ExcludedFromPeek, ref fals, sizeof(int));\n        });\n\n        Task.Run(() => {\n            if (!ExplorerTAP.ExplorerTAP.NeedsTAP()) return;\n\n            var hwnd = TaskbarHelper.FindWindow(\"Shell_TrayWnd\", null);\n            while(hwnd != IntPtr.Zero) {\n                Thread.Sleep(150);\n                hwnd = TaskbarHelper.FindWindow(\"Shell_TrayWnd\", null);\n            }\n\n            ExplorerTAP.ExplorerTAP.IsInjected = false;\n\n            do {\n                hwnd = TaskbarHelper.FindWindow(\"Shell_TrayWnd\", null);\n                Thread.Sleep(150);\n            } while (hwnd == IntPtr.Zero);\n\n            while (!ExplorerTAP.ExplorerTAP.NeedsTAP()) {\n                Thread.Sleep(150);\n            }\n\n            Thread.Sleep(2000);\n            \n            ExplorerTAP.ExplorerTAP.TryInject();\n\n            while (!ExplorerTAP.ExplorerTAP.IsInjected) {\n                Thread.Sleep(150);\n            }\n            ReloadTaskbars();\n        });\n\n\n\n    }\n    public static void ReloadTaskbars(bool startConfig = true) =>\n        Current.Dispatcher.Invoke(() => {\n            if (App.hiddenWebViewHost is not null) {\n                if (App.hiddenWebViewHost.webView_ is not null) {\n                    App.hiddenWebViewHost.webView_.Dispose();\n                    App.hiddenWebViewHost.webView_ = null;\n                }\n                App.hiddenWebViewHost.Close();\n                App.hiddenWebViewHost = null;\n            }\n            if (!App.Settings.GraphicsRepeat) {\n                webViewReady.WaitOne();\n                App.hiddenWebViewHost = new();\n            }\n            taskbars.ForEach(taskbar => {\n                if(taskbar.webView_ is not null) taskbar.webView_.Dispose();\n                taskbar.webView_ = null;\n                taskbar.windowHelper.RemoveDuplicate();\n                taskbar.Close();\n            });\n            if(Config.currentlyRunning is not null) Config.currentlyRunning.Stop().Wait(500);\n            Config.currentlyRunning = null;\n\n            taskbars = FindAllTaskbars();\n\n            SetupTaskbars();\n            Taskbar.SetupLayers();\n            Taskbar.SetupWebViews();\n\n            Task.Run(() => {\n                Thread.Sleep(100);\n                App.Current.Dispatcher.Invoke(() => Taskbar.SoftReset(startConfig));\n            });\n        });\n}"
  },
  {
    "path": "RainbowTaskbar/AssemblyInfo.cs",
    "content": "﻿using System.Windows;\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n    //(used if a resource is not found in the page,\n    // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n    //(used if a resource is not found in the page,\n    // app, or any theme specific resource dictionaries)\n)]"
  },
  {
    "path": "RainbowTaskbar/Configuration/Config.cs",
    "content": "﻿using RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Configuration.Instruction.Instructions;\nusing RainbowTaskbar.Configuration.Web;\nusing RainbowTaskbar.Helpers;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Data;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing System.Windows.Media.Imaging;\n\nnamespace RainbowTaskbar.Configuration {\n    public enum ConfigPublishStatus {\n        NotPublished,\n        PreviouslyPublished,\n        Published\n    }\n\n    [JsonDerivedType(typeof(InstructionConfigData), typeDiscriminator: \"c\")]\n    [JsonDerivedType(typeof(WebConfigData), typeDiscriminator: \"w\")]\n    [Serializable]\n    public abstract class  ConfigData {\n        \n    }\n\n    [JsonDerivedType(typeof(InstructionConfig), typeDiscriminator: \"c\")]\n    [JsonDerivedType(typeof(WebConfig), typeDiscriminator: \"w\")]\n    [Serializable]\n    public abstract class Config : INotifyPropertyChanged {\n        public event PropertyChangedEventHandler PropertyChanged;\n        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) =>\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n\n        public string Name { get; set; } = App.localization?.Get(\"untitled\") ?? \"Untitled\";\n        public string Description { get; set; } = \"\";\n        public string? PublishedID { get; set; }\n        public string? PreviousPublishedID { get; set; }\n        public string? CachedPublisherUsername { get; set; }\n        public string? CachedBase64Thumbnail { get; set; }\n        [JsonIgnore]\n        public int? CachedLikeCount { get; set; }\n        [JsonIgnore]\n        public int? CachedCommentCount { get; set; }\n        public string LocalID { get; set; }\n        public DateTime Created { get; set; } = DateTime.Now;\n        public DateTime Updated { get; set; } = DateTime.Now;\n        public DateTime Published { get; set; } = DateTime.MinValue;\n        [JsonIgnore]\n        public bool ChangedSincePublish { get => Updated > Published; }\n        [JsonIgnore]\n        public ConfigPublishStatus PublishStatus { get => PublishedID is not null ? (ChangedSincePublish ? ConfigPublishStatus.PreviouslyPublished : ConfigPublishStatus.Published) : ConfigPublishStatus.NotPublished; }\n\n        public static Config currentlyRunning;\n        public ConfigData ConfigData { get; set; }\n        [JsonIgnore]\n        public static JsonSerializerOptions SerializerOptions { get; set; } = new JsonSerializerOptions { Converters = { new JsonColorConverter() } };\n        [JsonIgnore]\n        public string ConfigType { get => this.GetType().Name; }\n\n        [JsonIgnore]\n        public string fileName = null;\n\n        public void InitNew() {\n            LocalID = Guid.NewGuid().ToString();\n        }\n        public static Config FromFile(string file) {\n            if (!File.Exists(file)) return null;\n            Config cfg = JsonSerializer.Deserialize<Config>(File.ReadAllText(file), SerializerOptions);\n            cfg.fileName = file;\n            return cfg;\n        }\n        public void ToFile() {\n            if (fileName is null)\n                fileName = Path.Join(App.configDir, LocalID + \".json\");\n            File.WriteAllText(fileName,\n                JsonSerializer.Serialize(this, SerializerOptions));\n        }\n        public Config Copy() {\n            return JsonSerializer.Deserialize<Config>(JsonSerializer.Serialize(this, SerializerOptions), SerializerOptions);\n        }\n        public void DeleteFile() {\n            if (File.Exists(fileName)) File.Delete(fileName);\n        }\n\n        static bool stopping = false;\n        public virtual Task<bool> Start() {\n            if (stopping) return Task.FromResult(false);\n\n            return Task.Run(() => {\n                stopping = true;\n\n                if (currentlyRunning is not null) currentlyRunning.Stop().Wait(300);\n                stopping = false;\n\n                App.Current.Dispatcher.Invoke(() => {\n                    var inst = new TransparencyInstruction() {\n                        Type = TransparencyInstruction.TransparencyInstructionType.All, Opacity = 1\n                    };\n                    var inst2 = new TransparencyInstruction() {\n                        Type = TransparencyInstruction.TransparencyInstructionType.TaskbarElements, Opacity = 1\n                    };\n                    App.taskbars.ForEach(x => { inst.Execute(x); inst2.Execute(x); });\n                    currentlyRunning = this;\n                });\n\n                return true;\n\n            });\n            \n           \n            \n\n\n\n        }\n        public abstract Task Stop();\n        public BitmapImage? LoadImage() {\n            if (CachedBase64Thumbnail is null) return null;\n\n            try {\n                byte[] imageBytes = Convert.FromBase64String(CachedBase64Thumbnail);\n\n                var bImg = new BitmapImage();\n                using (var stream = new MemoryStream(imageBytes, 0, imageBytes.Length)) {\n                    \n                    bImg.BeginInit();\n                    bImg.CacheOption = BitmapCacheOption.OnLoad;\n                    bImg.StreamSource = stream;\n                    bImg.EndInit();\n\n                    bImg.Freeze();\n                }\n                \n\n                return bImg;\n\n            }\n            catch { return null; }\n\n        }\n\n\n    }\n\n\n}\n"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/DefaultPresets.cs",
    "content": "﻿using RainbowTaskbar.Configuration.Instruction.Instructions;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\n\nnamespace RainbowTaskbar.Configuration.Instruction;\n\npublic static class DefaultPresets {\n    public static readonly InstructionPreset Rainbow = new() {\n        Name = \"Rainbow\",\n        RunOnceGroup = new InstructionGroup() {\n            Instructions = {\n                new BorderRadiusInstruction {\n                     Radius = 16\n                },\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                },\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.RainbowTaskbar,\n                    Opacity = 0.8\n                },\n            }\n        },\n        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {\n            new InstructionGroup {\n                Instructions = new BindingList<Instruction> {\n                    new ColorInstruction {\n                        Time = 1,\n                        Color1 = Color.FromArgb(255, 255, 0, 0),\n                        Color2 = Color.FromArgb(255, 255, 154, 0),\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Time2 = 500\n                    },\n                    new ColorInstruction {\n                        Time = 1,\n                        Color1 = Color.FromArgb(255, 255, 154, 0),\n                        Color2 = Color.FromArgb(255, 208, 222, 33),\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Time2 = 500\n                    },\n                    new ColorInstruction {\n                        Time = 1,\n                        Color1 = Color.FromArgb(255, 208, 222, 33),\n                        Color2 = Color.FromArgb(255, 79, 220, 74),\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Time2 = 500\n                    },\n                    new ColorInstruction {\n                        Time = 1,\n                        Color1 = Color.FromArgb(255, 79, 220, 74),\n                        Color2 = Color.FromArgb(255, 63, 218, 216),\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Time2 = 500\n                    },\n                    new ColorInstruction {\n                        Time = 1,\n                        Color1 = Color.FromArgb(255, 63, 218, 216),\n                        Color2 = Color.FromArgb(255, 47, 201, 226),\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Time2 = 500\n                    },\n                    new ColorInstruction {\n                        Time = 1,\n                        Color1 = Color.FromArgb(255, 47, 201, 226),\n                        Color2 = Color.FromArgb(255, 28, 127, 238),\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Time2 = 500\n                    },\n                    new ColorInstruction {\n                        Time = 1,\n                        Color1 = Color.FromArgb(255, 28, 127, 238),\n                        Color2 = Color.FromArgb(255, 95, 21, 242),\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Time2 = 500\n                    },\n                    new ColorInstruction {\n                        Time = 1,\n                        Color1 = Color.FromArgb(255, 95, 21, 242),\n                        Color2 = Color.FromArgb(255, 186, 12, 248),\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Time2 = 500\n                    },\n                    new ColorInstruction {\n                        Time = 1,\n                        Color1 = Color.FromArgb(255, 186, 12, 248),\n                        Color2 = Color.FromArgb(255, 251, 7, 217),\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Time2 = 500\n                    },\n                    new ColorInstruction {\n                        Time = 1,\n                        Color1 = Color.FromArgb(255, 251, 7, 217),\n                        Color2 = Color.FromArgb(255, 255, 0, 0),\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Time2 = 500\n                    }\n                }\n            }\n        })\n    };\n\n    public static readonly InstructionPreset Chill = new() {\n        Name = \"Chill\",\n        RunOnceGroup = new InstructionGroup() {\n            Instructions = {\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                },\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.RainbowTaskbar,\n                    Opacity = 0.9\n                },\n            }\n        },\n        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {\n            new InstructionGroup {\n                Instructions = new BindingList<Instruction> {\n                    new ColorInstruction {\n                        Time = 5000,\n                        Color1 = Color.RoyalBlue,\n                        Color2 = Color.DarkBlue,\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Transition = ColorInstruction.ColorInstructionTransition.Cubic,\n                        Time2 = 3000\n                    },\n                    new ColorInstruction {\n                        Time = 5000,\n                        Color1 = Color.DarkBlue,\n                        Color2 = Color.RoyalBlue,\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Transition = ColorInstruction.ColorInstructionTransition.Cubic,\n                        Time2 = 3000\n                    }\n                } \n            }\n        })\n    };\n\n    public static readonly InstructionPreset Unknown = new() {\n        Name = \"Unknown\",\n        RunOnceGroup = new InstructionGroup() {\n            Instructions = {\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                },\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.RainbowTaskbar,\n                    Opacity = 0.9\n                },\n            }\n        },\n        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {\n            new InstructionGroup {\n                Instructions = new BindingList<Instruction> {\n                    new ColorInstruction {\n                        Time = 1001,\n                        Randomize = true,\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Transition = ColorInstruction.ColorInstructionTransition.Linear,\n                        Time2 = 1000\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    }\n                } \n            },\n            new InstructionGroup {\n                Instructions = new BindingList<Instruction> {\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    },\n                    new TransparencyInstruction {\n                        Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                    }\n                }\n            }\n        })\n    };\n\n    public static readonly InstructionPreset HighContrast = new() {\n        Name = \"High contrast\",\n        RunOnceGroup = new InstructionGroup() {\n            Instructions = {\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                },\n                new ShapeInstruction {\n                    Shape = ShapeInstruction.ShapeInstructionShapes.Rectangle,\n                    Fill = Color.Transparent,\n                    Line = Color.FromArgb(0, 255, 0),\n                    Layer = 1,\n                    LineSize = 4,\n                    FitTaskbars = true\n                },\n                new ColorInstruction {\n                    Time = 1001,\n                    Color1 = Color.Black,\n                    Effect = ColorInstruction.ColorInstructionEffect.Solid,\n                }\n            }\n        }\n    };\n\n    public static readonly InstructionPreset ModernChill = new() {\n        Name = \"Modern Blue Chill\",\n        RunOnceGroup = new InstructionGroup() {\n            Instructions = {\n                 new BorderRadiusInstruction {\n                     Radius = 16\n                 },\n                 new TransparencyInstruction {\n                     Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                     Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                 },\n                 new TransparencyInstruction {\n                     Type = TransparencyInstruction.TransparencyInstructionType.RainbowTaskbar,\n                     Opacity = 0.9\n                 },\n                 new TransparencyInstruction {\n                     Type = TransparencyInstruction.TransparencyInstructionType.Layer,\n                     Opacity = 0.8,\n                     Layer = 0,\n                 },\n            }\n        },\n        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {\n            new InstructionGroup {\n                Instructions = new BindingList<Instruction> {\n                    new ShapeInstruction {\n                        FitTaskbars = true,\n                        DrawOnce = true,\n                        Shape = ShapeInstruction.ShapeInstructionShapes.Rectangle,\n                        LineSize = 2,\n                        Line = Color.FromArgb(255,0, 200, 255),\n                        Fill = Color.Transparent,\n                        Layer = 1\n                    },\n                    new ColorInstruction {\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Transition = ColorInstruction.ColorInstructionTransition.Sine,\n                        Time = 3000,\n                        Color1 = Color.FromArgb(255, 0, 136, 196),\n                        Color2 = Color.Black,\n                        Angle = 0,\n                        Time2 = 5000,\n                        Layer = 0,\n                        Randomize = false\n                    },\n                    new ColorInstruction {\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Transition = ColorInstruction.ColorInstructionTransition.Sine,\n                        Time = 3000,\n                        Color1 = Color.Black,\n                        Color2 = Color.FromArgb(255, 0, 136, 196),\n                        Angle = 0,\n                        Time2 = 5000,\n                        Layer = 0,\n                        Randomize = false\n                    }\n                } \n            }\n        })\n    };\n\n    public static readonly InstructionPreset ModernChill2 = new() {\n        Name = \"Modern Red Chill\",\n        RunOnceGroup = new InstructionGroup() {\n            Instructions = {\n                new BorderRadiusInstruction {\n                    Radius = 16\n                },\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                },\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.RainbowTaskbar,\n                    Opacity = 0.9\n                },\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.Layer,\n                    Opacity = 0.8,\n                    Layer = 0,\n                },\n            }\n        },\n        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {\n            new InstructionGroup {\n                Instructions = new BindingList<Instruction> {\n                    new ShapeInstruction {\n                        FitTaskbars = true,\n                        DrawOnce = true,\n                        Shape = ShapeInstruction.ShapeInstructionShapes.Rectangle,\n                        LineSize = 2,\n                        Line = Color.FromArgb(255,255, 61, 0),\n                        Fill = Color.Transparent,\n                        Layer = 1\n                    },\n                    new ColorInstruction {\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Transition = ColorInstruction.ColorInstructionTransition.Sine,\n                        Time = 3000,\n                        Color1 = Color.FromArgb(255, 176, 0, 0),\n                        Color2 = Color.Black,\n                        Angle = 0,\n                        Time2 = 5000,\n                        Layer = 0,\n                        Randomize = false\n                    },\n                    new ColorInstruction {\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Transition = ColorInstruction.ColorInstructionTransition.Sine,\n                        Time = 3000,\n                        Color1 = Color.Black,\n                        Color2 = Color.FromArgb(255, 176, 0, 0),\n                        Angle = 0,\n                        Time2 = 5000,\n                        Layer = 0,\n                        Randomize = false\n                    }\n                } \n            }\n        })\n    };\n\n    public static readonly InstructionPreset Translucent = new() {\n        Name = \"Translucent\",\n        RunOnceGroup = new InstructionGroup() {\n            Instructions = {\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                }\n            }\n        },\n    };\n\n    public static readonly InstructionPreset Blurred = new() {\n        Name = \"Blurred\",\n        RunOnceGroup = new InstructionGroup() {\n            Instructions = {\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                    Style = TransparencyInstruction.TransparencyInstructionStyle.Blur\n                }\n            }\n        },\n    };\n\n    public static readonly InstructionPreset Vaporwave = new() {\n        Name = \"Vaporwave\",\n        RunOnceGroup = new InstructionGroup() {\n            Instructions = {\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent\n                },\n                new TransparencyInstruction {\n                    Type = TransparencyInstruction.TransparencyInstructionType.Layer,\n                    Opacity = 0.6,\n                    Layer = 0,\n                },\n            }\n        },\n        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {\n            new InstructionGroup {\n                Instructions = new BindingList<Instruction> {\n                    new ShapeInstruction {\n                        FitTaskbars = true,\n                        DrawOnce = true,\n                        Shape = ShapeInstruction.ShapeInstructionShapes.Rectangle,\n                        LineSize = 2,\n                        Line = Color.FromArgb(255, 159,198, 255),\n                        Fill = Color.Transparent,\n                        Layer = 1\n                    },\n                    new TextInstruction {\n                        DrawOnce = true,\n                        Text = \" レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー \",\n                        Center = true,\n                        Y = 6,\n                        Font = \"Arial\",\n                        Size = 32,\n                        Color = Color.FromArgb(63,220,247,255),\n                        Layer = 1\n                    },\n                    new TextInstruction {\n                        DrawOnce = true,\n                        Text = \"◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓\",\n                        X = 4,\n                        Y = 6,\n                        Font = \"Arial\",\n                        Size = 32,\n                        Color = Color.FromArgb(127,255,110,172),\n                        Layer = 1\n                    },\n                    new TextInstruction {\n                        DrawOnce = true,\n                        Text = \"◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓\",\n                        X = 6,\n                        Y = 8,\n                        Font = \"Arial\",\n                        Size = 32,\n                        Color = Color.FromArgb(127,255,214,110),\n                        Layer = 1\n                    },\n                    new TextInstruction {\n                        DrawOnce = true,\n                        Text = \"ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                \",\n                        Center = true,\n                        Y = 29,\n                        Font = \"Arial\",\n                        Size = 16,\n                        Color = Color.FromArgb(200,110,255,182),\n                        Layer = 1\n                    },\n                    new ColorInstruction {\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Transition = ColorInstruction.ColorInstructionTransition.Linear,\n                        Time = 0,\n                        Color1 = Color.FromArgb(255, 100, 112, 216),\n                        Color2 = Color.FromArgb(255, 0, 185, 255),\n                        Angle = 0,\n                        Time2 = 1500,\n                        Layer = 0,\n                        Randomize = false\n                    },\n                    new ColorInstruction {\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Transition = ColorInstruction.ColorInstructionTransition.Linear,\n                        Time = 0,\n                        Color1 = Color.FromArgb(255, 0, 185, 255),\n                        Color2 = Color.FromArgb(255, 255, 0, 158),\n                        Angle = 0,\n                        Time2 = 1500,\n                        Layer = 0,\n                        Randomize = false\n                    },\n                    new ColorInstruction {\n                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,\n                        Transition = ColorInstruction.ColorInstructionTransition.Linear,\n                        Time = 0,\n                        Color1 = Color.FromArgb(255, 255, 0, 158),\n                        Color2 = Color.FromArgb(255, 100, 112, 216),\n                        Angle = 0,\n                        Time2 = 1500,\n                        Layer = 0,\n                        Randomize = false\n                    }\n                } \n            }\n        })\n    };\n\n    public static readonly List<InstructionPreset> Presets = new List<InstructionPreset>() {\n        Translucent, Blurred, Rainbow, Chill,\n        HighContrast, ModernChill,ModernChill2,\n        Vaporwave, Unknown\n    };\n}"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instruction.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.Serialization;\nusing System.Text.Json.Serialization;\nusing System.Text.RegularExpressions;\nusing System.Threading;\nusing FastMember;\nusing RainbowTaskbar.Configuration.Instruction.Instructions;\nusing RainbowTaskbar.Configuration.Web;\n\n\nnamespace RainbowTaskbar.Configuration.Instruction;\n\n[JsonDerivedType(typeof(BorderRadiusInstruction), typeDiscriminator: \"b\")]\n[JsonDerivedType(typeof(ClearLayerInstruction), typeDiscriminator: \"c\")]\n[JsonDerivedType(typeof(ColorInstruction), typeDiscriminator: \"cl\")]\n[JsonDerivedType(typeof(DelayInstruction), typeDiscriminator: \"d\")]\n[JsonDerivedType(typeof(ImageInstruction), typeDiscriminator: \"i\")]\n[JsonDerivedType(typeof(ShapeInstruction), typeDiscriminator: \"s\")]\n[JsonDerivedType(typeof(TextInstruction), typeDiscriminator: \"t\")]\n[JsonDerivedType(typeof(TransparencyInstruction), typeDiscriminator: \"tr\")]\npublic abstract class Instruction : INotifyPropertyChanged {\n    public event PropertyChangedEventHandler PropertyChanged;\n\n\n    public static IEnumerable<Type> InstructionTypes { get; set; } = GetKnownInstructionTypes();\n    public static IEnumerable<Type> DisplayableInstructionTypes {\n        get => InstructionTypes.Skip(1);\n    }\n    [JsonIgnore]\n    public abstract string Description { get; }\n    [JsonIgnore]\n    public string Name {\n        get {\n            return App.localization.Name(GetType().Name.ToLower());\n        }\n    }\n    [JsonIgnore]\n    public string TypeName {\n        get {\n            return GetType().Name;\n        }\n    }\n\n\n    public static IEnumerable<Type> GetKnownInstructionTypes() {\n        if (InstructionTypes == null)\n            InstructionTypes = Assembly.GetExecutingAssembly().GetTypes()\n                .Where(type => typeof(Instruction).IsAssignableFrom(type)).ToList();\n\n        return InstructionTypes;\n    }\n\n    public bool Execute(Taskbar window) => Execute(window, CancellationToken.None);\n\n    public abstract bool Execute(Taskbar window, CancellationToken token);\n\n    // TODO: Json or remove this idk\n    //public abstract JObject ToJSON();\n    /*\n    public static Instruction FromJSON(Type type, JObject json) {\n        dynamic inst = type.GetConstructor(Array.Empty<Type>()).Invoke(null) as Instruction;\n\n\n        foreach (var prop in json.Properties())\n            if (prop.Name != \"Name\" && prop.Name != \"Position\") {\n                var wrapped = ObjectAccessor.Create(inst);\n                if (prop.Name.StartsWith(\"Color\"))\n                    wrapped[prop.Name] = ColorTranslator.FromHtml(prop.Value.Value<string>());\n                else\n                    if (wrapped[prop.Name] is not null)\n                    wrapped[prop.Name] = Convert.ChangeType(prop.Value, wrapped[prop.Name].GetType());\n                else\n                    wrapped[prop.Name] = prop.Value;\n            }\n\n        return inst;\n    }\n    */\n}"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/InstructionConfig.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Dynamic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.Serialization;\nusing System.Text.RegularExpressions;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Media.Animation;\nusing System.Xml;\n\nusing PropertyChanged;\nusing RainbowTaskbar.HTTPAPI;\nusing System.Diagnostics;\nusing RainbowTaskbar.Configuration.Instruction.Instructions;\nusing System.Text.Json.Serialization;\n\nnamespace RainbowTaskbar.Configuration.Instruction;\n[Serializable]\npublic class InstructionConfigData : ConfigData, INotifyPropertyChanged {\n\n    private static readonly int SupportedConfigVersion = 0;\n    public int ConfigFileVersion { get; set; } = SupportedConfigVersion;\n    public InstructionGroup RunOnceGroup { get; set; } = new();\n    [OnChangedMethod(nameof(SetupPropertyChanged))]\n    public BindingList<InstructionGroup> LoopGroups { get; set; } = new BindingList<InstructionGroup>();\n\n    public event PropertyChangedEventHandler PropertyChanged;\n    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) =>\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n\n    // PropertyChanged bullshit\n    private void SetupPropertyChanged() {\n        LoopGroups.ListChanged += (_, _) => OnPropertyChanged(nameof(Instructions));\n    }\n    // ------------------------\n    public InstructionConfigData() {\n        SetupPropertyChanged();\n    }\n}\n\n[Serializable]\npublic class InstructionConfig : Config {\n\n    public CancellationTokenSource cts = new CancellationTokenSource();\n\n    public InstructionConfigData Data { get => ConfigData as InstructionConfigData; set => ConfigData = value; }\n\n    public InstructionConfig() {\n        ConfigData = new InstructionConfigData();\n\n        Data.RunOnceGroup = new InstructionGroup();\n    }\n    public override async Task<bool> Start() {\n        if(!(await base.Start())) return false;\n        App.taskbars.ForEach(x => {\n            x.ClassicGrid.Visibility = System.Windows.Visibility.Visible;\n            x.WebGrid.Visibility = System.Windows.Visibility.Collapsed;\n        });\n        Task.Run(() => StartGroupTasks());\n        return true;\n    }\n    public override Task Stop() {\n        return Task.WhenAll(StopGroupTasks());\n    }\n\n    public List<Task> StopGroupTasks() {\n        var tasks = new List<Task>();\n        if(cts is not null) {\n            cts.Cancel();\n            cts = null;\n        }\n        if(Data.RunOnceGroup.Task is not null) tasks.Add(Data.RunOnceGroup.Task);\n        foreach(var group in Data.LoopGroups) {\n            if(group.Task is not null) tasks.Add(group.Task);\n        }\n\n        return tasks;\n    }\n\n    public void StartGroupTasks() {\n\n        Stop().Wait();\n        cts = new CancellationTokenSource();\n        Data.RunOnceGroup.StartOnceTask(cts.Token);\n        Data.RunOnceGroup.Task.Wait(cts.Token);\n        foreach (var group in Data.LoopGroups) {\n            group.StartLoopTask(cts.Token);\n        }\n\n\n    }\n\n    public static BindingList<Instruction> LegacyInstructionsToV2(BindingList<V2Legacy.Configuration.Instruction> instructions) {\n        var cfg = new BindingList<Instruction>();\n\n\n        foreach (var inst in instructions) {\n            if (inst is V2Legacy.Configuration.Instructions.BorderRadiusInstruction binst) {\n                cfg.Add(new BorderRadiusInstruction() {\n                    Radius = binst.Radius,\n                });\n            }\n            if (inst is V2Legacy.Configuration.Instructions.ClearLayerInstruction cinst) {\n                cfg.Add(new ClearLayerInstruction() {\n                    Layer = cinst.Layer,\n                });\n            }\n            if (inst is V2Legacy.Configuration.Instructions.ColorInstruction clinst) {\n                cfg.Add(new ColorInstruction() {\n                    Angle = clinst.Angle,\n                    Color1 = clinst.Color1,\n                    Color2 = clinst.Color2,\n                    Effect = (ColorInstruction.ColorInstructionEffect) clinst.Effect,\n                    Randomize = clinst.Randomize,\n                    Layer = clinst.Layer,\n                    Time = clinst.Time,\n                    Time2 = clinst.Time2,\n                    Transition = (ColorInstruction.ColorInstructionTransition) clinst.Transition\n                });\n            }\n            if (inst is V2Legacy.Configuration.Instructions.DelayInstruction dinst) {\n                cfg.Add(new DelayInstruction() {\n                    Time = dinst.Time,\n                });\n            }\n            if (inst is V2Legacy.Configuration.Instructions.ImageInstruction iinst) {\n                cfg.Add(new ImageInstruction() {\n                    DrawOnce = iinst.DrawOnce,\n                    Height = iinst.Height,\n                    Layer = iinst.Layer,\n                    Width = iinst.Width,\n                    Opacity = iinst.Opacity,\n                    Path = iinst.Path,\n                    X = iinst.X,\n                    Y = iinst.Y\n                });\n            }\n            if (inst is V2Legacy.Configuration.Instructions.ShapeInstruction sinst) {\n                cfg.Add(new ShapeInstruction() {\n                    DrawOnce = sinst.DrawOnce,\n                    Shape = (ShapeInstruction.ShapeInstructionShapes) sinst.Shape,\n                    Fill = sinst.Fill,\n                    FitTaskbars = sinst.FitTaskbars,\n                    Layer = sinst.Layer,\n                    Line = sinst.Line,\n                    LineSize = sinst.LineSize,\n                    Radius = sinst.Radius,\n                    X2 = sinst.X2,\n                    Y2 = sinst.Y2,\n                    X = sinst.X,\n                    Y = sinst.Y\n                });\n            }\n            if (inst is V2Legacy.Configuration.Instructions.TextInstruction tinst) {\n                cfg.Add(new TextInstruction() {\n                    Size = tinst.Size,\n                    Center = tinst.Center,\n                    Color = tinst.Color,\n                    DrawOnce = tinst.DrawOnce,\n                    Font = tinst.Font,\n                    Layer = tinst.Layer,\n                    Text = tinst.Text,\n                    X = tinst.X,\n                    Y = tinst.Y,\n                });\n            }\n            if (inst is V2Legacy.Configuration.Instructions.TransparencyInstruction trinst) {\n                cfg.Add(new TransparencyInstruction() {\n                    Layer = trinst.Layer,\n                    Style = (TransparencyInstruction.TransparencyInstructionStyle) trinst.Style,\n                    Opacity = trinst.Opacity,\n                    Type = (TransparencyInstruction.TransparencyInstructionType) trinst.Type\n                });\n            }\n        }\n\n        return cfg;\n    }\n\n\n    public static InstructionConfig FromLegacyConfig(V2Legacy.Configuration.Config config) {\n        var cfg = new InstructionConfig();\n        cfg.InitNew();\n        var cfgData = (InstructionConfigData)cfg.ConfigData;\n        cfgData.LoopGroups.Add(new());\n        cfgData.LoopGroups[0].Instructions = LegacyInstructionsToV2(config.Instructions);\n        cfg.Name = \"(MIGRATED) Current\";\n        return cfg;\n    }\n    public static InstructionConfig FromLegacyPreset(V2Legacy.Configuration.InstructionPreset preset) {\n        var cfg = new InstructionConfig();\n        cfg.InitNew();\n        var cfgData = (InstructionConfigData) cfg.ConfigData;\n        cfgData.LoopGroups.Add(new());\n        cfgData.LoopGroups[0].Instructions = LegacyInstructionsToV2(preset.Instructions);\n        cfg.Name = \"(MIGRATED) \" + preset.Name;\n        \n\n        return cfg;\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/InstructionGroup.cs",
    "content": "﻿using PropertyChanged;\nusing RainbowTaskbar.HTTPAPI;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\nusing System.Text;\nusing System.Text.Json.Serialization;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\n\nnamespace RainbowTaskbar.Configuration.Instruction {\n    public class InstructionGroup : INotifyPropertyChanged {\n\n        [OnChangedMethod(nameof(SetupPropertyChanged))]\n        public BindingList<Instruction> Instructions { get; set; } = new BindingList<Instruction>();\n        [JsonIgnore]\n        public Task Task { get; set; } = null;\n        private int groupStep = 0;\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        private void SetupPropertyChanged() {\n            Instructions.ListChanged += (_, _) => OnPropertyChanged(nameof(Instructions));\n        }\n\n        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) =>\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n\n\n        public InstructionGroup() {\n            SetupPropertyChanged();\n        }\n\n        public bool RunOnceTask(CancellationToken token) {\n            bool slept = false;\n            for (groupStep = 0;\n                     groupStep < Instructions.Count && !token.IsCancellationRequested;\n                     groupStep++) {\n\n                try {\n                    \n\n\n                    var tasks = new List<Task>();\n\n                    App.taskbars.ForEach(taskbar => {\n                        tasks.Add(Task.Run(() => {\n                            if (groupStep < Instructions.Count && Instructions[groupStep].Execute(taskbar, token)) slept = true;\n                        }));\n                    });\n                    Task.WaitAll(tasks.ToArray(), token);\n\n                }\n                catch (Exception e) {\n                    if (e.GetType() == typeof(OperationCanceledException) || e.InnerException is not null && e.InnerException.GetType() == typeof(TaskCanceledException)) {\n                        return slept;\n                    }\n                    MessageBox.Show(\n                        $\"The \\\"{Instructions[groupStep].Description}\\\" instruction at index {groupStep} (starting from 0) threw an exception, it will be removed from the instruction group.\\n${e.Message}\",\n                        \"RainbowTaskbar\", MessageBoxButton.OK, MessageBoxImage.Error);\n                    Application.Current.Dispatcher.Invoke(() => {\n                        Instructions.RemoveAt(groupStep);\n                        App.Settings.SelectedConfig.ToFile();\n                        App.ReloadTaskbars();\n                    });\n                    return slept;\n                }\n            }\n            return slept;\n        }\n\n        public void LoopTask(CancellationToken token) {\n            while (!token.IsCancellationRequested) {\n                var slept = RunOnceTask(token);\n\n                if (!slept) break;\n            }\n        }\n        public void StartOnceTask(CancellationToken token) {\n            Task = Task.Run(() => RunOnceTask(token));\n        }\n        public void StartLoopTask(CancellationToken token) {\n            Task = Task.Run(() => LoopTask(token));\n        }\n    }\n\n}\n"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/InstructionPreset.cs",
    "content": "﻿using System.ComponentModel;\nusing System.Runtime.Serialization;\n\nnamespace RainbowTaskbar.Configuration.Instruction;\n\n\npublic class InstructionPreset {\n    public string Name { get; set; }\n    public InstructionGroup RunOnceGroup { get; set; } = new InstructionGroup();\n    public BindingList<InstructionGroup> LoopGroups { get; set; } = new BindingList<InstructionGroup>();\n}"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/BorderRadiusInstruction.cs",
    "content": "﻿using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\n\n\nnamespace RainbowTaskbar.Configuration.Instruction.Instructions;\n\n\ninternal class BorderRadiusInstruction : Instruction {\n    public int Radius { get; set; } = 0;\n\n    public override string Description {\n        get {\n            return App.localization.InstructionFormat(this, Radius);\n        }\n    }\n\n\n    public override bool Execute(Taskbar window, CancellationToken _) {\n        window.taskbarHelper.Radius = Radius;\n        window.windowHelper.Radius = Radius;\n        window.taskbarHelper.UpdateRadius();\n        return false;\n    }\n    /*\n    public override JObject ToJSON() {\n        dynamic data = new ExpandoObject();\n        data.Name = GetType().Name;\n        data.Radius = Radius;\n\n        return JObject.FromObject(data);\n    }\n    */\n}"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/ClearLayerInstruction.cs",
    "content": "﻿using System.Dynamic;\nusing System.Linq;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Media;\nusing System.Windows.Shapes;\n\n\nnamespace RainbowTaskbar.Configuration.Instruction.Instructions;\n\n\ninternal class ClearLayerInstruction : Instruction {\n    public int Layer { get; set; } = 0;\n\n    public override string Description {\n        get {\n            return App.localization.InstructionFormat(this, Layer);\n        }\n    }\n\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        window.Dispatcher.Invoke(() => {\n            window.canvasManager.layers.MakeIfNeeded(Layer);\n            window.canvasManager.layers.renderTargets[Layer].Clear();\n        }, System.Windows.Threading.DispatcherPriority.Normal, token);\n        return false;\n    }\n    /*\n    public override JObject ToJSON() {\n        dynamic data = new ExpandoObject();\n        data.Name = GetType().Name;\n        data.Layer = Layer;\n\n        return JObject.FromObject(data);\n    }\n    */\n}"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/ColorInstruction.cs",
    "content": "﻿\nusing System.Drawing;\nusing System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows.Media;\nusing RainbowTaskbar.Interpolation;\nusing Color = System.Drawing.Color;\nusing Brush = System.Windows.Media.Brush;\nusing RainbowTaskbar.Languages;\n\nnamespace RainbowTaskbar.Configuration.Instruction.Instructions;\n\n\ninternal class ColorInstruction : Instruction {\n\n    public override string Description {\n        get {\n            if (Randomize) {\n                return App.localization.InstructionFormatSuffix(this, \"randomized\", Effect.ToStringLocalized());\n            }\n            else if (Effect == ColorInstructionEffect.Gradient || Effect == ColorInstructionEffect.FadeGradient) {\n                return App.localization.InstructionFormatSuffix(this, \"gradient\", Effect.ToStringLocalized(), ColorTranslator.ToHtml(Color1), ColorTranslator.ToHtml(Color2));\n            }\n            else {\n                return App.localization.InstructionFormatSuffix(this, \"solid\", Effect.ToStringLocalized(), ColorTranslator.ToHtml(Color1));\n            }\n        }\n    }\n    public enum ColorInstructionEffect {\n        Solid,\n        Fade,\n        Gradient,\n        FadeGradient\n    }\n\n    public enum ColorInstructionTransition {\n        Linear,\n        Sine,\n        Cubic,\n        Exponential,\n        Back\n    }\n\n    public int Time { get; set; } = 1;\n\n    public Color Color1 { get; set; } = Color.FromArgb(0, 0, 0);\n\n    public ColorInstructionEffect Effect { get; set; }\n\n    public Color Color2 { get; set; } = Color.FromArgb(0, 0, 0);\n\n    public int Time2 { get; set; } = 1;\n\n    public ColorInstructionTransition Transition { get; set; }\n\n    public double Angle { get; set; } = 0;\n\n    public int Layer { get; set; } = 0;\n\n    public bool Randomize { get; set; } = false;\n\n    public bool Has2Colors { get => Effect == ColorInstructionEffect.FadeGradient || Effect == ColorInstructionEffect.Gradient; }\n\n    /*\n    public override JObject ToJSON() {\n        dynamic data = new ExpandoObject();\n        data.Name = GetType().Name;\n        data.Time = Time;\n        data.Effect = Effect;\n        data.Transition = Transition;\n        data.Time2 = Time2;\n        data.Angle = Angle;\n        data.Layer = Layer;\n        data.Randomize = Randomize;\n        data.Color1 = ColorExtension.HexConverter(Color1);\n        data.Color2 = ColorExtension.HexConverter(Color2);\n\n\n        return JObject.FromObject(data);\n    }\n    */\n\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        \n        var OldBrush = window.canvasManager.layers.brushes[Layer];\n        if (Randomize) {\n            Color1 = Color.FromArgb(255, App.rnd.Next(0, 255), App.rnd.Next(0, 255), App.rnd.Next(0, 255));\n            Color2 = Color.FromArgb(255, App.rnd.Next(0, 255), App.rnd.Next(0, 255), App.rnd.Next(0, 255));\n        }\n\n        switch (Effect) {\n            case ColorInstructionEffect.Solid:\n                window.Dispatcher.Invoke(() => {\n                    var Brush = new SolidColorBrush(Color1.ToMediaColor());\n                    window.canvasManager.layers.DrawRect(Layer, Brush);\n                }, System.Windows.Threading.DispatcherPriority.Normal, token);\n                token.WaitHandle.WaitOne(Time);\n                break;\n            case ColorInstructionEffect.Gradient:\n                window.Dispatcher.Invoke(() => {\n                    var Brush = new LinearGradientBrush(Color1.ToMediaColor(), Color2.ToMediaColor(), Angle);\n                    window.canvasManager.layers.DrawRect(Layer, Brush);\n                }, System.Windows.Threading.DispatcherPriority.Normal, token);\n                token.WaitHandle.WaitOne(Time);\n                break;\n\n            case ColorInstructionEffect.FadeGradient:\n\n                if (OldBrush is SolidColorBrush) {\n                    var Brush = (SolidColorBrush) OldBrush;\n\n                    System.Windows.Media.Color OColor;\n                    window.Dispatcher.Invoke(() => { OColor = Brush.Color; }, System.Windows.Threading.DispatcherPriority.Normal, token);\n\n                    var j = 1;\n\n                    while (j++ < Time2 / App.Settings.InterpolationQuality) {\n                        var Color1Interpolated = ColorInterpolation.Interpolate(OColor.ToDrawingColor(), Color1,\n                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));\n                        var Color2Interpolated = ColorInterpolation.Interpolate(OColor.ToDrawingColor(), Color2,\n                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));\n\n\n                        window.Dispatcher.Invoke(() => {\n                            var Brush = new LinearGradientBrush(Color1Interpolated.ToMediaColor(),\n                                Color2Interpolated.ToMediaColor(), Angle);\n                            window.canvasManager.layers.DrawRect(Layer, Brush);\n                        }, System.Windows.Threading.DispatcherPriority.Normal, token);\n\n                        token.WaitHandle.WaitOne(Time2 / (Time2 / App.Settings.InterpolationQuality));\n                    }\n                }\n                else {\n                    var Brush = (LinearGradientBrush) OldBrush;\n\n                    System.Windows.Media.Color OColor1;\n                    System.Windows.Media.Color OColor2;\n                    window.Dispatcher.Invoke(() => {\n                        OColor1 = Brush.GradientStops[0].Color;\n                        OColor2 = Brush.GradientStops[1].Color;\n                    }, System.Windows.Threading.DispatcherPriority.Normal, token);\n\n                    var j = 1;\n\n                    while (j++ < Time2 / App.Settings.InterpolationQuality) {\n                        var Color1Interpolated = ColorInterpolation.Interpolate(OColor1.ToDrawingColor(), Color1,\n                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));\n                        var Color2Interpolated = ColorInterpolation.Interpolate(OColor2.ToDrawingColor(), Color2,\n                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));\n\n\n                        window.Dispatcher.Invoke(() => {\n                            var Brush = new LinearGradientBrush(Color1Interpolated.ToMediaColor(),\n                                Color2Interpolated.ToMediaColor(), Angle);\n                            window.canvasManager.layers.DrawRect(Layer, Brush);\n                        }, System.Windows.Threading.DispatcherPriority.Normal, token);\n\n\n                        token.WaitHandle.WaitOne(Time2 / (Time2 / App.Settings.InterpolationQuality));\n                    }\n                }\n\n                token.WaitHandle.WaitOne(Time);\n                break;\n\n            case ColorInstructionEffect.Fade:\n\n                if (OldBrush is SolidColorBrush) {\n                    var Brush = (SolidColorBrush) OldBrush;\n\n                    System.Windows.Media.Color OColor;\n                    window.Dispatcher.Invoke(() => { OColor = Brush.Color; }, System.Windows.Threading.DispatcherPriority.Normal, token);\n\n                    var j = 1;\n\n                    while (j++ < Time2 / App.Settings.InterpolationQuality) {\n                        var Color1Interpolated = ColorInterpolation.Interpolate(OColor.ToDrawingColor(), Color1,\n                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));\n\n                        window.Dispatcher.Invoke(() => {\n                            var Brush = new SolidColorBrush(Color1Interpolated.ToMediaColor());\n                            window.canvasManager.layers.DrawRect(Layer, Brush);\n                        }, System.Windows.Threading.DispatcherPriority.Normal, token);\n\n\n                        token.WaitHandle.WaitOne(Time2 / (Time2 / App.Settings.InterpolationQuality));\n                    }\n                }\n                else {\n                    var Brush = (LinearGradientBrush) OldBrush;\n\n                    System.Windows.Media.Color OColor1;\n                    System.Windows.Media.Color OColor2;\n                    window.Dispatcher.Invoke(() => {\n                        OColor1 = Brush.GradientStops[0].Color;\n                        OColor2 = Brush.GradientStops[1].Color;\n                    }, System.Windows.Threading.DispatcherPriority.Normal, token);\n\n                    var j = 1;\n\n                    while (j++ < Time2 / App.Settings.InterpolationQuality) {\n                        var Color1Interpolated = ColorInterpolation.Interpolate(OColor1.ToDrawingColor(), Color1,\n                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));\n                        var Color2Interpolated = ColorInterpolation.Interpolate(OColor2.ToDrawingColor(), Color1,\n                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));\n\n\n                        window.Dispatcher.Invoke(() => {\n                            var Brush = new LinearGradientBrush(Color1Interpolated.ToMediaColor(),\n                                Color2Interpolated.ToMediaColor(), Angle);\n                            window.canvasManager.layers.DrawRect(Layer, Brush);\n                        }, System.Windows.Threading.DispatcherPriority.Normal, token);\n\n\n                        token.WaitHandle.WaitOne(Time2 / (Time2 / App.Settings.InterpolationQuality));\n                    }\n                }\n\n                token.WaitHandle.WaitOne(Time);\n                break;\n        }\n        \n        return true;\n\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/DelayInstruction.cs",
    "content": "﻿using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\n\n\nnamespace RainbowTaskbar.Configuration.Instruction.Instructions;\n\n\ninternal class DelayInstruction : Instruction {\n    public int Time { get; set; } = 1;\n\n    public override string Description {\n        get {\n            return App.localization.InstructionFormat(this, Time);\n        }\n    }\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        token.WaitHandle.WaitOne(Time);\n        return true;\n    }\n    /*\n    public override JObject ToJSON() {\n        dynamic data = new ExpandoObject();\n        data.Name = GetType().Name;\n        data.Time = Time;\n\n        return JObject.FromObject(data);\n    }\n    */\n}"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/ImageInstruction.cs",
    "content": "﻿using System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Imaging;\nusing System.Dynamic;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nnamespace RainbowTaskbar.Configuration.Instruction.Instructions;\n\n\ninternal class ImageInstruction : Instruction {\n\n    public bool drawn = false;\n\n    public int Layer { get; set; } = 0;\n\n    public string Path { get; set; } = \"\";\n\n    public int X { get; set; } = 0;\n\n    public int Y { get; set; } = 0;\n\n    public int Width { get; set; } = 0;\n\n    public int Height { get; set; } = 0;\n\n    public double Opacity { get; set; } = 1;\n\n    public bool DrawOnce { get; set; } = false;\n\n    public override string Description {\n        get {\n            return App.localization.InstructionFormat(this, System.IO.Path.GetFileName(Path));\n        }\n    }\n    /*\n    public override JObject ToJSON() {\n        dynamic data = new ExpandoObject();\n\n        data.Name = GetType().Name;\n        data.Layer = Layer;\n        data.Path = Path;\n        data.X = X;\n        data.Y = Y;\n        data.Width = Width;\n        data.Height = Height;\n        data.Opacity = Opacity;\n        data.DrawOnce = DrawOnce;\n\n        return JObject.FromObject(data);\n    }\n    */\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        if (Path == \"\") return false;\n\n        if (DrawOnce && drawn) return false;\n\n        window.Dispatcher.Invoke(() => {\n            var bmp = new Bitmap(Path);\n            var ms = new MemoryStream();\n\n            bmp.Save(ms, ImageFormat.Png);\n\n            var image = new BitmapImage();\n            image.BeginInit();\n            ms.Seek(0, SeekOrigin.Begin);\n            image.StreamSource = ms;\n            image.EndInit();\n\n            window.canvasManager.layers.DrawImage(Layer, new Rect(X, Y, Width == 0 ? bmp.Width : Width, Height == 0 ? bmp.Height : Height), image);\n        }, System.Windows.Threading.DispatcherPriority.Normal, token);\n\n        if (DrawOnce) {\n            drawn = true;\n        }\n\n        return false;\n    }\n\n}"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/ShapeInstruction.cs",
    "content": "﻿\nusing System;\nusing System.Dynamic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Media;\nusing System.Windows.Shapes;\n\nusing RainbowTaskbar.Interpolation;\nusing RainbowTaskbar.Languages;\n\nnamespace RainbowTaskbar.Configuration.Instruction.Instructions;\n\n\npublic class ShapeInstruction : Instruction {\n\n    public bool drawn = false;\n\n    public int Layer { get; set; } = 0;\n\n    public ShapeInstructionShapes Shape { get; set; } = ShapeInstructionShapes.Line;\n\n    public int X { get; set; } = 0;\n\n    public int Y { get; set; } = 0;\n\n    public int X2 { get; set; } = 0;\n\n    public int Y2 { get; set; } = 0;\n\n    private Taskbar _tsk;\n    private int x2 {\n        get {\n            if (FitTaskbars) {\n                return App.Settings.GraphicsRepeat ? _tsk.canvasManager.layers.width : App.layers.width;\n            }\n            else {\n                return X2;\n            }\n        }\n    }\n\n    private int y2 {\n        get {\n            if (FitTaskbars) {\n                return App.Settings.GraphicsRepeat ? _tsk.canvasManager.layers.height : App.layers.height;\n            }\n            else {\n                return Y2;\n            }\n        }\n    }\n\n    public bool DrawOnce { get; set; } = false;\n\n    public System.Drawing.Color Fill { get; set; } = System.Drawing.Color.FromArgb(255, 0, 0, 0);\n\n    public System.Drawing.Color Line { get; set; } = System.Drawing.Color.FromArgb(255, 0, 0, 0);\n\n    public int LineSize { get; set; } = 1;\n\n    public int Radius { get; set; } = 0;\n\n    private int radius {\n        get {\n            if (FitTaskbars) {\n                return _tsk.taskbarHelper.Radius + 1;\n            }\n            else {\n                return Radius;\n            }\n        }\n    }\n\n\n    public bool FitTaskbars { get; set; } = false;\n\n    public override string Description {\n        get {\n            var name = Shape == ShapeInstructionShapes.Rectangle && Radius > 0 ? App.localization.Get(\"enum_roundedrect\") : Shape.ToStringLocalized();\n            return App.localization.InstructionFormat(this, name);\n        }\n    }\n\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        _tsk = window;\n        if (DrawOnce && drawn) {\n            return false;\n        }\n\n        switch (Shape) {\n            case ShapeInstructionShapes.Line: {\n                    var geometry = new LineGeometry(new Point(X, Y), new Point(x2, y2));\n                    geometry.Freeze();\n                    window.Dispatcher.Invoke(() =>\n                        window.canvasManager.layers.DrawShape(Layer, geometry, null, new Pen(new SolidColorBrush(Line.ToMediaColor()), LineSize))\n                    , System.Windows.Threading.DispatcherPriority.Normal, token);\n                    break;\n                }\n            case ShapeInstructionShapes.Rectangle: {\n                    var geometry = new RectangleGeometry(new Rect(new Point(X, Y), new Point(x2, y2)));\n                    geometry.RadiusX = radius / 2.0; geometry.RadiusY = radius / 2.0;\n                    geometry.Freeze();\n                    window.Dispatcher.Invoke(() =>\n                        window.canvasManager.layers.DrawShape(Layer, geometry, new SolidColorBrush(Fill.ToMediaColor()), new Pen(new SolidColorBrush(Line.ToMediaColor()), LineSize))\n                    , System.Windows.Threading.DispatcherPriority.Normal, token);\n                    break;\n                }\n            case ShapeInstructionShapes.Ellipse: {\n                    var geometry = new EllipseGeometry(new Rect(new Point(X, Y), new Point(x2, y2)));\n                    geometry.Freeze();\n                    window.Dispatcher.Invoke(() =>\n                        window.canvasManager.layers.DrawShape(Layer, geometry, new SolidColorBrush(Fill.ToMediaColor()), new Pen(new SolidColorBrush(Line.ToMediaColor()), LineSize))\n                    , System.Windows.Threading.DispatcherPriority.Normal, token);\n                    break;\n                }\n            \n        }\n\n        if (DrawOnce) {\n            drawn = true;\n        }\n\n        return false;\n    }\n\n    public enum ShapeInstructionShapes {\n        Line,\n        Rectangle,\n        Ellipse\n    }\n    /*\n    public override JObject ToJSON() {\n        dynamic data = new ExpandoObject();\n\n        data.Name = GetType().Name;\n        data.Layer = Layer;\n        data.Shape = Shape;\n        data.X = X;\n        data.Y = Y;\n        data.X2 = X2;\n        data.Y2 = Y2;\n        data.FitTaskbars = FitTaskbars;\n        data.Fill = ColorExtension.HexConverter(Fill);\n        data.Line = ColorExtension.HexConverter(Line);\n        data.LineSize = LineSize;\n        data.DrawOnce = DrawOnce;\n\n        return JObject.FromObject(data);\n    }\n    */\n}\n"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/TextInstruction.cs",
    "content": "﻿using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Media;\nusing RainbowTaskbar.Interpolation;\nusing Color = System.Drawing.Color;\n\nnamespace RainbowTaskbar.Configuration.Instruction.Instructions;\n\n\ninternal class TextInstruction : Instruction {\n\n    public bool drawn = false;\n\n    public int Layer { get; set; } = 1;\n\n    public string Text { get; set; } = \"\";\n\n    public int X { get; set; } = 0;\n\n    public int Y { get; set; } = 0;\n\n    public string Font { get; set; } = \"Arial\";\n\n    public int Size { get; set; } = 32;\n\n    public bool DrawOnce { get; set; } = false;\n\n    public Color Color { get; set; } = Color.Black;\n\n    public bool Center { get; set; } = false;\n\n    public override string Description {\n        get {\n            return App.localization.InstructionFormat(this, Text);\n        }\n    }\n    /*\n    public override JObject ToJSON() {\n        dynamic data = new ExpandoObject();\n        data.Name = GetType().Name;\n        data.Layer = Layer;\n        data.Text = Text;\n        data.X = X;\n        data.Y = Y;\n        data.Font = Font;\n        data.Size = Size;\n        data.Color = ColorExtension.HexConverter(Color);\n        data.DrawOnce = DrawOnce;\n        data.Center = Center;\n\n        return JObject.FromObject(data);\n    }*/\n\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        if (drawn && DrawOnce) {\n            return false;\n        }\n\n\n        window.Dispatcher.Invoke(() =>\n            window.canvasManager.layers.DrawText(Layer, Text, X, Y, Size, Font, new SolidColorBrush(Color.ToMediaColor()), Center)\n        , System.Windows.Threading.DispatcherPriority.Normal, token);\n\n        if (DrawOnce) drawn = true;\n\n        return false;\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/TransparencyInstruction.cs",
    "content": "﻿using System;\nusing System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows.Controls;\nusing RainbowTaskbar.Helpers;\nusing RainbowTaskbar.Languages;\n\nnamespace RainbowTaskbar.Configuration.Instruction.Instructions;\n\n\npublic class TransparencyInstruction : Instruction {\n    public enum TransparencyInstructionStyle {\n        Default,\n        Blur,\n        Transparent\n    }\n\n    public enum TransparencyInstructionType {\n        Taskbar,\n        RainbowTaskbar,\n        All,\n        Style,\n        Layer,\n        TaskbarElements\n    }\n\n    public TransparencyInstructionType Type { get; set; }\n\n    public double Opacity { get; set; } = 1;\n\n    public double TaskbarOpacity { get => App.Settings.GlobalOpacity == -1 ? Opacity : App.Settings.GlobalOpacity; }\n\n    public TransparencyInstructionStyle Style { get; set; }\n\n    public int Layer { get; set; }\n\n    public override string Description {\n        get {\n            /*return Type == TransparencyInstructionType.Style ? $\"Taskbar style - {Style.ToString()}\" :\n                (Type == TransparencyInstructionType.Layer ? $\"Layer {Layer} - {Math.Round(Opacity * 100)}% opacity\" :\n                $\"{Type.ToString()} - {Math.Round(Opacity * 100)}% opacity\");*/\n            if (Type == TransparencyInstructionType.Style) {\n                return App.localization.InstructionFormatSuffix(this, \"style\", Style.ToStringLocalized());\n            }\n            else if (Type == TransparencyInstructionType.Layer) {\n                return App.localization.InstructionFormatSuffix(this, \"layer\", Layer, Math.Round(Opacity * 100));\n            }\n            else {\n                return App.localization.InstructionFormatSuffix(this, \"opacity\", Type.ToStringLocalized(), Math.Round(Opacity * 100));\n            }\n\n        }\n    }\n    /*\n    public override JObject ToJSON() {\n        dynamic data = new ExpandoObject();\n        data.Name = GetType().Name;\n        data.Opacity = Opacity;\n        data.Layer = Layer;\n        data.Style = Style;\n        data.Type = Type;\n\n        return JObject.FromObject(data);\n    }\n    */\n\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        switch (Type) {\n            case TransparencyInstructionType.Taskbar:\n\n                window.taskbarHelper.SetAlpha(TaskbarOpacity);\n                break;\n\n            case TransparencyInstructionType.RainbowTaskbar:\n                window.Dispatcher.Invoke(() => {\n                    if (window.Opacity != Opacity) window.Opacity = Opacity;\n                    \n                }, System.Windows.Threading.DispatcherPriority.Normal, token);\n                break;\n\n            case TransparencyInstructionType.All:\n                window.Dispatcher.Invoke(() => {\n                    if (window.Opacity != Opacity) window.Opacity = Opacity;\n                }, System.Windows.Threading.DispatcherPriority.Normal, token);\n                window.taskbarHelper.SetAlpha(TaskbarOpacity);\n                break;\n\n            case TransparencyInstructionType.Style:\n\n                switch (Style) {\n                    case TransparencyInstructionStyle.Default:\n                        if (window.taskbarHelper.Style != TaskbarHelper.TaskbarStyle.Default)\n                            window.taskbarHelper.Style = TaskbarHelper.TaskbarStyle.ForceDefault;\n                        break;\n                    case TransparencyInstructionStyle.Blur:\n                        window.taskbarHelper.Style = TaskbarHelper.TaskbarStyle.Blur;\n                        break;\n                    case TransparencyInstructionStyle.Transparent:\n                        window.taskbarHelper.Style = TaskbarHelper.TaskbarStyle.Transparent;\n                        break;\n                }\n\n                ExplorerTAP.ExplorerTAP.SetAppearanceType(Style);\n\n                break;\n\n            case TransparencyInstructionType.Layer:\n                \n                \n                window.Dispatcher.Invoke(() =>\n                    window.canvasManager.canvases[Layer].Opacity = Opacity\n                    , System.Windows.Threading.DispatcherPriority.Normal, token);\n                break;\n\n            case TransparencyInstructionType.TaskbarElements:\n                ExplorerTAP.ExplorerTAP.SetTaskbarElementsOpacity(Opacity);\n                break;\n        }\n\n        return false;\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/Configuration/Web/WebConfig.cs",
    "content": "﻿using Microsoft.Web.WebView2.Core;\nusing Microsoft.Web.WebView2.Wpf;\nusing RainbowTaskbar.Helpers;\nusing RainbowTaskbar.Interpolation;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Text.RegularExpressions;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows.Data;\nusing System.Windows.Media;\nusing System.Windows.Threading;\n\nnamespace RainbowTaskbar.Configuration.Web {\n    public enum WebConfigUserSettingDataType {\n        String,\n        Number,\n        Color,\n        Boolean\n    }\n    [Serializable]\n    public class WebConfigUserSetting {\n        public string Name { get; set; } = App.localization?.Get(\"defpropname\") ?? \"New property\";\n        public string Key { get; set; } = App.localization?.Get(\"defpropkey\") ?? \"property_1\";\n        public string _value { get; set; } = string.Empty;\n        // probably should have used a converter but i gave up trying\n        [JsonIgnore]\n        public string ValueJS {\n            get {\n                switch (DataType) {\n                    case WebConfigUserSettingDataType.Boolean: {\n                            var suc = bool.TryParse(_value, out bool res);\n                            return suc ? res.ToString().ToLower() : \"false\";\n                        }\n                    case WebConfigUserSettingDataType.Number: {\n                            var suc = double.TryParse(_value, out double res);\n                            return suc ? res.ToString() : \"0\";\n                        }\n                    default:\n                        return $\"{JsonSerializer.Serialize(_value)}\";\n                }\n            }\n        }\n        [JsonIgnore]\n        public dynamic Value { \n            get {\n                switch (DataType) {\n                    case WebConfigUserSettingDataType.Boolean: {\n                            var suc = bool.TryParse(_value, out bool res);\n                            return suc ? res : false;\n                        }\n                    case WebConfigUserSettingDataType.Number: {\n                            var suc = double.TryParse(_value, out double res);\n                            return suc ? res : 0;\n                        }\n                    case WebConfigUserSettingDataType.Color: {\n                            try {\n                                return (System.Windows.Media.Color) System.Windows.Media.ColorConverter.ConvertFromString(_value);\n                            }\n                            catch { return System.Windows.Media.Color.FromArgb(255, 0, 0, 0); }\n                        }\n                    default:\n                        return _value;\n                }\n            } \n            set {\n                switch (DataType) {\n                    case WebConfigUserSettingDataType.Boolean: {\n                            _value = value ? \"true\" : \"false\";\n                            break;\n                        }\n                    case WebConfigUserSettingDataType.Number: {\n                            _value = (value as object).ToString();\n                            break;\n                        }\n                    case WebConfigUserSettingDataType.Color: {\n                            _value = ColorTranslator.ToHtml(((System.Windows.Media.Color) value).ToDrawingColor());\n                            break;\n                        }\n                    default:\n                        _value = (value as object).ToString();\n                        break;\n                }\n            } \n        }\n        public WebConfigUserSettingDataType DataType { get; set; } = WebConfigUserSettingDataType.String;\n    }\n    [Serializable]\n    public class WebConfigData : ConfigData {\n        public string WebContent { get; set; }\n        public BindingList<WebConfigUserSetting> UserSettings { get; set; } = new() { new() { } };\n\n    }\n    [Serializable]\n    public class WebConfig : Config {\n        [JsonIgnore]\n        public WebConfigData Data { get => ConfigData as WebConfigData; set \n            {\n                ConfigData = value;\n            }\n        }\n\n        public WebConfig() {\n            ConfigData = new WebConfigData() { WebContent = \"\"\"\n<html>\n    <head>\n        <style>\n            body,html {\n                width:100%;\n                height:100%;\n                margin:0;\n                padding:0;\n                overflow:hidden;\n            }\n        </style>\n    </head>\n    <body>\n\n    </body>\n    <script>\n        rainbowTaskbar\n            .setTaskbarOpacity(1)\n            .setStyleTransparent();\n\n        rainbowTaskbar.onUIChanged = (info) => {\n            \n        }\n     </script>\n\n</html>\n\"\"\" };\n        }\n\n        private void _Start(WebView2 webView, Mutex webViewReady, Taskbar t) {\n            if(!webViewReady.WaitOne(1500)) return;\n            webViewReady.ReleaseMutex();\n            App.Current.Dispatcher.Invoke(() => {\n                webView?.CoreWebView2.Resume();\n                webView.CoreWebView2.MemoryUsageTargetLevel = Microsoft.Web.WebView2.Core.CoreWebView2MemoryUsageTargetLevel.Low;\n\n                File.WriteAllText(Path.Join(App.rainbowTaskbarDir, \"current.html\"), Data.WebContent);\n\n                var code = $$\"\"\"\n                        // requestAnimationFrame code adapted from https://github.com/PixelsCommander/fps-control-chrome-extension/blob/master/src/js/content.js\n\n                        window.rtMaxFPS = {{App.Settings.MaxWebFPS}};\n                        window.rtUserConfig = {};\n\n                        let __rafs = 0;\n                        let __raf = window.requestAnimationFrame;\n                        let __nextRAFTime = Date.now();\n                        let __mockedRaf = (callback) => {\n                            let skip = (window.rtMaxFPS !== 0 && Date.now() < __nextRAFTime);\n\n                            if (skip) {\n                                __skippingRaf(callback);\n                            } else {\n                                __nextRAFTime = Date.now() + 1000/window.rtMaxFPS;\n                                __raf(callback);\n                            }\n\n                            return __rafs++;\n                        }\n                        function __skippingRaf(func) {\n                            __raf(() => {\n                                window.requestAnimationFrame(func);\n                            })\n                        }\n\n                        window.rainbowTaskbar = {\n                            setTaskbarOpacity: (v) => {window.chrome.webview.postMessage({m:\"transparency\",v,which:0}); return window.rainbowTaskbar},\n                            setUnderlayOpacity: (v) => {window.chrome.webview.postMessage({m:\"transparency\",v,which:1}); return window.rainbowTaskbar},\n                            setTaskbarElementsOpacity: (v) => {window.chrome.webview.postMessage({m:\"transparency\",v,which:5}); return window.rainbowTaskbar},\n                            setStyleDefault: () => {window.chrome.webview.postMessage({m:\"style\",style:0}); return window.rainbowTaskbar},\n                            setStyleBlur: () => {window.chrome.webview.postMessage({m:\"style\",style:1}); return window.rainbowTaskbar},\n                            setStyleTransparent: () => {window.chrome.webview.postMessage({m:\"style\",style:2}); return window.rainbowTaskbar},\n                            setTaskbarOffset: (offset) => {window.chrome.webview.postMessage({m:\"offset\",v:offset}); return window.rainbowTaskbar},\n                            \n                            uiInfo: {},\n                            graphicsRepeat: {{(App.Settings.GraphicsRepeat ? \"true\" : \"false\")}},\n                            maxFps: window.rtMaxFPS,\n                            rtUserConfig: window.rtUserConfig,\n                            taskbarIndex: {{(t is not null ? App.taskbars.IndexOf(t) : -1)}},\n\n                            helpers: {\n                                normalizeTaskbarCoords: (_ui, copy = true) => {\n                                    let ui = copy ? JSON.parse(JSON.stringify(_ui)) : _ui;\n                        \n                                    let minX = _ui.sort((a,b)=>a.taskbar.X - b.taskbar.X)[0].taskbar.X;\n                                    for(let e of ui) {\n                                        e.taskbar.X -= minX;\n                                    }\n                        \n                                    return ui;\n                                },\n                                normalizeAndScaleUICoords: (_ui, copy = true) => {\n                                    let ui = rainbowTaskbar.helpers.normalizeTaskbarCoords(_ui, copy);\n\n                                    for(let e of ui) {\n                                        e.taskbar.X /= window.devicePixelRatio;\n                                        e.taskbar.Y /= window.devicePixelRatio;\n                                        e.taskbar.Width /= window.devicePixelRatio;\n                                        e.taskbar.Height /= window.devicePixelRatio;\n                        \n                                        e.taskbarFrameRepeater.X /= window.devicePixelRatio;\n                                        e.taskbarFrameRepeater.Y /= window.devicePixelRatio;\n                                        e.taskbarFrameRepeater.Width /= window.devicePixelRatio;\n                                        e.taskbarFrameRepeater.Height /= window.devicePixelRatio;\n                        \n                                        e.systemTrayFrame.X /= window.devicePixelRatio;\n                                        e.systemTrayFrame.Y /= window.devicePixelRatio;\n                                        e.systemTrayFrame.Width /= window.devicePixelRatio;\n                                        e.systemTrayFrame.Height /= window.devicePixelRatio;\n                                    }\n\n                                    return ui;\n                                },\n                                generateCSSMaskForUI: (_ui, fadeTop = true) => {\n                                    let ui = rainbowTaskbar.helpers.normalizeAndScaleUICoords(_ui);\n                                    ui.sort((a,b) => a.taskbar.X - b.taskbar.X);\n\n                                    let genVis = ``;\n\n                                    if(rainbowTaskbar.graphicsRepeat) {\n                                        let x = ui.find(x=>x.taskbarIndex == rainbowTaskbar.taskbarIndex);\n\n                                        genVis = `rgba(255, 255, 255, 0) ${x.taskbarFrameRepeater.X - 24}px, rgba(255, 255, 255, 1) ${x.taskbarFrameRepeater.X + 64}px, rgba(255, 255, 255, 1) ${x.taskbarFrameRepeater.X + x.taskbarFrameRepeater.Width - 64}px, rgba(255, 255, 255, 0) ${x.taskbarFrameRepeater.X + x.taskbarFrameRepeater.Width + 24}px, rgba(255, 255, 255, 0) ${x.systemTrayFrame.X - 24}px, rgba(255, 255, 255, 1) ${x.systemTrayFrame.X + 64}px, rgba(255, 255, 255, 1) ${x.taskbar.Width - 8}px, rgba(255, 255, 255, 0) ${x.taskbar.Width}px,`\n                                    } else {\n                                        genVis = ui.map((x,i)=>\n                                            `rgba(255, 255, 255, ${+(x.taskbarFrameRepeater.X == 0)}) ${x.taskbar.X + x.taskbarFrameRepeater.X - 24}px, rgba(255, 255, 255, 1) ${x.taskbar.X + x.taskbarFrameRepeater.X + 64}px, rgba(255, 255, 255, 1) ${x.taskbar.X + x.taskbarFrameRepeater.X + x.taskbarFrameRepeater.Width - 64}px, rgba(255, 255, 255, 0) ${x.taskbar.X + x.taskbarFrameRepeater.X + x.taskbarFrameRepeater.Width + 24}px, rgba(255, 255, 255, 0) ${x.taskbar.X + x.systemTrayFrame.X - 24}px, rgba(255, 255, 255, 1) ${x.taskbar.X + x.systemTrayFrame.X + 64}px, rgba(255, 255, 255, 1) ${x.taskbar.X + x.taskbar.Width - 8}px, rgba(255, 255, 255, ${+(x.taskbarFrameRepeater.X == 0)}) ${x.taskbar.X + x.taskbar.Width}px,`\n                                        ).join(\"\")\n                                    }\n\n                                   \n\n                                    let mask = `linear-gradient(90deg,rgba(255, 255, 255, 0) 0%, ${genVis} rgba(255, 255, 255, 1) 100%) 0px 0px / 100% 100% no-repeat${fadeTop ? \", linear-gradient(180deg,rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 1) 40%, rgba(255, 255, 255, 1) 100%) 0px 0px / 100% 100% no-repeat\" : \"\"}`;\n                                    let maskComposite = 'intersect';\n                                    return {\n                                        mask, maskComposite, \n                                        apply: () => {\n                                            document.documentElement.style.mask = mask;\n                                            document.documentElement.style.maskComposite = maskComposite;\n                                        }\n                                    }\n                                }\n                            },\n\n                            onUIChanged: (uiInfo) => {},\n\n                            __internal: {\n                                __onUIChanged: (data) => {window.rainbowTaskbar.uiInfo=data;window.rainbowTaskbar.onUIChanged(window.rainbowTaskbar.uiInfo);},\n                            }\n                            \n                        }\n\n                        window.chrome.webview.addEventListener(\"message\", (m) => {\n                            let message = JSON.parse(m.data);\n                            if(message.message == \"ui\") {\n                                window.rainbowTaskbar.__internal.__onUIChanged(message.data);\n                            }\n                        });\n\n                        window.chrome.webview.postMessage({m:\"ui\"})\n                        for(let i = 1; i <= 5; i++) setTimeout(() => window.chrome.webview.postMessage({m:\"ui\"}), i*500);\n\n\n                        window.requestAnimationFrame = __mockedRaf;\n                        {{string.Join('\\n', Data.UserSettings.Select((x) => {\n                    return \"window.rtUserConfig[\" + JsonSerializer.Serialize(new Regex(\"[^\\\\w$]\").Replace(x.Key, \" \")) + \"]=\" + x.ValueJS + \";\";\n                })) ?? \"\"}}\n\n                        \"\"\";\n                \n                webView?.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(\n                    code).ContinueWith((s) => {\n                        App.Current.Dispatcher.Invoke(() => {\n                            webView?.CoreWebView2.Navigate(Path.Join(App.rainbowTaskbarDir, \"current.html\"));\n                            EventHandler<CoreWebView2NavigationCompletedEventArgs> handler = null;\n                            handler = (sender, args) => {\n                                webView.CoreWebView2.RemoveScriptToExecuteOnDocumentCreated(s.Result);\n                                webView.NavigationCompleted -= handler;\n                            };\n                            webView.NavigationCompleted += handler;\n                        });\n                    });\n\n                \n            });\n        }\n\n        public override async Task<bool> Start() {\n            if (!(await base.Start())) return false;\n\n            App.taskbars.ForEach(x => {\n                x.ClassicGrid.Visibility = System.Windows.Visibility.Collapsed;\n                x.WebGrid.Visibility = System.Windows.Visibility.Visible;\n            });\n\n            if(App.Settings.GraphicsRepeat) {\n                App.taskbars.ForEach(x => {\n                    Task.Run(() => {\n                        _Start(x.webView, x.webViewReady_, x);\n                    });\n                });\n            } else {\n                Task.Run(() => {\n                    _Start(App.webView, App.webViewReady, null);\n                });\n            }\n\n            return true;\n        }\n\n        public override Task Stop() {\n            var wv = App.webView;\n            return Task.Run(() => {\n                App.Current.Dispatcher.Invoke(() => {\n                    try {\n                        wv?.NavigateToString(\"<html></html>\");\n                        wv?.CoreWebView2.TrySuspendAsync();\n                    }\n                    catch { }\n                });\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Drawing/CanvasManager.cs",
    "content": "﻿using System.Drawing;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Shapes;\nusing System.Linq;\nusing System.Collections.Generic;\nusing System.Windows.Media;\nusing System.Globalization;\nusing System.Windows.Media.Imaging;\n\nnamespace RainbowTaskbar.Drawing;\n\npublic class CanvasManager {\n    public List<Canvas> canvases;\n    private LayerManager _layers = null;\n    public LayerManager layers { \n        get {\n            if (_layers == null) {\n                return App.layers;\n            }\n            else return _layers;\n        }\n        set => _layers = value;\n    }\n    public Window window;\n\n    public CanvasManager(Taskbar window, Canvas[] canvases) {\n        this.window = window;\n        this.canvases = canvases.ToList();\n\n        this.canvases.ForEach((c) => {\n            c.Width = window.Width;\n            c.Height = window.Height;\n        });\n        if (App.Settings.GraphicsRepeat) _layers = new LayerManager(window);\n    }\n\n    public void SetImage(int index, RenderTargetBitmap target) {\n        var c = canvases[index];\n        var img = new System.Windows.Controls.Image();\n        img.Name = $\"{c.Name}Image\";\n        img.Width = layers.width;\n        img.Height = c.Height;\n        img.SnapsToDevicePixels = true;\n\n        img.Source = target;\n\n        img.Stretch = Stretch.None;\n        c.Children.Add(img);\n        Canvas.SetTop(img, 0);\n        if(!App.Settings.GraphicsRepeat) {\n            Canvas.SetLeft(img, -window.Left);\n        }\n    }\n\n   \n\n    \n\n}"
  },
  {
    "path": "RainbowTaskbar/Drawing/LayerManager.cs",
    "content": "﻿using RainbowTaskbar.Helpers;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\n\nnamespace RainbowTaskbar.Drawing\n{\n    public class LayerManager\n    {\n        public int width = 0;\n        public int height = 0;\n        public Taskbar window = null;\n        public List<RenderTargetBitmap> renderTargets = new List<RenderTargetBitmap>();\n        public List<System.Windows.Media.Brush> brushes = new List<System.Windows.Media.Brush>();\n\n        public LayerManager() {\n            for (int i = 0; i < 16; i++) brushes.Add(new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, 255, 255)));\n        }\n\n        public LayerManager(Taskbar window) {\n            this.window = window;\n            width = (int) (window.Width);\n            height = (int) (window.Height);\n            for (int i = 0; i < 16; i++) brushes.Add(new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, 255, 255)));\n        }\n\n        public void MakeIfNeeded(int layer) {\n            if (renderTargets.Count - 1 < layer && layer < 16) {\n                for (int i = renderTargets.Count; i <= layer; i++) {\n                    var target = new RenderTargetBitmap((int) width, (int) height, 96, 96, PixelFormats.Pbgra32);\n                    renderTargets.Add(target);\n                    \n                    if(window is not null) window.canvasManager.SetImage(i, target);\n                    else {\n                        App.taskbars.ForEach(b => {\n                            b.canvasManager.SetImage(i, target);\n                        });\n                    }\n                }\n\n            }\n        }\n\n        public void DrawRect(int layer, System.Windows.Media.Brush fill, Rect? rect = null) {\n            MakeIfNeeded(layer);\n\n            var visual = new DrawingVisual();\n            var ctx = visual.RenderOpen();\n            ctx.DrawRectangle(fill, null, rect ?? new Rect(0, 0, width, height));\n            brushes[layer] = fill;\n            ctx.Close();\n            renderTargets[layer].Render(visual);\n        }\n        public void DrawImage(int layer, Rect rect, ImageSource imageSource) {\n            MakeIfNeeded(layer);\n\n            var visual = new DrawingVisual();\n            var ctx = visual.RenderOpen();\n            ctx.DrawImage(imageSource, rect);\n            ctx.Close();\n            renderTargets[layer].Render(visual);\n        }\n\n        public void DrawShape(int layer, Geometry shape, System.Windows.Media.Brush brush = null, System.Windows.Media.Pen pen = null) {\n            MakeIfNeeded(layer);\n\n            var visual = new DrawingVisual();\n            var ctx = visual.RenderOpen();\n            ctx.DrawGeometry(brush, pen, shape);\n            ctx.Close();\n            renderTargets[layer].Render(visual);\n        }\n        public void DrawText(int layer, string content, int x = 0, int y = 0, int size = 32, string font = \"Arial\", System.Windows.Media.Brush fill = null, bool Center = false) {\n            MakeIfNeeded(layer);\n\n            var visual = new DrawingVisual();\n            var ctx = visual.RenderOpen();\n            var ftext = new FormattedText(\n                content ?? \"\",\n                CultureInfo.GetCultureInfo(\"en-us\"),\n                FlowDirection.LeftToRight,\n                new Typeface(font),\n                size,\n                fill,\n                TaskbarHelper.GetSystemDpi() / 96.0\n                );\n            ctx.DrawText(ftext, new System.Windows.Point(Center ? width/2 - ftext.Width/2 : x, y));\n            ctx.Close();\n            renderTargets[layer].Render(visual);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/DebugWindow.xaml",
    "content": "﻿<ui:FluentWindow  xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" x:Class=\"RainbowTaskbar.Editor.DebugWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:RainbowTaskbar.Editor\" xmlns:configuration=\"clr-namespace:RainbowTaskbar.Configuration\" d:DataContext=\"{d:DesignInstance Type=local:DebugWindow}\"\n                  mc:Ignorable=\"d\"\n                  Closing=\"FluentWindow_Closing\"\n        Title=\"DebugWindow\" Height=\"450\" Width=\"800\">\n    <Window.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Window.Resources>\n    <Grid>\n\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n            <RowDefinition Height=\"*\"></RowDefinition>\n        </Grid.RowDefinitions>\n\n\n        <ui:TitleBar Title=\"Debug\"/>\n        <Grid Grid.Row=\"1\">\n            <TextBlock Text=\"{Binding DebugText}\"></TextBlock>\n        </Grid>\n    </Grid>\n</ui:FluentWindow>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/DebugWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Dynamic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\nusing Wpf.Ui.Controls;\n\nnamespace RainbowTaskbar.Editor\n{\n    /// <summary>\n    /// Interaction logic for DebugWindow.xaml\n    /// </summary>\n    public partial class DebugWindow : FluentWindow, INotifyPropertyChanged\n    {\n        public string DebugText { get; set; }\n        private bool active = true;\n        public DebugWindow()\n        {\n\n            DataContext = this;\n            InitializeComponent();\n            ApplicationThemeManager.ApplySystemTheme(true);\n            Task.Run(() => {\n                while (active) {\n                    List<string> missingKeys = new List<string>();\n                    foreach (DictionaryEntry key in App.localization.dictionary_en_US) {\n                        if(!App.localization.dictionary.Contains(key.Key)) missingKeys.Add((string)key.Key);\n                    }\n                    DebugText = $\"Missing translation keys: {string.Join(\", \", missingKeys)}\\n\\n\";\n                    if (ExplorerTAP.ExplorerTAP.IsInjected) {\n                        DebugText += $\"UI Data: {ExplorerTAP.ExplorerTAP.GetUIDataStr(App.taskbars[0])}\\n\";\n                    }\n                    Thread.Sleep(100);\n                }\n            });\n        }\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        private void FluentWindow_Closing(object sender, CancelEventArgs e) {\n            active = false;\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/EditorViewModel.cs",
    "content": "﻿using RainbowTaskbar.Editor.Pages.Edit;\nusing RainbowTaskbar.Helpers;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Controls;\n\nnamespace RainbowTaskbar.Editor {\n    public class EditorViewModel {\n        public EditPage EditPage { get; set; }\n        public string? LatestUpdateInfo { get; set; } = null;\n        public bool IsAppMicrosoftStore { get => App.IsAppMicrosoftStore; }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/EditorWindow.xaml",
    "content": "﻿<ui:FluentWindow x:Class=\"RainbowTaskbar.Editor.EditorWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:RainbowTaskbar.Editor\"\n        xmlns:pages=\"clr-namespace:RainbowTaskbar.Editor.Pages\"\n        mc:Ignorable=\"d\"\n        KeyDown=\"FluentWindow_KeyDown\"\n        xmlns:extensions=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls\"\n        xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\"\n                 Closing=\"FluentWindow_Closing\"\n                 Icon=\"pack://application:,,,/RainbowTaskbar;component/Resources/icon.ico\"\n        Title=\"EditorWindow\" Height=\"700\" Width=\"1200\">\n    <Window.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Window.Resources>\n    <Grid>\n        \n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n            <RowDefinition Height=\"*\"></RowDefinition>\n        </Grid.RowDefinitions>\n        \n        \n        <ui:TitleBar Title=\"RainbowTaskbar\"/>\n        <Grid Grid.Row=\"1\">\n            <ui:NavigationView x:Name=\"nav\"  PaneDisplayMode=\"LeftFluent\" Navigating=\"nav_Navigating\">\n                <ui:NavigationView.MenuItems>\n                    <ui:NavigationViewItem NavigationCacheMode=\"Enabled\" Icon=\"{ui:SymbolIcon Home24}\" TargetPageType=\"{x:Type pages:Home}\">\n                        <ui:NavigationViewItem.Content>\n                            <Viewbox StretchDirection=\"DownOnly\">\n                                <TextBlock Text=\"{DynamicResource home}\"></TextBlock>\n                            </Viewbox>\n                        </ui:NavigationViewItem.Content>\n                    </ui:NavigationViewItem>\n                    <ui:NavigationViewItem NavigationCacheMode=\"Disabled\" Icon=\"{ui:SymbolIcon CalendarAgenda24}\" TargetPageType=\"{x:Type pages:Configs}\">\n                        <ui:NavigationViewItem.Content>\n                            <Viewbox StretchDirection=\"DownOnly\">\n                                <TextBlock Text=\"{DynamicResource configs}\"></TextBlock>\n                            </Viewbox>\n                        </ui:NavigationViewItem.Content>\n                    </ui:NavigationViewItem>\n                    <ui:NavigationViewItem NavigationCacheMode=\"Enabled\" Icon=\"{ui:SymbolIcon Globe24}\" TargetPageType=\"{x:Type pages:Browse}\">\n                        <ui:NavigationViewItem.Content>\n                            <Viewbox StretchDirection=\"DownOnly\">\n                                <TextBlock Text=\"{DynamicResource browse}\"></TextBlock>\n                            </Viewbox>\n                        </ui:NavigationViewItem.Content>\n                    </ui:NavigationViewItem>\n                </ui:NavigationView.MenuItems>\n                <ui:NavigationView.FooterMenuItems>\n                    <ui:NavigationViewItem NavigationCacheMode=\"Disabled\" Icon=\"{ui:SymbolIcon Settings24}\" TargetPageType=\"{x:Type pages:Settings}\">\n                        <ui:NavigationViewItem.Content>\n                            <Viewbox StretchDirection=\"DownOnly\">\n                                <TextBlock Text=\"{DynamicResource settings}\"></TextBlock>\n                            </Viewbox>\n                        </ui:NavigationViewItem.Content>\n                    </ui:NavigationViewItem>\n                    <ui:NavigationViewItem NavigationCacheMode=\"Enabled\" Icon=\"{ui:SymbolIcon Info24}\" TargetPageType=\"{x:Type pages:About}\">\n                        <ui:NavigationViewItem.Content>\n                            <Viewbox StretchDirection=\"DownOnly\">\n                                <TextBlock Text=\"{DynamicResource about}\"></TextBlock>\n                            </Viewbox>\n                        </ui:NavigationViewItem.Content>\n                    </ui:NavigationViewItem>\n                </ui:NavigationView.FooterMenuItems>\n            </ui:NavigationView>\n\n        </Grid>\n\n        <ContentPresenter x:Name=\"RootContentDialogPresenter\" Grid.Row=\"0\" Grid.RowSpan=\"2\" />\n    </Grid>\n</ui:FluentWindow>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/EditorWindow.xaml.cs",
    "content": "﻿using RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Editor.Pages;\nusing RainbowTaskbar.Editor.Pages.Controls;\nusing RainbowTaskbar.Editor.Pages.Edit;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing System.Reflection;\nusing System.Reflection.Metadata;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Interop;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Shapes;\nusing Wpf.Ui;\nusing Wpf.Ui.Appearance;\nusing Wpf.Ui.Controls;\nusing Wpf.Ui.Extensions;\nusing Xceed.Wpf.AvalonDock.Controls;\n\nnamespace RainbowTaskbar.Editor {\n    /// <summary>\n    /// Interaction logic for EditorWindow.xaml\n    /// </summary>\n    public partial class EditorWindow : FluentWindow {\n\n        public IContentDialogService contentDialogService;\n        public EditorWindow() {\n\n            SystemThemeWatcher.Watch(this);\n            InitializeComponent();\n\n            nav.Loaded += (_, _) => {\n                nav.Navigate(typeof(Home));\n                ApplicationThemeManager.ApplySystemTheme(true);\n            };\n\n            this.DataContext = App.editorViewModel;\n\n            this.contentDialogService = new ContentDialogService();\n            contentDialogService.SetDialogHost(RootContentDialogPresenter);\n\n            App.localization.Enable(Resources.MergedDictionaries);\n\n\n            if (!App.monacoExtracted) {\n                Stream stream = new MemoryStream(Properties.Resources.monaco);\n                if (Directory.Exists(App.monacoDir))\n                    Directory.Delete(App.monacoDir, true);\n                ZipFile.ExtractToDirectory(stream, App.monacoDir);\n            }\n\n            \n        }\n\n        public void OpenConfig(Config config) {\n            App.editor.nav.Navigate(typeof(EmptyPageBadFix));\n\n            var page = new ViewInfo(config);\n            Task.Run(() => {\n                Thread.Sleep(50);\n                Dispatcher.Invoke(() => App.editor.nav.Navigate(typeof(EmptyPageBadFix2)));\n                Thread.Sleep(50);\n                Dispatcher.Invoke(() => App.editor.nav.ReplaceContent(page));\n            });\n        }\n        private void nav_Navigating(NavigationView sender, NavigatingCancelEventArgs args) {\n            // this is totally disgusting but wpf ui is cooked so whatever\n\n\n            if(args.Page is Browse b) {\n                b.OnSortChanged(); \n            }\n\n            var navigationViewContentPresenter = (NavigationViewContentPresenter) sender.GetType()\n                .GetProperty(\"NavigationViewContentPresenter\", BindingFlags.NonPublic | BindingFlags.Instance)\n                .GetValue(sender);\n\n            var current = (Page)navigationViewContentPresenter.Content;\n\n            current.FindVisualChildren<UnsafeImage>().ToList().ForEach(x => {\n                x.Dispose();\n            });\n\n            if (current is not null && current.GetType() != args.Page.GetType() && (current is Browse || App.editorViewModel.EditPage is InstructionEditPage) && args.Page is not EmptyPageBadFix) {\n                \n\n                \n                args.Cancel = true;\n                nav.Navigate(typeof(EmptyPageBadFix));\n                Type t = args.Page.GetType();\n                Task.Run(() => {\n                    Thread.Sleep(50);\n                    Dispatcher.Invoke(() => nav.Navigate(t));\n                });\n            }\n\n            if(current is EditInfo editInfo) {\n                editInfo.Save(null, null);\n                \n                return;\n            }\n\n\n            if (App.editorViewModel.EditPage is not null && App.editorViewModel.EditPage is InstructionEditPage) {\n                var page = App.editorViewModel.EditPage as InstructionEditPage;\n                page.Current.Stop();\n                if (App.Settings.SelectedConfig is not null) App.Settings.SelectedConfig.Start();\n            }\n            if (App.editorViewModel.EditPage is not null && App.editorViewModel.EditPage is WebEditPage) {\n                if (App.Settings.SelectedConfig is not null) App.Settings.SelectedConfig.Start();\n            }\n\n            if (App.editorViewModel.EditPage is not null && App.editorViewModel.EditPage.Modified) {\n\n                args.Cancel = true;\n                \n                if(App.editorViewModel.EditPage is WebEditPage) {\n                    var page = App.editorViewModel.EditPage as WebEditPage;\n                    page.webView.Visibility = Visibility.Hidden;\n                }\n\n                var task = contentDialogService.ShowSimpleDialogAsync(\n                    new SimpleContentDialogCreateOptions() {\n                        Title = App.localization.Get(\"msgbox_save_title\"),\n                        Content = App.localization.Get(\"msgbox_save\"),\n                        PrimaryButtonText = App.localization.Get(\"msgbox_save_b1\"),\n                        SecondaryButtonText = App.localization.Get(\"msgbox_save_b2\"),\n                        CloseButtonText = App.localization.Get(\"msgbox_button_cancel\"),\n                });\n\n                Task.Run(() => {\n                    var res = task.Result;\n                    var saving = false;\n\n                    switch (res) {\n                        case ContentDialogResult.Primary:\n                            if (App.editorViewModel.EditPage is WebEditPage) {\n                                var page = App.editorViewModel.EditPage as WebEditPage;\n\n                                // INSANE!\n                                Dispatcher.Invoke(() => {\n                                    saving = true;\n                                    page.Save();\n                                    Task.Run(() => {\n                                        Thread.Sleep(1500);\n                                        saving = false;\n                                        Dispatcher.Invoke(() => {\n                                            try {\n                                                page.webView.Dispose();\n                                            }\n                                            catch { }\n                                        });\n                                    });\n                                });\n                            }\n                            goto case ContentDialogResult.Secondary;\n                        case ContentDialogResult.Secondary:\n                            Dispatcher.Invoke(() => {\n                                // weird COM error sometimes?\n                                try {\n                                    if(!saving) (App.editorViewModel.EditPage as WebEditPage).webView.Dispose();\n                                }\n                                catch { }\n                            });\n                            App.editorViewModel.EditPage = null;\n                            Dispatcher.Invoke(() => sender.Navigate(args.Page.GetType()));\n                            Dispatcher.Invoke(() => { if (App.Settings.SelectedConfig is not null) App.Settings.SelectedConfig.Start(); });\n                            break;\n                        case ContentDialogResult.None:\n                            if (App.editorViewModel.EditPage is WebEditPage) {\n                                var page = App.editorViewModel.EditPage as WebEditPage;\n                                Dispatcher.Invoke(() => page.webView.Visibility = Visibility.Visible);\n                            }\n                            break;\n                    }\n                });\n                return;\n                \n            }\n            if (App.editorViewModel.EditPage is not null && App.editorViewModel.EditPage is WebEditPage) {\n                (App.editorViewModel.EditPage as WebEditPage).webView.Dispose();\n            }\n            if(App.editorViewModel.EditPage is not null) {\n                App.editorViewModel.EditPage = null;\n            }\n\n            ApplicationThemeManager.ApplySystemTheme(true);\n        }\n\n        private void FluentWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) {\n            App.editor = null;\n            nav.FindVisualChildren<UnsafeImage>().ToList().ForEach(x => {\n                x.Dispose();\n            });\n            //e.Cancel = true;\n            //Hide();\n        }\n        DebugWindow curDeb = null;\n        private void FluentWindow_KeyDown(object sender, KeyEventArgs e) {\n            if(e.Key == Key.F12) {\n                if(curDeb is not null) {\n                    curDeb.Close();\n                }\n                curDeb = new DebugWindow();\n                curDeb.Show();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/About.xaml",
    "content": "﻿<Page x:Class=\"RainbowTaskbar.Editor.Pages.About\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages\"\n      mc:Ignorable=\"d\" \n      d:DesignHeight=\"450\" d:DesignWidth=\"800\"\n      xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\"\n      Title=\"About\">\n    <Page.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Page.Resources>\n    <Grid Margin=\"16\">\n        <StackPanel>\n            <TextBlock HorizontalAlignment=\"Center\" FontSize=\"32\" FontWeight=\"SemiBold\" Text=\"{DynamicResource aboutrnb}\"></TextBlock>\n            <TextBlock HorizontalAlignment=\"Center\" Text=\"{DynamicResource description}\"></TextBlock>\n            <TextBlock HorizontalAlignment=\"Center\" Text=\"{DynamicResource donations}\"></TextBlock>\n        </StackPanel>\n        <Image VerticalAlignment=\"Center\" x:Name=\"paypal\" MouseLeftButtonDown=\"Image_MouseLeftButtonDown\"\n                                       Tag=\"https://paypal.me/ad2k17\" Height=\"80\" Width=\"200\" Stretch=\"Fill\"\n                                       Source=\"pack://application:,,,/Resources/Paypal.png\">\n            <Image.Style>\n                <Style TargetType=\"Image\">\n                    <Style.Triggers>\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                            <Setter Property=\"Cursor\" Value=\"Hand\"/>\n                        </Trigger>\n                    </Style.Triggers>\n                </Style>\n            </Image.Style>\n\n        </Image>\n            <TextBlock HorizontalAlignment=\"Center\" VerticalAlignment=\"Bottom\" TextAlignment=\"Center\">\n                <Hyperlink Click=\"Hyperlink_Click_2\">\n                    <TextBlock Text=\"{DynamicResource rnbweb}\"></TextBlock>\n                </Hyperlink>\n                <LineBreak></LineBreak>\n            <Hyperlink Click=\"Hyperlink_Click\">\n                GitHub\n            </Hyperlink>\n            <LineBreak></LineBreak>\n            <Hyperlink Click=\"Hyperlink_Click_1\" >\n                <TextBlock Text=\"{DynamicResource issueorreq}\"></TextBlock>\n            </Hyperlink>\n            <LineBreak></LineBreak>\n            <Run Text=\"{DynamicResource langcredits}\"></Run>\n        </TextBlock>\n        \n    </Grid>\n</Page>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/About.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages {\n    /// <summary>\n    /// Interaction logic for About.xaml\n    /// </summary>\n    public partial class About : Page {\n        public About() {\n            InitializeComponent();\n            ApplicationThemeManager.ApplySystemTheme(true);\n\n            App.localization.Enable(Resources.MergedDictionaries);\n\n\n        }\n\n        private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {\n            Process.Start(new ProcessStartInfo(\"https://paypal.me/ad2k17\") { UseShellExecute = true });\n        }\n\n        private void Hyperlink_Click(object sender, RoutedEventArgs e) {\n            Process.Start(new ProcessStartInfo(\"https://github.com/ad2017gd\") { UseShellExecute = true });\n        }\n\n        private void Hyperlink_Click_1(object sender, RoutedEventArgs e) {\n            Process.Start(new ProcessStartInfo(\"https://github.com/ad2017gd/RainbowTaskbar/issues/new/choose\") { UseShellExecute = true });\n        }\n\n        private void Hyperlink_Click_2(object sender, RoutedEventArgs e) {\n            Process.Start(new ProcessStartInfo(\"https://ad2017.dev/rnb\") { UseShellExecute = true });\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Browse.xaml",
    "content": "﻿<Page x:Class=\"RainbowTaskbar.Editor.Pages.Browse\" x:Name=\"browsePage\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages\"\n      xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" xmlns:controls=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls\"\n      mc:Ignorable=\"d\"  ScrollViewer.CanContentScroll=\"False\"\n      xmlns:s=\"clr-namespace:System;assembly=mscorlib\" xmlns:loc=\"clr-namespace:RainbowTaskbar.Languages\"\n      d:DesignHeight=\"450\" d:DesignWidth=\"800\"\n      Title=\"Browse\">\n    <Page.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n            <ObjectDataProvider x:Key=\"SortBy\" ObjectType=\"{x:Type s:Enum}\" MethodName=\"GetValues\">\n                <ObjectDataProvider.MethodParameters>\n                    <x:Type TypeName=\"local:SortBy\" />\n                </ObjectDataProvider.MethodParameters>\n            </ObjectDataProvider>\n            <loc:EnumTranslator x:Key=\"EnumTranslator\" />\n        </ResourceDictionary>\n        \n        \n    </Page.Resources>\n    <Grid Margin=\"16\">\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n            <RowDefinition Height=\"*\"></RowDefinition>\n        </Grid.RowDefinitions>\n        <Grid>\n            <Grid.ColumnDefinitions>\n                <ColumnDefinition Width=\"*\"></ColumnDefinition>\n                <ColumnDefinition Width=\"Auto\"></ColumnDefinition>\n            </Grid.ColumnDefinitions>\n            <ui:TextBox PlaceholderText=\"{DynamicResource search}\" TextChanged=\"TextBox_TextChanged\" x:Name=\"search\" Grid.Column=\"0\"></ui:TextBox>\n            <ComboBox Grid.Column=\"1\" ItemsSource=\"{Binding Source={StaticResource SortBy}}\" SelectedValue=\"{Binding Sort}\">\n                <ComboBox.ItemTemplate>\n                    <DataTemplate>\n                        <TextBlock Text=\"{Binding Path=., Converter={StaticResource EnumTranslator}}\"></TextBlock>\n                    </DataTemplate>\n                </ComboBox.ItemTemplate>\n            </ComboBox>\n        </Grid>\n        <ScrollViewer Grid.Row=\"1\" Margin=\"-4,0,0,0\" ScrollChanged=\"ScrollViewer_ScrollChanged\" x:Name=\"scrollViewer\">\n            <StackPanel>\n                <ItemsControl x:Name=\"itemscontrol\" ItemsSource=\"{Binding ResultList}\">\n                    <ItemsControl.ItemsPanel>\n                        <ItemsPanelTemplate>\n                            <WrapPanel />\n                        </ItemsPanelTemplate>\n                    </ItemsControl.ItemsPanel>\n\n                    <ItemsControl.ItemTemplate>\n                        <DataTemplate>\n                            <controls:ResultListItemControl Margin=\"4\" Config=\"{Binding}\" PageParent=\"{Binding ElementName=browsePage, Path=.}\"></controls:ResultListItemControl>\n                        </DataTemplate>\n                    </ItemsControl.ItemTemplate>\n                </ItemsControl>\n\n                <StackPanel>\n                    <StackPanel.Style>\n                        <Style TargetType=\"StackPanel\">\n                            <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SearchLoaded}\" Value=\"True\">\n                                    <DataTrigger.Setters>\n                                        <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                                    </DataTrigger.Setters>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </StackPanel.Style>\n                    <ui:ProgressRing IsIndeterminate=\"True\" Margin=\"0,16,0,16\"/>\n                </StackPanel>\n            </StackPanel>\n        </ScrollViewer>\n    </Grid>\n</Page>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Browse.xaml.cs",
    "content": "﻿using RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Editor.Pages.Controls;\nusing RainbowTaskbar.HTTPAPI;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\nusing Xceed.Wpf.AvalonDock.Controls;\n\nnamespace RainbowTaskbar.Editor.Pages\n{\n    public enum SortBy {\n        Likes,\n        Match\n    }\n    /// <summary>\n    /// Interaction logic for Browse.xaml\n    /// </summary>\n    public partial class Browse : Page, INotifyPropertyChanged\n    {\n        public ObservableCollection<Config> ResultList { get; set; } = new();\n        public SortBy Sort { get; set; } = SortBy.Likes;\n        public int Page { get; set; } = -1;\n        private bool end = false;\n        public bool SearchLoaded { get; set; } = true;\n        public Browse()\n        {\n            DataContext = this;\n            InitializeComponent();\n            ApplicationThemeManager.ApplySystemTheme(true);\n            App.localization.Enable(Resources.MergedDictionaries);\n\n\n\n\n        }\n\n        public void Clear() {\n            itemscontrol.FindVisualChildren<UnsafeImage>().ToList().ForEach(x => {\n                x.Dispose();\n            });\n            ResultList.Clear();\n        }\n\n        public void OnSortChanged() {\n\n            if (!SearchLoaded) return;\n            SearchLoaded = false;\n            scrollViewer.ScrollToHome();\n            Clear();\n            Page = -1;\n            end = false;\n            Task.Run(() => {\n                Thread.Sleep(300);\n                while (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight && !end) {\n                    Page++;\n                    Task t = null;\n                    Dispatcher.Invoke(() => t = Search());\n                    t.Wait();\n                    Thread.Sleep(300);\n\n                }\n            });\n        }\n\n        public Task Search() {\n            SearchLoaded = false;\n            var configsreq = App.Settings.workshopAPI.SearchConfigsAsync(search.Text.Trim(), Sort, Page);\n            return Task.Run(() => {\n                var cfgs = configsreq.Result;\n                if (cfgs is null) {\n                    end = true;\n                    SearchLoaded = true;\n                    return;\n                }\n                var parsed = cfgs.Parse();\n                if(parsed.Count() == 0) {\n                    end = true;\n                    SearchLoaded = true;\n                    return;\n                }\n                Dispatcher.Invoke(() => parsed.ToList().ForEach(x=>ResultList.Add(x)));\n                SearchLoaded = true;\n            });\n            \n        }\n        Timer searchTimer;\n        private void TextBox_TextChanged(object sender, TextChangedEventArgs e) {\n            if (!SearchLoaded) return;\n            if (searchTimer != null) searchTimer.Dispose();\n            searchTimer = new Timer((_) => {\n                Dispatcher.Invoke(() => {\n                    Clear();\n                    Page = 0;\n                    end = false;\n                    Search();\n                });\n            });\n            searchTimer.Change(250, Timeout.Infinite);\n        }\n\n        private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e) {\n            if (!SearchLoaded) return;\n            var scroll = (ScrollViewer)sender;\n            if (scroll.VerticalOffset == scroll.ScrollableHeight && e.ExtentHeightChange == 0 && !end) {\n                Page++;\n                Search();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Configs.xaml",
    "content": "﻿<Page x:Class=\"RainbowTaskbar.Editor.Pages.Configs\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n      xmlns:cfg=\"clr-namespace:RainbowTaskbar.Configuration\"\n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages\" xmlns:controls=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls\"\n      mc:Ignorable=\"d\"  \n      xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\"\n      d:DesignHeight=\"450\" d:DesignWidth=\"800\"\n      Title=\"Configs\">\n    <Page.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Page.Resources>\n    <Grid Margin=\"16\">\n        <StackPanel>\n            <StackPanel Orientation=\"Horizontal\">\n                <ui:DropDownButton Content=\"{DynamicResource new}\" Icon=\"{ui:SymbolIcon Add24}\">\n                    <ui:DropDownButton.Flyout>\n                        <ContextMenu >\n                            <MenuItem Tag=\"classic\"  Header=\"{DynamicResource enum_classic}\" Click=\"AddNewConfig\"/>\n                            <MenuItem Tag=\"web\" Header=\"{DynamicResource enum_web}\" Click=\"AddNewConfig\"/>\n                        </ContextMenu>\n                    </ui:DropDownButton.Flyout>\n                </ui:DropDownButton>\n            </StackPanel>\n            <ItemsControl x:Name=\"itemscontrol\" ItemsSource=\"{Binding ConfigList}\" Margin=\"-4,0,0,0\">\n                <ItemsControl.ItemsPanel>\n                    <ItemsPanelTemplate>\n                        <WrapPanel />\n                    </ItemsPanelTemplate>\n                </ItemsControl.ItemsPanel>\n                \n                <ItemsControl.ItemTemplate>\n                    <DataTemplate>\n                        <controls:ConfigListItemControl Margin=\"4\" Config=\"{Binding}\"></controls:ConfigListItemControl>\n                    </DataTemplate>\n                </ItemsControl.ItemTemplate>\n            </ItemsControl>\n        </StackPanel>\n    </Grid>\n</Page>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Configs.xaml.cs",
    "content": "﻿using PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Configuration.Web;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages\n{\n    /// <summary>\n    /// Interaction logic for Configs.xaml\n    /// </summary>\n    public partial class Configs : Page\n    {\n        public ObservableCollection<Config> ConfigList { get => App.Configs; }\n        public Configs()\n        {\n            DataContext = this;\n            InitializeComponent();\n\n            ApplicationThemeManager.ApplySystemTheme(true);\n\n            App.localization.Enable(Resources.MergedDictionaries);\n        }\n\n        private void AddNewConfig(object sender, RoutedEventArgs e) {\n            var menu = (MenuItem)sender;\n            Config cfg = null;\n            if(menu.Tag.ToString() == \"classic\") {\n                cfg = new InstructionConfig();\n            } else {\n                cfg = new WebConfig();\n            }\n            cfg.InitNew();\n            cfg.ToFile();\n            App.Configs.Insert(0, cfg);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/ConfigListItemControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.ConfigListItemControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\"\n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <LinearGradientBrush\n    x:Key=\"ImageOpacityMask\"\n    StartPoint=\"0,0\"\n    EndPoint=\"0,1\">\n            <GradientStop Color=\"#00FFFFFF\" Offset=\"0\"/>\n            <GradientStop Color=\"#00FFFFFF\" Offset=\"0.1\"/>\n            <GradientStop Color=\"#FFFFFFFF\" Offset=\"0.3\"/>\n            <GradientStop Color=\"#FFFFFFFF\" Offset=\"1\"/>\n        </LinearGradientBrush>\n    </UserControl.Resources>\n    <Grid DataContext=\"{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}\">\n        <Button Click=\"Select\" Width=\"256\" Height=\"256\"  HorizontalContentAlignment=\"Stretch\" VerticalContentAlignment=\"Stretch\">\n            <Grid HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\">\n                <Grid.ColumnDefinitions>\n                    <ColumnDefinition Width=\"*\"></ColumnDefinition>\n                    <ColumnDefinition Width=\"Auto\"></ColumnDefinition>\n                </Grid.ColumnDefinitions>\n                <Grid.RowDefinitions>\n                    <RowDefinition Height=\"*\"></RowDefinition>\n                    <RowDefinition Height=\"8\"></RowDefinition>\n                    <RowDefinition Height=\"48\"></RowDefinition>\n                    <RowDefinition Height=\"Auto\"></RowDefinition>\n                </Grid.RowDefinitions>\n                <Viewbox Grid.ColumnSpan=\"2\" OpacityMask=\"{StaticResource ImageOpacityMask}\" VerticalAlignment=\"Stretch\" HorizontalAlignment=\"Stretch\" Stretch=\"UniformToFill\">\n                    <local:UnsafeImage x:Name=\"image\" OpacityMask=\"White\"></local:UnsafeImage>\n                </Viewbox>\n                <Viewbox Grid.ColumnSpan=\"2\" Grid.Row=\"2\" StretchDirection=\"DownOnly\" Stretch=\"Uniform\">\n                    <TextBlock FontSize=\"32\"  HorizontalAlignment=\"Center\" Text=\"{Binding Config.Name}\"></TextBlock>\n                </Viewbox>\n                <TextBlock Grid.ColumnSpan=\"2\" x:Name=\"author\" FontSize=\"8\" Grid.Row=\"3\" HorizontalAlignment=\"Center\"></TextBlock>\n\n                <StackPanel VerticalAlignment=\"Top\" Grid.Column=\"1\" Orientation=\"Horizontal\">\n                    <ui:Button Icon=\"{ui:SymbolIcon Delete24}\" Click=\"Delete\" Margin=\"0,0,2,0\"></ui:Button>\n                    <ui:Button Icon=\"{ui:SymbolIcon Edit24}\" Click=\"Edit\"></ui:Button>\n                </StackPanel>\n                <TextBlock Text=\"{Binding ConfigType}\"></TextBlock>\n            </Grid>\n        </Button>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/ConfigListItemControl.xaml.cs",
    "content": "﻿using Kasay;\nusing PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Web;\nusing RainbowTaskbar.Editor.Pages.Edit;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Xceed.Wpf.AvalonDock.Controls;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls\n{\n    /// <summary>\n    /// Interaction logic for ConfigListItemControl.xaml\n    /// </summary>\n    public partial class ConfigListItemControl : UserControl, INotifyPropertyChanged\n    {\n        public static readonly DependencyProperty ConfigProperty =\n                   DependencyProperty.Register(\n                         \"Config\",\n                          typeof(Config),\n                          typeof(ConfigListItemControl));\n\n        public Config Config {\n            get {\n                return (Config) GetValue(ConfigProperty);\n            }\n            set {\n                SetValue(ConfigProperty, value);\n                \n            }\n        }\n        public string ConfigType { get => (Config is WebConfig) ? App.localization[\"enum_web\"] : App.localization[\"enum_classic\"]; }\n\n        public void OnConfigChanged() {\n            image.Source = Config.LoadImage();\n        }\n        public ConfigListItemControl()\n        {\n\n            InitializeComponent();\n            DependencyPropertyDescriptor\n                .FromProperty(ConfigProperty, typeof(ConfigListItemControl))\n                .AddValueChanged(this, (s, e) => OnConfigChanged());\n\n        }\n\n        private void Delete(object sender, RoutedEventArgs e) {\n            e.Handled = true;\n            var button = (UIElement) sender;\n            var control = button.FindVisualAncestor<ConfigListItemControl>();\n            App.Configs.Remove(control.Config);\n            control.Config.DeleteFile();\n        }\n        private void Edit(object sender, RoutedEventArgs e) {\n            e.Handled = true;\n            var page = new EditInfo(Config);\n            App.editor.nav.Navigate(typeof(EmptyPageBadFix));\n            Task.Run(() => {\n                Thread.Sleep(50);\n                Dispatcher.Invoke(() => App.editor.nav.ReplaceContent(page));\n            });\n            \n        }\n\n        private void Select(object sender, RoutedEventArgs e) {\n            if (App.Settings.SelectedConfig != Config) {\n                App.Settings.SelectedConfig = Config;\n            } else {\n                App.ReloadTaskbars();\n            }\n            App.Settings.ToFile();\n        }\n\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionContextMenu.xaml",
    "content": "﻿<ContextMenu x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionContextMenu\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls\"\n        mc:Ignorable=\"d\">\n    <ContextMenu.Style>\n        <Style TargetType=\"ContextMenu\" BasedOn=\"{StaticResource {x:Type ContextMenu}}\">\n        </Style>\n    </ContextMenu.Style>\n    <MenuItem x:Name=\"duplicate\" Click=\"Duplicate_Click\" Header=\"{DynamicResource duplicate}\"></MenuItem>\n    <MenuItem x:Name=\"delete\" Click=\"Delete_Click\" Header=\"{DynamicResource delete}\" />\n</ContextMenu>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionContextMenu.xaml.cs",
    "content": "﻿using RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Editor.Pages.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Shapes;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls\n{\n    /// <summary>\n    /// Interaction logic for InstructionContextMenu.xaml\n    /// </summary>\n    public partial class InstructionContextMenu : ContextMenu\n    {\n        public static readonly DependencyProperty ListBoxProperty =\n                   DependencyProperty.Register(\n                         \"ParentListBox\",\n                          typeof(ListBox),\n                          typeof(InstructionContextMenu));\n\n        public ListBox ParentListBox {\n            get {\n                return (ListBox) GetValue(ListBoxProperty);\n            }\n            set {\n                SetValue(ListBoxProperty, value);\n            }\n        }\n        public InstructionContextMenu()\n        {\n            InitializeComponent();\n            App.localization.Enable(Resources.MergedDictionaries);\n        }\n\n        private void Duplicate_Click(object sender, RoutedEventArgs e) {\n            var list = (ParentListBox.ItemsSource as BindingList<Instruction>);\n            list.Insert(ParentListBox.SelectedIndex+1, JsonSerializer.Deserialize<Instruction>(JsonSerializer.Serialize(ParentListBox.SelectedItem as Instruction)));\n        }\n\n        private void Delete_Click(object sender, RoutedEventArgs e) {\n            (ParentListBox.ItemsSource as BindingList<Instruction>).Remove(ParentListBox.SelectedItem as Instruction);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/BorderRadiusInstructionControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.BorderRadiusInstructionControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls\" xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" xmlns:converters=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls.Converters\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <converters:DivideHalf x:Key=\"DivideHalf\"></converters:DivideHalf>\n    </UserControl.Resources>\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"*\" />\n            <RowDefinition Height=\"Auto\" />\n        </Grid.RowDefinitions>\n        <StackPanel>\n            <StackPanel Orientation=\"Horizontal\">\n                <Slider Minimum=\"0\" Maximum=\"80\" Value=\"{Binding SelectedInstruction.Radius}\" HorizontalAlignment=\"Left\"\n            VerticalAlignment=\"Center\" Width=\"240\" />\n                <ui:NumberBox ClearButtonEnabled=\"False\" Value=\"{Binding SelectedInstruction.Radius}\" Margin=\"5,0,0,0\" HorizontalAlignment=\"Left\" TextWrapping=\"NoWrap\" Minimum=\"0\" Maximum=\"80\">\n                </ui:NumberBox>\n            </StackPanel>\n        </StackPanel>\n        <StackPanel Orientation=\"Horizontal\" Grid.Row=\"1\">\n            <Canvas Margin=\"0,0,0,5\" x:Name=\"Preview\" Width=\"450\" Height=\"40\">\n                <Rectangle RadiusX=\"{Binding SelectedInstruction.Radius, Converter={StaticResource DivideHalf}}\"\n                           RadiusY=\"{Binding SelectedInstruction.Radius, Converter={StaticResource DivideHalf}}\"\n                           Canvas.Left=\"0\" Canvas.Top=\"0\" Width=\"450\" Height=\"40\">\n                    <Rectangle.Fill>\n                        <SolidColorBrush Color=\"LightGray\" />\n                    </Rectangle.Fill>\n                </Rectangle>\n                <Label Margin=\"150,0,0,0\" Content=\"This is some text.\" />\n                <Label Margin=\"150,12,0,0\" Foreground=\"White\" Content=\"Radius preview!\" />\n                <Rectangle RadiusX=\"{Binding SelectedInstruction.Radius, Converter={StaticResource DivideHalf}}\"\n                           RadiusY=\"{Binding SelectedInstruction.Radius, Converter={StaticResource DivideHalf}}\"\n                           Name=\"PreviewRectangle\" Opacity=\"0.8\" Fill=\"MediumPurple\" Canvas.Left=\"0\" Canvas.Top=\"0\"\n                           Width=\"450\" Height=\"40\" />\n\n                <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"10\" Canvas.Left=\"8\" RadiusX=\"1\" RadiusY=\"1\" Fill=\"#2af\" />\n                <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"10\" Canvas.Left=\"19\" RadiusX=\"1\" RadiusY=\"1\" Fill=\"#2af\" />\n                <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"21\" Canvas.Left=\"8\" RadiusX=\"1\" RadiusY=\"1\" Fill=\"#2af\" />\n                <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"21\" Canvas.Left=\"19\" RadiusX=\"1\" RadiusY=\"1\" Fill=\"#2af\" />\n\n                <TextBlock Width=\"440\" Height=\"20\" TextAlignment=\"Right\" Margin=\"0,12,0,0\" Foreground=\"White\"\n                           Text=\"22:11\" />\n\n            </Canvas>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/BorderRadiusInstructionControl.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls {\n    /// <summary>\n    /// Interaction logic for BorderRadiusControl.xaml\n    /// </summary>\n    public partial class BorderRadiusInstructionControl : UserControl {\n        public BorderRadiusInstructionControl() {\n            InitializeComponent();\n            App.localization.Enable(Resources.MergedDictionaries);\n            ApplicationThemeManager.ApplySystemTheme(true);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ClearLayerInstructionControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.ClearLayerInstructionControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </UserControl.Resources>\n    <Grid>\n          <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"*\" />\n        </Grid.RowDefinitions>\n        <StackPanel Orientation=\"Horizontal\" Margin=\"0,5,0,0\">\n            <StackPanel Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource layer}\" Margin=\"0,0,10,0\" VerticalAlignment=\"Center\"/>\n                <TextBox Text=\"{Binding SelectedInstruction.Layer}\" MinWidth=\"75\"/>\n            </StackPanel>\n        </StackPanel>  \n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ClearLayerInstructionControl.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls {\n    /// <summary>\n    /// Interaction logic for ClearLayerInstructionControl.xaml\n    /// </summary>\n    public partial class ClearLayerInstructionControl : UserControl {\n        public ClearLayerInstructionControl() {\n            InitializeComponent();\n            App.localization.Enable(Resources.MergedDictionaries);\n            ApplicationThemeManager.ApplySystemTheme(true);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ColorInstructionControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.ColorInstructionControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls\" xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" xmlns:xctk=\"http://schemas.xceed.com/wpf/xaml/toolkit\"\n             mc:Ignorable=\"d\" \n             xmlns:instructions=\"clr-namespace:RainbowTaskbar.Configuration.Instruction.Instructions\"\nxmlns:s=\"clr-namespace:System;assembly=mscorlib\" xmlns:converters=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls.Converters\" xmlns:loc=\"clr-namespace:RainbowTaskbar.Languages\"\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n            <converters:ColorConverter x:Key=\"ColorConverter\" />\n            <loc:EnumTranslator x:Key=\"EnumTranslator\" />\n\n            <ObjectDataProvider x:Key=\"ColorInstructionEffect\" ObjectType=\"{x:Type s:Enum}\" MethodName=\"GetValues\">\n                <ObjectDataProvider.MethodParameters>\n                    <x:Type TypeName=\"instructions:ColorInstruction+ColorInstructionEffect\" />\n                </ObjectDataProvider.MethodParameters>\n            </ObjectDataProvider>\n\n            <ObjectDataProvider x:Key=\"ColorInstructionTransition\" ObjectType=\"{x:Type s:Enum}\" MethodName=\"GetValues\">\n                <ObjectDataProvider.MethodParameters>\n                    <x:Type TypeName=\"instructions:ColorInstruction+ColorInstructionTransition\" />\n                </ObjectDataProvider.MethodParameters>\n            </ObjectDataProvider>\n        </ResourceDictionary>\n        \n\n    </UserControl.Resources>\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"*\" />\n            <RowDefinition Height=\"Auto\" />\n        </Grid.RowDefinitions>\n        <StackPanel Orientation=\"Vertical\">\n            <StackPanel Orientation=\"Horizontal\">\n                <ComboBox x:Name=\"SelectedEffect\"\n                                        SelectedItem=\"{Binding SelectedInstruction.Effect}\"\n                                        \n                                        ItemsSource=\"{Binding Source={StaticResource ColorInstructionEffect}}\">\n\n                    <ComboBox.ItemTemplate>\n                        <DataTemplate>\n                            <Label Content=\"{Binding Path=., Converter={StaticResource EnumTranslator}}\" />\n                        </DataTemplate>\n                    </ComboBox.ItemTemplate>\n                </ComboBox>\n\n                <ComboBox Margin=\"5,0,0,0\" x:Name=\"SelectedTransition\"\n                                        SelectedItem=\"{Binding SelectedInstruction.Transition}\"\n                                        ItemsSource=\"{Binding Source={StaticResource ColorInstructionTransition}}\">\n\n                    <ComboBox.Style>\n                        <Style TargetType=\"{x:Type ComboBox}\" BasedOn=\"{StaticResource {x:Type ComboBox}}\">\n                            <Setter Property=\"ComboBox.Visibility\" Value=\"Collapsed\" />\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding ElementName=SelectedEffect, Path=SelectedItem}\"\n                                             Value=\"Fade\">\n                                    <Setter Property=\"ComboBox.Visibility\" Value=\"Visible\" />\n                                </DataTrigger>\n\n                                <DataTrigger Binding=\"{Binding ElementName=SelectedEffect, Path=SelectedItem}\"\n                                             Value=\"FadeGradient\">\n                                    <Setter Property=\"ComboBox.Visibility\" Value=\"Visible\" />\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </ComboBox.Style>\n                    <ComboBox.ItemTemplate>\n                        <DataTemplate>\n                            <Label Content=\"{Binding Path=., Converter={StaticResource EnumTranslator}}\" />\n                        </DataTemplate>\n                    </ComboBox.ItemTemplate>\n                </ComboBox>\n\n                <CheckBox Checked=\"Randomize_Checked\" Unchecked=\"Randomize_Checked\" x:Name=\"Randomize\"\n                          Margin=\"10,0,0,0\" VerticalAlignment=\"Center\" Content=\"{DynamicResource randomize}\"\n                          IsChecked=\"{Binding SelectedInstruction.Randomize}\" />\n            </StackPanel>\n\n            <StackPanel Orientation=\"Horizontal\" Margin=\"0,5,0,0\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource holdtime}\" Margin=\"0,0,10,0\" VerticalAlignment=\"Center\" />\n                <Slider IsSnapToTickEnabled=\"True\" TickFrequency=\"1\" Minimum=\"1\" Maximum=\"5000\"\n                        Value=\"{Binding SelectedInstruction.Time}\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\"\n                        Width=\"240\" />\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Time}\" x:Name=\"SelectedTime\" Margin=\"5,0,0,0\" HorizontalAlignment=\"Left\" \n                          VerticalAlignment=\"Top\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\">\n\n\n                </ui:NumberBox>\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource milliseconds}\" Margin=\"5,0,10,0\" VerticalAlignment=\"Center\" />\n            </StackPanel>\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <xctk:ColorPicker x:Name=\"ColorPicker1\" SelectedColorChanged=\"ColorPicker1_SelectedColorChanged\" \n                                  ShowTabHeaders=\"False\"\n                                  ColorMode=\"ColorCanvas\"\n                                  UsingAlphaChannel=\"True\" Margin=\"0,0,5,0\" Width=\"75\"\n                                  DropDownBackground=\"{DynamicResource ComboBoxDropDownBackground}\"\n                                  Background=\"{DynamicResource ComboBoxDropDownBackground}\"\n                                  SelectedColor=\"{Binding SelectedInstruction.Color1, Converter={StaticResource ColorConverter}}\" >\n                </xctk:ColorPicker>\n\n                <xctk:ColorPicker x:Name=\"ColorPicker2\" SelectedColorChanged=\"ColorPicker1_SelectedColorChanged\"\n                                  UsingAlphaChannel=\"True\" Width=\"75\"\n                                  ShowTabHeaders=\"False\"\n                                  DropDownBackground=\"{DynamicResource ComboBoxDropDownBackground}\"\n                                  Background=\"{DynamicResource ComboBoxDropDownBackground}\"\n                                  ColorMode=\"ColorCanvas\"\n                                  SelectedColor=\"{Binding SelectedInstruction.Color2, Converter={StaticResource ColorConverter}}\">\n\n                    <xctk:ColorPicker.Style>\n                        <Style>\n                            <Setter Property=\"xctk:ColorPicker.Visibility\" Value=\"Collapsed\" />\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding ElementName=SelectedEffect, Path=SelectedItem}\"\n                                             Value=\"Gradient\">\n                                    <Setter Property=\"xctk:ColorPicker.Visibility\" Value=\"Visible\" />\n                                </DataTrigger>\n\n                                <DataTrigger Binding=\"{Binding ElementName=SelectedEffect, Path=SelectedItem}\"\n                                             Value=\"FadeGradient\">\n                                    <Setter Property=\"xctk:ColorPicker.Visibility\" Value=\"Visible\" />\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </xctk:ColorPicker.Style>\n                </xctk:ColorPicker>\n\n                <StackPanel.Style>\n                    <Style>\n                        <Setter Property=\"StackPanel.Visibility\" Value=\"Visible\" />\n                        <Style.Triggers>\n                            <DataTrigger Binding=\"{Binding ElementName=Randomize, Path=IsChecked}\" Value=\"True\">\n                                <Setter Property=\"StackPanel.Visibility\" Value=\"Collapsed\" />\n                            </DataTrigger>\n                        </Style.Triggers>\n                    </Style>\n                </StackPanel.Style>\n            </StackPanel>\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <StackPanel.Style>\n                    <Style>\n                        <Setter Property=\"StackPanel.Visibility\" Value=\"Collapsed\" />\n                        <Style.Triggers>\n                            <DataTrigger Binding=\"{Binding ElementName=SelectedEffect, Path=SelectedItem}\"\n                                         Value=\"FadeGradient\">\n                                <Setter Property=\"StackPanel.Visibility\" Value=\"Visible\" />\n                            </DataTrigger>\n                            <DataTrigger Binding=\"{Binding ElementName=SelectedEffect, Path=SelectedItem}\" Value=\"Fade\">\n                                <Setter Property=\"StackPanel.Visibility\" Value=\"Visible\" />\n                            </DataTrigger>\n                        </Style.Triggers>\n                    </Style>\n                </StackPanel.Style>\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource fadetime}\" Margin=\"0,0,10,0\" VerticalAlignment=\"Center\"/>\n                <Slider IsSnapToTickEnabled=\"True\" TickFrequency=\"1\" Minimum=\"0\" Maximum=\"5000\"\n                        Value=\"{Binding SelectedInstruction.Time2}\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\"\n                        Width=\"240\" />\n                <ui:NumberBox ClearButtonEnabled=\"False\" Value=\"{Binding SelectedInstruction.Time2}\" x:Name=\"SelectedTime2\" Margin=\"5,0,0,0\" HorizontalAlignment=\"Left\" \n                          VerticalAlignment=\"Top\" SpinButtonPlacementMode=\"Hidden\">\n\n\n                </ui:NumberBox>\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource milliseconds}\" Margin=\"5,0,10,0\" VerticalAlignment=\"Center\"/>\n            </StackPanel>\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <StackPanel.Style>\n                    <Style>\n                        <Setter Property=\"StackPanel.Visibility\" Value=\"Collapsed\" />\n                        <Style.Triggers>\n                            <DataTrigger Binding=\"{Binding ElementName=SelectedEffect, Path=SelectedItem}\"\n                                         Value=\"Gradient\">\n                                <Setter Property=\"StackPanel.Visibility\" Value=\"Visible\" />\n                            </DataTrigger>\n\n                            <DataTrigger Binding=\"{Binding ElementName=SelectedEffect, Path=SelectedItem}\"\n                                         Value=\"FadeGradient\">\n                                <Setter Property=\"StackPanel.Visibility\" Value=\"Visible\" />\n                            </DataTrigger>\n                        </Style.Triggers>\n                    </Style>\n                </StackPanel.Style>\n\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource gradientangle}\" Margin=\"0,0,10,0\" VerticalAlignment=\"Center\" />\n                <ui:NumberBox ClearButtonEnabled=\"False\" SpinButtonPlacementMode=\"Hidden\" Name=\"AnglePicker\" Value=\"{Binding SelectedInstruction.Angle}\"  Minimum=\"0\" Maximum=\"360\" />\n            </StackPanel>\n\n        </StackPanel>\n        <StackPanel Grid.Row=\"2\" Orientation=\"Vertical\" Margin=\"0,5,0,0\" >\n            <StackPanel Margin=\"0,10\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource layer}\" Margin=\"0,0,10,0\" VerticalAlignment=\"Center\" />\n                <ui:NumberBox  Value=\"{Binding SelectedInstruction.Layer}\" ClearButtonEnabled=\"False\"\n                                   Minimum=\"0\" Maximum=\"15\" />\n\n\n            </StackPanel>\n            <StackPanel HorizontalAlignment=\"Center\">\n                <Canvas Margin=\"0,0,0,5\" x:Name=\"Preview\" Width=\"450\" Height=\"40\">\n                <Rectangle Canvas.Left=\"0\" Canvas.Top=\"0\" Width=\"450\" Height=\"40\">\n                    <Rectangle.Fill>\n                        <SolidColorBrush Color=\"LightGray\" />\n                    </Rectangle.Fill>\n                </Rectangle>\n                <Label Margin=\"150,0,0,0\" Content=\"This is some text.\" />\n                <Label Margin=\"150,12,0,0\" Foreground=\"White\" Content=\"Color preview!\" />\n                <Rectangle Name=\"PreviewRectangle\" Opacity=\"0.8\" Canvas.Left=\"0\" Canvas.Top=\"0\" Width=\"450\" Height=\"40\" />\n\n                <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"10\" Canvas.Left=\"8\" RadiusX=\"1\" RadiusY=\"1\" Fill=\"#2af\" />\n                <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"10\" Canvas.Left=\"19\" RadiusX=\"1\" RadiusY=\"1\" Fill=\"#2af\" />\n                <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"21\" Canvas.Left=\"8\" RadiusX=\"1\" RadiusY=\"1\" Fill=\"#2af\" />\n                <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"21\" Canvas.Left=\"19\" RadiusX=\"1\" RadiusY=\"1\" Fill=\"#2af\" />\n\n                <TextBlock Width=\"440\" Height=\"20\" TextAlignment=\"Right\" Margin=\"0,12,0,0\" Foreground=\"White\"\n                           Text=\"22:11\" />\n\n            </Canvas>\n            </StackPanel>\n\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ColorInstructionControl.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\nusing static RainbowTaskbar.Configuration.Instruction.Instructions.ColorInstruction;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls {\n    /// <summary>\n    /// Interaction logic for ColorInstructionControl.xaml\n    /// </summary>\n    public partial class ColorInstructionControl : UserControl {\n        public ColorInstructionControl() {\n            InitializeComponent();\n            App.localization.Enable(Resources.MergedDictionaries);\n            ApplicationThemeManager.ApplySystemTheme(true);\n            Task.Run(() => {\n                Thread.Sleep(100);\n                Dispatcher.Invoke(() => {\n                    ColorPicker1_SelectedColorChanged(null, null);\n                });\n            });\n        }\n\n        private void ColorPicker1_SelectedColorChanged(object sender, RoutedPropertyChangedEventArgs<Color?> e) {\n            if (SelectedEffect.SelectedItem is ColorInstructionEffect instructionEffect) {\n                if (instructionEffect == ColorInstructionEffect.Gradient ||\n                    instructionEffect == ColorInstructionEffect.FadeGradient)\n                    if (ColorPicker1.SelectedColor.HasValue && ColorPicker2.SelectedColor.HasValue)\n                        PreviewRectangle.Fill = new LinearGradientBrush(ColorPicker1.SelectedColor.Value,\n                            ColorPicker2.SelectedColor.Value, AnglePicker.Value ?? 0);\n                if (instructionEffect == ColorInstructionEffect.Fade || instructionEffect == ColorInstructionEffect.Solid)\n                    if (ColorPicker1.SelectedColor.HasValue)\n                        PreviewRectangle.Fill = new SolidColorBrush(ColorPicker1.SelectedColor.Value);\n            }\n        }\n\n        private void Randomize_Checked(object sender, RoutedEventArgs e) {\n            if ((bool) Randomize.IsChecked) {\n                var rnd = new Random();\n                var Color1 = Color.FromRgb((byte) rnd.Next(0, 255), (byte) rnd.Next(0, 255), (byte) rnd.Next(0, 255));\n                var Color2 = Color.FromRgb((byte) rnd.Next(0, 255), (byte) rnd.Next(0, 255), (byte) rnd.Next(0, 255));\n                if (SelectedEffect.SelectedItem is ColorInstructionEffect instructionEffect) {\n                    if (instructionEffect == ColorInstructionEffect.Gradient ||\n                        instructionEffect == ColorInstructionEffect.FadeGradient)\n                        PreviewRectangle.Fill = new LinearGradientBrush(Color1, Color2,  AnglePicker.Value ?? 0);\n                    if (instructionEffect == ColorInstructionEffect.Fade ||\n                        instructionEffect == ColorInstructionEffect.Solid)\n                        PreviewRectangle.Fill = new SolidColorBrush(Color1);\n                }\n            }\n            else {\n                ColorPicker1_SelectedColorChanged(null, null);\n            }\n        }\n\n        public void UpdateColors() {\n\n            ColorPicker1_SelectedColorChanged(null, null);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/ColorConverter.cs",
    "content": "﻿using RainbowTaskbar.Interpolation;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Data;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls.Converters {\n    public class ColorConverter : IValueConverter {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>\n            value is not null ? ((Color) value).ToMediaColor() : null;\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>\n            value is not null ? ((System.Windows.Media.Color) value).ToDrawingColor() : null;\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/DivideHalf.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Data;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls.Converters {\n    public class DivideHalf : IValueConverter {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {\n            double p;\n            if (double.TryParse(value.ToString(), out p)) return p / 2.0;\n            else return 0;\n        }\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {\n            double p;\n            if (double.TryParse(value.ToString(), out p)) return p * 2.0;\n            else return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/FileExists.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Controls;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls.Converters {\n    public class FileExists : ValidationRule {\n        public override ValidationResult Validate(object value, CultureInfo cultureInfo) => File.Exists(value?.ToString())\n            ? ValidationResult.ValidResult\n            : new ValidationResult(false, \"File must exist\");\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/FloatToPercentage.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Data;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls.Converters {\n    public class FloatToPercentage : IValueConverter {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {\n            double p;\n            if (double.TryParse(value.ToString(), out p)) return (int)(p * 100);\n            else return 0;\n        }\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {\n            double p;\n            if (double.TryParse(value.ToString(), out p)) return p / 100.0;\n            else return 0;\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/DelayInstructionControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.DelayInstructionControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls\" xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </UserControl.Resources>\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"/>\n            <RowDefinition Height=\"*\"/>\n        </Grid.RowDefinitions>\n        <StackPanel Orientation=\"Horizontal\">\n            <Slider Minimum=\"1\" Maximum=\"5000\" Value=\"{Binding SelectedInstruction.Time}\" HorizontalAlignment=\"Left\"\n                    VerticalAlignment=\"Top\" Width=\"240\" />\n            <ui:NumberBox Text=\"{Binding SelectedInstruction.Time}\" x:Name=\"SelectedTime\" Margin=\"5,0,0,0\" HorizontalAlignment=\"Left\"\n                     VerticalAlignment=\"Top\">\n            </ui:NumberBox>\n            <TextBlock FontSize=\"14\" Text=\"{DynamicResource milliseconds}\" Margin=\"5,0,10,0\" VerticalAlignment=\"Center\" />\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/DelayInstructionControl.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls {\n    /// <summary>\n    /// Interaction logic for DelayInstructionControl.xaml\n    /// </summary>\n    public partial class DelayInstructionControl : UserControl {\n        public DelayInstructionControl() {\n            InitializeComponent();\n            App.localization.Enable(Resources.MergedDictionaries);\n            ApplicationThemeManager.ApplySystemTheme(true);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ImageInstructionControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.ImageInstructionControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls\" xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" xmlns:converters=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls.Converters\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </UserControl.Resources>\n    <Grid>\n\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"*\" />\n            <RowDefinition Height=\"Auto\" />\n        </Grid.RowDefinitions>\n        <StackPanel Orientation=\"Vertical\">\n            <StackPanel Orientation=\"Horizontal\">\n                <Button Click=\"Button_Click\" Content=\"{DynamicResource chooseimg}\" />\n                <TextBox x:Name=\"ImagePathTextBox\" Margin=\"5,0,0,0\" Width=\"250\">\n                    <TextBox.Text>\n                        <Binding Path=\"SelectedInstruction.Path\">\n                            <Binding.ValidationRules>\n                                <converters:FileExists />\n                            </Binding.ValidationRules>\n                        </Binding>\n                    </TextBox.Text>\n                </TextBox>\n                <CheckBox Content=\"{DynamicResource drawonce}\" VerticalAlignment=\"Center\" Margin=\"5,0,0,0\" IsChecked=\"{Binding SelectedInstruction.DrawOnce}\"></CheckBox>\n            </StackPanel>\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"X\" Margin=\"0,0,5,0\" VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.X}\"/>\n\n                <TextBlock FontSize=\"14\" Text=\"Y\" Margin=\"15,0,5,0\" VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Y}\" />\n            </StackPanel>\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource width}\" Margin=\"0,0,5,0\" VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Width}\" Minimum=\"0\" />\n\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource height}\" Margin=\"15,0,5,0\" VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Height}\"  Minimum=\"0\" />\n            </StackPanel>\n\n        </StackPanel>\n        <StackPanel Grid.Row=\"1\" Orientation=\"Horizontal\" Margin=\"0,5,0,0\">\n\n            <TextBlock FontSize=\"14\" Text=\"{DynamicResource layer}\" Margin=\"0,0,10,0\" VerticalAlignment=\"Center\"/>\n            <ui:NumberBox Value=\"{Binding SelectedInstruction.Layer}\" MinWidth=\"75\" Minimum=\"0\" Maximum=\"15\"/>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ImageInstructionControl.xaml.cs",
    "content": "﻿using Microsoft.Win32;\nusing RainbowTaskbar.Configuration.Instruction.Instructions;\nusing RainbowTaskbar.Editor.Pages.Edit;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing.Imaging;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls {\n    /// <summary>\n    /// Interaction logic for ImageInstructionControl.xaml\n    /// </summary>\n    public partial class ImageInstructionControl : UserControl {\n        public ImageInstructionControl() {\n            InitializeComponent();\n            App.localization.Enable(Resources.MergedDictionaries);\n            ApplicationThemeManager.ApplySystemTheme(true);\n        }\n\n        private void Button_Click(object sender, RoutedEventArgs e) {\n            var openFileDialog = new OpenFileDialog {\n                Filter = GetImageFilter(),\n                CheckFileExists = true\n            };\n            if (openFileDialog.ShowDialog() == true) {\n                ImagePathTextBox.Text = openFileDialog.FileName;\n                ((DataContext as InstructionEditPage).SelectedInstruction as ImageInstruction).Path = openFileDialog.FileName;\n            }\n        }\n\n        public string GetImageFilter() {\n            var allImageExtensions = new StringBuilder();\n            var separator = \"\";\n            var codecs = ImageCodecInfo.GetImageEncoders();\n            var images = new Dictionary<string, string>();\n            foreach (var codec in codecs) {\n                allImageExtensions.Append(separator);\n                allImageExtensions.Append(codec.FilenameExtension);\n                separator = \";\";\n                images.Add($\"{codec.FormatDescription} Files: ({codec.FilenameExtension})\",\n                    codec.FilenameExtension);\n            }\n\n            var sb = new StringBuilder();\n            if (allImageExtensions.Length > 0) sb.Append($\"All Images|{allImageExtensions.ToString()}\");\n            images.Add(\"All Files\", \"*.*\");\n            foreach (var image in images) sb.Append($\"|{image.Key}|{image.Value}\");\n            return sb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ShapeInstructionControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.ShapeInstructionControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls\" xmlns:xctk=\"http://schemas.xceed.com/wpf/xaml/toolkit\" xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\"\n             mc:Ignorable=\"d\" \n                          xmlns:instructions=\"clr-namespace:RainbowTaskbar.Configuration.Instruction.Instructions\"\nxmlns:s=\"clr-namespace:System;assembly=mscorlib\" xmlns:converters=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls.Converters\" xmlns:loc=\"clr-namespace:RainbowTaskbar.Languages\"\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n            <converters:ColorConverter x:Key=\"ColorConverter\" />\n            <ObjectDataProvider x:Key=\"Shapes\" ObjectType=\"{x:Type s:Enum}\" MethodName=\"GetValues\">\n                <ObjectDataProvider.MethodParameters>\n                    <x:Type TypeName=\"instructions:ShapeInstruction+ShapeInstructionShapes\" />\n                </ObjectDataProvider.MethodParameters>\n            </ObjectDataProvider>\n            <loc:EnumTranslator x:Key=\"EnumTranslator\" />\n        </ResourceDictionary>\n    </UserControl.Resources>\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"*\" />\n            <RowDefinition Height=\"Auto\" />\n        </Grid.RowDefinitions>\n        <StackPanel Orientation=\"Horizontal\">\n\n            <ComboBox Grid.Row=\"0\" x:Name=\"SelectedType\"\n                                    SelectedItem=\"{Binding SelectedInstruction.Shape}\"\n                                    ItemsSource=\"{Binding Source={StaticResource Shapes}}\">\n                <ComboBox.ItemTemplate>\n                    <DataTemplate>\n                        <Label Content=\"{Binding Path=., Converter={StaticResource EnumTranslator}}\" />\n                    </DataTemplate>\n                </ComboBox.ItemTemplate>\n            </ComboBox>\n            <CheckBox Content=\"{DynamicResource drawonce}\" VerticalAlignment=\"Center\" Margin=\"5,0,0,0\" IsChecked=\"{Binding SelectedInstruction.DrawOnce}\"></CheckBox>\n        </StackPanel>\n        <StackPanel Orientation=\"Horizontal\">\n\n        </StackPanel>\n        <!-- Line StackPanel  -->\n        <StackPanel Margin=\"0,5,0,0\" Grid.Row=\"1\" Orientation=\"Vertical\">\n            <StackPanel.Style>\n                <Style>\n                    <Style.Setters>\n                        <Setter Property=\"StackPanel.Visibility\" Value=\"Collapsed\"/>\n                    </Style.Setters>\n                    <Style.Triggers>\n                        <DataTrigger Binding=\"{Binding SelectedInstruction.Shape}\" Value=\"Line\">\n                            <Setter Property=\"StackPanel.Visibility\" Value=\"Visible\"/>\n                        </DataTrigger>\n                    </Style.Triggers>\n                </Style>\n            </StackPanel.Style>\n\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource strokecolor}\" Margin=\"0,0,5,0\" VerticalAlignment=\"Center\" />\n                <xctk:ColorPicker \n                DropDownBackground=\"{DynamicResource ComboBoxDropDownBackground}\"\n                ShowTabHeaders=\"False\"\n                ColorMode=\"ColorCanvas\"\n                Background=\"{DynamicResource ComboBoxDropDownBackground}\"\n                \n                SelectedColor=\"{Binding SelectedInstruction.Line, Converter={StaticResource ColorConverter}}\" HorizontalAlignment=\"Left\" UsingAlphaChannel=\"True\" Margin=\"0,0,0,0\" Width=\"75\"></xctk:ColorPicker>\n            </StackPanel>\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource thickness}\" Margin=\"0,0,5,0\" VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.LineSize}\"  SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\"/>\n            </StackPanel>\n\n            <StackPanel Margin=\"0,10,0,10\"></StackPanel>\n\n            <StackPanel Margin=\"0,5,0,0\" Grid.Row=\"1\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"X\" Margin=\"0,0,5,0\"  VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.X}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\"/>\n\n                <TextBlock FontSize=\"14\" Text=\"Y\" Margin=\"15,0,5,0\"  VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Y}\"  SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\"/>\n            </StackPanel>\n\n            <StackPanel Margin=\"0,5,0,0\" Grid.Row=\"1\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"X2\" Margin=\"0,0,5,0\"  VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.X2}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\" />\n\n                <TextBlock FontSize=\"14\" Text=\"Y2\" Margin=\"15,0,5,0\"  VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Y2}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\" />\n            </StackPanel>\n        </StackPanel>\n        <!-- Rectangle StackPanel  -->\n        <StackPanel Margin=\"0,5,0,0\" Grid.Row=\"1\" Orientation=\"Vertical\">\n            <StackPanel.Style>\n                <Style>\n                    <Style.Setters>\n                        <Setter Property=\"StackPanel.Visibility\" Value=\"Collapsed\"/>\n                    </Style.Setters>\n                    <Style.Triggers>\n                        <DataTrigger Binding=\"{Binding SelectedInstruction.Shape}\" Value=\"Rectangle\">\n                            <Setter Property=\"StackPanel.Visibility\" Value=\"Visible\"/>\n                        </DataTrigger>\n                    </Style.Triggers>\n                </Style>\n            </StackPanel.Style>\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource fillcolor}\" Margin=\"0,0,5,0\" VerticalAlignment=\"Center\" />\n                <xctk:ColorPicker \n                DropDownBackground=\"{DynamicResource ComboBoxDropDownBackground}\"\n                ShowTabHeaders=\"False\"\n                ColorMode=\"ColorCanvas\"\n                Background=\"{DynamicResource ComboBoxDropDownBackground}\"\n                \n                SelectedColor=\"{Binding SelectedInstruction.Fill, Converter={StaticResource ColorConverter}}\" HorizontalAlignment=\"Left\" UsingAlphaChannel=\"True\" Margin=\"0,0,0,0\" Width=\"75\"></xctk:ColorPicker>\n            </StackPanel>\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource strokecolor}\" Margin=\"0,0,5,0\" VerticalAlignment=\"Center\" />\n                <xctk:ColorPicker \n                    \n                    DropDownBackground=\"{DynamicResource ComboBoxDropDownBackground}\"\n                ShowTabHeaders=\"False\"\n                ColorMode=\"ColorCanvas\"\n                Background=\"{DynamicResource ComboBoxDropDownBackground}\"\n                    \n                    SelectedColor=\"{Binding SelectedInstruction.Line, Converter={StaticResource ColorConverter}}\" HorizontalAlignment=\"Left\" UsingAlphaChannel=\"True\" Margin=\"0,0,0,0\" Width=\"75\"></xctk:ColorPicker>\n            </StackPanel>\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource thickness}\" Margin=\"0,0,5,0\" VerticalAlignment=\"Center\" />\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.LineSize}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\" />\n\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource radius}\" Margin=\"5,0,5,0\" VerticalAlignment=\"Center\" />\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Radius}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\" >\n                    <ui:NumberBox.Style>\n                        <Style TargetType=\"ui:NumberBox\" BasedOn=\"{StaticResource {x:Type ui:NumberBox}}\">\n                            <Style.Setters>\n                                <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                            </Style.Setters>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.FitTaskbars}\" Value=\"True\">\n                                    <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </ui:NumberBox.Style>\n                </ui:NumberBox>\n            </StackPanel>\n            <StackPanel Margin=\"0,10,0,10\"/>\n            <CheckBox Content=\"{DynamicResource fittaskbars}\" VerticalAlignment=\"Center\" Margin=\"5,0,0,0\" IsChecked=\"{Binding SelectedInstruction.FitTaskbars}\"></CheckBox>\n            <StackPanel Margin=\"0,5,0,0\" Grid.Row=\"1\" Orientation=\"Horizontal\">\n\n                <TextBlock FontSize=\"14\" Text=\"X\" Margin=\"0,0,5,0\"  VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.X}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\" >\n                    <ui:NumberBox.Style>\n                        <Style TargetType=\"ui:NumberBox\" BasedOn=\"{StaticResource {x:Type ui:NumberBox}}\">\n                            <Style.Setters>\n                                <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                            </Style.Setters>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.FitTaskbars}\" Value=\"True\">\n                                    <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </ui:NumberBox.Style>\n                </ui:NumberBox>\n\n                <TextBlock FontSize=\"14\" Text=\"Y\" Margin=\"15,0,5,0\"  VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Y}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\">\n                    <ui:NumberBox.Style>\n                        <Style TargetType=\"ui:NumberBox\"  BasedOn=\"{StaticResource {x:Type ui:NumberBox}}\">\n                            <Style.Setters>\n                                <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                            </Style.Setters>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.FitTaskbars}\" Value=\"True\">\n                                    <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </ui:NumberBox.Style>\n                </ui:NumberBox>\n            </StackPanel>\n\n            <StackPanel Margin=\"0,5,0,0\" Grid.Row=\"1\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"X2\" Margin=\"0,0,5,0\"  VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.X2}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\">\n                    <ui:NumberBox.Style>\n                        <Style TargetType=\"ui:NumberBox\" BasedOn=\"{StaticResource {x:Type ui:NumberBox}}\">\n                            <Style.Setters>\n                                <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                            </Style.Setters>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.FitTaskbars}\" Value=\"True\">\n                                    <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </ui:NumberBox.Style>\n                </ui:NumberBox>\n\n                <TextBlock FontSize=\"14\" Text=\"Y2\" Margin=\"15,0,5,0\" VerticalAlignment=\"Center\" />\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Y2}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\">\n                    <ui:NumberBox.Style>\n                        <Style TargetType=\"ui:NumberBox\" BasedOn=\"{StaticResource {x:Type ui:NumberBox}}\">\n                            <Style.Setters>\n                                <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                            </Style.Setters>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.FitTaskbars}\" Value=\"True\">\n                                    <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </ui:NumberBox.Style>\n                </ui:NumberBox>\n            </StackPanel>\n        </StackPanel>\n        <!-- Ellipse StackPanel  -->\n        <StackPanel Margin=\"0,5,0,0\" Grid.Row=\"1\" Orientation=\"Vertical\">\n            <StackPanel.Style>\n                <Style>\n                    <Style.Setters>\n                        <Setter Property=\"StackPanel.Visibility\" Value=\"Collapsed\"/>\n                    </Style.Setters>\n                    <Style.Triggers>\n                        <DataTrigger Binding=\"{Binding SelectedInstruction.Shape}\" Value=\"Ellipse\">\n                            <Setter Property=\"StackPanel.Visibility\" Value=\"Visible\"/>\n                        </DataTrigger>\n                    </Style.Triggers>\n                </Style>\n            </StackPanel.Style>\n\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource fillcolor}\" Margin=\"0,0,5,0\" VerticalAlignment=\"Center\" />\n                <xctk:ColorPicker \n                DropDownBackground=\"{DynamicResource ComboBoxDropDownBackground}\"\n                ShowTabHeaders=\"False\"\n                ColorMode=\"ColorCanvas\"\n                Background=\"{DynamicResource ComboBoxDropDownBackground}\"\n                \n                SelectedColor=\"{Binding SelectedInstruction.Fill, Converter={StaticResource ColorConverter}}\" HorizontalAlignment=\"Left\" UsingAlphaChannel=\"True\" Margin=\"0,0,0,0\" Width=\"75\"></xctk:ColorPicker>\n            </StackPanel>\n\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource strokecolor}\" Margin=\"0,0,5,0\" VerticalAlignment=\"Center\" />\n                <xctk:ColorPicker \n                    \n                    DropDownBackground=\"{DynamicResource ComboBoxDropDownBackground}\"\n                ShowTabHeaders=\"False\"\n                ColorMode=\"ColorCanvas\"\n                Background=\"{DynamicResource ComboBoxDropDownBackground}\"\n                    \n                    SelectedColor=\"{Binding SelectedInstruction.Line, Converter={StaticResource ColorConverter}}\" HorizontalAlignment=\"Left\" UsingAlphaChannel=\"True\" Margin=\"0,0,0,0\" Width=\"75\"></xctk:ColorPicker>\n            </StackPanel>\n\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource thickness}\" Margin=\"0,0,5,0\" VerticalAlignment=\"Center\" />\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.LineSize}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\"/>\n            </StackPanel>\n\n            <StackPanel Margin=\"0,10,0,10\"></StackPanel>\n            <CheckBox Content=\"{DynamicResource fittaskbars}\" VerticalAlignment=\"Center\" Margin=\"5,0,0,0\" IsChecked=\"{Binding SelectedInstruction.FitTaskbars}\"></CheckBox>\n            <StackPanel Margin=\"0,5,0,0\" Grid.Row=\"1\" Orientation=\"Horizontal\">\n\n                <TextBlock FontSize=\"14\" Text=\"X\" Margin=\"0,0,5,0\"  VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.X}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\">\n                    <ui:NumberBox.Style>\n                        <Style TargetType=\"ui:NumberBox\" BasedOn=\"{StaticResource {x:Type ui:NumberBox}}\">\n                            <Style.Setters>\n                                <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                            </Style.Setters>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.FitTaskbars}\" Value=\"True\">\n                                    <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </ui:NumberBox.Style>\n                </ui:NumberBox>\n\n                <TextBlock FontSize=\"14\" Text=\"Y\" Margin=\"15,0,5,0\"  VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Y}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\">\n                    <ui:NumberBox.Style>\n                        <Style TargetType=\"ui:NumberBox\" BasedOn=\"{StaticResource {x:Type ui:NumberBox}}\">\n                            <Style.Setters>\n                                <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                            </Style.Setters>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.FitTaskbars}\" Value=\"True\">\n                                    <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </ui:NumberBox.Style>\n                </ui:NumberBox>\n            </StackPanel>\n\n            <StackPanel Margin=\"0,5,0,0\" Grid.Row=\"1\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"X2\" Margin=\"0,0,5,0\"  VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.X2}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\">\n                    <ui:NumberBox.Style>\n                        <Style TargetType=\"ui:NumberBox\" BasedOn=\"{StaticResource {x:Type ui:NumberBox}}\">\n                            <Style.Setters>\n                                <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                            </Style.Setters>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.FitTaskbars}\" Value=\"True\">\n                                    <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </ui:NumberBox.Style>\n                </ui:NumberBox>\n\n                <TextBlock FontSize=\"14\" Text=\"Y2\" Margin=\"15,0,5,0\"  VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Y2}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\">\n                    <ui:NumberBox.Style>\n                        <Style TargetType=\"ui:NumberBox\" BasedOn=\"{StaticResource {x:Type ui:NumberBox}}\">\n                            <Style.Setters>\n                                <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                            </Style.Setters>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.FitTaskbars}\" Value=\"True\">\n                                    <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </ui:NumberBox.Style>\n                </ui:NumberBox>\n            </StackPanel>\n        </StackPanel>\n\n        <StackPanel Grid.Row=\"4\" Orientation=\"Horizontal\" Margin=\"0,5,0,0\">\n            <TextBlock FontSize=\"14\" Text=\"{DynamicResource layer}\" Margin=\"0,0,10,0\" VerticalAlignment=\"Center\"/>\n            <ui:NumberBox Value=\"{Binding SelectedInstruction.Layer}\" Minimum=\"0\" Maximum=\"15\" ClearButtonEnabled=\"False\"/>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ShapeInstructionControl.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls {\n    /// <summary>\n    /// Interaction logic for ShapeInstructionControl.xaml\n    /// </summary>\n    public partial class ShapeInstructionControl : UserControl {\n        public ShapeInstructionControl() {\n            InitializeComponent();\n            App.localization.Enable(Resources.MergedDictionaries);\n            ApplicationThemeManager.ApplySystemTheme(true);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/TextInstructionControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.TextInstructionControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"  xmlns:converters=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls.Converters\"\n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls\" xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" xmlns:xctk=\"http://schemas.xceed.com/wpf/xaml/toolkit\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n            <converters:ColorConverter x:Key=\"ColorConverter\"></converters:ColorConverter>\n        </ResourceDictionary>\n    </UserControl.Resources>\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"*\" />\n            <RowDefinition Height=\"Auto\" />\n        </Grid.RowDefinitions>\n        <StackPanel Orientation=\"Vertical\">\n            <StackPanel Orientation=\"Horizontal\">\n                <TextBox Width=\"400\" AcceptsReturn=\"True\"\n                                       Text=\"{Binding SelectedInstruction.Text}\" />\n                <CheckBox Content=\"{DynamicResource drawonce}\" VerticalAlignment=\"Center\" Margin=\"5,0,0,0\" IsChecked=\"{Binding SelectedInstruction.DrawOnce}\"></CheckBox>\n            </StackPanel>\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <TextBlock FontSize=\"14\" Text=\"X\" Margin=\"0,0,5,0\" VerticalAlignment=\"Center\">\n\n                </TextBlock>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.X}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\">\n                    <ui:NumberBox.Style>\n                        <Style TargetType=\"ui:NumberBox\" BasedOn=\"{StaticResource {x:Type ui:NumberBox}}\">\n                            <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.Center}\" Value=\"True\">\n                                    <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </ui:NumberBox.Style>\n                </ui:NumberBox>\n\n                <TextBlock FontSize=\"14\" Text=\"Y\" Margin=\"15,0,5,0\" VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Y}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\" />\n\n                <CheckBox Content=\"{DynamicResource centerx}\" VerticalAlignment=\"Center\" Margin=\"5,0,0,0\" IsChecked=\"{Binding SelectedInstruction.Center}\"></CheckBox>\n            </StackPanel>\n            <StackPanel Margin=\"0,5,0,0\" Orientation=\"Horizontal\">\n                <ComboBox x:Name=\"FontComboBox\" ItemsSource=\"{Binding InstalledFonts}\"\n                                        SelectedItem=\"{Binding SelectedInstruction.Font}\">\n                    <ComboBox.ItemTemplate>\n                        <DataTemplate>\n                            <TextBlock Text=\"{Binding}\" FontFamily=\"{Binding}\"></TextBlock>\n                        </DataTemplate>\n                    </ComboBox.ItemTemplate>\n                </ComboBox>\n\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource fontsize}\" Margin=\"15,0,5,0\" VerticalAlignment=\"Center\"/>\n                <ui:NumberBox Value=\"{Binding SelectedInstruction.Size}\" Minimum=\"1\"  SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\"/>\n                <TextBlock FontSize=\"14\" Text=\"{DynamicResource fontcolor}\" Margin=\"15,0,5,0\" VerticalAlignment=\"Center\"/>\n                <xctk:ColorPicker\n                    \n                    DropDownBackground=\"{DynamicResource ComboBoxDropDownBackground}\"\n                ShowTabHeaders=\"False\"\n                ColorMode=\"ColorCanvas\"\n                Background=\"{DynamicResource ComboBoxDropDownBackground}\"\n                    \n                    SelectedColor=\"{Binding SelectedInstruction.Color, Converter={StaticResource ColorConverter}}\" />\n\n            </StackPanel>\n\n\n        </StackPanel>\n\n        <StackPanel Grid.Row=\"2\" Orientation=\"Horizontal\" Margin=\"0,5,0,0\">\n            <TextBlock FontSize=\"14\" Text=\"{DynamicResource layer}\" VerticalAlignment=\"Center\" Margin=\"0,0,10,0\" />\n            <ui:NumberBox Value=\"{Binding SelectedInstruction.Layer}\" ClearButtonEnabled=\"False\"\n                               Minimum=\"0\" Maximum=\"15\"  />\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/TextInstructionControl.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls {\n    /// <summary>\n    /// Interaction logic for TextInstructionControl.xaml\n    /// </summary>\n    public partial class TextInstructionControl : UserControl {\n        public TextInstructionControl() {\n            InitializeComponent();\n            App.localization.Enable(Resources.MergedDictionaries);\n            ApplicationThemeManager.ApplySystemTheme(true);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/TransparencyInstructionControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.TransparencyInstructionControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls\"\n             xmlns:instructions=\"clr-namespace:RainbowTaskbar.Configuration.Instruction.Instructions\"\n             xmlns:s=\"clr-namespace:System;assembly=mscorlib\" xmlns:converters=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls.Converters\" xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" xmlns:loc=\"clr-namespace:RainbowTaskbar.Languages\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n            <converters:FloatToPercentage x:Key=\"FloatToPercentage\"></converters:FloatToPercentage>\n            <loc:EnumTranslator x:Key=\"EnumTranslator\" />\n            <ObjectDataProvider x:Key=\"TransparencyInstructionType\" ObjectType=\"{x:Type s:Enum}\" MethodName=\"GetValues\">\n                <ObjectDataProvider.MethodParameters>\n                    <x:Type TypeName=\"instructions:TransparencyInstruction+TransparencyInstructionType\" />\n                </ObjectDataProvider.MethodParameters>\n            </ObjectDataProvider>\n            <ObjectDataProvider x:Key=\"TransparencyInstructionStyle\" ObjectType=\"{x:Type s:Enum}\" MethodName=\"GetValues\">\n                <ObjectDataProvider.MethodParameters>\n                    <x:Type TypeName=\"instructions:TransparencyInstruction+TransparencyInstructionStyle\" />\n                </ObjectDataProvider.MethodParameters>\n            </ObjectDataProvider>\n        </ResourceDictionary>\n    </UserControl.Resources>\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"Auto\" />\n            <RowDefinition Height=\"*\" />\n            <RowDefinition Height=\"Auto\" />\n        </Grid.RowDefinitions>\n        <StackPanel Grid.Row=\"0\" Orientation=\"Horizontal\">\n            <StackPanel Orientation=\"Horizontal\">\n                <Label VerticalAlignment=\"Center\" Content=\"{DynamicResource change}\"></Label>\n                <ComboBox Margin=\"5,0,0,0\" x:Name=\"SelectedType\"\n                                    SelectedItem=\"{Binding SelectedInstruction.Type}\"\n                                    ItemsSource=\"{Binding Source={StaticResource TransparencyInstructionType}}\">\n                    <ComboBox.ItemTemplate>\n                        <DataTemplate>\n                            <Label Content=\"{Binding Path=., Converter={StaticResource EnumTranslator}}\" />\n                        </DataTemplate>\n                    </ComboBox.ItemTemplate>\n\n                </ComboBox>\n                <Label Margin=\"5,0,0,0\" VerticalAlignment=\"Center\" Content=\"{DynamicResource to}\">\n                    \n                    <Label.Style>\n                        <Style TargetType=\"{x:Type Label}\" BasedOn=\"{StaticResource {x:Type Label}}\">\n                            <Setter Property=\"ComboBox.Visibility\" Value=\"Hidden\" />\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding ElementName=SelectedType, Path=SelectedItem}\" Value=\"Style\">\n                                    <Setter Property=\"ComboBox.Visibility\" Value=\"Visible\" />\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </Label.Style>\n                </Label>\n            </StackPanel>\n            <ComboBox Margin=\"5,0,0,0\" SelectedItem=\"{Binding SelectedInstruction.Style}\"\n                                    ItemsSource=\"{Binding Source={StaticResource TransparencyInstructionStyle}}\">\n                <ComboBox.Style>\n                    <Style TargetType=\"{x:Type ComboBox}\" BasedOn=\"{StaticResource {x:Type ComboBox}}\">\n                        <Setter Property=\"ComboBox.Visibility\" Value=\"Hidden\" />\n                        <Style.Triggers>\n                            <DataTrigger Binding=\"{Binding ElementName=SelectedType, Path=SelectedItem}\" Value=\"Style\">\n                                <Setter Property=\"ComboBox.Visibility\" Value=\"Visible\" />\n                            </DataTrigger>\n                        </Style.Triggers>\n                    </Style>\n                </ComboBox.Style>\n                <ComboBox.ItemTemplate>\n                    <DataTemplate>\n                        <Label Content=\"{Binding Path=., Converter={StaticResource EnumTranslator}}\" />\n                    </DataTemplate>\n                </ComboBox.ItemTemplate>\n            </ComboBox>\n        </StackPanel>\n        <StackPanel Grid.Row=\"1\" Orientation=\"Horizontal\" Margin=\"0,5,0,0\">\n            <StackPanel.Style>\n                <Style>\n                    <Setter Property=\"StackPanel.Visibility\" Value=\"Visible\" />\n                    <Style.Triggers>\n                        <DataTrigger Binding=\"{Binding ElementName=SelectedType, Path=SelectedItem}\" Value=\"Style\">\n                            <Setter Property=\"StackPanel.Visibility\" Value=\"Hidden\" />\n                        </DataTrigger>\n                    </Style.Triggers>\n                </Style>\n            </StackPanel.Style>\n\n\n            <Slider IsSnapToTickEnabled=\"True\" TickFrequency=\"1\" Minimum=\"0\" Maximum=\"100\"\n                    Value=\"{Binding SelectedInstruction.Opacity, Converter={StaticResource FloatToPercentage}}\"\n                    HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Width=\"240\" />\n            <ui:NumberBox x:Name=\"SelectedTime\" Margin=\"5,0,0,0\" Minimum=\"0\" SpinButtonPlacementMode=\"Hidden\" Maximum=\"100\" HorizontalAlignment=\"Left\" TextWrapping=\"NoWrap\"\n                      VerticalAlignment=\"Top\">\n                <ui:NumberBox.Text>\n                    <Binding Path=\"SelectedInstruction.Opacity\"\n                             Converter=\"{StaticResource FloatToPercentage}\"\n                             Mode=\"TwoWay\"\n                             UpdateSourceTrigger=\"PropertyChanged\">\n                    </Binding>\n                </ui:NumberBox.Text>\n            </ui:NumberBox>\n            <TextBlock FontSize=\"14\" Text=\"%\" Margin=\"0,0,10,0\" VerticalAlignment=\"Center\" />\n        </StackPanel>\n        <StackPanel Grid.Row=\"2\" Orientation=\"Horizontal\" Margin=\"0,5,0,0\">\n            <StackPanel.Style>\n                <Style>\n                    <Setter Property=\"StackPanel.Visibility\" Value=\"Collapsed\" />\n                    <Style.Triggers>\n                        <DataTrigger Binding=\"{Binding ElementName=SelectedType, Path=SelectedItem}\" Value=\"Layer\">\n                            <Setter Property=\"StackPanel.Visibility\" Value=\"Visible\" />\n                        </DataTrigger>\n                    </Style.Triggers>\n                </Style>\n            </StackPanel.Style>\n\n            <TextBlock FontSize=\"14\" Text=\"{DynamicResource layer}\" Margin=\"0,0,10,0\" />\n            <ui:NumberBox Value=\"{Binding SelectedInstruction.Layer}\" Minimum=\"0\" Maximum=\"15\" />\n        </StackPanel>\n        <StackPanel Grid.Row=\"4\" Orientation=\"Horizontal\" HorizontalAlignment=\"Center\">\n            <Canvas Margin=\"0,0,0,5\" x:Name=\"Preview\" Width=\"450\" Height=\"40\">\n\n                <Grid>\n                    <Grid.Style>\n                        <Style>\n\n                            <Style.Triggers>\n\n                                <MultiDataTrigger>\n                                    <MultiDataTrigger.Conditions>\n                                        <Condition Binding=\"{Binding SelectedInstruction.Type}\" Value=\"Style\" />\n                                        <Condition Binding=\"{Binding SelectedInstruction.Style}\" Value=\"Blur\" />\n\n                                    </MultiDataTrigger.Conditions>\n\n                                    <Setter Property=\"Grid.Effect\">\n                                        <Setter.Value>\n                                            <BlurEffect Radius=\"15\" />\n                                        </Setter.Value>\n                                    </Setter>\n                                </MultiDataTrigger>\n\n\n                            </Style.Triggers>\n                        </Style>\n                    </Grid.Style>\n\n\n                    <Rectangle Canvas.Left=\"0\" Canvas.Top=\"0\" Width=\"450\" Height=\"40\">\n                        <Rectangle.Fill>\n                            <SolidColorBrush Color=\"LightGray\" />\n                        </Rectangle.Fill>\n                    </Rectangle>\n                    <Label Margin=\"150,0,0,0\" Content=\"This is some text.\" />\n                    <Label Margin=\"150,12,0,0\" Foreground=\"White\" Content=\"Transparency preview!\" />\n                </Grid>\n\n                <Rectangle Name=\"PreviewRectangle\" Canvas.Left=\"0\" Canvas.Top=\"0\" Width=\"450\" Height=\"40\">\n                    <Rectangle.Style>\n                        <Style>\n                            <Setter Property=\"Rectangle.Fill\" Value=\"MediumPurple\" />\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.Type}\" Value=\"RainbowTaskbar\">\n                                    <Setter Property=\"Rectangle.Opacity\" Value=\"{Binding SelectedInstruction.Opacity}\" />\n                                </DataTrigger>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.Type}\" Value=\"All\">\n                                    <Setter Property=\"Rectangle.Opacity\" Value=\"{Binding SelectedInstruction.Opacity}\" />\n                                </DataTrigger>\n\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.Type}\" Value=\"Style\">\n                                    <Setter Property=\"Rectangle.Opacity\" Value=\"0.6\" />\n                                </DataTrigger>\n\n                                <MultiDataTrigger>\n                                    <MultiDataTrigger.Conditions>\n                                        <Condition Binding=\"{Binding SelectedInstruction.Type}\" Value=\"Style\" />\n                                        <Condition Binding=\"{Binding SelectedInstruction.Style}\" Value=\"Default\" />\n\n                                    </MultiDataTrigger.Conditions>\n\n                                    <Setter Property=\"Rectangle.Opacity\" Value=\"0.96\" />\n                                    <Setter Property=\"Rectangle.Fill\">\n                                        <Setter.Value>\n                                            <SolidColorBrush Color=\"#7489E7\" />\n                                        </Setter.Value>\n                                    </Setter>\n                                    <Setter Property=\"Rectangle.Effect\">\n                                        <Setter.Value>\n                                            <BlurEffect Radius=\"2\" />\n                                        </Setter.Value>\n                                    </Setter>\n                                </MultiDataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </Rectangle.Style>\n                </Rectangle>\n\n                <Canvas>\n                    <Canvas.Style>\n                        <Style>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.Type}\" Value=\"Taskbar\">\n                                    <Setter Property=\"Rectangle.Opacity\" Value=\"{Binding SelectedInstruction.Opacity}\" />\n                                </DataTrigger>\n                                <DataTrigger Binding=\"{Binding SelectedInstruction.Type}\" Value=\"All\">\n                                    <Setter Property=\"Rectangle.Opacity\" Value=\"{Binding SelectedInstruction.Opacity}\" />\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </Canvas.Style>\n\n                    <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"10\" Canvas.Left=\"8\" RadiusX=\"1\" RadiusY=\"1\"\n                               Fill=\"#2af\" />\n                    <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"10\" Canvas.Left=\"19\" RadiusX=\"1\" RadiusY=\"1\"\n                               Fill=\"#2af\" />\n                    <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"21\" Canvas.Left=\"8\" RadiusX=\"1\" RadiusY=\"1\"\n                               Fill=\"#2af\" />\n                    <Rectangle Width=\"10\" Height=\"10\" Canvas.Top=\"21\" Canvas.Left=\"19\" RadiusX=\"1\" RadiusY=\"1\"\n                               Fill=\"#2af\" />\n\n                    <TextBlock Width=\"440\" Height=\"20\" TextAlignment=\"Right\" Margin=\"0,12,0,0\" Foreground=\"White\"\n                               Text=\"22:11\" />\n                </Canvas>\n\n            </Canvas>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/TransparencyInstructionControl.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.InstructionControls\n{\n    /// <summary>\n    /// Interaction logic for TransparencyInstructionControl.xaml\n    /// </summary>\n    public partial class TransparencyInstructionControl : UserControl\n    {\n        public TransparencyInstructionControl()\n        {\n            InitializeComponent();\n            App.localization.Enable(Resources.MergedDictionaries);\n            ApplicationThemeManager.ApplySystemTheme(true);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/IssueControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.IssueControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls\" xmlns:loc=\"clr-namespace:RainbowTaskbar.Languages\"\n             xmlns:w=\"clr-namespace:RainbowTaskbar.Configuration.Web\"\n             xmlns:s=\"clr-namespace:System;assembly=mscorlib\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <loc:EnumTranslator x:Key=\"EnumTranslator\" />\n        <ObjectDataProvider x:Key=\"WebConfigUserSettingDataType\" ObjectType=\"{x:Type s:Enum}\" MethodName=\"GetValues\">\n            <ObjectDataProvider.MethodParameters>\n                <x:Type TypeName=\"w:WebConfigUserSettingDataType\" />\n            </ObjectDataProvider.MethodParameters>\n        </ObjectDataProvider>\n    </UserControl.Resources>\n    <Grid MinWidth=\"480\">\n        <StackPanel>\n            <TextBlock VerticalAlignment=\"Center\" Text=\"{DynamicResource issueremind}\" Margin=\"0,0,5,5\" HorizontalAlignment=\"Left\"></TextBlock>\n            <StackPanel Orientation=\"Vertical\">\n                <TextBlock VerticalAlignment=\"Center\" Text=\"{DynamicResource issuetitle}\" Margin=\"0,0,5,0\" HorizontalAlignment=\"Left\"></TextBlock>\n                <TextBox Text=\"{Binding Title}\" Width=\"280\" HorizontalAlignment=\"Left\"></TextBox>\n            </StackPanel>\n            <StackPanel Orientation=\"Vertical\">\n                <TextBlock VerticalAlignment=\"Center\" Text=\"{DynamicResource issuedesc}\" Margin=\"0,0,5,0\" HorizontalAlignment=\"Left\"></TextBlock>\n                <TextBox TextWrapping=\"Wrap\" AcceptsReturn=\"True\" Text=\"{Binding Description}\" MinHeight=\"64\" Width=\"360\" HorizontalAlignment=\"Left\"></TextBox>\n            </StackPanel>\n            <StackPanel Orientation=\"Vertical\">\n                <TextBlock VerticalAlignment=\"Center\" Text=\"{DynamicResource issuecontact}\" Margin=\"0,0,5,0\" HorizontalAlignment=\"Left\"></TextBlock>\n                <TextBox Text=\"{Binding Contact}\" Width=\"280\" HorizontalAlignment=\"Left\"></TextBox>\n            </StackPanel>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/IssueControl.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls\n{\n    /// <summary>\n    /// Interaction logic for IssueControl.xaml\n    /// </summary>\n    public partial class IssueControl : UserControl\n    {\n        public string Title { get; set; } = \"\";\n        public string Description { get; set; } = \"\";\n        public string Contact { get; set; } = \"\";\n        public IssueControl()\n        {\n            DataContext = this;\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/LoginControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.LoginControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </UserControl.Resources>\n    <StackPanel>\n        <TextBlock Text=\"{DynamicResource msgbox_login}\"></TextBlock>\n        <TextBox x:Name=\"code\"></TextBox>\n    </StackPanel>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/LoginControl.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls {\n    /// <summary>\n    /// Interaction logic for LoginControl.xaml\n    /// </summary>\n    public partial class LoginControl : UserControl {\n        public LoginControl() {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/ResultListItemControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.ResultListItemControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\"\n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls\"\n             mc:Ignorable=\"d\"\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n            <LinearGradientBrush\nx:Key=\"ImageOpacityMask\"\nStartPoint=\"0,0\"\nEndPoint=\"0,1\">\n            <GradientStop Color=\"#00FFFFFF\" Offset=\"0\"/>\n            <GradientStop Color=\"#00FFFFFF\" Offset=\"0.1\"/>\n            <GradientStop Color=\"#FFFFFFFF\" Offset=\"0.3\"/>\n            <GradientStop Color=\"#FFFFFFFF\" Offset=\"1\"/>\n        </LinearGradientBrush>\n        </ResourceDictionary>\n    </UserControl.Resources>\n    <Grid DataContext=\"{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}\">\n        <Button Click=\"Select\" Width=\"340\" Height=\"340\"  HorizontalContentAlignment=\"Stretch\" VerticalContentAlignment=\"Stretch\">\n            <Grid HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\">\n                <Grid.ColumnDefinitions>\n                    <ColumnDefinition Width=\"*\"></ColumnDefinition>\n                    <ColumnDefinition Width=\"Auto\"></ColumnDefinition>\n                </Grid.ColumnDefinitions>\n                <Grid.RowDefinitions>\n                    <RowDefinition Height=\"*\"></RowDefinition>\n                    <RowDefinition Height=\"8\"></RowDefinition>\n                    <RowDefinition Height=\"48\"></RowDefinition>\n                    <RowDefinition Height=\"Auto\"></RowDefinition>\n                </Grid.RowDefinitions>\n                <Viewbox Grid.ColumnSpan=\"2\" OpacityMask=\"{StaticResource ImageOpacityMask}\" VerticalAlignment=\"Stretch\" HorizontalAlignment=\"Stretch\" Stretch=\"UniformToFill\">\n                    <local:UnsafeImage x:Name=\"image\" OpacityMask=\"White\"></local:UnsafeImage>\n                </Viewbox>\n                <Viewbox Grid.ColumnSpan=\"2\" Grid.Row=\"2\" StretchDirection=\"DownOnly\" Stretch=\"Uniform\">\n                    <TextBlock FontSize=\"32\"  HorizontalAlignment=\"Center\" Text=\"{Binding Config.Name}\"></TextBlock>\n                </Viewbox>\n                <TextBlock Grid.ColumnSpan=\"2\" x:Name=\"author\" FontSize=\"8\" Grid.Row=\"3\" HorizontalAlignment=\"Center\"></TextBlock>\n\n                <StackPanel VerticalAlignment=\"Top\" Grid.Column=\"1\" Orientation=\"Horizontal\">\n                    <ui:Button Icon=\"{ui:SymbolIcon ArrowDownload24}\" Click=\"Download\" Margin=\"0,0,2,0\">\n                        <ui:Button.Style>\n                            <Style TargetType=\"ui:Button\" BasedOn=\"{StaticResource {x:Type ui:Button} }\">\n                                <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                                <Style.Triggers>\n                                    <DataTrigger Binding=\"{Binding Downloaded}\" Value=\"True\">\n                                        <DataTrigger.Setters>\n                                            <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                                        </DataTrigger.Setters>\n                                    </DataTrigger>\n                                </Style.Triggers>\n                            </Style>\n                        </ui:Button.Style>\n                    </ui:Button>\n                    <ui:Button Icon=\"{ui:SymbolIcon Delete24}\" Click=\"Delete\" Margin=\"0,0,2,0\">\n                        <ui:Button.Style>\n                            <Style TargetType=\"ui:Button\" BasedOn=\"{StaticResource {x:Type ui:Button} }\">\n                                <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                                <Style.Triggers>\n                                    <DataTrigger Binding=\"{Binding CanDelete}\" Value=\"True\">\n                                        <DataTrigger.Setters>\n                                            <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                                        </DataTrigger.Setters>\n                                    </DataTrigger>\n                                </Style.Triggers>\n                            </Style>\n                        </ui:Button.Style>\n                    </ui:Button>\n                    <ui:Button Icon=\"{ui:SymbolIcon Checkmark24}\" Click=\"Verify\" Margin=\"0,0,2,0\">\n                        <ui:Button.Style>\n                            <Style TargetType=\"ui:Button\" BasedOn=\"{StaticResource {x:Type ui:Button} }\">\n                                <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                                <Style.Triggers>\n                                    <DataTrigger Binding=\"{Binding Unverified}\" Value=\"True\">\n                                        <DataTrigger.Setters>\n                                            <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                                        </DataTrigger.Setters>\n                                    </DataTrigger>\n                                </Style.Triggers>\n                            </Style>\n                        </ui:Button.Style>\n                    </ui:Button>\n                </StackPanel>\n                <TextBlock Text=\"{Binding ConfigType}\"></TextBlock>\n            </Grid>\n        </Button>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/ResultListItemControl.xaml.cs",
    "content": "﻿using Kasay;\nusing PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Web;\nusing RainbowTaskbar.Editor.Pages.Edit;\nusing RainbowTaskbar.HTTPAPI;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Interop;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Xceed.Wpf.AvalonDock.Controls;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls\n{\n    /// <summary>\n    /// Interaction logic for ResultListItemControl.xaml\n    /// </summary>\n    public partial class ResultListItemControl : UserControl, INotifyPropertyChanged\n    {\n        public static readonly DependencyProperty ConfigProperty =\n                   DependencyProperty.Register(\n                         \"Config\",\n                          typeof(Config),\n                          typeof(ResultListItemControl));\n\n        public Config Config {\n            get {\n                return (Config) GetValue(ConfigProperty);\n            }\n            set {\n                SetValue(ConfigProperty, value);\n            }\n        }\n        public static readonly DependencyProperty PageParentProperty =\n                   DependencyProperty.Register(\n                         \"PageParent\",\n                          typeof(Browse),\n                          typeof(ResultListItemControl));\n\n        public Browse PageParent {\n            get {\n                return (Browse) GetValue(PageParentProperty);\n            }\n            set {\n                SetValue(PageParentProperty, value);\n            }\n        }\n        public string ConfigType { get => (Config is WebConfig) ? App.localization[\"enum_web\"] : App.localization[\"enum_classic\"]; }\n\n        public bool Downloaded { get => App.Configs.Any(x=>x.PublishedID == Config.PublishedID || (x.PublishedID is null && x.PreviousPublishedID == Config.PublishedID)); }\n        public bool CanDelete { get => Config.CachedPublisherUsername == App.Settings.AccountUsername || App.Settings.AccountUsername == \"ad2017gd\"; }\n\n        public bool Unverified { get; set; } = false;\n\n\n        public async void OnConfigChanged() {\n            Config.CachedBase64Thumbnail = await App.Settings.workshopAPI.DownloadThumbnailBase64(Config);\n            if(Config.CachedBase64Thumbnail is null && App.Settings.AccountUsername == \"ad2017gd\") {\n                Config.CachedBase64Thumbnail = await App.Settings.workshopAPI.DownloadThumbnailBase64(Config, true);\n                if (Config.CachedBase64Thumbnail is not null) Unverified = true;\n            }\n            image.Source = Config.LoadImage();\n        }\n\n        public ResultListItemControl()\n        {\n            InitializeComponent();\n            DependencyPropertyDescriptor\n                .FromProperty(ConfigProperty, typeof(ConfigListItemControl))\n                .AddValueChanged(this, (s, e) => OnConfigChanged());\n\n        }\n\n\n        private void Select(object sender, RoutedEventArgs e) {\n            e.Handled = true;\n            App.editor.OpenConfig(Config);\n            \n        }\n\n        private void Download(object sender, RoutedEventArgs e) {\n            e.Handled = true;\n            var copy = Config.Copy();\n            if(copy.CachedPublisherUsername != App.Settings.AccountUsername) {\n                copy.PreviousPublishedID = copy.PublishedID;\n                copy.PublishedID = null;\n            }\n            copy.ToFile();\n            App.Configs.Insert(0, copy);\n            OnPropertyChanged(\"Downloaded\");\n        }\n\n        private void Delete(object sender, RoutedEventArgs e) {\n            e.Handled = true;\n            var res = App.Settings.workshopAPI.DeleteConfigAsync(Config);\n            Task.Run(() => {\n                var result = res.Result;\n                Dispatcher.InvokeAsync(() => {\n                    if (result.Result) {\n                        var existing = App.Configs.FirstOrDefault(x => x.PublishedID == Config.PublishedID, null);\n                        if(existing is not null) {\n\n                            existing.PublishedID = null;\n                            existing.Published = DateTime.MinValue;\n                            PageParent.ResultList.Remove(Config);\n                        }\n                    }\n                });\n            });\n        }\n\n        private void Verify(object sender, RoutedEventArgs e) {\n            e.Handled = true;\n\n            var res = App.Settings.workshopAPI.VerifyThumbnail(Config);\n            Task.Run(() => {\n                var result = res.Result;\n                Dispatcher.InvokeAsync(() => {\n                    if (result.Result) {\n                        Unverified = false;\n                    }\n                });\n            });\n        }\n\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/UnsafeImage.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls {\n    public class UnsafeImage : System.Windows.Controls.Image, IDisposable {\n        public void Dispose() {\n            Source = null;\n            UpdateLayout();\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/WebControls/AddPropertyDialogControl.xaml",
    "content": "﻿<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.WebControls.AddPropertyDialogControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls.WebControls\" xmlns:loc=\"clr-namespace:RainbowTaskbar.Languages\"\n             xmlns:w=\"clr-namespace:RainbowTaskbar.Configuration.Web\"\n             xmlns:s=\"clr-namespace:System;assembly=mscorlib\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\n    <UserControl.Resources>\n        <loc:EnumTranslator x:Key=\"EnumTranslator\" />\n        <ObjectDataProvider x:Key=\"WebConfigUserSettingDataType\" ObjectType=\"{x:Type s:Enum}\" MethodName=\"GetValues\">\n            <ObjectDataProvider.MethodParameters>\n                <x:Type TypeName=\"w:WebConfigUserSettingDataType\" />\n            </ObjectDataProvider.MethodParameters>\n        </ObjectDataProvider>\n    </UserControl.Resources>\n    <Grid>\n        <StackPanel>\n            <StackPanel Orientation=\"Horizontal\">\n                <TextBlock VerticalAlignment=\"Center\" Text=\"{DynamicResource propkey}\" Margin=\"0,0,5,0\"></TextBlock>\n                <TextBox Text=\"{Binding Setting.Key}\" Width=\"180\"></TextBox>\n            </StackPanel>\n            <StackPanel Orientation=\"Horizontal\">\n                <TextBlock VerticalAlignment=\"Center\" Text=\"{DynamicResource propname}\" Margin=\"0,0,5,0\"></TextBlock>\n                <TextBox Text=\"{Binding Setting.Name}\" Width=\"180\"></TextBox>\n            </StackPanel>\n            <StackPanel Orientation=\"Horizontal\">\n                <TextBlock VerticalAlignment=\"Center\" Text=\"{DynamicResource proptype}\" Margin=\"0,0,5,0\"></TextBlock>\n                <ComboBox ItemsSource=\"{Binding Source={StaticResource WebConfigUserSettingDataType}}\" SelectedItem=\"{Binding Setting.DataType}\">\n                    <ComboBox.ItemTemplate>\n                        <DataTemplate>\n                            <Label Content=\"{Binding Path=., Converter={StaticResource EnumTranslator}}\" />\n                        </DataTemplate>\n                    </ComboBox.ItemTemplate>\n                </ComboBox>\n            </StackPanel>\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/WebControls/AddPropertyDialogControl.xaml.cs",
    "content": "﻿using RainbowTaskbar.Configuration.Web;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace RainbowTaskbar.Editor.Pages.Controls.WebControls {\n    /// <summary>\n    /// Interaction logic for AddPropertyDialogControl.xaml\n    /// </summary>\n    public partial class AddPropertyDialogControl : UserControl {\n        public WebConfigUserSetting Setting { get; set; } = new();\n        public AddPropertyDialogControl() {\n            InitializeComponent();\n            DataContext = this;\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/EditInfo.xaml",
    "content": "﻿<Page x:Class=\"RainbowTaskbar.Editor.Pages.Edit.EditInfo\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Edit\" xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" xmlns:controls=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls\" xmlns:loc=\"clr-namespace:RainbowTaskbar.Languages\" xmlns:xktc=\"http://schemas.xceed.com/wpf/xaml/toolkit\"\n      mc:Ignorable=\"d\" \n      d:DesignHeight=\"450\" d:DesignWidth=\"800\"\n      Title=\"EditInfo\">\n    <Page.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n            <loc:EnumTranslator x:Key=\"EnumTranslator\" />\n        </ResourceDictionary>\n        \n    </Page.Resources>\n    <Grid Margin=\"16\">\n        <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"1.5*\"></ColumnDefinition>\n            <ColumnDefinition Width=\"*\"></ColumnDefinition>\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n            <RowDefinition Height=\"2*\"></RowDefinition>\n            <RowDefinition Height=\"*\"></RowDefinition>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n        </Grid.RowDefinitions>\n        <Grid Grid.Column=\"1\" Grid.RowSpan=\"4\" Margin=\"8,0,0,0\">\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"Auto\"></RowDefinition>\n                <RowDefinition Height=\"*\"></RowDefinition>\n                <RowDefinition Height=\"Auto\"></RowDefinition>\n                <RowDefinition Height=\"*\"></RowDefinition>\n                <RowDefinition Height=\"Auto\"></RowDefinition>\n            </Grid.RowDefinitions>\n            <TextBlock FontSize=\"24\" Text=\"{DynamicResource thumbnail}\"></TextBlock>\n            <controls:UnsafeImage Grid.Row=\"1\" x:Name=\"thumbPreview\" HorizontalAlignment=\"Stretch\"></controls:UnsafeImage>\n            <ui:Button Grid.Row=\"2\"  x:Name=\"picture\" Click=\"picture_Click\" Icon=\"{ui:SymbolIcon Image24}\" Content=\"{DynamicResource pickimg}\"></ui:Button>\n            <Grid Grid.Row=\"3\">\n                <Grid.RowDefinitions>\n                    <RowDefinition Height=\"*\"></RowDefinition>\n                    <RowDefinition Height=\"Auto\"></RowDefinition>\n                </Grid.RowDefinitions>\n                <ItemsControl ItemsSource=\"{Binding New.ConfigData.UserSettings}\">\n                    <ItemsControl.Template>\n                        <ControlTemplate TargetType=\"ItemsControl\">\n                            <StackPanel>\n                                <ItemsPresenter/>\n                            </StackPanel>\n                        </ControlTemplate>\n                    </ItemsControl.Template>\n                    <ItemsControl.ItemTemplate>\n                        <DataTemplate>\n                            <Grid>\n                                <Grid.ColumnDefinitions>\n                                    <ColumnDefinition Width=\"Auto\"></ColumnDefinition>\n                                    <ColumnDefinition Width=\"*\"></ColumnDefinition>\n                                    <ColumnDefinition Width=\"Auto\"></ColumnDefinition>\n                                </Grid.ColumnDefinitions>\n                                <StackPanel VerticalAlignment=\"Center\">\n                                    <TextBlock Text=\"{Binding Name}\" VerticalAlignment=\"Center\" Margin=\"0,0,8,0\"></TextBlock>\n                                    <TextBlock Text=\"{Binding Key}\" VerticalAlignment=\"Center\" Margin=\"0,0,8,0\" FontSize=\"8\"></TextBlock>\n                                </StackPanel>\n                                <StackPanel Grid.Column=\"1\" HorizontalAlignment=\"Right\">\n                                    <StackPanel.Style>\n                                        <Style TargetType=\"StackPanel\">\n                                            <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                                            <Style.Triggers>\n                                                <DataTrigger Binding=\"{Binding DataType}\" Value=\"String\">\n                                                    <DataTrigger.Setters>\n                                                        <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                                                    </DataTrigger.Setters>\n                                                </DataTrigger>\n                                            </Style.Triggers>\n                                        </Style>\n                                    </StackPanel.Style>\n                                    <TextBox Text=\"{Binding Value, UpdateSourceTrigger=PropertyChanged}\" HorizontalAlignment=\"Right\" MinWidth=\"100\"></TextBox>\n                                </StackPanel>\n                                <StackPanel Grid.Column=\"1\" HorizontalAlignment=\"Right\">\n                                    <StackPanel.Style>\n                                        <Style TargetType=\"StackPanel\">\n                                            <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                                            <Style.Triggers>\n                                                <DataTrigger Binding=\"{Binding DataType}\" Value=\"Number\">\n                                                    <DataTrigger.Setters>\n                                                        <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                                                    </DataTrigger.Setters>\n                                                </DataTrigger>\n                                            </Style.Triggers>\n                                        </Style>\n                                    </StackPanel.Style>\n                                    <ui:NumberBox Value=\"{Binding Value, UpdateSourceTrigger=PropertyChanged}\" SpinButtonPlacementMode=\"Hidden\" ClearButtonEnabled=\"False\" HorizontalAlignment=\"Right\" MinWidth=\"100\"></ui:NumberBox>\n                                </StackPanel>\n                                <StackPanel Grid.Column=\"1\" HorizontalAlignment=\"Right\">\n                                    <StackPanel.Style>\n                                        <Style TargetType=\"StackPanel\">\n                                            <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                                            <Style.Triggers>\n                                                <DataTrigger Binding=\"{Binding DataType}\" Value=\"Boolean\">\n                                                    <DataTrigger.Setters>\n                                                        <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                                                    </DataTrigger.Setters>\n                                                </DataTrigger>\n                                            </Style.Triggers>\n                                        </Style>\n                                    </StackPanel.Style>\n                                    <CheckBox IsChecked=\"{Binding Value, UpdateSourceTrigger=PropertyChanged}\" HorizontalAlignment=\"Right\"></CheckBox>\n                                </StackPanel>\n                                <StackPanel Grid.Column=\"1\" HorizontalAlignment=\"Right\">\n                                    <StackPanel.Style>\n                                        <Style TargetType=\"StackPanel\">\n                                            <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                                            <Style.Triggers>\n                                                <DataTrigger Binding=\"{Binding DataType}\" Value=\"Color\">\n                                                    <DataTrigger.Setters>\n                                                        <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                                                    </DataTrigger.Setters>\n                                                </DataTrigger>\n                                            </Style.Triggers>\n                                        </Style>\n                                    </StackPanel.Style>\n                                    <xktc:ColorPicker HorizontalAlignment=\"Right\"\n                                        ShowTabHeaders=\"False\"\n                                        ColorMode=\"ColorCanvas\"\n                                        UsingAlphaChannel=\"True\" Margin=\"0,0,5,0\" Width=\"75\"\n                                        DropDownBackground=\"{DynamicResource ComboBoxDropDownBackground}\"\n                                        Background=\"{DynamicResource ComboBoxDropDownBackground}\"\n                                        SelectedColor=\"{Binding Value}\" >\n                                    </xktc:ColorPicker>\n                                </StackPanel>\n                                <ui:Button Grid.Column=\"2\" Icon=\"{ui:SymbolIcon Delete24}\" Click=\"Delete\" Tag=\"{Binding}\"></ui:Button>\n                            </Grid>\n                        </DataTemplate>\n                    </ItemsControl.ItemTemplate>\n                </ItemsControl>\n                \n            </Grid>\n            <StackPanel Grid.Row=\"4\" Orientation=\"Horizontal\">\n                <StackPanel.Style>\n                    <Style TargetType=\"StackPanel\">\n                        <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                        <Style.Triggers>\n                            <DataTrigger Binding=\"{Binding New.ConfigType}\" Value=\"WebConfig\">\n                                <DataTrigger.Setters>\n                                    <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                                </DataTrigger.Setters>\n                            </DataTrigger>\n                        </Style.Triggers>\n                    </Style>\n                </StackPanel.Style>\n                <ui:Button Margin=\"0,0,4,0\" Icon=\"{ui:SymbolIcon Save24}\" Content=\"{DynamicResource save}\" Click=\"Save\"></ui:Button>\n                <ui:Button Content=\"{DynamicResource addprop}\" Icon=\"{ui:SymbolIcon Add24}\" Click=\"AddProperty\">\n                    \n                </ui:Button>\n            </StackPanel>\n            \n        </Grid>\n        <StackPanel Margin=\"0,0,0,16\">\n            <TextBlock FontSize=\"16\" VerticalAlignment=\"Center\" Margin=\"0,0,0,4\" Text=\"{DynamicResource name}\"></TextBlock>\n            <TextBox Text=\"{Binding New.Name}\"></TextBox>\n        </StackPanel>\n        <Grid Margin=\"0,0,0,16\" Grid.Row=\"1\">\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"Auto\"></RowDefinition>\n                <RowDefinition Height=\"*\"></RowDefinition>\n            </Grid.RowDefinitions>\n            <TextBlock FontSize=\"16\" VerticalAlignment=\"Center\" Margin=\"0,0,0,4\" Text=\"{DynamicResource descriptionlit}\"></TextBlock>\n            <ui:RichTextBox DataObject.Pasting=\"richDescription_Pasting\" AllowDrop=\"False\" IsDocumentEnabled=\"False\"  Grid.Row=\"1\" AcceptsReturn=\"True\" x:Name=\"richDescription\" Margin=\"0,0,0,16\" MouseWheel=\"richDescription_MouseWheel\">\n            </ui:RichTextBox>\n        </Grid>\n        <StackPanel Grid.Row=\"2\">\n            <ui:Button Icon=\"{ui:SymbolIcon Edit24}\" Click=\"Edit\" Content=\"{DynamicResource editconfig}\"></ui:Button>\n            <ui:Button Icon=\"{ui:SymbolIcon Stack24}\" Click=\"Preset\" Content=\"{DynamicResource copypreset}\"> \n                <ui:Button.Style>\n                    <Style TargetType=\"ui:Button\" BasedOn=\"{StaticResource {x:Type ui:Button}}\">\n                        <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                        <Style.Triggers>\n                            <DataTrigger Binding=\"{Binding IsClassic}\" Value=\"True\">\n                                <DataTrigger.Setters>\n                                    <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                                </DataTrigger.Setters>\n                            </DataTrigger>\n                        </Style.Triggers>\n                    </Style>\n                </ui:Button.Style>\n            </ui:Button>\n        </StackPanel>\n        \n        <StackPanel Grid.Row=\"3\" Orientation=\"Horizontal\">\n            <ui:Button Icon=\"{ui:SymbolIcon Save24}\" Click=\"Save\" Content=\"{DynamicResource save}\"></ui:Button>\n            <ui:Button Icon=\"{ui:SymbolIcon ArrowUpload24}\" Click=\"Publish\" Content=\"{DynamicResource saveandpublish}\"></ui:Button>\n            <TextBlock VerticalAlignment=\"Center\" Margin=\"5,0,0,0\" xml:space=\"preserve\" Text=\"{DynamicResource publishstatus}\"></TextBlock>\n            <TextBlock VerticalAlignment=\"Center\" Text=\"{Binding Config.PublishStatus, Converter={StaticResource EnumTranslator}}\"></TextBlock>\n        </StackPanel>\n    </Grid>\n</Page>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/EditInfo.xaml.cs",
    "content": "﻿using Microsoft.Win32;\nusing PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Configuration.Web;\nusing RainbowTaskbar.Editor.Pages.Controls.WebControls;\nusing RainbowTaskbar.Helpers;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection.Metadata;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Nodes;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing System.Xml.Linq;\nusing Wpf.Ui.Appearance;\nusing Wpf.Ui.Controls;\nusing Wpf.Ui.Extensions;\nusing static System.Runtime.InteropServices.JavaScript.JSType;\nusing Button = Wpf.Ui.Controls.Button;\n\nnamespace RainbowTaskbar.Editor.Pages.Edit {\n    /// <summary>\n    /// Interaction logic for EditInfo.xaml\n    /// </summary>\n    public partial class EditInfo : Page {\n        public Config Config { get; set; }\n        public Config New { get; set; }\n        public bool IsClassic { get => Config is InstructionConfig; }\n\n        public EditInfo(Config config) {\n            InitializeComponent();\n            this.DataContext = this;\n            ApplicationThemeManager.ApplySystemTheme(true);\n            App.localization.Enable(Resources.MergedDictionaries);\n\n            Config = config;\n            New = Config.Copy();\n\n            var content = new TextRange(richDescription.Document.ContentStart, richDescription.Document.ContentEnd);\n            if (content.CanLoad(DataFormats.Rtf)) {\n                try {\n                    using (var stream = new MemoryStream(Encoding.Default.GetBytes(Config.Description)))\n                        content.Load(stream, DataFormats.Rtf);\n                }\n                catch { }\n            }\n            thumbPreview.Source = Config.LoadImage();\n        }\n\n        public void Save(object sender, RoutedEventArgs e) {\n            string newDesc = \"\";\n            var textRange = new TextRange(richDescription.Document.ContentStart, richDescription.Document.ContentEnd);\n            using (var stream = new MemoryStream()) {\n                textRange.Save(stream, DataFormats.Rtf);\n                stream.Position = 0;\n                newDesc = Encoding.Default.GetString(stream.ToArray());\n            }\n\n            Config.Description = newDesc;\n            Config.Name = New.Name;\n            Config.Updated = DateTime.Now;\n            if(Config is WebConfig) {\n                (Config.ConfigData as WebConfigData).UserSettings = (New.ConfigData as WebConfigData).UserSettings;\n            }\n            Config.ToFile();\n\n            if (this.Config == Config.currentlyRunning) {\n                Config.Start();\n            }\n        }\n\n        private void Edit(object sender, RoutedEventArgs e) {\n            if(Config is WebConfig) {\n                App.editorViewModel.EditPage = new WebEditPage();\n                App.editorViewModel.EditPage.Config = Config;\n            } else if (Config is InstructionConfig) {\n                App.editorViewModel.EditPage = new InstructionEditPage(Config as InstructionConfig);\n            }\n            App.editor.nav.ReplaceContent(App.editorViewModel.EditPage);\n        }\n\n        private void Preset(object sender, RoutedEventArgs e) {\n            var b = (Wpf.Ui.Controls.Button) sender;\n            b.ContextMenu = new();\n            DefaultPresets.Presets.ForEach(x => {\n                var v = new Wpf.Ui.Controls.MenuItem() { Header = x.Name };\n                v.Click += (_,_) => {\n                    var cfg = Config as InstructionConfig;\n                    cfg.Data.RunOnceGroup = x.RunOnceGroup;\n                    cfg.Data.LoopGroups.Clear();\n                    foreach(var group in x.LoopGroups) {\n                        cfg.Data.LoopGroups.Add(group);\n                    }\n                    cfg.ToFile();\n                };\n                b.ContextMenu.Items.Add(v);\n                \n            });\n            b.ContextMenu.IsOpen = true;\n            \n        }\n\n        private void Publish(object sender, RoutedEventArgs e) {\n            Save(null, null);\n            if(!App.Settings.LoggedIn) {\n                App.editor.contentDialogService.ShowSimpleDialogAsync(new() {\n                    Content = App.localization.Get(\"msgbox_notloggedin\"),\n                    Title = App.localization.Get(\"msgbox_notloggedin_title\"),\n                    CloseButtonText = \"OK\"\n                });\n                return;\n            }\n            Task.Run(() => {\n                var res = App.Settings.workshopAPI.PublishConfigAsync(Config).Result;\n                if (res is null || !res.Result) {\n                    Dispatcher.Invoke(() => App.editor.contentDialogService.ShowSimpleDialogAsync(new() {\n                        Content = App.localization.Get(\"msgbox_fail\"),\n                        Title = App.localization.Get(\"msgbox_fail_title\"),\n                        CloseButtonText = \"OK\"\n                    }));\n                    return;\n                }\n                Dispatcher.Invoke(() => {\n\n                    if (thumbPreview.Source is not null)\n                        Task.Run(() => {\n                            var res2 = App.Settings.workshopAPI.SetConfigThumbnail(Config, thumbPreview).Result;\n                            if (res2 is null || !res2.Result) {\n                                Dispatcher.Invoke(() => App.editor.contentDialogService.ShowSimpleDialogAsync(new() {\n                                    Content = App.localization.Get(\"msgbox_thumbnail\"),\n                                    Title = App.localization.Get(\"msgbox_fail_title\"),\n                                    CloseButtonText = \"OK\"\n                                }));\n                            }\n                        });\n                    \n\n                    Config.PublishedID = res.Data.PublishedID;\n                    Config.CachedPublisherUsername = App.Settings.AccountUsername;\n                    Config.Published = DateTime.Now;\n                    Config.ToFile();\n                });\n            });\n        }\n\n        private void richDescription_MouseWheel(object sender, MouseWheelEventArgs e) {\n            var fontSizes = new List<double>() { 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 24, 30, 36, 42, 48, 60, 72 };\n            if (Keyboard.Modifiers == ModifierKeys.Control) {\n                var current = ((double) (richDescription.Selection.GetPropertyValue(FontSizeProperty) == DependencyProperty.UnsetValue ? 12.0 : richDescription.Selection.GetPropertyValue(FontSizeProperty)));\n                var nearest = fontSizes.MinBy(x => Math.Abs(x - current));\n                var nextIdx = Math.Min(Math.Max(0,fontSizes.IndexOf(nearest) + Math.Sign(e.Delta)), fontSizes.Count-1);\n\n                richDescription.Selection.ApplyPropertyValue(FontSizeProperty, fontSizes[nextIdx]);\n            }\n        }\n\n        \n\n        private void picture_Click(object sender, RoutedEventArgs e) {\n            OpenFileDialog openFileDialog =\n            new() {\n                InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),\n                Filter = \"Image files (*.bmp;*.jpg;*.jpeg;*.png;*.webp)|*.bmp;*.jpg;*.jpeg;*.png;*.webp|All files (*.*)|*.*\"\n            };\n            if (openFileDialog.ShowDialog() ?? false) {\n                if(openFileDialog.CheckFileExists) {\n                    Config.CachedBase64Thumbnail = Convert.ToBase64String(File.ReadAllBytes(openFileDialog.FileName));\n                    Config.Updated = DateTime.Now;\n                }\n            }\n            thumbPreview.Source = Config.LoadImage();\n        }\n\n        private void Delete(object sender, RoutedEventArgs e) {\n            var btn = sender as Button;\n\n            (New.ConfigData as WebConfigData).UserSettings.Remove(btn.Tag as WebConfigUserSetting);\n            \n        }\n\n        private void AddProperty(object sender, RoutedEventArgs e) {\n\n            var ctrl = new AddPropertyDialogControl();\n            Task.Run(() => {\n                Task<ContentDialogResult> result = null;\n                Dispatcher.Invoke(() => result = App.editor.contentDialogService.ShowSimpleDialogAsync(new() {\n                    Content = ctrl,\n                    Title = App.localization.Get(\"msgbox_property_title\"),\n                    CloseButtonText = \"OK\"\n                }));\n                result.Wait();\n                Dispatcher.Invoke(() => {\n                    (New.ConfigData as WebConfigData).UserSettings.Add(ctrl.Setting);\n                    ;\n                });\n            });\n        }\n\n        private void richDescription_Pasting(object sender, DataObjectPastingEventArgs e) {\n            // also checked server side dont worry!\n            if (e.FormatToApply == \"Bitmap\" || e.FormatToApply == DataFormats.FileDrop) {\n                e.CancelCommand();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/EditPage.cs",
    "content": "﻿using RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Editor.Pages.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\n\nnamespace RainbowTaskbar.Editor.Pages.Edit {\n    public class EditPage : Page {\n        public Config Config { get; set; }\n        public bool Modified { get; set; } = false;\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/InstructionEditPage.xaml",
    "content": "﻿<local:EditPage x:Class=\"RainbowTaskbar.Editor.Pages.Edit.InstructionEditPage\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n                 xmlns:dd=\"urn:gong-wpf-dragdrop\" \n        xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\"\n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Edit\" xmlns:controls=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls\"\n                mc:Ignorable=\"d\" \n                ScrollViewer.CanContentScroll=\"False\"\n      d:DesignHeight=\"450\" d:DesignWidth=\"800\"\n      Title=\"InstructionEditPage\">\n    <local:EditPage.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </local:EditPage.Resources>\n\n    <Grid Margin=\"16\" ScrollViewer.CanContentScroll=\"False\">\n        <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"*\"></ColumnDefinition>\n            <ColumnDefinition Width=\"2*\"></ColumnDefinition>\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"*\"></RowDefinition>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n        </Grid.RowDefinitions>\n        <ScrollViewer VerticalScrollBarVisibility=\"Auto\" HorizontalScrollBarVisibility=\"Disabled\">\n            <Grid ScrollViewer.CanContentScroll=\"True\" ScrollViewer.VerticalScrollBarVisibility=\"Visible\">\n                <Grid.RowDefinitions>\n                    <RowDefinition Height=\"*\"></RowDefinition>\n                    <RowDefinition Height=\"2*\"></RowDefinition>\n                    <RowDefinition Height=\"Auto\"></RowDefinition>\n                </Grid.RowDefinitions>\n                <StackPanel>\n                    <ui:CardExpander Header=\"{DynamicResource runoncegroup}\" IsExpanded=\"True\">\n                        <StackPanel>\n                            <ListBox ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\" dd:DragDrop.IsDragSource=\"True\"\ndd:DragDrop.IsDropTarget=\"True\" dd:DragDrop.DragHandler=\"{Binding}\"\nItemsSource=\"{Binding Current.Data.RunOnceGroup.Instructions}\"\nSelectionChanged=\"ListBox_SelectionChanged\">\n                                <ListBox.ContextMenu>\n                                    <controls:InstructionContextMenu ParentListBox=\"{Binding Path=PlacementTarget,RelativeSource={x:Static RelativeSource.Self}}\"></controls:InstructionContextMenu>\n                                </ListBox.ContextMenu>\n                                <ListBox.ItemTemplate>\n                                    <DataTemplate>\n                                        <TextBlock Text=\"{Binding Path=Description}\"></TextBlock>\n                                    </DataTemplate>\n                                </ListBox.ItemTemplate>\n                            </ListBox>\n                            <ui:Button DataContext=\"{Binding Current.Data.RunOnceGroup}\" Click=\"AddInstruction\" HorizontalAlignment=\"Right\" Icon=\"{ui:SymbolIcon Add24}\" Content=\"{DynamicResource new}\"></ui:Button>\n                        </StackPanel>\n                        \n                    </ui:CardExpander>\n                </StackPanel>\n\n                <StackPanel Grid.Row=\"1\">\n                    <ui:CardExpander IsExpanded=\"True\">\n                        <ui:CardExpander.Header>\n                            <DockPanel>\n                                <ui:Button Click=\"AddGroup\" Icon=\"{ui:SymbolIcon Add24}\" DockPanel.Dock=\"Left\" Margin=\"0,0,8,0\"></ui:Button>\n                                <TextBlock VerticalAlignment=\"Center\" Text=\"{DynamicResource loopinggroups}\"></TextBlock>\n                            </DockPanel>\n                        </ui:CardExpander.Header>\n                        <ItemsControl ItemsSource=\"{Binding Current.Data.LoopGroups}\">\n                            <ItemsControl.ItemTemplate>\n                                <DataTemplate>\n                                    <StackPanel Margin=\"0,0,0,8\">\n                                        <ui:CardExpander  IsExpanded=\"True\">\n                                            <ui:CardExpander.Header>\n                                                <DockPanel>\n                                                    <ui:Button Icon=\"{ui:SymbolIcon Delete24}\" Click=\"DeleteGroup\" DockPanel.Dock=\"Left\" Margin=\"0,0,8,0\"></ui:Button>\n                                                    <TextBlock VerticalAlignment=\"Center\" Text=\"{DynamicResource group}\"></TextBlock>\n                                                </DockPanel>\n                                                \n                                            </ui:CardExpander.Header>\n                                            <StackPanel>\n                                                <ListBox ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\" dd:DragDrop.IsDragSource=\"True\"\ndd:DragDrop.IsDropTarget=\"True\" dd:DragDrop.DragHandler=\"{Binding}\"\nItemsSource=\"{Binding Instructions}\"\nSelectionChanged=\"ListBox_SelectionChanged\">\n                                                    <ListBox.ContextMenu>\n                                                        <controls:InstructionContextMenu ParentListBox=\"{Binding Path=PlacementTarget,RelativeSource={x:Static RelativeSource.Self}}\"></controls:InstructionContextMenu>\n                                                    </ListBox.ContextMenu>\n                                                    <ListBox.ItemTemplate>\n                                                        <DataTemplate>\n                                                            <TextBlock Text=\"{Binding Path=Description}\"></TextBlock>\n                                                        </DataTemplate>\n                                                    </ListBox.ItemTemplate>\n                                                </ListBox>\n                                                <ui:Button DataContext=\"{Binding}\" HorizontalAlignment=\"Right\" Icon=\"{ui:SymbolIcon Add24}\" Click=\"AddInstruction\" Content=\"{DynamicResource add}\">\n\n                                                </ui:Button>\n                                            </StackPanel>\n                                            \n                                        </ui:CardExpander>\n                                    </StackPanel>\n                                </DataTemplate>\n                            </ItemsControl.ItemTemplate>\n                        </ItemsControl>\n                    </ui:CardExpander>\n                </StackPanel>\n               \n            </Grid>\n        </ScrollViewer>\n        <Grid Grid.Column=\"1\" Margin=\"16\">\n            <ScrollViewer>\n                <ContentPresenter Content=\"{Binding SelectedInstructionControl}\" />\n            </ScrollViewer>\n        </Grid>\n        <StackPanel Grid.Row=\"1\" Orientation=\"Horizontal\">\n            <ui:Button Click=\"RunConfig\" Icon=\"{ui:SymbolIcon Play24}\" Margin=\"0,0,4,0\" Content=\"{DynamicResource run}\"></ui:Button>\n            <ui:Button Click=\"SaveConfig\" Icon=\"{ui:SymbolIcon Save24}\" Content=\"{DynamicResource save}\"></ui:Button>\n        </StackPanel>\n    </Grid>\n</local:EditPage>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/InstructionEditPage.xaml.cs",
    "content": "﻿using PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Editor.Pages.Controls.InstructionControls;\nusing RainbowTaskbar.Languages;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing.Text;\nusing System.Linq;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\nusing Xceed.Wpf.AvalonDock.Controls;\n\nnamespace RainbowTaskbar.Editor.Pages.Edit {\n    /// <summary>\n    /// Interaction logic for InstructionEditPage.xaml\n    /// </summary>\n    public partial class InstructionEditPage : EditPage, INotifyPropertyChanged {\n\n        public InstructionConfig IConfig { get => Config as  InstructionConfig; set => Config = value; }\n\n        public InstructionConfig Current { get; set; }\n        public Instruction SelectedInstruction { get; set; }\n\n        public string[] InstalledFonts { get; set; } =\n            new InstalledFontCollection().Families.Select(font => font.Name).ToArray();\n\n        [DependsOn(\"SelectedInstruction\")]\n        public UserControl SelectedInstructionControl {\n            get {\n                if (SelectedInstruction is null) return null;\n                switch (SelectedInstruction.GetType().Name) {\n                    case \"DelayInstruction\": return new DelayInstructionControl();\n                    case \"TransparencyInstruction\": return new TransparencyInstructionControl();\n                    case \"ColorInstruction\": return new ColorInstructionControl();\n                    case \"BorderRadiusInstruction\": return new BorderRadiusInstructionControl();\n                    case \"ClearLayerInstruction\": return new ClearLayerInstructionControl();\n                    case \"ImageInstruction\": return new ImageInstructionControl();\n                    case \"TextInstruction\": return new TextInstructionControl();\n                    case \"ShapeInstruction\": return new ShapeInstructionControl();\n                }\n\n                return null;\n            }\n        }\n\n        public void OnSelectedInstructionChanged() {\n            ;\n        }\n        public InstructionEditPage(InstructionConfig config) {\n            InitializeComponent();\n            DataContext = this;\n            ApplicationThemeManager.ApplySystemTheme(true);\n            App.localization.Enable(Resources.MergedDictionaries);\n\n            Config = config;\n            Current = config.Copy() as InstructionConfig;\n        }\n\n        private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) {\n            if (e.AddedItems.Count == 0) return;\n            var others = this.FindVisualChildren<ListBox>().Where(x => x != (sender as ListBox)).ToList() ;\n            others.ForEach(x=>x.SelectedItem = null);\n\n            SelectedInstruction = (sender as ListBox).SelectedItem as Instruction;\n        }\n\n        private void AddGroup(object sender, RoutedEventArgs e) {\n            Current.Data.LoopGroups.Add(new());\n        }\n\n        private void AddInstruction(object sender, RoutedEventArgs e) {\n            var btn = sender as Wpf.Ui.Controls.Button;\n            btn.ContextMenu = new();\n            Instruction.DisplayableInstructionTypes.ToList().ForEach(x => {\n                var v = new Wpf.Ui.Controls.MenuItem() { Header = App.localization.Get(x.Name.ToLower()) };\n                v.Click += (_, _) => {\n                    (btn.DataContext as InstructionGroup).Instructions.Add(x.GetConstructor(Array.Empty<Type>()).Invoke(null) as Instruction);\n                };\n                btn.ContextMenu.Items.Add(v);\n            });\n            btn.ContextMenu.IsOpen = true;\n            ;\n        }\n\n        private void DeleteGroup(object sender, RoutedEventArgs e) {\n            var btn = sender as Wpf.Ui.Controls.Button;\n            Current.Data.LoopGroups.Remove(btn.DataContext as InstructionGroup);\n        }\n        \n        private void RunConfig(object sender, RoutedEventArgs e) {\n            if(App.Settings.SelectedConfig is not null) App.Settings.SelectedConfig.Stop();\n            App.ReloadTaskbars(false);\n            Taskbar.SoftReset(true, Current);\n        }\n\n        private void SaveConfig(object sender, RoutedEventArgs e) {\n            Current.Updated = DateTime.Now;\n            Current.ToFile();\n            var idx = App.Configs.IndexOf(Config);\n            App.Configs.RemoveAt(idx);\n            App.Configs.Insert(idx, Current);\n            Config = Current;\n            Current = Current.Copy() as InstructionConfig;\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/ViewComments.xaml",
    "content": "﻿<Page x:Class=\"RainbowTaskbar.Editor.Pages.Edit.ViewComments\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Edit\" xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" \n      mc:Ignorable=\"d\" \n      d:DesignHeight=\"450\" d:DesignWidth=\"800\"\n      Title=\"ViewComments\">\n    <Page.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Page.Resources>\n    <Grid Margin=\"16\" ScrollViewer.CanContentScroll=\"False\" ScrollViewer.VerticalScrollBarVisibility=\"Disabled\">\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n            <RowDefinition Height=\"*\"></RowDefinition>\n        </Grid.RowDefinitions>\n        <ui:Button Click=\"Button_Click\" Content=\"{DynamicResource goback}\" Icon=\"{ui:SymbolIcon ArrowLeft24}\" Margin=\"0,0,0,5\"></ui:Button>\n        <Grid Grid.Row=\"1\" Margin=\"0,0,0,10\">\n            <Grid.ColumnDefinitions>\n                <ColumnDefinition Width=\"*\"></ColumnDefinition>\n                <ColumnDefinition Width=\"Auto\"></ColumnDefinition>\n            </Grid.ColumnDefinitions>\n            \n            <ui:TextBox Grid.Column=\"0\" x:Name=\"textb\">\n                <ui:TextBox.Style>\n                    <Style TargetType=\"ui:TextBox\" BasedOn=\"{StaticResource {x:Type ui:TextBox}}\">\n                        <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                        <Style.Triggers>\n                            <DataTrigger Binding=\"{Binding SignedIn}\" Value=\"True\">\n                                <DataTrigger.Setters>\n                                    <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                                </DataTrigger.Setters>\n                            </DataTrigger>\n                        </Style.Triggers>\n                    </Style>\n                </ui:TextBox.Style>\n            </ui:TextBox>\n            <ui:Button Grid.Column=\"1\" Icon=\"{ui:SymbolIcon Send24}\" Click=\"Button_Click_1\">\n                <ui:Button.Style>\n                    <Style TargetType=\"ui:Button\" BasedOn=\"{StaticResource {x:Type ui:Button}}\">\n                        <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                        <Style.Triggers>\n                            <DataTrigger Binding=\"{Binding SignedIn}\" Value=\"True\">\n                                <DataTrigger.Setters>\n                                    <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                                </DataTrigger.Setters>\n                            </DataTrigger>\n                        </Style.Triggers>\n                    </Style>\n                </ui:Button.Style>\n            </ui:Button>\n            \n            \n        </Grid>\n        \n        <ScrollViewer Grid.Row=\"2\" Margin=\"-4,0,0,0\">\n            <ItemsControl ItemsSource=\"{Binding Comments}\">\n                <ItemsControl.ItemsPanel>\n                    <ItemsPanelTemplate>\n                        <StackPanel />\n                    </ItemsPanelTemplate>\n                </ItemsControl.ItemsPanel>\n\n                <ItemsControl.ItemTemplate>\n                    <DataTemplate>\n                        <Grid>\n                            <Grid.ColumnDefinitions>\n                                <ColumnDefinition Width=\"*\"></ColumnDefinition>\n                                <ColumnDefinition Width=\"Auto\"></ColumnDefinition>\n                            </Grid.ColumnDefinitions>\n                            <StackPanel Grid.Column=\"0\">\n                                <TextBlock Text=\"{Binding AuthorUsername}\" FontSize=\"12\"></TextBlock>\n                                <TextBlock TextWrapping=\"Wrap\" Margin=\"16,0,0,0\" Text=\"{Binding Content}\" FontSize=\"16\"></TextBlock>\n                            </StackPanel>\n                            <ui:Button Grid.Column=\"1\" Click=\"Button_Click_2\" Tag=\"{Binding}\" Icon=\"{ui:SymbolIcon Delete24}\">\n                                <ui:Button.Style>\n                                <Style TargetType=\"ui:Button\" BasedOn=\"{StaticResource {x:Type ui:Button}}\">\n                                    <Setter Property=\"IsEnabled\" Value=\"False\"></Setter>\n                                    <Style.Triggers>\n                                        <DataTrigger Binding=\"{Binding OwnComment}\" Value=\"True\">\n                                            <DataTrigger.Setters>\n                                                <Setter Property=\"IsEnabled\" Value=\"True\"></Setter>\n                                            </DataTrigger.Setters>\n                                        </DataTrigger>\n                                    </Style.Triggers>\n                                </Style>\n                                </ui:Button.Style>\n                            </ui:Button>\n                        </Grid>\n                    </DataTemplate>\n                </ItemsControl.ItemTemplate>\n            </ItemsControl>\n        </ScrollViewer>\n    </Grid>\n</Page>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/ViewComments.xaml.cs",
    "content": "﻿using PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Configuration.Web;\nusing RainbowTaskbar.Helpers;\nusing RainbowTaskbar.HTTPAPI;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Nodes;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\nusing Wpf.Ui.Controls;\nusing Wpf.Ui.Extensions;\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement;\nusing Page = System.Windows.Controls.Page;\n\nnamespace RainbowTaskbar.Editor.Pages.Edit {\n    /// <summary>\n    /// Interaction logic for ViewComments.xaml\n    /// </summary>\n    public partial class ViewComments : Page, INotifyPropertyChanged {\n        public Config Config { get; set; }\n        public Page OldPage { get; set; }\n        public bool SignedIn { get => App.Settings.LoggedIn; }\n\n        public BindingList<CommentData> Comments { get; set; }\n\n        public ViewComments(Config config) {\n            InitializeComponent();\n            this.DataContext = this;\n            ApplicationThemeManager.ApplySystemTheme(true);\n            App.localization.Enable(Resources.MergedDictionaries);\n            Config = config;\n            App.Settings.workshopAPI.GetConfigComments(Config).ContinueWith(c => {\n                var res = c?.Result;\n                if (res.Result)\n                    Comments = new BindingList<CommentData>(c.Result.Comments);\n                });\n\n\n\n        }\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        private void Button_Click(object sender, RoutedEventArgs e) {\n            App.editor.nav.Navigate(typeof(EmptyPageBadFix));\n            Task.Run(() => {\n                Thread.Sleep(50);\n                Dispatcher.Invoke(() => App.editor.nav.Navigate(typeof(EmptyPageBadFix2)));\n                Thread.Sleep(50);\n                Dispatcher.Invoke(() => App.editor.nav.ReplaceContent(OldPage));\n            });\n        }\n\n        private void Button_Click_1(object sender, RoutedEventArgs e) {\n            App.Settings.workshopAPI.AddConfigComment(Config, textb.Text).ContinueWith(c=> {\n                var res = c.Result;\n                if(res.Result) {\n                    Dispatcher.Invoke(() => {\n                        Comments.Insert(0, new() { AuthorUsername = App.Settings.AccountUsername, Content = textb.Text, ID = res.ID });\n                        Config.CachedCommentCount++;\n\n                        textb.Text = \"\";\n                    });\n                    \n                }\n\n            });\n            \n        }\n\n        private void Button_Click_2(object sender, RoutedEventArgs e) {\n            var btn = (sender as Wpf.Ui.Controls.Button);\n            var cfg = btn.Tag as CommentData;\n\n            App.Settings.workshopAPI.DeleteConfigComment(Config, cfg.ID);\n            Comments.Remove(Comments.First(x => x.ID == cfg.ID));\n            Config.CachedCommentCount--;\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/ViewInfo.xaml",
    "content": "﻿<Page x:Class=\"RainbowTaskbar.Editor.Pages.Edit.ViewInfo\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Edit\" xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" xmlns:controls=\"clr-namespace:RainbowTaskbar.Editor.Pages.Controls\"\n      mc:Ignorable=\"d\" \n      d:DesignHeight=\"450\" d:DesignWidth=\"800\"\n      Title=\"ViewInfo\">\n    <Page.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Page.Resources>\n    <Grid Margin=\"16\" ScrollViewer.CanContentScroll=\"False\" ScrollViewer.VerticalScrollBarVisibility=\"Disabled\">\n        <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"1.5*\"></ColumnDefinition>\n            <ColumnDefinition Width=\"*\"></ColumnDefinition>\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"*\"></RowDefinition>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n        </Grid.RowDefinitions>\n        <controls:UnsafeImage Grid.Row=\"0\" x:Name=\"thumbPreview\" HorizontalAlignment=\"Stretch\" Grid.Column=\"1\"></controls:UnsafeImage>\n        <Grid ScrollViewer.CanContentScroll=\"True\" ScrollViewer.VerticalScrollBarVisibility=\"Visible\">\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"Auto\"></RowDefinition>\n                <RowDefinition Height=\"2*\"></RowDefinition>\n                <RowDefinition Height=\"*\"></RowDefinition>\n            </Grid.RowDefinitions>\n            <Viewbox Grid.Row=\"0\" StretchDirection=\"DownOnly\" Stretch=\"Uniform\" HorizontalAlignment=\"Left\">\n                <TextBlock FontSize=\"36\" Text=\"{Binding Config.Name}\"></TextBlock>\n            </Viewbox>\n            <FlowDocumentScrollViewer  IsEnabled=\"False\" ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\" ScrollViewer.CanContentScroll=\"False\" Grid.Row=\"1\" Margin=\"0,0,0,8\" FontSize=\"16\" x:Name=\"description\">\n                \n                <FlowDocument></FlowDocument>\n            </FlowDocumentScrollViewer>\n            <StackPanel Grid.Row=\"2\" Margin=\"0,0,0,8\">\n                <StackPanel Orientation=\"Horizontal\">\n                    <TextBlock Text=\"{DynamicResource filesize}\" xml:space=\"preserve\"></TextBlock>\n                    <TextBlock Text=\"{Binding FileSize}\"></TextBlock>\n                    <TextBlock Text=\"{DynamicResource filesizeextra}\" xml:space=\"preserve\"></TextBlock>\n                </StackPanel>\n                <StackPanel Orientation=\"Horizontal\">\n                    <TextBlock Text=\"{DynamicResource author}\" xml:space=\"preserve\"></TextBlock>\n                    <TextBlock Text=\"{Binding Config.CachedPublisherUsername}\"></TextBlock>\n                </StackPanel>\n                <StackPanel Orientation=\"Horizontal\">\n                    <TextBlock Text=\"{DynamicResource likes}\" xml:space=\"preserve\"></TextBlock>\n                    <TextBlock Text=\"{Binding Config.CachedLikeCount}\"></TextBlock>\n                </StackPanel>\n            </StackPanel>\n        </Grid>\n\n        <StackPanel Grid.Row=\"1\" Orientation=\"Horizontal\">\n            <ui:Button Icon=\"{ui:SymbolIcon ArrowDownload24}\" Click=\"Download\">\n                <ui:Button.Style>\n                    <Style TargetType=\"ui:Button\" BasedOn=\"{StaticResource {x:Type ui:Button}}\">\n                        <Setter Property=\"Content\" Value=\"{DynamicResource download}\"></Setter>\n                        <Style.Triggers>\n                            <DataTrigger Binding=\"{Binding Downloaded}\" Value=\"True\">\n                                <DataTrigger.Setters>\n                                    <Setter Property=\"Content\" Value=\"{DynamicResource downloadnew}\"></Setter>\n                                </DataTrigger.Setters>\n                            </DataTrigger>\n                        </Style.Triggers>\n                    </Style>\n                </ui:Button.Style>\n            </ui:Button>\n            <ui:Button Margin=\"5,0,0,0\" Click=\"Like\">\n                <ui:Button.Style>\n                    <Style TargetType=\"ui:Button\" BasedOn=\"{StaticResource {x:Type ui:Button}}\">\n                        <Setter Property=\"Content\" Value=\"{DynamicResource like}\"></Setter>\n                        <Setter Property=\"Icon\" Value=\"{ui:SymbolIcon Heart24}\"></Setter>\n                        <Style.Triggers>\n                            <DataTrigger Binding=\"{Binding Liked}\" Value=\"True\">\n                                <DataTrigger.Setters>\n                                    <Setter Property=\"Content\" Value=\"{DynamicResource unlike}\"></Setter>\n                                    <Setter Property=\"Icon\" Value=\"{ui:SymbolIcon HeartBroken24}\"></Setter>\n                                </DataTrigger.Setters>\n                            </DataTrigger>\n                        </Style.Triggers>\n                    </Style>\n                </ui:Button.Style>\n            </ui:Button>\n            <ui:Button Margin=\"5,0,0,0\" Click=\"Comment\" Content=\"{Binding CommentButtonText}\" Icon=\"{ui:SymbolIcon Comment24}\">\n            </ui:Button>\n            <ui:Button Margin=\"5,0,0,0\" Click=\"OpenWeb\" Content=\"{DynamicResource openweb}\" Icon=\"{ui:SymbolIcon Globe24}\">\n            </ui:Button>\n        </StackPanel>\n    </Grid>\n</Page>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/ViewInfo.xaml.cs",
    "content": "﻿using PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Configuration.Web;\nusing RainbowTaskbar.Helpers;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Nodes;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\nusing Wpf.Ui.Controls;\nusing Wpf.Ui.Extensions;\n\nnamespace RainbowTaskbar.Editor.Pages.Edit {\n    /// <summary>\n    /// Interaction logic for EditInfo.xaml\n    /// </summary>\n    public partial class ViewInfo : Page, INotifyPropertyChanged {\n        public Config Config { get; set; }\n        public bool IsClassic { get => Config is InstructionConfig; }\n        public bool Downloaded { get => App.Configs.Any(x => x.PublishedID == Config.PublishedID); }\n        public string FileSize { get => (Encoding.UTF8.GetBytes(JsonSerializer.Serialize(Config)).Length / 1024.0).ToString(\"N1\"); }\n        public bool Liked { get; set; }\n\n        public string CommentButtonText { get => App.localization.Get(\"comments\") + $\" ({Config.CachedCommentCount})\"; }\n        public ViewInfo(Config config) {\n            InitializeComponent();\n            this.DataContext = this;\n            ApplicationThemeManager.ApplySystemTheme(true);\n            App.localization.Enable(Resources.MergedDictionaries);\n            Config = config;\n\n            var content = new TextRange(description.Document.ContentStart, description.Document.ContentEnd);\n\n            if (content.CanLoad(DataFormats.Rtf)) {\n                using (var stream = new MemoryStream(Encoding.Default.GetBytes(Config.Description)))\n                    content.Load(stream, DataFormats.Rtf);\n            }\n\n            thumbPreview.Source = config.LoadImage();\n\n            if (App.Settings.LoggedIn) App.Settings.workshopAPI.GetLikedConfigs().ContinueWith(x => Liked = x?.Result.Search.Contains(Config.PublishedID) ?? false);\n        }\n\n        private void Download(object sender, RoutedEventArgs e) {\n            var copy = Config.Copy();\n            if (copy.CachedPublisherUsername != App.Settings.AccountUsername || Downloaded) {\n                copy.PreviousPublishedID = copy.PublishedID;\n                copy.PublishedID = null;\n            }\n            copy.ToFile();\n            App.Configs.Insert(0, copy);\n        }\n\n        private void Like(object sender, RoutedEventArgs e) {\n            if(!App.Settings.LoggedIn) {\n                App.editor.contentDialogService.ShowSimpleDialogAsync(new() {\n                    Content = App.localization.Get(\"msgbox_notloggedin2\"),\n                    Title = App.localization.Get(\"msgbox_notloggedin_title\"),\n                    CloseButtonText = \"OK\"\n                });\n                return;\n            }\n\n            Liked = !Liked;\n            Config.CachedLikeCount += Liked ? 1 : -1;\n            App.Settings.workshopAPI.LikeConfig(Config, Liked);\n        }\n\n        private void Comment(object sender, RoutedEventArgs e) {\n           var page = new ViewComments(Config);\n            page.OldPage = this;\n\n            App.editor.nav.Navigate(typeof(EmptyPageBadFix));\n            Task.Run(() => {\n                Thread.Sleep(50);\n                Dispatcher.Invoke(() => App.editor.nav.Navigate(typeof(EmptyPageBadFix2)));\n                Thread.Sleep(50);\n                Dispatcher.Invoke(() => App.editor.nav.ReplaceContent(page));\n            });\n        }\n        private void OpenWeb(object sender, RoutedEventArgs e) {\n            Process.Start(new ProcessStartInfo(\"https://ad2017.dev/rnb/web/config/\"+Config.PublishedID) { UseShellExecute = true });\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/WebEditPage.xaml",
    "content": "﻿<local:EditPage x:Class=\"RainbowTaskbar.Editor.Pages.Edit.WebEditPage\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n      xmlns:wv2=\"clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf\"\n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages.Edit\"\n      mc:Ignorable=\"d\" \n                \n        xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\"\n      d:DesignHeight=\"450\" d:DesignWidth=\"800\"\n      Title=\"WebEdit\">\n    <Page.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Page.Resources>\n    <Grid Margin=\"8\">\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n            <RowDefinition Height=\"*\"></RowDefinition>\n        </Grid.RowDefinitions>\n        <Menu>\n            <ui:MenuItem Header=\"{DynamicResource run}\" Icon=\"{ui:SymbolIcon Play24}\" Click=\"RunConfig\"/>\n\n            <CheckBox IsChecked=\"{Binding OpenDevTools}\" Content=\"{DynamicResource devtools}\"></CheckBox>\n        </Menu>\n        <local:WebView2Fixed Grid.Row=\"1\" x:Name=\"webView\" VerticalAlignment=\"Stretch\" HorizontalAlignment=\"Stretch\"></local:WebView2Fixed>\n    </Grid>\n</local:EditPage>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/WebEditPage.xaml.cs",
    "content": "﻿\nusing Microsoft.Web.WebView2.Core;\nusing Microsoft.Web.WebView2.Wpf;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Web;\nusing RainbowTaskbar.Editor.Pages.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Dynamic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Nodes;\nusing System.Text.RegularExpressions;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages.Edit {\n    /// <summary>\n    /// Interaction logic for WebEdit.xaml\n    /// </summary>\n    public partial class WebEditPage : EditPage {\n\n        \n        public bool OpenDevTools { get; set; } = false;\n\n        public void OnOpenDevToolsChanged() {\n            if(OpenDevTools) {\n                if(!App.Settings.GraphicsRepeat) {\n                    App.hiddenWebViewHost.webView_.CoreWebView2?.OpenDevToolsWindow();\n                } else {\n                    App.taskbars.ForEach(x=>x.webView.CoreWebView2?.OpenDevToolsWindow());\n                }\n            }\n        }\n\n        public WebEditPage() {\n            InitializeComponent();\n            this.DataContext = this;\n            ApplicationThemeManager.ApplySystemTheme(true);\n            App.localization.Enable(Resources.MergedDictionaries);\n\n            var envasync = CoreWebView2Environment.CreateAsync(null, System.IO.Path.GetTempPath(), new CoreWebView2EnvironmentOptions());\n            Task.Run(() => {\n                var env = envasync.Result;\n                Dispatcher.Invoke(() =>\n                    webView.EnsureCoreWebView2Async(env).ContinueWith((t) => {\n                        Dispatcher.Invoke(() => {\n                            webView.Source = new Uri(System.IO.Path.Join(App.monacoDir, \"index.html\"));\n                            webView.SetCurrentValue(WebView2.DefaultBackgroundColorProperty, System.Drawing.Color.Transparent);\n                        });\n\n                    })\n                );\n            });\n            \n            var theme = Wpf.Ui.Appearance.ApplicationThemeManager.GetAppTheme() == Wpf.Ui.Appearance.ApplicationTheme.Light ? \"vs\" : \"vs-dark\";\n            webView.NavigationCompleted += (_, _) => {\n                webView.ExecuteScriptAsync(\n                    $$$\"\"\"\n                    monaco.editor.defineTheme('editortheme', {\n                        base: '{{{theme}}}',\n                        inherit: true,\n                        rules: [{ background: 'FFFFFF00' }],\n                        colors: {'editor.background': '#FFFFFF00','minimap.background': '#FFFFFF00',}});\n                    monaco.editor.setTheme('editortheme');\n\n                                        \n                    window.addEventListener('resize', () => {\n                      editor.layout({ width: 0, height: 0 })\n                      window.requestAnimationFrame(() => {\n                        editor.layout({ width: document.documentElement.clientWidth - 2, height: document.documentElement.clientHeight - 2})\n                      })\n                    })\n                    \n                    editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => window.chrome.webview.postMessage({m:\"save\"}));\n                    \"\"\"\n                );\n\n\n                webView.ExecuteScriptAsync($\"editor.getModel().setValue(atob('{Convert.ToBase64String(Encoding.UTF8.GetBytes((Config as WebConfig).Data.WebContent))}'));\")\n                .ContinueWith((_) => {\n                    Dispatcher.Invoke(() => webView.ExecuteScriptAsync(\"\"\"\n                        editor.getModel().onDidChangeContent((event) => {\n                          \twindow.chrome.webview.postMessage({m:\"changed\"});\n                        });\n                        \"\"\"));\n                });\n            };\n            webView.WebMessageReceived += (_, args) => {\n                var message = JsonSerializer.Deserialize<JsonNode>(args.WebMessageAsJson);\n                switch(message[\"m\"].GetValue<string>()) {\n                    case \"changed\":\n                        Modified = true;\n                        break;\n                    case \"save\":\n                        Save();\n                        Modified = false;\n                        break;\n                }\n            };\n\n            \n        }\n        public async Task<string> GetContent() {\n            var res = await webView.ExecuteScriptAsync(\"editor.getModel().getValue()\");\n            return Regex.Unescape(res).TrimStart('\"').TrimEnd('\"');\n        }\n        public void Save() {\n            GetContent().ContinueWith((t) => {\n                var res = t.Result;\n                Dispatcher.Invoke(() => { (Config as WebConfig).Data.WebContent = res; Config.Updated = DateTime.Now; Config.ToFile(); });\n            });\n        }\n        public WebConfig Current { get; set; } = new WebConfig();\n        private void RunConfig(object sender, RoutedEventArgs e) {\n            if (App.Settings.SelectedConfig is not null) {\n                App.Settings.SelectedConfig.Stop();\n                App.ReloadTaskbars(false);\n            }\n            GetContent().ContinueWith((t) => {\n                Current.Data.UserSettings = (Config as WebConfig).Data.UserSettings;\n                Current.Data.WebContent = t.Result;\n                Thread.Sleep(500);\n                Dispatcher.Invoke(() => {\n                    Current.Start();\n                    });\n                Thread.Sleep(1000);\n                Dispatcher.Invoke(() => {\n                    OnOpenDevToolsChanged();\n                });\n            });\n        }\n        \n\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/WebView2Fixed.cs",
    "content": "﻿using Microsoft.Web.WebView2.Wpf;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Input;\n\nnamespace RainbowTaskbar.Editor.Pages.Edit {\n    public class WebView2Fixed : WebView2 {\n        protected override void OnPreviewKeyDown(KeyEventArgs e) {\n            return;\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/EmptyPageBadFix.xaml",
    "content": "﻿<Page x:Class=\"RainbowTaskbar.Editor.Pages.EmptyPageBadFix\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages\"\n      mc:Ignorable=\"d\" \n      d:DesignHeight=\"450\" d:DesignWidth=\"800\"\n      Title=\"EmptyPageBadFix\">\n\n    <Grid>\n        \n    </Grid>\n</Page>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/EmptyPageBadFix.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages {\n    /// <summary>\n    /// Interaction logic for EmptyPageBadFix.xaml\n    /// </summary>\n    public partial class EmptyPageBadFix : Page {\n        public EmptyPageBadFix() {\n            InitializeComponent();\n            ApplicationThemeManager.ApplySystemTheme(true);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/EmptyPageBadFix2.xaml",
    "content": "﻿<Page x:Class=\"RainbowTaskbar.Editor.Pages.EmptyPageBadFix2\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages\"\n      mc:Ignorable=\"d\" \n      d:DesignHeight=\"450\" d:DesignWidth=\"800\"\n      Title=\"EmptyPageBadFix2\">\n\n    <Grid>\n        \n    </Grid>\n</Page>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/EmptyPageBadFix2.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\n\nnamespace RainbowTaskbar.Editor.Pages {\n    /// <summary>\n    /// Interaction logic for EmptyPageBadFix2.xaml\n    /// </summary>\n    public partial class EmptyPageBadFix2 : Page {\n        public EmptyPageBadFix2() {\n            InitializeComponent();\n            ApplicationThemeManager.ApplySystemTheme(true);\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Home.xaml",
    "content": "﻿<Page x:Class=\"RainbowTaskbar.Editor.Pages.Home\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages\"\n      xmlns:wv2=\"clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf\"\n      mc:Ignorable=\"d\" \n      d:DesignHeight=\"450\" d:DesignWidth=\"800\"\n      xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\"\n      Title=\"Home\">\n    <Page.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n    </Page.Resources>\n    <Grid Margin=\"16\">\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n            <RowDefinition Height=\"*\"></RowDefinition>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n        </Grid.RowDefinitions>\n        <TextBlock x:Name=\"title\" HorizontalAlignment=\"Center\" FontSize=\"32\" FontWeight=\"SemiBold\" Margin=\"0,0,0,10\" Text=\"{DynamicResource welcome}\"></TextBlock>\n        <Grid x:Name=\"lastupdate\" Grid.Row=\"1\">\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"Auto\"></RowDefinition>\n                <RowDefinition Height=\"*\"></RowDefinition>\n            </Grid.RowDefinitions>\n            <Grid.Style>\n                <Style TargetType=\"Grid\">\n                    <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                </Style>\n            </Grid.Style>\n            <TextBlock Text=\"{DynamicResource whatsnew}\"></TextBlock>\n            <wv2:WebView2 Grid.Row=\"1\" x:Name=\"wv\"></wv2:WebView2>\n        </Grid>\n        <StackPanel Grid.Row=\"2\" Orientation=\"Horizontal\">\n            <ui:Button Margin=\"0,0,4,0\" Icon=\"{ui:SymbolIcon Star24}\" Click=\"Button_Click\" Content=\"{DynamicResource review}\">\n                <ui:Button.Style>\n                    <Style BasedOn=\"{StaticResource {x:Type ui:Button}}\" TargetType=\"ui:Button\">\n                        <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                        <Style.Triggers>\n                            <DataTrigger Binding=\"{Binding IsAppMicrosoftStore}\" Value=\"True\">\n                                <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                            </DataTrigger>\n                        </Style.Triggers>\n                    </Style>\n                </ui:Button.Style></ui:Button>\n\n            <ui:Button Margin=\"0,0,4,0\" Icon=\"{ui:SymbolIcon Info24}\" Content=\"{DynamicResource issueorreq}\" Click=\"Button_Click_1\">\n            </ui:Button>\n\n            <ui:Button Icon=\"{ui:SymbolIcon Globe24}\" Content=\"{DynamicResource rnbweb}\" Click=\"Button_Click_2\">\n            </ui:Button>\n        </StackPanel>\n    </Grid>\n</Page>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Home.xaml.cs",
    "content": "﻿using RainbowTaskbar.Configuration.Web;\nusing RainbowTaskbar.Editor.Pages.Controls;\nusing RainbowTaskbar.Editor.Pages.Controls.WebControls;\nusing RainbowTaskbar.Editor.Pages.Edit;\nusing RainbowTaskbar.Helpers;\nusing RainbowTaskbar.Interpolation;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing Wpf.Ui.Appearance;\nusing Wpf.Ui.Controls;\nusing Wpf.Ui.Extensions;\n\nnamespace RainbowTaskbar.Editor.Pages {\n    /// <summary>\n    /// Interaction logic for Home.xaml\n    /// </summary>\n    public partial class Home : Page {\n        public Home() {\n            InitializeComponent();\n\n            ApplicationThemeManager.ApplySystemTheme(true);\n\n            App.localization.Enable(Resources.MergedDictionaries);\n            DataContext = App.editorViewModel;\n            \n            Task.Run( () => {\n                \n                if(App.editorViewModel.LatestUpdateInfo is null) {\n                    string str;\n                    try {\n                        str = AutoUpdate.GetLatestBody().Result;\n                    }\n                    catch (Exception ex) {\n                        str = \"Failed to get latest update info.\";\n                    }\n                    App.editorViewModel.LatestUpdateInfo = Markdig.Markdown.ToHtml(str);\n                }\n                Task t = null;\n                Dispatcher.Invoke(() => {\n                    t = wv.EnsureCoreWebView2Async();\n                    wv.DefaultBackgroundColor = System.Drawing.Color.Transparent;\n                });\n                t.Wait();\n                Dispatcher.Invoke(() => {\n\n\n                    wv.CoreWebView2.Settings.AreBrowserAcceleratorKeysEnabled = false;\n                    wv.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;\n                    wv.CoreWebView2.Settings.IsSwipeNavigationEnabled = false;\n                    wv.CoreWebView2.Settings.IsStatusBarEnabled = false;\n                    wv.CoreWebView2.Settings.IsPinchZoomEnabled = false;\n                    wv.CoreWebView2.Settings.AreDevToolsEnabled = false;\n                    wv.CoreWebView2.Settings.UserAgent = \"RainbowTaskbar Web Display https://ad2017.dev/rnb\";\n                    wv.CoreWebView2.IsMuted = true;\n\n                    wv.NavigateToString(\n                        $$\"\"\"\n                    <style>\n                    body {\n                        background: transparent;\n                        color: {{ColorTranslator.ToHtml((title.Foreground as SolidColorBrush).Color.ToDrawingColor())}};\n                        font-family: \"{{title.FontFamily.ToString()}}\", \"Segoe UI\", sans-serif;\n                        font-size: large;\n                    }\n                    </style>\n                    \"\"\" + App.editorViewModel.LatestUpdateInfo);\n\n                    lastupdate.Visibility = Visibility.Visible;\n                    ApplicationThemeManager.ApplySystemTheme(true);\n                });\n            });\n\n        }\n\n        private void Button_Click(object sender, RoutedEventArgs e) {\n            Process.Start(new ProcessStartInfo(\"ms-windows-store:Review?PFN=48822ad2017.30397FC5B3C66_32727fk258az6\") { UseShellExecute = true });\n        }\n\n        private void Button_Click_1(object sender, RoutedEventArgs e) {\n            var ctrl = new IssueControl();\n\n            lastupdate.Visibility = Visibility.Hidden;\n\n            Task.Run(() => {\n                Task<ContentDialogResult> result = null;\n                Dispatcher.Invoke(() => result = App.editor.contentDialogService.ShowSimpleDialogAsync(new() {\n                    Content = ctrl,\n                    Title = App.localization.Get(\"issueorreq\"),\n                    PrimaryButtonText = \"OK\",\n                    SecondaryButtonText = App.localization.Get(\"msgbox_issuegithub\"),\n                    CloseButtonText = App.localization.Get(\"msgbox_button_cancel\")\n                }));\n                result.Wait();\n\n                if (result.Result == ContentDialogResult.Primary) {\n                    Task<HTTPAPI.ResultResponse> res = null;\n                    Dispatcher.Invoke(() => {\n                        res = App.Settings.workshopAPI.SubmitIssue(ctrl.Title, ctrl.Description, ctrl.Contact);\n                    });\n                    res.Wait();\n                    if (!res.Result.Result) {\n                        Dispatcher.Invoke(() => App.editor.contentDialogService.ShowSimpleDialogAsync(new() {\n                            Content = App.localization.Get(\"msgbox_fail_title\"),\n                            Title = App.localization.Get(\"msgbox_fail_title\"),\n                            CloseButtonText = \"OK\"\n                        }).ContinueWith((t) => Dispatcher.Invoke(() => lastupdate.Visibility = Visibility.Visible)));\n                    } else {\n                        Dispatcher.Invoke(() => lastupdate.Visibility = Visibility.Visible);\n                    }\n                }\n                else if(result.Result == ContentDialogResult.Secondary) {\n                    Process.Start(new ProcessStartInfo(\"https://github.com/ad2017gd/RainbowTaskbar/issues/new/choose\") { UseShellExecute = true });\n                    Dispatcher.Invoke(() => lastupdate.Visibility = Visibility.Visible);\n                } else {\n                    Dispatcher.Invoke(() => lastupdate.Visibility = Visibility.Visible);\n                }\n\n                \n            });\n        }\n\n        private void Button_Click_2(object sender, RoutedEventArgs e) {\n            Process.Start(new ProcessStartInfo(\"https://ad2017.dev/rnb\") { UseShellExecute = true });\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Settings.xaml",
    "content": "﻿<Page x:Class=\"RainbowTaskbar.Editor.Pages.Settings\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n      xmlns:local=\"clr-namespace:RainbowTaskbar.Editor.Pages\"\n      xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" xmlns:loc=\"clr-namespace:RainbowTaskbar.Languages\"\n      mc:Ignorable=\"d\" \n      d:DesignHeight=\"900\" d:DesignWidth=\"800\"\n      Title=\"Settings\">\n    <Page.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"../../Languages/en_US.xaml\" />\n            </ResourceDictionary.MergedDictionaries>\n            <loc:LanguageConverter x:Key=\"LanguageConverter\" />\n        </ResourceDictionary>\n\n    </Page.Resources>\n    <Grid Margin=\"0,25,0,0\">\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"*\"></RowDefinition>\n            <RowDefinition Height=\"Auto\"></RowDefinition>\n        </Grid.RowDefinitions>\n        <StackPanel Margin=\"45,0,0,0\">\n            <TextBlock FontSize=\"32\" FontWeight=\"SemiBold\" Text=\"{DynamicResource general}\"></TextBlock>\n            <Grid Height=\"15\"/>\n            <!-- Little Spacer -->\n\n            <CheckBox Content=\"{DynamicResource runstartup}\" IsChecked=\"{Binding SettingsCfg.RunAtStartup}\"></CheckBox>\n            <CheckBox Content=\"{DynamicResource checkupdate}\" IsChecked=\"{Binding SettingsCfg.CheckUpdate}\"></CheckBox>\n            <CheckBox Content=\"{DynamicResource showicon}\" IsChecked=\"{Binding SettingsCfg.ShowTrayIcon}\"></CheckBox>\n            <CheckBox Content=\"{DynamicResource reportex}\" IsChecked=\"{Binding SettingsCfg.ReportExceptions}\"></CheckBox>\n            <StackPanel Orientation=\"Horizontal\">\n                <TextBlock VerticalAlignment=\"Center\" Margin=\"0,0,8,0\" Text=\"{DynamicResource language}\"></TextBlock>\n                <ComboBox ItemsSource=\"{Binding Languages}\" SelectedItem=\"{Binding SettingsCfg.Language, Mode=TwoWay}\">\n                    <ComboBox.ItemTemplate>\n                        <DataTemplate>\n                            <Label Content=\"{Binding ., Converter={StaticResource LanguageConverter}}\" />\n                        </DataTemplate>\n                    </ComboBox.ItemTemplate>\n                </ComboBox>\n            </StackPanel>\n\n            <Grid Height=\"50\"/>\n            <!-- Big Spacer -->\n\n            <TextBlock FontSize=\"32\" FontWeight=\"SemiBold\" Text=\"{DynamicResource workshop}\"></TextBlock>\n            <Grid Height=\"15\"/>\n            <!-- Little Spacer -->\n\n            <StackPanel Orientation=\"Horizontal\" Margin=\"0,0,0,5\">\n                <TextBlock FontSize=\"16\" xml:space=\"preserve\" Text=\"{DynamicResource signedin}\" FontWeight=\"SemiBold\"></TextBlock>\n                <TextBlock FontSize=\"16\" xml:space=\"preserve\" Text=\" (\"></TextBlock>\n                <TextBlock FontSize=\"16\" Text=\"{Binding SettingsCfg.AccountUsername, UpdateSourceTrigger=PropertyChanged}\"></TextBlock>\n                <TextBlock FontSize=\"16\">)</TextBlock>\n            </StackPanel>\n            <StackPanel Orientation=\"Horizontal\">\n                <Button Content=\"{DynamicResource logingit}\" x:Name=\"login\" Click=\"github_Click\" Margin=\"0,0,5,0\">\n                </Button>\n                <Button Content=\"{DynamicResource logingoog}\" x:Name=\"login2\" Click=\"google_Click\" Margin=\"0,0,15,0\">\n                </Button>\n                <Button Content=\"{DynamicResource signout}\" x:Name=\"signout\" Click=\"login2_Click\" Margin=\"0,0,15,0\">\n                </Button>\n            </StackPanel>\n\n            <Grid Height=\"50\"/>\n            <!-- Big Spacer -->\n\n            <TextBlock FontSize=\"32\" FontWeight=\"SemiBold\" Text=\"{DynamicResource enum_web}\"></TextBlock>\n            <Grid Height=\"15\"/>\n            <!-- Little Spacer -->\n\n            <CheckBox Content=\"{DynamicResource passmouse}\" IsChecked=\"{Binding SettingsCfg.WebTouchThrough}\"></CheckBox>\n            <CheckBox Content=\"{DynamicResource allowjs}\" IsChecked=\"{Binding SettingsCfg.WebScriptEnabled}\"></CheckBox>\n            <StackPanel Orientation=\"Horizontal\">\n                <TextBlock VerticalAlignment=\"Center\" Margin=\"0,0,8,0\" Text=\"{DynamicResource webfps}\"></TextBlock>\n                <ui:NumberBox ClearButtonEnabled=\"False\" Value=\"{Binding SettingsCfg.MaxWebFPS, UpdateSourceTrigger=PropertyChanged}\" SpinButtonPlacementMode=\"Hidden\"></ui:NumberBox>\n            </StackPanel>\n\n            <Grid Height=\"50\"/>\n            <!-- Big Spacer -->\n\n            <TextBlock FontSize=\"32\" FontWeight=\"SemiBold\" Text=\"{DynamicResource graphics}\"></TextBlock>\n            <Grid Height=\"15\"/>\n            <!-- Little Spacer -->\n\n            <StackPanel Orientation=\"Horizontal\">\n                <TextBlock VerticalAlignment=\"Center\" Margin=\"0,0,8,0\" Text=\"{DynamicResource interpquality}\"></TextBlock>\n                <ui:NumberBox ClearButtonEnabled=\"False\" Value=\"{Binding SettingsCfg.InterpolationQuality}\" SpinButtonPlacementMode=\"Hidden\"></ui:NumberBox>\n            </StackPanel>\n\n            <Grid Height=\"50\"/>\n            <!-- Big Spacer -->\n\n            <TextBlock FontSize=\"24\" FontWeight=\"SemiBold\" Text=\"{DynamicResource multipletaskbars}\"></TextBlock>\n            <Grid Height=\"15\"/>\n            <!-- Little Spacer -->\n\n            <StackPanel Orientation=\"Horizontal\">\n                <CheckBox Content=\"{DynamicResource graphicsrepeat}\" IsChecked=\"{Binding SettingsCfg.GraphicsRepeat}\"></CheckBox>\n                <!--<TextBlock Margin=\"5,0,0,0\" VerticalAlignment=\"Center\" FontSize=\"10\" Text=\"{DynamicResource perfimpact}\">\n                    <TextBlock.Style>\n                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource {x:Type TextBlock}}\">\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\"></Setter>\n                            <Style.Triggers>\n                                <DataTrigger Binding=\"{Binding SettingsCfg.GraphicsRepeat}\" Value=\"False\">\n                                    <DataTrigger.Setters>\n                                        <Setter Property=\"Visibility\" Value=\"Visible\"></Setter>\n                                    </DataTrigger.Setters>\n                                </DataTrigger>\n                            </Style.Triggers>\n                        </Style>\n                    </TextBlock.Style>\n                </TextBlock>-->\n            </StackPanel>\n            <CheckBox Content=\"{DynamicResource samerad}\" IsChecked=\"{Binding SettingsCfg.SameRadiusOnEach}\"></CheckBox>\n\n            <Grid Height=\"50\"/>\n            <!-- Big Spacer -->\n\n            <TextBlock FontSize=\"32\" FontWeight=\"SemiBold\" Text=\"{DynamicResource globalprop}\"></TextBlock>\n            <Grid Height=\"15\"/>\n            <!-- Little Spacer -->\n\n            <TextBlock VerticalAlignment=\"Center\" FontSize=\"12\" FontWeight=\"Bold\" Text=\"{DynamicResource globalpropdef}\"></TextBlock>\n            <StackPanel Orientation=\"Horizontal\">\n                <TextBlock VerticalAlignment=\"Center\" Margin=\"0,0,8,0\" Text=\"{DynamicResource globalopacity}\"></TextBlock>\n                <ui:NumberBox Minimum=\"-1\" Maximum=\"1\" ClearButtonEnabled=\"False\" Value=\"{Binding SettingsCfg.GlobalOpacity, UpdateSourceTrigger=PropertyChanged}\" SpinButtonPlacementMode=\"Hidden\"></ui:NumberBox>\n            </StackPanel>\n\n            <Grid Height=\"50\"/>\n            <!-- Big Spacer -->\n\n            <TextBlock FontSize=\"32\" FontWeight=\"SemiBold\">API</TextBlock>\n            <Grid Height=\"15\"/>\n            <!-- Little Spacer -->\n\n            <TextBlock Text=\"{DynamicResource comingsoon}\"></TextBlock>\n            <Grid Height=\"50\"/>\n            <!-- Big Spacer -->\n\n        </StackPanel>\n    </Grid>\n</Page>\n"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Settings.xaml.cs",
    "content": "﻿using RainbowTaskbar.Editor.Pages.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Net.Http;\nusing System.Net;\nusing System.Security.Policy;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing System.Net.Http.Json;\nusing System.Text.Json;\nusing System.Dynamic;\nusing Wpf.Ui.Extensions;\n\nnamespace RainbowTaskbar.Editor.Pages {\n    /// <summary>\n    /// Interaction logic for Settings.xaml\n    /// </summary>\n    public partial class Settings : Page {\n\n        public Preferences.Settings SettingsCfg { get => App.Settings; }\n        public List<string> Languages {\n            get => RainbowTaskbar.Languages.Localization.languages;\n        }\n\n        public Settings() {\n            DataContext = this;\n            InitializeComponent();\n\n            App.localization.Enable(Resources.MergedDictionaries);\n        }\n\n        private void genericLogin(string oauthUrl) {\n            Process.Start(new ProcessStartInfo($\"{oauthUrl}{(SettingsCfg.LoginKey is not null && SettingsCfg.LoginKey != string.Empty ? $\"&state={SettingsCfg.LoginKey}\" : \"\")}\") { UseShellExecute = true });\n\n            var loginControl = new LoginControl();\n            var task = App.editor.contentDialogService.ShowSimpleDialogAsync(new() {\n                Content = loginControl,\n                Title = App.localization.Get(\"msgbox_login_title\"),\n                PrimaryButtonText = App.localization.Get(\"msgbox_login_button\"),\n                CloseButtonText = \"Cancel\"\n            });\n            Task.Run(() => {\n                var res = task.Result;\n                if (res == Wpf.Ui.Controls.ContentDialogResult.Primary) {\n                    string code = \"\";\n                    Dispatcher.Invoke(() => {\n                        code = loginControl.code.Text;\n                    });\n                    using var http = new HttpClient();\n                    using var web = new WebClient();\n                    try {\n                        var content = http.PostAsJsonAsync(\"https://rnbsrv.ad2017.dev/user/code\", new { code }).Result;\n                        dynamic json = content.Content.ReadFromJsonAsync<ExpandoObject>().Result;\n                        SettingsCfg.LoginKey = json.key.ToString();\n                        SettingsCfg.ToFile();\n                    }\n                    catch { }\n\n                }\n            });\n        }\n\n        private void github_Click(object sender, RoutedEventArgs e) {\n            genericLogin(\"https://github.com/login/oauth/authorize?client_id=Ov23li82ypW7MrlXLsQx\");\n\n        }\n\n        private void google_Click(object sender, RoutedEventArgs e) {\n            genericLogin(\"https://accounts.google.com/o/oauth2/auth?client_id=1034862162125-eo3oug90ecm84gpt2tuodfmmtfuuovle.apps.googleusercontent.com&redirect_uri=https://rnbsrv.ad2017.dev/google/auth&scope=email&response_type=code\");\n        }\n\n        private void login_Click(object sender, RoutedEventArgs e) {\n            \n        }\n\n        private void login2_Click(object sender, RoutedEventArgs e) {\n            SettingsCfg.LoginKey = null;\n            SettingsCfg.ToFile();\n            SettingsCfg.OnLanguageChanged();\n\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/ExplorerTAP/ExplorerTAP.cs",
    "content": "﻿using H.Pipes;\nusing RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Configuration.Instruction.Instructions;\nusing RainbowTaskbar.Helpers;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Reflection.Metadata;\nusing System.Runtime.ConstrainedExecution;\nusing System.Runtime.InteropServices;\nusing System.Runtime.Versioning;\nusing System.Security;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Shapes;\nusing WebSocketSharp;\n\nnamespace RainbowTaskbar.ExplorerTAP {\n    [StructLayout(LayoutKind.Sequential)]\n    struct GUID {\n        public uint a;\n        public short b;\n        public short c;\n        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]\n        public byte[] d;\n    }\n    class ExplorerTAP\n    {\n\n        [DllImport(\"kernel32.dll\")]\n        public static extern IntPtr LoadLibrary(string lib);\n        [DllImport(\"kernel32.dll\")]\n        public static extern void FreeLibrary(IntPtr module);\n        [DllImport(\"kernel32.dll\")]\n        public static extern IntPtr GetProcAddress(IntPtr module, string proc);\n\n        [DllImport(\"user32.dll\", SetLastError = true)]\n        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);\n\n        [DllImport(\"Windows.UI.Xaml.dll\", CharSet = CharSet.Unicode)]\n        public static extern int InitializeXamlDiagnosticsEx(string endPointName, uint pid, string xamlDiagDll, string TAPDllName, GUID clsID, string numiPASA);\n\n        [DllImport(\"user32.dll\", SetLastError = true)]\n        static extern bool PostMessage(IntPtr hWnd, [MarshalAs(UnmanagedType.U4)] uint Msg, IntPtr wParam, IntPtr lParam);\n\n\n        public delegate int SetAppearanceTypeDelegate(uint type);\n        public delegate int CloseDelegate();\n        public delegate int VersionDelegate();\n        public delegate int GetDataPtrDelegate();\n        public delegate int DebugGetUITreeDelegate(ref IntPtr tree);\n        public delegate int GetYPositionDelegate(IntPtr hwnd);\n        public delegate int SetTaskbarElementsOpacityDelegate(uint alpha);\n\n        public static SetAppearanceTypeDelegate SetAppearanceTypeDLL;\n        public static CloseDelegate CloseDLL;\n        public static VersionDelegate VersionDLL;\n        public static GetDataPtrDelegate GetDataPtrDLL;\n        public static DebugGetUITreeDelegate DebugGetUITreeDLL;\n        public static GetYPositionDelegate GetYPositionDLL;\n        public static SetTaskbarElementsOpacityDelegate SetTaskbarElementsOpacityDLL;\n\n\n        public static IntPtr library;\n        public static int tries = 0;\n\n        public static bool IsInjected { get; set; } = false;\n        public static bool IsInjecting { get; set; } = false;\n\n        public static bool NeedsTAPCache { get; set; } = false;\n\n        public static bool NeedsTAP() {\n            var taskbarHWND = TaskbarHelper.FindWindow(\"Shell_TrayWnd\", null);\n            return\n                (NeedsTAPCache = taskbarHWND != IntPtr.Zero &&\n                TaskbarHelper.FindWindowEx(taskbarHWND, IntPtr.Zero, \"Windows.UI.Composition.DesktopWindowContentBridge\", null) != IntPtr.Zero &&\n                TaskbarHelper.FindWindowEx(taskbarHWND, IntPtr.Zero, \"WorkerW\", null) == IntPtr.Zero);\n                \n        }\n\n        public const int TAPVERSION = 4;\n\n       \n        private static void StartExplorer() {\n            string explorer = string.Format(\"{0}\\\\{1}\", Environment.GetEnvironmentVariable(\"WINDIR\"), \"explorer.exe\");\n            Process process = new Process();\n            process.StartInfo.FileName = explorer;\n            process.StartInfo.UseShellExecute = true;\n            process.Start();\n            do {\n                Thread.Sleep(100);\n            } while (!NeedsTAP());\n        }\n        public static IntPtr dataPtr = IntPtr.Zero;\n        static IntPtr proc = IntPtr.Zero;\n        static IntPtr rtdStruct = IntPtr.Zero;\n        static int version = 0;\n\n        public static bool TryInject() {\n\n            var taskbarHWND = TaskbarHelper.FindWindow(\"Shell_TrayWnd\", null);\n\n            if (NeedsTAP() && !IsInjecting) {\n                if (library != IntPtr.Zero) FreeLibrary(library);\n                \n\n                IsInjecting = true;\n                var inject = true;\n                // We re on win11 with new taskbar\n\n                string dllPath = Environment.GetEnvironmentVariable(\"temp\") + \"\\\\RainbowTaskbarDLL.dll\";\n                dataPtr = IntPtr.Zero;\n\n                if (File.Exists(dllPath)) {\n                    bool deleted = false;\n                    try {\n                        File.Delete(dllPath);\n                        deleted = true;\n                    }\n                    catch { }\n\n                    if (!deleted) {\n                        library = LoadLibrary(dllPath);\n                        IntPtr VersionDLLPtr = GetProcAddress(library, \"VersionDLL\");\n                        if (VersionDLLPtr != IntPtr.Zero) {\n                            VersionDLL = Marshal.GetDelegateForFunctionPointer<VersionDelegate>(VersionDLLPtr);\n                            version = VersionDLL();\n                        }\n                        FreeLibrary(library);\n                        if (VersionDLLPtr == IntPtr.Zero || version < TAPVERSION) {\n                            var result = MessageBox.Show(\n                                App.localization[\"msgbox_olddll\"], \"RainbowTaskbar\", MessageBoxButton.YesNoCancel, MessageBoxImage.Information\n                            );\n                            if (result == MessageBoxResult.Yes) {\n                                Process.Start(\"cmd\", $\"/c taskkill /f /im explorer.exe\").WaitForExit();\n                                Thread.Sleep(100);\n                                Process.Start(\"cmd\", $\"/c del /q \\\"{dllPath}\\\"\").WaitForExit();\n                                do {\n                                    Thread.Sleep(500);\n                                } while (TaskbarHelper.FindWindow(\"Shell_TrayWnd\", null) != IntPtr.Zero);\n                                StartExplorer();\n                                Thread.Sleep(4000);\n                                taskbarHWND = TaskbarHelper.FindWindow(\"Shell_TrayWnd\", null);\n                            } else {\n                                IsInjecting = true;\n                                return true;\n                            }\n                        } else {\n                            inject = false;\n                        }\n                    }\n                    \n                    \n                }\n                try {\n                    var assembly = Assembly.GetExecutingAssembly();\n                    var arch = System.Runtime.InteropServices.RuntimeInformation.OSArchitecture.ToString();\n                    if (arch == \"X64\") arch = \"x64\";\n                    var resourceName = $\"RainbowTaskbar.RainbowTaskbarDLL_{arch}.dll\";\n\n                    using (Stream stream = assembly.GetManifestResourceStream(resourceName))\n                    using (BinaryReader reader = new BinaryReader(stream)) {\n                        var fstr = File.OpenWrite(dllPath);\n                        reader.BaseStream.CopyTo(fstr);\n                        fstr.Close();\n                    }\n                }\n                catch { }\n\n                library = LoadLibrary(dllPath);\n\n                if(GetProcAddress(library, \"SetAppearanceTypeDLL\") != IntPtr.Zero) \n                    SetAppearanceTypeDLL = Marshal.GetDelegateForFunctionPointer<SetAppearanceTypeDelegate>(GetProcAddress(library, \"SetAppearanceTypeDLL\"));\n                if(GetProcAddress(library, \"CloseDLL\") != IntPtr.Zero) \n                    CloseDLL = Marshal.GetDelegateForFunctionPointer<CloseDelegate>(GetProcAddress(library, \"CloseDLL\"));\n                if (GetProcAddress(library, \"GetDataPtrDLL\") != IntPtr.Zero)\n                    GetDataPtrDLL = Marshal.GetDelegateForFunctionPointer<GetDataPtrDelegate>(GetProcAddress(library, \"GetDataPtrDLL\"));\n                if (GetProcAddress(library, \"DebugGetUITreeDLL\") != IntPtr.Zero)\n                    DebugGetUITreeDLL = Marshal.GetDelegateForFunctionPointer<DebugGetUITreeDelegate>(GetProcAddress(library, \"DebugGetUITreeDLL\"));\n                if (GetProcAddress(library, \"GetYPositionDLL\") != IntPtr.Zero)\n                    GetYPositionDLL = Marshal.GetDelegateForFunctionPointer<GetYPositionDelegate>(GetProcAddress(library, \"GetYPositionDLL\"));\n                if (GetProcAddress(library, \"SetTaskbarElementsOpacityDLL\") != IntPtr.Zero)\n                    SetTaskbarElementsOpacityDLL = Marshal.GetDelegateForFunctionPointer<SetTaskbarElementsOpacityDelegate>(GetProcAddress(library, \"SetTaskbarElementsOpacityDLL\"));\n\n                if (inject) {\n                    var guid = new GUID() {\n                        a = 0xc9d60190,\n                        b = 0x2c89,\n                        c = 0x11ee,\n                        d = new byte[] { 0xbe, 0x56, 0x02, 0x42, 0xac, 0x12, 0x00, 0x02 }\n                    };\n\n                    uint pid = 0;\n                    GetWindowThreadProcessId(TaskbarHelper.FindWindow(\"Shell_TrayWnd\", null), out pid);\n\n\n                    int hr = -1;\n                    int tries = 1;\n                    do {\n                        var xamlthread = new Thread(() => {\n                            hr = InitializeXamlDiagnosticsEx($\"VisualDiagConnection{tries}\", pid, null, dllPath, guid, null);\n                        });\n                        xamlthread.Start();\n                        xamlthread.Join();\n                        Thread.Sleep(50);\n                    } while (hr != 0 && tries++ < 50);\n\n                    // too lazy to make an event, this shall work\n                    Task.Delay(1250).Wait();\n                }\n\n                if (proc != IntPtr.Zero) CloseHandle(proc);\n                if (rtdStruct != IntPtr.Zero) Marshal.FreeHGlobal(rtdStruct);\n\n                GetWindowThreadProcessId(taskbarHWND, out var pidd);\n                proc = OpenProcess(ProcessAccessFlags.VirtualMemoryRead, false, pidd);\n                rtdStruct = Marshal.AllocHGlobal(Marshal.SizeOf<RainbowTaskbarData>());\n\n                IsInjecting = false;\n                IsInjected = true;\n                \n                \n            } else {\n                return false;\n            }\n            return true;\n\n        }\n        public static void Reset() {\n            if (!IsInjected) return;\n            if (CloseDLL is not null || !IsInjected)\n                CloseDLL();\n            if (library != IntPtr.Zero) FreeLibrary(library);\n            SetAppearanceTypeDLL = null;\n            CloseDLL = null;\n            IsInjected = false;\n        }\n\n        public static void SetAppearanceType(TransparencyInstruction.TransparencyInstructionStyle type) {\n            if (!NeedsTAP() || IsInjecting) return;\n            if (SetAppearanceTypeDLL is null || !IsInjected) return;\n            uint hres = unchecked((uint) SetAppearanceTypeDLL((uint) type));\n            if (hres == 0) tries = 0;\n            if (hres != 0 && tries < 10) { // MK_E_UNAVAILABLE or other errors?\n                while(hres != 0 && tries < 10) {\n                    if(TryInject()) \n                        tries++;\n                    hres = unchecked((uint) SetAppearanceTypeDLL((uint) type));\n                }\n                if (hres != 0 && tries >= 10) {\n                    MessageBox.Show(\n                        $\"0x{hres.ToString(\"X8\")} : {Marshal.GetExceptionForHR(unchecked((int) hres))?.Message}\\n\\n{App.localization[\"msgbox_baddll\"]}\", \"RainbowTaskbar Error\", MessageBoxButton.OK, MessageBoxImage.Warning\n                        );\n                }\n\n\n            }\n        }\n\n        public static void SetTaskbarElementsOpacity(double opacity) {\n            if (!NeedsTAP() || IsInjecting) return;\n            if (SetTaskbarElementsOpacityDLL is null || !IsInjected) return;\n\n            SetTaskbarElementsOpacityDLL((uint)(opacity * 255));\n        }\n\n        public static int GetDataPtr() {\n            if (!NeedsTAP() || IsInjecting) return -1;\n            if (GetDataPtrDLL is null || !IsInjected) return -1;\n            return GetDataPtrDLL();\n        }\n\n\n        [StructLayout(LayoutKind.Sequential, Pack = 8)]\n        public struct TaskbarInfo {\n            public IntPtr taskbar;\n            public int YPosition;\n            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 16)]\n            public byte[,] _reserved;\n        }\n\n        [StructLayout(LayoutKind.Sequential, Pack = 8)]\n        public struct TaskbarInfo2 {\n            public IntPtr taskbar;\n            public IntPtr UIDataPtr;\n            public int UIDataSize;\n        }\n\n        [StructLayout(LayoutKind.Sequential, Pack = 8)]\n        public struct RainbowTaskbarData {\n            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]\n            public TaskbarInfo[] lTaskbarInfo;\n            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]\n            public TaskbarInfo2[] lTaskbarInfo2;\n\n        }\n\n        [DllImport(\"kernel32.dll\", SetLastError = true)]\n        static extern bool ReadProcessMemory(\n            IntPtr hProcess,\n            IntPtr lpBaseAddress,\n            IntPtr lpBuffer,\n            int dwSize,\n            out IntPtr lpNumberOfBytesRead);\n        [DllImport(\"kernel32.dll\", SetLastError = true)]\n        public static extern IntPtr OpenProcess(\n             ProcessAccessFlags processAccess,\n             bool bInheritHandle,\n             uint processId\n        );\n        [Flags]\n        public enum ProcessAccessFlags : uint {\n            All = 0x001F0FFF,\n            Terminate = 0x00000001,\n            CreateThread = 0x00000002,\n            VirtualMemoryOperation = 0x00000008,\n            VirtualMemoryRead = 0x00000010,\n            VirtualMemoryWrite = 0x00000020,\n            DuplicateHandle = 0x00000040,\n            CreateProcess = 0x000000080,\n            SetQuota = 0x00000100,\n            SetInformation = 0x00000200,\n            QueryInformation = 0x00000400,\n            QueryLimitedInformation = 0x00001000,\n            Synchronize = 0x00100000\n        }\n        [DllImport(\"kernel32.dll\", SetLastError = true)]\n        [return: MarshalAs(UnmanagedType.Bool)]\n        static extern bool CloseHandle(IntPtr hObject);\n\n\n\n\n        public static int GetYPosition(Taskbar t) {\n            if (!NeedsTAP() || IsInjecting) return 0;\n            if (version > 0 && version < TAPVERSION) return 0;\n\n            if (dataPtr == IntPtr.Zero) dataPtr = GetDataPtr();\n            ReadProcessMemory(proc, dataPtr, rtdStruct, Marshal.SizeOf<RainbowTaskbarData>(), out _);\n            var data = Marshal.PtrToStructure<RainbowTaskbarData>(rtdStruct);\n\n            var x = data.lTaskbarInfo.FirstOrDefault(x => x.taskbar == t.taskbarHelper.HWND, new()).YPosition;\n            return x;\n        }\n        public static string GetUIDataStr(Taskbar t) {\n            if (!NeedsTAP() || IsInjecting) return string.Empty;\n            if (version > 0 && version < TAPVERSION) return string.Empty;\n\n            if (dataPtr == IntPtr.Zero) dataPtr = GetDataPtr();\n            ReadProcessMemory(proc, dataPtr, rtdStruct, Marshal.SizeOf<RainbowTaskbarData>(), out _);\n            var data = Marshal.PtrToStructure<RainbowTaskbarData>(rtdStruct);\n\n            var x = data.lTaskbarInfo2.FirstOrDefault(x => x.taskbar == t.taskbarHelper.HWND, new());\n            var alloc = Marshal.AllocHGlobal(x.UIDataSize);\n            ReadProcessMemory(proc, x.UIDataPtr, alloc, x.UIDataSize, out _);\n\n            string st = Marshal.PtrToStringUni(alloc);\n            Marshal.FreeHGlobal(alloc);\n\n            return st;\n        }\n\n        [Serializable]\n        public class UIData {\n            [JsonPropertyName(\"stfPt\")]\n            public List<float> SystemTrayFramePoint { get; set; }\n            [JsonPropertyName(\"stfSize\")]\n            public List<float> SystemTrayFrameSize { get; set; }\n            [JsonPropertyName(\"tfrPt\")]\n            public List<float> TaskbarFrameRepeaterPoint { get; set; }\n            [JsonPropertyName(\"tfrSize\")]\n            public List<float> TaskbarFrameRepeaterSize { get; set; }\n\n            public RectangleF SystemTrayFrame { get => new(SystemTrayFramePoint[0], SystemTrayFramePoint[1], SystemTrayFrameSize[0], SystemTrayFrameSize[1]); }\n            public RectangleF TaskbarFrameRepeater { get => new(TaskbarFrameRepeaterPoint[0], TaskbarFrameRepeaterPoint[1], TaskbarFrameRepeaterSize[0], TaskbarFrameRepeaterSize[1]); }\n        }\n\n        public static UIData GetUIData(Taskbar t) {\n            string str = GetUIDataStr(t);\n            if(!str.IsNullOrEmpty()) {\n                return JsonSerializer.Deserialize<UIData>(str);\n            }\n\n            return null;\n        }\n    }\n\n}\n"
  },
  {
    "path": "RainbowTaskbar/FodyWeavers.xml",
    "content": "﻿<Weavers xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"FodyWeavers.xsd\">\n    <PropertyChanged/>\n</Weavers>"
  },
  {
    "path": "RainbowTaskbar/HTTPAPI/WorkshopAPI.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Net.Http;\nusing System.Net;\nusing System.Text;\nusing System.Text.Json.Serialization;\nusing System.Threading.Tasks;\nusing RainbowTaskbar.Configuration;\nusing System.Net.Http.Json;\nusing RainbowTaskbar.Configuration.Web;\nusing System.IO;\nusing System.Text.Json;\nusing System.Dynamic;\nusing RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Editor.Pages;\nusing System.Drawing.Imaging;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Media;\nusing System.Windows.Controls;\nusing System.Windows.Threading;\n\nnamespace RainbowTaskbar.HTTPAPI {\n    public class AuthenticatedRequest {\n        [JsonPropertyName(\"key\")]\n        public string LoginKey { get; set; }\n    }\n    public class ResultResponse {\n        [JsonPropertyName(\"result\")]\n        public bool Result { get; set; }\n    }\n    public class PublishConfigRequest : AuthenticatedRequest {\n        [JsonPropertyName(\"title\")]\n        public string Title { get; set; }\n        [JsonPropertyName(\"configData\")]\n        public string Data { get; set; }\n        [JsonPropertyName(\"id\")]\n        public string? PublishedID { get; set; }\n        [JsonPropertyName(\"prevId\")]\n        public string? PreviousPublishedId { get; set; }\n        [JsonPropertyName(\"description\")]\n        public string Description { get; set; }\n        [JsonPropertyName(\"type\")]\n        public string Type { get; set; }\n    }\n    public class ConfigData {\n        [JsonPropertyName(\"title\")]\n        public string Title { get; set; }\n        [JsonPropertyName(\"data\")]\n        public string Data { get; set; }\n        [JsonPropertyName(\"description\")]\n        public string Description { get; set; }\n        [JsonPropertyName(\"type\")]\n        public string Type { get; set; }\n        [JsonPropertyName(\"id\")]\n        public string PublishedID { get; set; }\n        [JsonPropertyName(\"previousId\")]\n        public string PreviousPublishedID { get; set; }\n        [JsonPropertyName(\"datePublished\")]\n        public long Published { get; set; }\n        [JsonPropertyName(\"dateUpdated\")]\n        public long Updated { get; set; }\n        [JsonPropertyName(\"author\")]\n        public string AuthorUsername { get; set; }\n        [JsonPropertyName(\"likes\")]\n        public int LikeCount { get; set; }\n        [JsonPropertyName(\"comments\")]\n        public int CommentCount { get; set; }\n    }\n    public class PublishConfigResponse : ResultResponse {\n        [JsonPropertyName(\"config\")]\n        public ConfigData Data { get; set; }\n        \n    }\n\n    public class CommentData {\n        [JsonPropertyName(\"author\")]\n        public string AuthorUsername { get; set; }\n        [JsonPropertyName(\"content\")]\n        public string Content { get; set; }\n        [JsonPropertyName(\"datePublished\")]\n        public long Published { get; set; }\n        [JsonPropertyName(\"id\")]\n        public string ID { get; set; }\n\n        [JsonIgnore]\n        public bool OwnComment { get => AuthorUsername == App.Settings.AccountUsername || App.Settings.AccountUsername == \"ad2017gd\"; }\n    }\n\n    public class ConfigCommentsResponse : ResultResponse {\n        [JsonPropertyName(\"comments\")]\n        public List<CommentData> Comments { get; set; }\n    }\n    public class ConfigCommentRequest : AuthenticatedRequest {\n        [JsonPropertyName(\"content\")]\n        public string Content { get; set; }\n    }\n    public class ConfigCommentResponse : ResultResponse {\n        [JsonPropertyName(\"id\")]\n        public string ID { get; set; }\n    }\n\n    public class SearchConfigRequest {\n        [JsonPropertyName(\"search\")]\n        public string Search { get; set; }\n        [JsonPropertyName(\"page\")]\n        public int Page { get; set; }\n        [JsonPropertyName(\"sort\")]\n        public int Sort { get; set; }\n\n    }\n\n    public class LikedConfigsResponse {\n        [JsonPropertyName(\"search\")]\n        public List<string> Search { get; set; }\n\n    }\n    public class SearchConfigResponse : ResultResponse {\n        [JsonPropertyName(\"search\")]\n        public List<ConfigData> Results { get; set; }\n\n        public IEnumerable<Config?> Parse() {\n            return Results.Select(x => {\n                try {\n                    Config cfg = x.Type == \"web\" ? new WebConfig() : new InstructionConfig();\n                    cfg.InitNew();\n                    cfg.Name = x.Title;\n                    cfg.Description = x.Description;\n                    cfg.Updated = new DateTime(1970, 1, 1).AddMilliseconds(x.Updated);\n                    cfg.PublishedID = x.PublishedID;\n                    cfg.PreviousPublishedID = x.PreviousPublishedID;\n                    cfg.CachedPublisherUsername = x.AuthorUsername;\n                    cfg.ConfigData = JsonSerializer.Deserialize<Configuration.ConfigData>(x.Data, Config.SerializerOptions);\n                    cfg.CachedLikeCount = x.LikeCount;\n                    cfg.CachedCommentCount = x.CommentCount;\n\n                    return cfg;\n                } catch {\n                    return null;\n                }\n            }).Where(x=>x is not null);\n        }\n    }\n    public class ThumbnailConfigRequest : AuthenticatedRequest {\n        [JsonPropertyName(\"thumbnail\")]\n        public string Image { get; set; }\n\n    }\n\n    public class IssueRequest {\n        [JsonPropertyName(\"title\")]\n        public string Title { get; set; }\n        [JsonPropertyName(\"content\")]\n        public string Content { get; set; }\n        [JsonPropertyName(\"contact\")]\n        public string Contact { get; set; }\n\n    }\n    public class ExceptionRequest {\n        [JsonPropertyName(\"message\")]\n        public string Message { get; set; }\n\n    }\n    public class WorkshopAPI {\n        public string LoginKey { get; set; }\n        public async Task<PublishConfigResponse?> PublishConfigAsync(Config cfg) {\n            try {\n                using var http = new HttpClient();\n\n                var content = await http.PostAsJsonAsync(\"https://rnbsrv.ad2017.dev/user/me/publish\", new PublishConfigRequest { \n                    LoginKey = LoginKey,\n                    Title = cfg.Name,\n                    Data = JsonSerializer.Serialize(cfg.ConfigData, Config.SerializerOptions),\n                    PublishedID = cfg.PublishedID,\n                    PreviousPublishedId = cfg.PreviousPublishedID,\n                    Description = cfg.Description,\n                    Type = cfg is WebConfig ? \"web\" : \"instruction\"\n                });\n                var result = await content.Content.ReadFromJsonAsync<PublishConfigResponse>();\n\n                return result;\n            } catch (Exception e) {\n                return null;\n            }\n        }\n        public async Task<SearchConfigResponse?> SearchConfigsAsync(string search, SortBy sort, int page = 0) {\n            try {\n                using var http = new HttpClient();\n\n                var content = await http.PostAsJsonAsync(\"https://rnbsrv.ad2017.dev/config\", new SearchConfigRequest {\n                    Sort = (int)sort,\n                    Search = search,\n                    Page = page\n                });\n                var result = await content.Content.ReadFromJsonAsync<SearchConfigResponse>();\n\n                return result;\n            }\n            catch (Exception e) {\n                return null;\n            }\n        }\n        public async Task<ResultResponse?> DeleteConfigAsync(Config config) {\n            try {\n                using var http = new HttpClient();\n\n                var content = await http.PostAsJsonAsync($\"https://rnbsrv.ad2017.dev/user/me/config/{config.PublishedID}/delete\", new AuthenticatedRequest {\n                    LoginKey = LoginKey\n                });\n                var result = await content.Content.ReadFromJsonAsync<ResultResponse>();\n\n                return result;\n            }\n            catch (Exception e) {\n                return null;\n            }\n        }\n\n        public async Task<string?> DownloadThumbnailBase64(Config config, bool unverified = false) {\n            try {\n                using var http = new HttpClient();\n\n                var res = await http.PostAsJsonAsync($\"https://rnbsrv.ad2017.dev/{(unverified ? \"u/\" : \"\")}img/{config.PublishedID}.jpg\", new AuthenticatedRequest {\n                    LoginKey = LoginKey\n                });\n                if (res.StatusCode != HttpStatusCode.OK) return null;\n                var bytes = await res.Content.ReadAsByteArrayAsync();\n\n                return Convert.ToBase64String(bytes);\n            } catch {\n                return null;\n            }\n        }\n\n        public async Task<ResultResponse> VerifyThumbnail(Config config) {\n            try {\n                using var http = new HttpClient();\n\n                var content = await http.PostAsJsonAsync($\"https://rnbsrv.ad2017.dev/thumb/{config.PublishedID}/verify\", new AuthenticatedRequest {\n                    LoginKey = LoginKey\n                });\n                var result = await content.Content.ReadFromJsonAsync<ResultResponse>();\n\n                return result;\n            }\n            catch {\n                return null;\n            }\n        }\n\n        public async Task<LikedConfigsResponse> GetLikedConfigs() {\n            try {\n                using var http = new HttpClient();\n\n                var content = await http.PostAsJsonAsync($\"https://rnbsrv.ad2017.dev/user/me/liked\", new AuthenticatedRequest {\n                    LoginKey = LoginKey\n                });\n                var result = await content.Content.ReadFromJsonAsync<LikedConfigsResponse>();\n\n                return result;\n            }\n            catch {\n                return null;\n            }\n        }\n\n        public async Task<ConfigCommentsResponse> GetConfigComments(Config config) {\n            try {\n                using var http = new HttpClient();\n\n                var content = await http.PostAsJsonAsync($\"https://rnbsrv.ad2017.dev/config/{config.PublishedID}/comments\", new AuthenticatedRequest {\n                    LoginKey = LoginKey\n                });\n                var result = await content.Content.ReadFromJsonAsync<ConfigCommentsResponse>();\n\n                return result;\n            }\n            catch {\n                return null;\n            }\n        }\n        public async Task<ConfigCommentResponse> AddConfigComment(Config config, string comment) {\n            try {\n                using var http = new HttpClient();\n\n                var content = await http.PostAsJsonAsync($\"https://rnbsrv.ad2017.dev/config/{config.PublishedID}/comment\", new ConfigCommentRequest {\n                    Content = comment,\n                    LoginKey = LoginKey\n                });\n                var result = await content.Content.ReadFromJsonAsync<ConfigCommentResponse>();\n\n                return result;\n            }\n            catch {\n                return null;\n            }\n        }\n\n        public async Task<ResultResponse> DeleteConfigComment(Config config, string ID) {\n            try {\n                using var http = new HttpClient();\n\n                var content = await http.PostAsJsonAsync($\"https://rnbsrv.ad2017.dev/config/{config.PublishedID}/comment/{ID}/delete\", new AuthenticatedRequest {\n                    LoginKey = LoginKey\n                });\n                var result = await content.Content.ReadFromJsonAsync<ResultResponse>();\n\n                return result;\n            }\n            catch {\n                return null;\n            }\n        }\n\n        public async Task<ResultResponse> LikeConfig(Config cfg, bool like = true) {\n            try {\n                using var http = new HttpClient();\n\n                var content = await http.PostAsJsonAsync($\"https://rnbsrv.ad2017.dev/config/{cfg.PublishedID}/{(like ? \"\" : \"un\")}like\", new AuthenticatedRequest {\n                    LoginKey = LoginKey\n                });\n                var result = await content.Content.ReadFromJsonAsync<ResultResponse>();\n\n                return result;\n            }\n            catch {\n                return null;\n            }\n        }\n\n        public async Task<ResultResponse> SubmitIssue(string title, string desc, string contact) {\n            try {\n                using var http = new HttpClient();\n\n                var content = await http.PostAsJsonAsync($\"https://rnbsrv.ad2017.dev/issue\", new IssueRequest {\n                    Title = title,\n                    Contact = contact == \"\" || contact == string.Empty ? \"Not provided\" : contact,\n                    Content = desc\n                });\n                var result = await content.Content.ReadFromJsonAsync<ResultResponse>();\n\n                return result;\n            }\n            catch {\n                return null;\n            }\n        }\n        public async Task<ResultResponse> ReportException(Exception e) {\n            try {\n                using var http = new HttpClient();\n\n                var content = await http.PostAsJsonAsync($\"https://rnbsrv.ad2017.dev/exception\", new ExceptionRequest {\n                    Message = e.Message + \"\\n\" + e.StackTrace,\n                });\n                var result = await content.Content.ReadFromJsonAsync<ResultResponse>();\n\n                return result;\n            }\n            catch {\n                return null;\n            }\n        }\n\n\n        public async Task<ResultResponse?> SetConfigThumbnail(Config config, Image img) {\n            try {\n                using var http = new HttpClient();\n\n                string base64img = \"\";\n\n                img.Dispatcher.Invoke(() => {\n                    using (MemoryStream m = new MemoryStream()) {\n                        var bitmap = new TransformedBitmap((BitmapSource) img.Source,\n                            new ScaleTransform(\n                            720.0 / img.Source.Height,\n                            720.0 / img.Source.Height));\n\n                        var bmpEncoder = new JpegBitmapEncoder();\n                        bmpEncoder.Frames.Add(BitmapFrame.Create(bitmap));\n                        bmpEncoder.Save(m);\n\n                        byte[] imageBytes = m.ToArray();\n\n                        base64img = Convert.ToBase64String(imageBytes);\n                    }\n                });\n                \n\n                var content = await http.PostAsJsonAsync($\"https://rnbsrv.ad2017.dev/user/me/config/{config.PublishedID}/thumbnail\", new ThumbnailConfigRequest {\n                    LoginKey = LoginKey,\n                    Image = base64img\n                });\n                var result = await content.Content.ReadFromJsonAsync<ResultResponse>();\n\n                return result;\n            }\n            catch (Exception e) {\n                return null;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Helpers/AutoUpdate.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Http;\nusing System.Reflection;\nusing System.Runtime.Serialization;\nusing System.Runtime.Serialization.Json;\nusing System.Security.AccessControl;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing RainbowTaskbar.Configuration;\n\nnamespace RainbowTaskbar.Helpers;\n\ninternal static class AutoUpdate {\n    public static void CheckForUpdate() =>\n        Task.Run(async () => {\n\n\n            using var http = new HttpClient();\n            using var web = new WebClient();\n            http.DefaultRequestHeaders.Add(\"User-Agent\", \"RainbowTaskbar\");\n            var content =\n                await http.GetStreamAsync(\"https://api.github.com/repos/ad2017gd/RainbowTaskbar/releases/latest\");\n\n            var ser = new DataContractJsonSerializer(typeof(GitHubAPIResponse));\n            var response = ser.ReadObject(content) as GitHubAPIResponse;\n            if (Assembly.GetExecutingAssembly().GetName().Version.CompareTo(Version.Parse(response.TagName)) < 0) {\n                // Outdated version\n                var res = MessageBox.Show(App.localization.Get(\"msgbox_update\"),\n                    \"RainbowTaskbar\", MessageBoxButton.YesNo, MessageBoxImage.Information);\n                if (res == MessageBoxResult.Yes) {\n                    var asset = response.Assets.First(asset => asset.Name.StartsWith($\"rnbtsk-{System.Runtime.InteropServices.RuntimeInformation.OSArchitecture.ToString().ToLower()}\"));\n\n                    var uri = new Uri(asset.BrowserDownloadUrl);\n                    var oldfile = Environment.ProcessPath;\n                    var newfile = $\"{Environment.ProcessPath}_new.exe\";\n\n                    var programfilesX86 = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);\n                    var verb = \"\";\n                    var programfiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);\n                    if (Environment.ProcessPath.StartsWith(programfilesX86, StringComparison.OrdinalIgnoreCase) || Environment.ProcessPath.StartsWith(programfiles, StringComparison.OrdinalIgnoreCase)) {\n                        verb = \"runas\";\n                        newfile = Environment.ExpandEnvironmentVariables(\"%temp%\\\\rnbtsk_newver_.exe\");\n                    }\n\n                    await web.DownloadFileTaskAsync(uri, newfile);\n\n\n\n\n                    var data = false;\n                    var proc = Process.Start(\n                        new ProcessStartInfo {\n                            UseShellExecute = verb == \"runas\",\n                            Verb = verb,\n                            Arguments =\n                                $\"/C echo p && timeout /t 1 /nobreak > nul && taskkill /f /im \\\"{Process.GetCurrentProcess().MainModule.ModuleName}\\\" > nul && timeout /t 1 /nobreak > nul && move /y \\\"{newfile}\\\" \\\"{oldfile}\\\" > nul\",\n                            FileName = \"cmd\",\n                            WindowStyle = ProcessWindowStyle.Hidden\n                        }\n                    );\n                    var procStart = Process.Start(\n                        new ProcessStartInfo {\n                            Arguments =\n                                $\"/C timeout /t 10 /nobreak > nul && start \\\"\\\" \\\"{oldfile}\\\"\",\n                            FileName = \"cmd\",\n                            WindowStyle = ProcessWindowStyle.Hidden\n                        }\n                    );\n                }\n            }\n        });\n    public static async Task<string> GetLatestBody() {\n        using var http = new HttpClient();\n        using var web = new WebClient();\n        http.DefaultRequestHeaders.Add(\"User-Agent\", \"RainbowTaskbar\");\n        var content =\n            await http.GetStreamAsync(\"https://api.github.com/repos/ad2017gd/RainbowTaskbar/releases/latest\");\n\n        var ser = new DataContractJsonSerializer(typeof(GitHubAPIResponse));\n        var response = ser.ReadObject(content) as GitHubAPIResponse;\n        return response.Body;\n    }\n        \n\n    [DataContract]\n    public class Asset {\n        [DataMember(Name = \"name\")] public string Name { get; set; }\n\n        [DataMember(Name = \"label\")] public string Label { get; set; }\n\n        [DataMember(Name = \"browser_download_url\")]\n        public string BrowserDownloadUrl { get; set; }\n    }\n\n    [DataContract]\n    public class GitHubAPIResponse {\n        [DataMember(Name = \"tag_name\")] public string TagName { get; set; }\n\n        [DataMember(Name = \"name\")] public string Name { get; set; }\n\n        [DataMember(Name = \"body\")] public string Body { get; set; }\n\n        [DataMember(Name = \"assets\")] public List<Asset> Assets { get; set; }\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/Helpers/Cache.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace RainbowTaskbar.Helpers {\n    public class Cache<T> {\n        public T Value { get; set; }\n        public DateTime LastUpdated { get; set; } = DateTime.Now;\n        public TimeSpan UpdateInterval { get; set; } = TimeSpan.FromDays(1);\n        public bool NeedsUpdate { get => DateTime.Now >= LastUpdated + UpdateInterval; }\n        public Cache(T value, TimeSpan interval) { Value = value; UpdateInterval = interval; }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Helpers/DPIUtil.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Security;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Interop;\n\nnamespace RainbowTaskbar.Helpers {\n\n    // https://stackoverflow.com/a/76402250\n    public static class DPIUtil {\n        /// <summary>\n        /// Min OS version build that supports DPI per monitor\n        /// </summary>\n        private const int MinOSVersionBuild = 14393;\n\n        /// <summary>\n        /// Min OS version major build that support DPI per monitor\n        /// </summary>\n        private const int MinOSVersionMajor = 10;\n\n        /// <summary>\n        /// Flag, if OS supports DPI per monitor\n        /// </summary>\n        private static bool _isSupportingDpiPerMonitor;\n\n        /// <summary>\n        /// Flag, if OS version checked\n        /// </summary>\n        private static bool _isOSVersionChecked;\n\n        /// <summary>\n        /// Flag, if OS supports DPI per monitor\n        /// </summary>\n        internal static bool IsSupportingDpiPerMonitor {\n            get {\n                if (_isOSVersionChecked) {\n                    return _isSupportingDpiPerMonitor;\n                }\n\n                _isOSVersionChecked = true;\n                var osVersionInfo = new OSVERSIONINFOEXW {\n                    dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEXW))\n                };\n\n                if (RtlGetVersion(ref osVersionInfo) != 0) {\n                    _isSupportingDpiPerMonitor = Environment.OSVersion.Version.Major >= MinOSVersionMajor && Environment.OSVersion.Version.Build >= MinOSVersionBuild;\n\n                    return _isSupportingDpiPerMonitor;\n                }\n\n                _isSupportingDpiPerMonitor = osVersionInfo.dwMajorVersion >= MinOSVersionMajor && osVersionInfo.dwBuildNumber >= MinOSVersionBuild;\n\n                return _isSupportingDpiPerMonitor;\n            }\n        }\n\n        public static double ScaleFactor(Taskbar window) {\n            var dpi = GetDpi(window);\n\n            return dpi / 96.0;\n        }\n        [DllImport(\"user32.dll\", SetLastError = true)]\n        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);\n\n        [StructLayout(LayoutKind.Sequential)]\n        public struct POINT {\n            public int X;\n            public int Y;\n\n            public POINT(int x, int y) {\n                this.X = x;\n                this.Y = y;\n            }\n\n            public static implicit operator System.Drawing.Point(POINT p) {\n                return new System.Drawing.Point(p.X, p.Y);\n            }\n\n            public static implicit operator POINT(System.Drawing.Point p) {\n                return new POINT(p.X, p.Y);\n            }\n\n            public static implicit operator POINT(System.Windows.Point p) {\n                return new POINT((int)p.X, (int)p.Y);\n            }\n\n            public override string ToString() {\n                return $\"X: {X}, Y: {Y}\";\n            }\n        }\n\n        [DllImport(\"user32.dll\", SetLastError = true)]\n        static extern IntPtr MonitorFromPoint(POINT pt, MonitorOptions dwFlags);\n\n        enum MonitorOptions : uint {\n            MONITOR_DEFAULTTONULL = 0x00000000,\n            MONITOR_DEFAULTTOPRIMARY = 0x00000001,\n            MONITOR_DEFAULTTONEAREST = 0x00000002\n        }\n        public static uint GetDpi(Taskbar window) {\n            uint dpiX, dpiY;\n\n            if (IsSupportingDpiPerMonitor) {\n                POINT pt = new POINT(0, 0);\n                if(window is not null && window.IsVisible) {\n                    return GetDpiForWindow(window.taskbarHelper.HWND);\n                } \n                var monitorFromPoint = MonitorFromPoint(pt, MonitorOptions.MONITOR_DEFAULTTONEAREST);\n\n                GetDpiForMonitor(monitorFromPoint, DpiType.Effective, out dpiX, out dpiY);\n            }\n            else {\n                return 96;\n            }\n\n            return dpiX;\n        }\n\n       \n        [DllImport(\"user32.dll\")]\n        static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags);\n        /// <summary>\n        /// Queries the dots per inch (dpi) of a display.\n        /// </summary>\n        /// <param name=\"hmonitor\"> Handle of the monitor being queried. </param>\n        /// <param name=\"dpiType\"> The type of DPI being queried. </param>\n        /// <param name=\"dpiX\"> The value of the DPI along the X axis. </param>\n        /// <param name=\"dpiY\"> The value of the DPI along the Y axis. </param>\n        /// <returns> Status success </returns>\n        /// <remarks>\n        /// <see cref=\"https://learn.microsoft.com/en-us/windows/win32/api/shellscalingapi/nf-shellscalingapi-getdpiformonitor\"/>\n        /// </remarks>\n        [DllImport(\"Shcore.dll\")]\n        private static extern IntPtr GetDpiForMonitor([In] IntPtr hmonitor, [In] DpiType dpiType, [Out] out uint dpiX, [Out] out uint dpiY);\n\n        [DllImport(\"User32.dll\")]\n        private static extern uint GetDpiForWindow([In] IntPtr window);\n\n\n\n        /// <summary>\n        /// The RtlGetVersion routine returns version information about the currently running operating system.\n        /// </summary>\n        /// <param name=\"versionInfo\"> Operating system version information </param>\n        /// <returns> Status success</returns>\n        /// <remarks>\n        /// <see cref=\"https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-rtlgetversion\"/>\n        /// </remarks>\n        [SecurityCritical]\n        [DllImport(\"ntdll.dll\", SetLastError = true)]\n        private static extern int RtlGetVersion(ref OSVERSIONINFOEXW versionInfo);\n\n        /// <summary>\n        /// Contains operating system version information.\n        /// </summary>\n        /// <remarks>\n        /// <see cref=\"https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-osversioninfoexw\"/>\n        /// </remarks>\n        [StructLayout(LayoutKind.Sequential)]\n        private struct OSVERSIONINFOEXW {\n            /// <summary>\n            /// The size of this data structure, in bytes\n            /// </summary>\n            internal int dwOSVersionInfoSize;\n\n            /// <summary>\n            /// The major version number of the operating system.\n            /// </summary>\n            internal int dwMajorVersion;\n\n            /// <summary>\n            /// The minor version number of the operating system.\n            /// </summary>\n            internal int dwMinorVersion;\n\n            /// <summary>\n            /// The build number of the operating system.\n            /// </summary>\n            internal int dwBuildNumber;\n\n            /// <summary>\n            /// The operating system platform.\n            /// </summary>\n            internal int dwPlatformId;\n\n            /// <summary>\n            /// A null-terminated string, such as \"Service Pack 3\", that indicates the latest Service Pack installed on the system.\n            /// </summary>\n            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]\n            internal string szCSDVersion;\n\n            /// <summary>\n            /// The major version number of the latest Service Pack installed on the system. \n            /// </summary>\n            internal ushort wServicePackMajor;\n\n            /// <summary>\n            /// The minor version number of the latest Service Pack installed on the system.\n            /// </summary>\n            internal ushort wServicePackMinor;\n\n            /// <summary>\n            /// A bit mask that identifies the product suites available on the system. \n            /// </summary>\n            internal short wSuiteMask;\n\n            /// <summary>\n            /// Any additional information about the system.\n            /// </summary>\n            internal byte wProductType;\n\n            /// <summary>\n            /// Reserved for future use.\n            /// </summary>\n            internal byte wReserved;\n        }\n\n        /// <summary>\n        /// DPI type\n        /// </summary>\n        /// <remarks>\n        /// <see cref=\"https://learn.microsoft.com/en-us/windows/win32/api/shellscalingapi/ne-shellscalingapi-monitor_dpi_type\"/>\n        /// </remarks>\n        private enum DpiType {\n            /// <summary>\n            /// The effective DPI. This value should be used when determining the correct scale factor for scaling UI elements.\n            /// </summary>\n            Effective = 0,\n\n            /// <summary>\n            /// The angular DPI. This DPI ensures rendering at a compliant angular resolution on the screen.\n            /// </summary>\n            Angular = 1,\n\n            /// <summary>\n            /// The raw DPI. This value is the linear DPI of the screen as measured on the screen itself. Use this value when you want to read the pixel density and not the recommended scaling setting.\n            /// </summary>\n            Raw = 2,\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Helpers/HiddenWebViewHost.xaml",
    "content": "﻿<Window x:Class=\"RainbowTaskbar.Helpers.HiddenWebViewHost\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:RainbowTaskbar.Helpers\" xmlns:wpf=\"clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf\"\n        mc:Ignorable=\"d\"\n        Background=\"#01FFFFFF\"\n        ShowInTaskbar=\"False\"\n        AllowsTransparency=\"True\"\n        WindowStyle=\"None\"\n        Title=\"HiddenWebViewHost\" Height=\"1\" Width=\"1\">\n    <Grid Background=\"#00FFFF00\">\n        <wpf:WebView2 x:Name=\"webView_\" DefaultBackgroundColor=\"Transparent\"></wpf:WebView2>\n    </Grid>\n</Window>\n"
  },
  {
    "path": "RainbowTaskbar/Helpers/HiddenWebViewHost.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Shapes;\n\nnamespace RainbowTaskbar.Helpers {\n    /// <summary>\n    /// Interaction logic for HiddenWebViewHost.xaml\n    /// </summary>\n    public partial class HiddenWebViewHost : Window {\n        public HiddenWebViewHost() {\n            InitializeComponent();\n            WindowHelper.InitOther(this);\n            Width = 2000;\n            Height = 100;\n            Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Helpers/JsonColorConverter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Threading.Tasks;\n\nnamespace RainbowTaskbar.Helpers {\n    public class JsonColorConverter : JsonConverter<Color> {\n        public override Color Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => Color.FromArgb(reader.GetInt32());\n\n        public override void Write(Utf8JsonWriter writer, Color value, JsonSerializerOptions options) => writer.WriteNumberValue(value.ToArgb());\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Helpers/Taskbar.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace RainbowTaskbar.Helpers;\n\npublic class TaskbarHelper {\n\n\n    public enum DWMWINDOWATTRIBUTE : uint {\n        NCRenderingEnabled = 1,\n        NCRenderingPolicy,\n        TransitionsForceDisabled,\n        AllowNCPaint,\n        CaptionButtonBounds,\n        NonClientRtlLayout,\n        ForceIconicRepresentation,\n        Flip3DPolicy,\n        ExtendedFrameBounds,\n        HasIconicBitmap,\n        DisallowPeek,\n        ExcludedFromPeek,\n        Cloak,\n        Cloaked,\n        FreezeRepresentation,\n        DWMWA_PASSIVE_UPDATE_MODE,\n        DWMWA_USE_HOSTBACKDROPBRUSH,\n        DWMWA_USE_IMMERSIVE_DARK_MODE = 20,\n        DWMWA_WINDOW_CORNER_PREFERENCE = 33,\n        DWMWA_BORDER_COLOR,\n        DWMWA_CAPTION_COLOR,\n        DWMWA_TEXT_COLOR,\n        DWMWA_VISIBLE_FRAME_BORDER_THICKNESS,\n        DWMWA_LAST\n\n    }\n\n\n    [DllImport(\"dwmapi.dll\", PreserveSig = true)]\n    public static extern int DwmSetWindowAttribute(IntPtr hwnd, DWMWINDOWATTRIBUTE attr, ref int attrValue, int attrSize);\n\n    public delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);\n\n    public enum CombineRgnStyles {\n        RGN_AND = 1,\n        RGN_OR = 2,\n        RGN_XOR = 3,\n        RGN_DIFF = 4,\n        RGN_COPY = 5,\n        RGN_MIN = RGN_AND,\n        RGN_MAX = RGN_COPY\n    }\n\n    public enum TaskbarStyle {\n        Default,\n        Blur,\n        Transparent,\n        ForceDefault // temporary value\n    }\n\n    public const int GWL_EXSTYLE = -20;\n    public const int WS_EX_LAYERED = 0x80000;\n    public const int LWA_ALPHA = 0x2;\n    public const int LWA_COLORKEY = 0x1;\n\n    private const uint EVENT_OBJECT_LOCATIONCHANGE = 0x800B;\n    private const uint WINEVENT_OUTOFCONTEXT = 0;\n\n    public const int WM_DWMCOMPOSITIONCHANGED = 0x031E;\n\n    private float scale;\n    private byte _alpha = 255;\n\n    public bool autoHide = IsAutoHide();\n\n    public bool first = false;\n    public bool last = false;\n\n    private IntPtr hhook;\n\n    public IntPtr HWND = (IntPtr) 0;\n\n    private bool layered;\n    private int old_radius = 0;\n\n    private WinEventDelegate procDelegate;\n    private WinEventDelegate proc2Delegate;\n    public int Radius = 0;\n    public int YOffset = 0;\n\n\n    private IntPtr rgn = IntPtr.Zero;\n    public bool Secondary;\n    public TaskbarStyle Style = TaskbarStyle.Default;\n    public Taskbar window = null;\n\n    public TaskbarHelper(IntPtr hWnd, bool secondary = false) {\n        HWND = hWnd;\n        Secondary = secondary;\n        scale = GetScalingFactor();\n\n        SendMessage(HWND, WM_DWMCOMPOSITIONCHANGED, 1, null);\n    }\n\n    public event EventHandler TaskbarPositionChanged;\n\n    [DllImport(\"user32.dll\")]\n    private static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);\n\n    [DllImport(\"user32.dll\")]\n    public static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);\n\n    [DllImport(\"user32.dll\", EntryPoint = \"GetWindowLong\")]\n    public static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);\n\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);\n\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr hWndChildAfter, string className, string windowTitle);\n\n\n    [DllImport(\"user32.dll\")]\n    private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);\n\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy,\n        int uFlags);\n\n    [DllImport(\"user32.dll\")]\n    private static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,\n        IntPtr lParam);\n\n\n    [DllImport(\"user32.dll\")]\n    private static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr\n            hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess,\n        uint idThread, uint dwFlags);\n\n    [DllImport(\"user32.dll\")]\n    private static extern bool UnhookWinEvent(IntPtr hWinEventHook);\n\n    [DllImport(\"user32.dll\")]\n    internal static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data);\n\n    [DllImport(\"user32.dll\")]\n    internal static extern bool GetWindowCompositionAttribute(IntPtr point, ref WindowCompositionAttributeData data);\n\n\n    private void WinEventProc(IntPtr hWinEventHook, uint eventType,\n        IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) {\n        if (hwnd != HWND) return;\n        if (idObject != 0 || idChild != 0) return;\n\n        if (window is not null && window.TaskbarClip is not null) \n            window.TaskbarClip.Rect = new(0, 0, window.Width, window.Height);\n        var raise = TaskbarPositionChanged;\n        if (raise != null) raise(null, null);\n    }\n\n    public void PositionChangedHook() {\n        procDelegate = WinEventProc;\n        hhook = SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE, EVENT_OBJECT_LOCATIONCHANGE, IntPtr.Zero,\n            procDelegate, 0, 0, WINEVENT_OUTOFCONTEXT);\n\n        \n    }\n\n    public void PositionChangedUnhook() => UnhookWinEvent(hhook);\n\n    public void SetAlpha(double alpha) {\n        if (!IsWindow(HWND)) return;\n        if (!layered) {\n            SetWindowLong(HWND, GWL_EXSTYLE, (uint) GetWindowLong(HWND, GWL_EXSTYLE).ToInt32() | WS_EX_LAYERED);\n            layered = true;\n        }\n        // I have no idea what the reasoning behind this is, but it probably meant something when i first did it so we're keeping it!\n        if (_alpha != (byte) (alpha * 255)) {\n            SetLayeredWindowAttributes(HWND, 0, (byte) (alpha * 255), LWA_ALPHA);\n            _alpha = (byte) (alpha * 255);\n        } else {\n            SetLayeredWindowAttributes(HWND, 0, 254, LWA_ALPHA);\n            _alpha = 254;\n        }\n        \n    }\n\n    [DllImport(\"user32\")]\n    public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);\n\n    [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n    public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam,\n        [MarshalAs(UnmanagedType.LPWStr)] string lParam);\n\n    [DllImport(\"user32.dll\")]\n    public static extern bool IsWindow(IntPtr hWnd);\n\n\n    public void SetBlur() {\n        if (!IsWindow(HWND)) return;\n        if (ExplorerTAP.ExplorerTAP.NeedsTAPCache) return;\n        var accent = new AccentPolicy();\n        switch (Style) {\n            case TaskbarStyle.Default:\n                return;\n            case TaskbarStyle.ForceDefault:\n                Style = TaskbarStyle.Default;\n\n                SendMessage(HWND, WM_DWMCOMPOSITIONCHANGED, 1, null);\n                return;\n            case TaskbarStyle.Blur:\n                accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND;\n                break;\n            case TaskbarStyle.Transparent:\n                accent.AccentState = AccentState.ACCENT_ENABLE_TRANSPARENTGRADIENT;\n                break;\n            default: return;\n        }\n\n        unchecked {\n            accent.GradientColor = 0x01000000;\n        }\n\n        ;\n        accent.AccentFlags = 0;\n        accent.AnimationId = 2;\n\n        var accentStructSize = Marshal.SizeOf(accent);\n\n        var accentPtr = Marshal.AllocHGlobal(accentStructSize);\n        Marshal.StructureToPtr(accent, accentPtr, false);\n\n        var data = new WindowCompositionAttributeData();\n        data.Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY;\n        data.SizeOfData = accentStructSize;\n        data.Data = accentPtr;\n\n        GetWindowCompositionAttribute(HWND, ref data);\n\n\n        SetWindowCompositionAttribute(HWND, ref data);\n\n        Marshal.FreeHGlobal(accentPtr);\n    }\n\n    public System.Drawing.Point GetPoint() {\n        if (!IsWindow(HWND)) return new System.Drawing.Point(0,0);\n        RECT rc;\n        GetWindowRect(HWND, out rc);\n\n        return new System.Drawing.Point(rc.Left, rc.Top);\n    }\n    private int oldActualHeight = 0;\n    public Rectangle GetRealRectangle() {\n        if (!IsWindow(HWND)) return new Rectangle(0, 0, 0, 0);\n        RECT rc;\n        GetWindowRect(HWND, out rc);\n        return new Rectangle(rc.Left, rc.Top, rc.Right - rc.Left, rc.Bottom - rc.Top);\n    }\n    public Rectangle GetRectangle(bool scaling = true) {\n        if (!IsWindow(HWND)) return new Rectangle(0, 0, 0, 0);\n        RECT rc;\n        GetWindowRect(HWND, out rc);\n\n        if(ExplorerTAP.ExplorerTAP.NeedsTAPCache) {\n            var actualPos = ExplorerTAP.ExplorerTAP.GetYPosition(window);\n            ;\n            rc.Top += (int)(actualPos * (scaling ? GetScalingFactor() : 1));\n            //rc.Bottom += actualPos;\n        }\n\n        return new Rectangle(rc.Left, rc.Top + YOffset, rc.Right - rc.Left, rc.Bottom - rc.Top - YOffset);\n    }\n\n    enum QUERY_USER_NOTIFICATION_STATE {\n        QUNS_NOT_PRESENT = 1,\n        QUNS_BUSY = 2,\n        QUNS_RUNNING_D3D_FULL_SCREEN = 3,\n        QUNS_PRESENTATION_MODE = 4,\n        QUNS_ACCEPTS_NOTIFICATIONS = 5,\n        QUNS_QUIET_TIME = 6,\n        QUNS_APP = 7\n    };\n    [DllImport(\"shell32.dll\")]\n    static extern int SHQueryUserNotificationState(\n     out QUERY_USER_NOTIFICATION_STATE pquns);\n\n\n    public void PlaceWindowUnder(Taskbar window) {\n        if (!IsWindow(HWND)) return;\n\n        UpdateRadius();\n        var rect = GetRectangle();\n\n\n        SetWindowPos(window.windowHelper.HWND, HWND, rect.X, rect.Y, 0, 0,\n            SWP.NOACTIVATE | SWP.SHOWWINDOW | SWP.NOSIZE);\n        if (window.Width != rect.Width * (1 / scale)) window.Width = rect.Width * (1/scale);\n        var off = App.Settings.GraphicsRepeat ? 0 : window.UnderlayOffset;\n        if (window.Height - off != rect.Height * (1 / scale)) window.Height = rect.Height * (1 / scale) - off;\n\n\n    }\n\n\n    //SetWindowLong(HWND, GWL_EXSTYLE, (uint)((int)GetWindowLong(HWND, GWL_EXSTYLE) | WS_EX_LAYERED));\n    [DllImport(\"shell32.dll\")]\n    private static extern IntPtr SHAppBarMessage(uint dwMessage,\n        ref APPBARDATA pData);\n\n    private static bool IsAutoHide() {\n        var appbar = new APPBARDATA {cbSize = Marshal.SizeOf(typeof(APPBARDATA))};\n        var state = (uint) SHAppBarMessage(4, ref appbar);\n        return (state & 1) == 1;\n    }\n\n    [DllImport(\"user32.dll\")]\n    private static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw);\n\n    [DllImport(\"gdi32.dll\")]\n    private static extern IntPtr CreateRoundRectRgn(int x1, int y1, int x2, int y2, int cx, int cy);\n\n    [DllImport(\"gdi32.dll\")]\n    private static extern IntPtr CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);\n\n    [DllImport(\"gdi32.dll\")]\n    private static extern int CombineRgn(IntPtr hrgnDest, IntPtr hrgnSrc1, IntPtr hrgnSrc2,\n        CombineRgnStyles fnCombineMode);\n\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    private static extern IntPtr GetDC(IntPtr hWnd);\n\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    private static extern int ReleaseDC(IntPtr hWnd, IntPtr hdc);\n\n    [DllImport(\"gdi32.dll\")]\n    private static extern int GetDeviceCaps(IntPtr hdc, int nIndex);\n\n    [DllImport(\"gdi32.dll\", EntryPoint = \"DeleteObject\")]\n    [return: MarshalAs(UnmanagedType.Bool)]\n    public static extern bool DeleteObject([In] IntPtr hObject);\n\n    [DllImport(\"user32.dll\")]\n    private static extern int GetWindowRgn(IntPtr hWnd, IntPtr hRgn);\n\n    public static int GetSystemDpi() {\n        using (Graphics screen = Graphics.FromHwnd(IntPtr.Zero)) {\n            IntPtr hdc = screen.GetHdc();\n\n            int virtualWidth = GetDeviceCaps(hdc, 8);\n            int physicalWidth = GetDeviceCaps(hdc,118);\n            screen.ReleaseHdc(hdc);\n\n            return (int) (96f * physicalWidth / virtualWidth);\n        }\n    }\n\n    public float GetScalingFactor() {\n        if (DPIUtil.IsSupportingDpiPerMonitor) return (float)DPIUtil.ScaleFactor(window);\n\n        var desktop = GetDC(IntPtr.Zero);\n        var real = GetDeviceCaps(desktop, 10);\n        var fals = GetDeviceCaps(desktop, 117);\n\n        var scale = fals / (float) real;\n        ReleaseDC(IntPtr.Zero, desktop);\n        return scale;\n    }\n\n    [DllImport(\"gdi32.dll\")]\n    public static extern int OffsetRgn(IntPtr hrgn, int nXOffset, int nYOffset);\n    private TaskbarStyle old_style = TaskbarStyle.ForceDefault;\n    public bool UpdateRadius() {\n\n        if (!IsWindow(HWND)) return false;\n        if (old_radius != Radius && old_style != Style) {\n            old_radius = Radius;\n            old_style = Style;\n\n            var scale = GetScalingFactor();\n\n            var r = GetRealRectangle();\n\n            var w = (int) ((r.Width) * scale);\n            var h = (int) ((r.Height) * scale);\n\n            if (!autoHide && App.taskbars.Count > 1 && !App.Settings.SameRadiusOnEach) {\n                rgn = CreateRectRgn(0, 0, 0, 0);\n                if (last) {\n                    var rgn2 = CreateRectRgn(0, 0, w / 2, h + 1);\n                    var rgn1 = CreateRoundRectRgn(w / 3, 0, w + 1, h + 1, Radius, Radius);\n                    CombineRgn(rgn, rgn1, rgn2, CombineRgnStyles.RGN_OR);\n                    if(SetWindowRgn(HWND, rgn, true) != 0) DeleteObject(rgn);\n\n                    DeleteObject(rgn1);\n                    DeleteObject(rgn2);\n\n                    window.Dispatcher.Invoke(() => {\n                        window.TaskbarClip.RadiusX = window.TaskbarClip.RadiusY = Radius / 2;\n                        window.TaskbarClip.Rect = new(0, 0, window.Width, window.Height);\n\n                        window.TaskbarClipHide.RadiusX = window.TaskbarClipHide.RadiusY = 0;\n                        window.TaskbarClipHide.Rect = new(0, 0, Radius / 2, window.Height);\n                    });\n                }\n                else if (first){\n                    var rgn1 = CreateRoundRectRgn(0, 0, w + 1, h + 1, Radius, Radius);\n                    var rgn2 = CreateRectRgn(w / 2, 0, w + 1, h + 1);\n                    CombineRgn(rgn, rgn1, rgn2, CombineRgnStyles.RGN_OR);\n                    if(SetWindowRgn(HWND, rgn, true) != 0) DeleteObject(rgn);\n\n                    DeleteObject(rgn1);\n                    DeleteObject(rgn2);\n\n                    window.Dispatcher.Invoke(() => {\n                        window.TaskbarClip.RadiusX = window.TaskbarClip.RadiusY = Radius / 2;\n                        window.TaskbarClip.Rect = new(0, 0, window.Width, window.Height);\n\n                        window.TaskbarClipHide.RadiusX = window.TaskbarClipHide.RadiusY = 0;\n                        window.TaskbarClipHide.Rect = new(window.Width - Radius / 2, 0, Radius / 2, window.Height);\n                    });\n                }\n            }\n            else {\n                rgn = CreateRoundRectRgn(0, 0, w + 1, h + 1, Radius, Radius);\n                if(SetWindowRgn(HWND, rgn, true)!=0) DeleteObject(rgn);\n\n                window.Dispatcher.Invoke(() => {\n                    window.TaskbarClip.RadiusX = window.TaskbarClip.RadiusY = Radius / 2;\n                    window.TaskbarClip.Rect = new(0, 0, window.Width, window.Height);\n\n                    window.TaskbarClipHide.RadiusX = window.TaskbarClipHide.RadiusY = 0;\n                    window.TaskbarClipHide.Rect = new(0, 0, 0, 0);\n                });\n            }\n\n            rgn = CreateRectRgn(0, 0, 0, 0);\n            GetWindowRgn(HWND, rgn);\n            if(Style == TaskbarStyle.Default || Style == TaskbarStyle.Blur) {\n                if(SetWindowRgn(window.windowHelper.HWND, rgn, true) != 0) DeleteObject(rgn);\n            } else {\n                var rgn2 = CreateRectRgn(0, 0, w, h);\n                if(SetWindowRgn(window.windowHelper.HWND, rgn2, true) != 0) DeleteObject(rgn2);\n                DeleteObject(rgn);\n            }\n\n            return true;\n        }\n\n        return false;\n    }\n\n    [StructLayout(LayoutKind.Sequential)]\n    public struct RECT {\n        public int Left; // x position of upper-left corner\n        public int Top; // y position of upper-left corner\n        public int Right; // x position of lower-right corner\n        public int Bottom; // y position of lower-right corner\n    }\n\n    public static class SWP {\n        public static readonly int\n            NOSIZE = 0x0001,\n            NOMOVE = 0x0002,\n            NOZORDER = 0x0004,\n            NOREDRAW = 0x0008,\n            NOACTIVATE = 0x0010,\n            DRAWFRAME = 0x0020,\n            FRAMECHANGED = 0x0020,\n            SHOWWINDOW = 0x0040,\n            HIDEWINDOW = 0x0080,\n            NOCOPYBITS = 0x0100,\n            NOOWNERZORDER = 0x0200,\n            NOREPOSITION = 0x0200,\n            NOSENDCHANGING = 0x0400,\n            DEFERERASE = 0x2000,\n            ASYNCWINDOWPOS = 0x4000;\n    }\n\n    private delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType,\n        IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);\n\n    [StructLayout(LayoutKind.Sequential)]\n    internal struct WindowCompositionAttributeData {\n        public WindowCompositionAttribute Attribute;\n        public IntPtr Data;\n        public int SizeOfData;\n    }\n\n    internal enum WindowCompositionAttribute {\n        // ...\n        WCA_ACCENT_POLICY = 19\n        // ...\n    }\n\n    internal enum AccentState {\n        ACCENT_DISABLED = 0,\n        ACCENT_ENABLE_GRADIENT = 1,\n        ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,\n        ACCENT_ENABLE_BLURBEHIND = 3,\n        ACCENT_INVALID_STATE = 4\n    }\n\n    [StructLayout(LayoutKind.Sequential)]\n    internal struct AccentPolicy {\n        public AccentState AccentState;\n        public int AccentFlags;\n        public int GradientColor;\n        public int AnimationId;\n    }\n\n    [StructLayout(LayoutKind.Sequential)]\n    public struct APPBARDATA {\n        public int cbSize; // initialize this field using: Marshal.SizeOf(typeof(APPBARDATA));\n        public IntPtr hWnd;\n        public uint uCallbackMessage;\n        public uint uEdge;\n        public RECT rc;\n        public int lParam;\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/Helpers/Window.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Forms;\nusing System.Windows.Interop;\n\nnamespace RainbowTaskbar.Helpers;\n\npublic class WindowHelper {\n    public enum CombineRgnStyles {\n        RGN_AND = 1,\n        RGN_OR = 2,\n        RGN_XOR = 3,\n        RGN_DIFF = 4,\n        RGN_COPY = 5,\n        RGN_MIN = RGN_AND,\n        RGN_MAX = RGN_COPY\n    }\n\n    public static int Count;\n\n    public float scale;\n\n    public bool autoHide = IsAutoHide();\n    public IntPtr HWND = (IntPtr) 0;\n    public int Radius = 0;\n    public TaskbarHelper taskbar;\n\n\n    public Taskbar window;\n\n\n    public WindowHelper(Taskbar window, TaskbarHelper taskbarHelper) {\n        Count++;\n        this.window = window;\n        Init(taskbarHelper);\n        scale = taskbar.GetScalingFactor();\n    }\n\n    [DllImport(\"user32.dll\")]\n    public static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);\n\n    [DllImport(\"user32.dll\", EntryPoint = \"GetWindowLong\")]\n    public static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);\n\n    [DllImport(\"user32.dll\")]\n    static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags);\n\n\n    // size of a device name string\n    private const int CCHDEVICENAME = 32;\n\n    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]\n    internal struct MonitorInfoEx {\n        public int Size;\n        public RECT Monitor;\n        public RECT WorkArea;\n        public uint Flags;\n        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]\n        public string DeviceName;\n\n        public void Init() {\n            this.Size = 40 + 2 * CCHDEVICENAME;\n            this.DeviceName = string.Empty;\n        }\n    }\n\n    [DllImport(\"user32.dll\")]\n    static extern bool GetMonitorInfo(IntPtr hMonitor, out MonitorInfoEx lpmi);\n    [DllImport(\"gdi32.dll\", EntryPoint = \"DeleteObject\")]\n    [return: MarshalAs(UnmanagedType.Bool)]\n    public static extern bool DeleteObject([In] IntPtr hObject);\n\n    [DllImport(\"user32.dll\")]\n    static extern IntPtr WindowFromPoint(System.Drawing.Point p);\n\n    \n\n    public event EventHandler? TaskbarUIChanged;\n    public string LastUIData = \"\";\n\n    DateTime lastZIndex = DateTime.MinValue;\n\n\n\n    private void TaskbarPosChanged(object sender, EventArgs args) {\n\n        var rect = taskbar.GetRectangle();\n        var changed = Math.Abs(window.Left - rect.Left * (1 / scale)) > 0.001 || Math.Abs(window.Top - rect.Top * (1 / scale)) > 0.001 || Math.Abs(window.Width - rect.Width * (1 / scale)) > 0.001 || Math.Abs(window.Height - rect.Height * (1 / scale)) > 0.001;\n        if (changed) {\n            taskbar.PlaceWindowUnder(window);\n            taskbar.SetBlur();\n        }\n\n        if (DateTime.Now - lastZIndex > TimeSpan.FromSeconds(0.05) && !changed) {\n            lastZIndex = DateTime.Now;\n            taskbar.PlaceWindowUnder(window);\n            taskbar.SetBlur();\n        }\n\n        if(ExplorerTAP.ExplorerTAP.IsInjected) {\n            string UIData = ExplorerTAP.ExplorerTAP.GetUIDataStr(window);\n            if(UIData != LastUIData) {\n                LastUIData = UIData;\n                TaskbarUIChanged?.Invoke(this, null);\n            }\n        }\n\n       \n\n        if (!App.Settings.GraphicsRepeat && App.hiddenWebViewHost is not null && window.Height != rect.Height * (1 / scale)) {\n            App.hiddenWebViewHost.Height = App.taskbars.Max(x=>x.Height);\n        }\n        if(autoHide && changed) {\n            var Taskbar = rect;\n            var finalW = Taskbar.Width * (1 / scale);\n            var finalH = Taskbar.Width * (1 / scale);\n            if(finalW > window.MinWidth) {\n                window.MinWidth = Taskbar.Width * (1 / scale);\n                window.Width = Taskbar.Width * (1 / scale);\n            }\n            if (finalH > window.MinHeight) {\n                window.MinHeight = Taskbar.Height * (1 / scale);\n                window.Height = Taskbar.Height * (1 / scale);\n            }\n\n            var scr = Screen.FromPoint(new((int)(rect.X*scale), (int)(rect.Y * scale)));\n            int max = (int) Math.Max(0,Math.Min(rect.Height, scr.Bounds.Bottom - rect.Y));\n\n\n            var rgn1 = CreateRectRgn(0, 0, (int)(rect.Width * scale), (int) (rect.Height * scale));\n            var rgn2 = CreateRectRgn(0, (int) (max* scale), (int) (rect.Width * scale), (int) (rect.Height * scale));\n            var rgn = CreateRectRgn(0, 0, 0, 0);\n            CombineRgn(rgn, rgn1, rgn2, CombineRgnStyles.RGN_XOR);\n            if(SetWindowRgn(HWND, rgn, false) != 0) DeleteObject(rgn);\n            DeleteObject(rgn1);\n            DeleteObject(rgn2);\n            \n            window.AutoHideClip.RadiusX = window.AutoHideClip.RadiusY = 0;\n            window.AutoHideClip.Rect = new(0, max, 1920, rect.Height);\n\n        }\n        if (ddHandle != IntPtr.Zero) UpdateDuplicate();\n    }\n\n    public static IntPtr GetHWND(Window window) => new WindowInteropHelper(Window.GetWindow(window)).EnsureHandle();\n    public bool alive = true;\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);\n\n    public void Init(TaskbarHelper taskbarHelper) {\n        HWND = GetHWND(window);\n        SetWindowLong(HWND, (int) GWL.EXSTYLE,\n            (uint) GetWindowLong(HWND, (int) GWL.EXSTYLE).ToInt32() | (uint) WS_EX.TRANSPARENT);\n        SetWindowLong(HWND, (int) GWL.STYLE,\n            (uint) GetWindowLong(HWND, (int) GWL.STYLE).ToInt32() | (uint) WS.POPUP | (uint) WS.VISIBLE);\n\n        \n        taskbar = taskbarHelper;\n        taskbarHelper.TaskbarPositionChanged += TaskbarPosChanged;\n\n        Task.Run(() => {\n            while (alive) {\n                window.Dispatcher.Invoke(() => TaskbarPosChanged(null, null));\n                Thread.Sleep(20);\n            }\n        });\n    }\n\n    public static void InitOther(Window wnd) {\n        var _HWND = GetHWND(wnd);\n        SetWindowLong(_HWND, (int) GWL.EXSTYLE,\n            (uint) GetWindowLong(_HWND, (int) GWL.EXSTYLE).ToInt32() | (uint) WS_EX.TRANSPARENT);\n        SetWindowLong(_HWND, (int) GWL.STYLE,\n            (uint) GetWindowLong(_HWND, (int) GWL.STYLE).ToInt32() | (uint) WS.POPUP | (uint) WS.VISIBLE);\n    }\n\n    [DllImport(\"shell32.dll\")]\n    private static extern IntPtr SHAppBarMessage(uint dwMessage,\n        ref APPBARDATA pData);\n\n    private static bool IsAutoHide() {\n        var appbar = new APPBARDATA {cbSize = Marshal.SizeOf(typeof(APPBARDATA))};\n        var state = (uint) SHAppBarMessage(4, ref appbar);\n        return (state & 1) == 1;\n    }\n\n    [DllImport(\"user32.dll\")]\n    private static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw);\n\n    [DllImport(\"gdi32.dll\")]\n    private static extern IntPtr CreateRoundRectRgn(int x1, int y1, int x2, int y2, int cx, int cy);\n\n    [DllImport(\"gdi32.dll\")]\n    private static extern IntPtr CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);\n\n    [DllImport(\"gdi32.dll\")]\n    private static extern int CombineRgn(IntPtr hrgnDest, IntPtr hrgnSrc1, IntPtr hrgnSrc2,\n        CombineRgnStyles fnCombineMode);\n\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    private static extern IntPtr GetDC(IntPtr hWnd);\n\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    private static extern int ReleaseDC(IntPtr hWnd, IntPtr hdc);\n\n   \n\n    [DllImport(\"dwmapi.dll\", SetLastError = true)]\n    static extern int DwmRegisterThumbnail(IntPtr dest, IntPtr src, out IntPtr thumb);\n    [StructLayout(LayoutKind.Sequential)]\n    public struct RECT {\n        public int Left, Top, Right, Bottom;\n    }\n    [StructLayout(LayoutKind.Sequential)]\n    public struct DWM_THUMBNAIL_PROPERTIES {\n        public DWM_TNP dwFlags;\n        public RECT rcDestination;\n        public RECT rcSource;\n        public byte opacity;\n        public int fVisible;\n        public int fSourceClientAreaOnly;\n    }\n    public enum DWM_TNP : uint {\n        DWM_TNP_RECTDESTINATION = 0x00000001,\n        DWM_TNP_RECTSOURCE = 0x00000002,\n        DWM_TNP_OPACITY = 0x00000004,\n        DWM_TNP_VISIBLE = 0x00000008,\n        DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010,\n    }\n    [DllImport(\"dwmapi.dll\", PreserveSig = true)]\n    public static extern int DwmUpdateThumbnailProperties(IntPtr hThumbnail, ref DWM_THUMBNAIL_PROPERTIES props);\n    [DllImport(\"dwmapi.dll\")]\n    static extern int DwmUnregisterThumbnail(IntPtr thumb);\n\n    IntPtr ddHandle = IntPtr.Zero;\n    public void Duplicate(nint handle) {\n        if (ddHandle != IntPtr.Zero) DwmUnregisterThumbnail(ddHandle);\n        var r = DwmRegisterThumbnail(this.HWND, handle, out ddHandle);\n\n        ;\n    }\n    public void UpdateDuplicate() {\n        if (ddHandle == IntPtr.Zero) return;\n        DWM_THUMBNAIL_PROPERTIES dskThumbProps = new();\n        dskThumbProps.dwFlags = DWM_TNP.DWM_TNP_SOURCECLIENTAREAONLY | DWM_TNP.DWM_TNP_VISIBLE | DWM_TNP.DWM_TNP_RECTSOURCE | DWM_TNP.DWM_TNP_OPACITY | DWM_TNP.DWM_TNP_RECTDESTINATION;\n        dskThumbProps.fSourceClientAreaOnly = 1;\n        dskThumbProps.fVisible = 1;\n        dskThumbProps.opacity = 255;\n        \n        var rect = taskbar.GetRectangle(true);\n        rect.X -= (int) App.taskbars.Min(x => x.Left); ;\n        \n        dskThumbProps.rcSource = new RECT() { Top = 0, Left = rect.X, Right = (int) rect.Width + rect.X, Bottom = (int) rect.Height };\n        dskThumbProps.rcDestination = new RECT() { Top = (int) (rect.Top - window.Top * scale), Left = 0, Right = (int) rect.Width, Bottom = (int) rect.Height };\n        DwmUpdateThumbnailProperties(ddHandle, ref dskThumbProps);\n        ;\n    }\n    public void RemoveDuplicate() {\n        DwmUnregisterThumbnail(ddHandle);\n        ddHandle = IntPtr.Zero;\n    }\n\n    public enum GWL {\n        EXSTYLE = -20,\n        HINSTANCE = -6,\n        HWNDPARENT = -8,\n        ID = -12,\n        STYLE = -16,\n        USERDATA = -21,\n        WNDPROC = -4,\n\n        DWLP_USER = 0x8,\n        DWLP_MSGRESULT = 0x0,\n        DWLP_DLGPROC = 0x4\n    }\n\n    [Flags]\n    public enum WS : uint {\n        OVERLAPPED = 0x00000000,\n        POPUP = 0x80000000,\n        CHILD = 0x40000000,\n        MINIMIZE = 0x20000000,\n        VISIBLE = 0x10000000,\n        DISABLED = 0x08000000,\n        CLIPSIBLINGS = 0x04000000,\n        CLIPCHILDREN = 0x02000000,\n        MAXIMIZE = 0x01000000,\n        BORDER = 0x00800000,\n        DLGFRAME = 0x00400000,\n        VSCROLL = 0x00200000,\n        HSCROLL = 0x00100000,\n        SYSMENU = 0x00080000,\n        THICKFRAME = 0x00040000,\n        GROUP = 0x00020000,\n        TABSTOP = 0x00010000,\n\n        MINIMIZEBOX = 0x00020000,\n        MAXIMIZEBOX = 0x00010000,\n\n        CAPTION = BORDER | DLGFRAME,\n        TILED = OVERLAPPED,\n        ICONIC = MINIMIZE,\n        SIZEBOX = THICKFRAME,\n        TILEDWINDOW = OVERLAPPEDWINDOW,\n\n        OVERLAPPEDWINDOW = OVERLAPPED | CAPTION | SYSMENU | THICKFRAME | MINIMIZEBOX | MAXIMIZEBOX,\n        POPUPWINDOW = POPUP | BORDER | SYSMENU,\n        CHILDWINDOW = CHILD\n    }\n\n\n    public enum WS_EX : uint {\n        DLGMODALFRAME = 0x00000001,\n        NOPARENTNOTIFY = 0x00000004,\n        TOPMOST = 0x00000008,\n        ACCEPTFILES = 0x00000010,\n        TRANSPARENT = 0x00000020,\n\n        //#if(WINVER >= 0x0400)\n\n        MDICHILD = 0x00000040,\n        TOOLWINDOW = 0x00000080,\n        WINDOWEDGE = 0x00000100,\n        CLIENTEDGE = 0x00000200,\n        CONTEXTHELP = 0x00000400,\n\n        RIGHT = 0x00001000,\n        LEFT = 0x00000000,\n        RTLREADING = 0x00002000,\n        LTRREADING = 0x00000000,\n        LEFTSCROLLBAR = 0x00004000,\n        RIGHTSCROLLBAR = 0x00000000,\n\n        CONTROLPARENT = 0x00010000,\n        STATICEDGE = 0x00020000,\n        APPWINDOW = 0x00040000,\n\n        OVERLAPPEDWINDOW = WINDOWEDGE | CLIENTEDGE,\n        PALETTEWINDOW = WINDOWEDGE | TOOLWINDOW | TOPMOST,\n\n        //#endif /* WINVER >= 0x0400 */\n\n        //#if(WIN32WINNT >= 0x0500)\n\n        LAYERED = 0x00080000,\n\n        //#endif /* WIN32WINNT >= 0x0500 */\n\n        //#if(WINVER >= 0x0500)\n\n        NOINHERITLAYOUT = 0x00100000, // Disable inheritence of mirroring by children\n        LAYOUTRTL = 0x00400000, // Right to left mirroring\n\n        //#endif /* WINVER >= 0x0500 */\n\n        //#if(WIN32WINNT >= 0x0500)\n\n        COMPOSITED = 0x02000000,\n        NOACTIVATE = 0x08000000\n\n        //#endif /* WIN32WINNT >= 0x0500 */\n    }\n\n    public static class SWP {\n        public static readonly int\n            NOSIZE = 0x0001,\n            NOMOVE = 0x0002,\n            NOZORDER = 0x0004,\n            NOREDRAW = 0x0008,\n            NOACTIVATE = 0x0010,\n            DRAWFRAME = 0x0020,\n            FRAMECHANGED = 0x0020,\n            SHOWWINDOW = 0x0040,\n            HIDEWINDOW = 0x0080,\n            NOCOPYBITS = 0x0100,\n            NOOWNERZORDER = 0x0200,\n            NOREPOSITION = 0x0200,\n            NOSENDCHANGING = 0x0400,\n            DEFERERASE = 0x2000,\n            ASYNCWINDOWPOS = 0x4000;\n    }\n\n\n    [StructLayout(LayoutKind.Sequential)]\n    public struct APPBARDATA {\n        public int cbSize; // initialize this field using: Marshal.SizeOf(typeof(APPBARDATA));\n        public IntPtr hWnd;\n        public uint uCallbackMessage;\n        public uint uEdge;\n        public TaskbarHelper.RECT rc;\n        public int lParam;\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/Interpolation/ColorInterpolation.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Globalization;\nusing System.Linq;\nusing System.Reflection;\nusing System.Windows.Data;\n\nnamespace RainbowTaskbar.Interpolation;\n\ninternal class ColorInterpolation {\n    public enum INTERPOLATE_FUNCTION {\n        Linear,\n        Sine,\n        Cubic,\n        Exponential,\n        Back\n    }\n\n    private static double Cubic(double x) => x < 0.5 ? 4 * x * x * x : 1 - Math.Pow(-2 * x + 2, 3) / 2;\n\n    private static double Back(double x) {\n        const double c1 = 1.70158;\n        const double c2 = c1 * 1.525;\n\n        return x < 0.5\n            ? Math.Pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2) / 2\n            : (Math.Pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n    }\n\n    private static double Sine(double x) => -(Math.Cos(3.14159 /*PI*/ * x) - 1) / 2;\n\n    private static double Exponential(double x) =>\n        x == 0\n            ? 0\n            : x == 1\n                ? 1\n                : x < 0.5\n                    ? Math.Pow(2, 20 * x - 10) / 2\n                    : (2 - Math.Pow(2, -20 * x + 10)) / 2;\n\n    private static double clamp(double d, double min, double max) {\n        var t = d < min ? min : d;\n        return t > max ? max : t;\n    }\n\n\n    private static Color interp(Color color1, Color color2, double fraction) {\n        var r = (byte) clamp((color2.R - color1.R) * fraction + color1.R, 0, 255);\n        var g = (byte) clamp((color2.G - color1.G) * fraction + color1.G, 0, 255);\n        var b = (byte) clamp((color2.B - color1.B) * fraction + color1.B, 0, 255);\n\n        return Color.FromArgb(255, r, g, b);\n    }\n\n    public static Color Interpolate(Color color1, Color color2, INTERPOLATE_FUNCTION which, double fraction) {\n        switch (which) {\n            case INTERPOLATE_FUNCTION.Linear: {\n                return interp(color1, color2, fraction);\n            }\n            case INTERPOLATE_FUNCTION.Sine: {\n                return interp(color1, color2, Sine(fraction));\n            }\n            case INTERPOLATE_FUNCTION.Cubic: {\n                return interp(color1, color2, Cubic(fraction));\n            }\n            case INTERPOLATE_FUNCTION.Exponential: {\n                return interp(color1, color2, Exponential(fraction));\n            }\n            case INTERPOLATE_FUNCTION.Back: {\n                return interp(color1, color2, Back(fraction));\n            }\n            default: {\n                return interp(color1, color2, fraction);\n            }\n        }\n    }\n}\n\ninternal static class ColorExtension {\n    public static Color ToDrawingColor(this System.Windows.Media.Color color) =>\n        Color.FromArgb(color.A, color.R, color.G, color.B);\n\n    public static System.Windows.Media.Color ToMediaColor(this Color color) =>\n        System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B);\n\n    public static string HexConverter(Color c) => \"#\" + c.R.ToString(\"X2\") + c.G.ToString(\"X2\") + c.B.ToString(\"X2\");\n}\n\npublic class ColorConverter : IValueConverter {\n    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>\n        value is not null ? ((Color) value).ToMediaColor() : null;\n\n    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>\n        value is not null ? ((System.Windows.Media.Color) value).ToDrawingColor() : null;\n}"
  },
  {
    "path": "RainbowTaskbar/Languages/Localization.cs",
    "content": "﻿using RainbowTaskbar.Configuration.Instruction.Instructions;\nusing RainbowTaskbar.Configuration.Instruction;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Data;\n\nnamespace RainbowTaskbar.Languages {\n    public class Localization\n    {\n        public static List<string> languages = new List<string>() { \"SystemDefault\", \"en_US\", \"zh_CN\", \"fr_FR\", \"ro_RO\" };\n        public ResourceDictionary dictionary;\n        public en_US dictionary_en_US;\n        public Localization() {\n            dictionary_en_US = new en_US();\n            dictionary_en_US.InitializeComponent();\n\n            Switch(CultureInfo.InstalledUICulture.Name);\n        }\n\n        public void Switch(string lang) {\n            var language = lang is not null ? lang.Replace(\"-\", \"_\") : null;\n            switch (language) {\n                case \"zh\":\n                case \"zh_CN\":\n                case \"zh_SG\":\n                    dictionary = new zh_CN();\n                    (dictionary as zh_CN).InitializeComponent();\n                    break;\n                case \"fr\":\n                case \"fr_FR\":\n                    dictionary = new fr_FR();\n                    (dictionary as fr_FR).InitializeComponent();\n                    break;\n                case \"ro\":\n                case \"ro_RO\":\n                case \"ro_MD\":\n                    dictionary = new ro_RO();\n                    (dictionary as ro_RO).InitializeComponent();\n                    break;\n                default:\n                    dictionary = dictionary_en_US;\n                    break;\n            }\n        }\n\n        public string Get(string key) {\n            return dictionary[key] as string;\n        }\n\n        public string this[string key] {\n            get {\n                return dictionary[key] as string;\n            }\n        }\n\n        public string UseSystemDefaultString { get {\n                return this[\"systemdefault\"];\n            } }\n\n\n        public string InstructionFormat(Instruction instruction, params object[] args) {\n            return string.Format(Get($\"{instruction.GetType().Name.ToLower()}format\"), args);\n        }\n        public string Name(string str) {\n            return str is not null ? Get(str.ToLower()) : null;\n        }\n        public string InstructionFormatSuffix(Instruction instruction, string suffix, params object[] args) {\n            return string.Format(Get($\"{instruction.GetType().Name.ToLower()}{suffix}format\"), args);\n        }\n\n        public string Enum(Enum en) {\n            return en is not null ? Get($\"enum_{en.ToString().ToLower()}\") : null;\n        }\n\n\n        public void Enable(Collection<ResourceDictionary> mergedDicts) {\n            mergedDicts.ToList().Where(x=>x.Contains(\"systemdefault\")).ToList().ForEach(x => mergedDicts.Remove(x));\n\n            mergedDicts.Add(dictionary_en_US);\n            mergedDicts.Add(dictionary);\n            \n        }\n\n    }\n\n    public static class EnumLocalization {\n        public static string ToStringLocalized(this Enum shape) {\n            return App.localization.Enum(shape);\n        }\n\n    }\n    \n}\n"
  },
  {
    "path": "RainbowTaskbar/Languages/Translators.cs",
    "content": "﻿using RainbowTaskbar.Configuration;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Data;\n\nnamespace RainbowTaskbar.Languages\n{\n    public class EnumTranslator : IValueConverter {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>\n            value is not null ? App.localization.Enum(value as Enum) : null;\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>\n            throw new NotImplementedException();\n    }\n\n    public class InstructionTranslator : IValueConverter {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>\n            value is not null ? App.localization.Name((value as string).ToLower()) : null;\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>\n            throw new NotImplementedException();\n    }\n\n    public class LanguageConverter : IValueConverter {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>\n            value is not null ? (\n                value as string == \"SystemDefault\" ? App.localization.UseSystemDefaultString : new CultureInfo(value as string).Parent.NativeName\n            ) : null;\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>\n            throw new NotImplementedException();\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Languages/en_US.xaml",
    "content": "﻿<ResourceDictionary x:Class=\"RainbowTaskbar.Languages.en_US\"\n                    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n                    xmlns:s=\"clr-namespace:System;assembly=mscorlib\">\n    <s:String x:Key=\"home\">Home</s:String>\n    <s:String x:Key=\"settings\">Settings</s:String>\n    <s:String x:Key=\"about\">About</s:String>\n    <s:String x:Key=\"browse\">Browse</s:String>\n    <s:String x:Key=\"configs\">Configs</s:String>\n\n    <!-- About Tab -->\n    <s:String x:Key=\"aboutrnb\">About RainbowTaskbar</s:String>\n    <s:String x:Key=\"rnbweb\">Open RainbowTaskbar website</s:String>\n    <s:String x:Key=\"description\">RainbowTaskbar is a tool that allows you to greatly customize the appearance of your taskbar.</s:String>\n    <s:String x:Key=\"donations\">It is completely free to use, but donations are well appreciated!</s:String>\n    <!-- RainbowTaskbar is free software.\n         Made by ad2017 , with the help of zCri .-->\n\n    <!-- Configs Tab -->\n    <s:String x:Key=\"untitled\">Untitled</s:String>\n    <s:String x:Key=\"new\">New</s:String>\n    <s:String x:Key=\"enum_classic\">Classic</s:String>\n    <s:String x:Key=\"enum_web\">Web</s:String>\n    \n    <!-- Instruction config edit -->\n    <s:String x:Key=\"runoncegroup\">Run once group</s:String>\n    <s:String x:Key=\"loopinggroups\">Looping groups</s:String>\n    <s:String x:Key=\"group\">Group</s:String>\n    <s:String x:Key=\"run\">Run</s:String>\n    <s:String x:Key=\"save\">Save</s:String>\n    <s:String x:Key=\"add\">Add</s:String>\n        <!-- Config edit -->\n    <s:String x:Key=\"name\">Title</s:String>\n    <s:String x:Key=\"thumbnail\">Thumbnail</s:String>\n    <s:String x:Key=\"editconfig\">Edit config</s:String>\n    <s:String x:Key=\"saveandpublish\">Save and publish</s:String>\n    <s:String x:Key=\"publishstatus\" xml:space=\"preserve\">Publish status: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"enum_published\">Latest published</s:String>\n    <s:String x:Key=\"enum_previouslypublished\">Previously published, not latest</s:String>\n    <s:String x:Key=\"enum_notpublished\">Not published</s:String>\n    <s:String x:Key=\"pickimg\">Pick image</s:String>\n    <s:String x:Key=\"copypreset\">Copy instructions from preset</s:String>\n    <s:String x:Key=\"descriptionlit\">Description</s:String>\n    <s:String x:Key=\"addprop\">Add property</s:String>\n    <s:String x:Key=\"propname\">Property name</s:String>\n    <s:String x:Key=\"propkey\">Property key</s:String>\n    <s:String x:Key=\"proptype\">Property type</s:String>\n    <s:String x:Key=\"defpropkey\">property_1</s:String>\n    <s:String x:Key=\"defpropname\">New property</s:String>\n\n    <s:String x:Key=\"devtools\">Open Developer Tools</s:String>\n\n    <s:String x:Key=\"enum_string\">String</s:String>\n    <s:String x:Key=\"enum_number\">Number</s:String>\n    <s:String x:Key=\"enum_color\">Color</s:String>\n    <s:String x:Key=\"enum_boolean\">Boolean</s:String>\n    \n    \n    <!-- Config view -->\n    <s:String x:Key=\"filesize\" xml:space=\"preserve\">File size: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"filesizeextra\"> KB (incl. thumbnail)</s:String> <!-- incl. = including, do not omit space at the end please! -->\n    <s:String x:Key=\"author\" xml:space=\"preserve\">Author: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"likes\" xml:space=\"preserve\">Likes: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"download\">Download</s:String><!-- verb! -->\n    <s:String x:Key=\"downloadnew\">Download new copy</s:String><!-- download is a verb! -->\n    <s:String x:Key=\"like\">Like</s:String><!-- verb! -->\n    <s:String x:Key=\"unlike\">Unlike</s:String><!-- verb! -->\n    <s:String x:Key=\"comments\">Comments</s:String>\n    <s:String x:Key=\"goback\">Go back</s:String>\n    <s:String x:Key=\"openweb\">Open in web</s:String>\n\n    <!-- Home tab -->\n    <s:String x:Key=\"welcome\">Welcome to the RainbowTaskbar editor!</s:String>\n    <s:String x:Key=\"whatsnew\">What's new in the latest update</s:String>\n    <s:String x:Key=\"review\">Review on Store</s:String>\n\n    <s:String x:Key=\"issueremind\">*using GitHub to submit an issue or request is preferred.</s:String>\n    <s:String x:Key=\"issuetitle\">Issue title</s:String>\n    <s:String x:Key=\"issuedesc\">Description</s:String>\n    <s:String x:Key=\"issuecontact\">Contact info (optional)</s:String>\n\n    <!-- Settings tab -->\n    <s:String x:Key=\"general\">General</s:String>\n    <s:String x:Key=\"runstartup\">Run at startup</s:String>\n    <s:String x:Key=\"checkupdate\">Check for updates</s:String>\n    <s:String x:Key=\"showicon\">Show tray icon</s:String>\n    <s:String x:Key=\"language\">Language</s:String>\n    <s:String x:Key=\"workshop\">Workshop</s:String>\n    <s:String x:Key=\"signedin\">Signed in as</s:String>\n    <s:String x:Key=\"logingit\">Log in (GitHub)</s:String>\n    <s:String x:Key=\"logingoog\">Log in (Google)</s:String>\n    <s:String x:Key=\"signout\">Log out</s:String>\n    <s:String x:Key=\"passmouse\">Pass mouse input to underlay (may use CPU)</s:String>\n    <s:String x:Key=\"allowjs\">Allow JavaScript</s:String>\n    <s:String x:Key=\"graphics\">Graphics</s:String>\n    <s:String x:Key=\"interpquality\">Interpolation quality (smaller = better)</s:String>\n    <s:String x:Key=\"multipletaskbars\">Multiple taskbars</s:String>\n    <s:String x:Key=\"perfimpact\">(current value may impact performance)</s:String>\n    <s:String x:Key=\"samerad\">Same radius</s:String>\n    <s:String x:Key=\"graphicsrepeat\">Repeat graphics</s:String>\n    <s:String x:Key=\"comingsoon\">Coming soon...</s:String>\n    <s:String x:Key=\"webfps\">Maximum web FPS</s:String>\n    <s:String x:Key=\"systemdefault\">(Use system language)</s:String>\n    <s:String x:Key=\"globalprop\">Global properties</s:String>\n    <s:String x:Key=\"globalpropdef\">*to keep config setting, use value '-1'</s:String>\n    <s:String x:Key=\"globalopacity\">Taskbar transparency (0-1)</s:String>\n    <s:String x:Key=\"reportex\">Send info on unhandled exceptions</s:String>\n\n    <!-- Browse Tab -->\n    <s:String x:Key=\"search\">Search something...</s:String>\n    <!-- Sort by Likes/Match-->\n    <s:String x:Key=\"enum_likes\">Likes</s:String>\n    <s:String x:Key=\"enum_match\">Match</s:String>\n\n    <!-- Instructions and displayed format strings -->\n    <s:String x:Key=\"borderradiusinstruction\">Border radius</s:String>\n    <s:String x:Key=\"clearlayerinstruction\">Clear layer</s:String>\n    <s:String x:Key=\"colorinstruction\">Color</s:String>\n    <s:String x:Key=\"delayinstruction\">Delay</s:String>\n    <s:String x:Key=\"imageinstruction\">Image</s:String>\n    <s:String x:Key=\"shapeinstruction\">Shape</s:String>\n    <s:String x:Key=\"textinstruction\">Text</s:String>\n    <s:String x:Key=\"transparencyinstruction\">Transparency/Style</s:String>\n\n    <s:String x:Key=\"borderradiusinstructionformat\">Border Radius - {0}px</s:String>\n    <s:String x:Key=\"clearlayerinstructionformat\">Clear layer - {0}</s:String>\n    <s:String x:Key=\"colorinstructionrandomizedformat\">{0} - Randomized</s:String>\n    <!-- no translation --> <s:String x:Key=\"colorinstructiongradientformat\">{0} - {1} -> {2}</s:String>\n    <!-- no translation --> <s:String x:Key=\"colorinstructionsolidformat\">{0} - {1}</s:String>\n    <s:String x:Key=\"delayinstructionformat\">Delay - {0}ms</s:String>\n    <s:String x:Key=\"imageinstructionformat\">Image - {0}</s:String>\n    <s:String x:Key=\"shapeinstructionformat\">Shape - {0}</s:String>\n    <s:String x:Key=\"textinstructionformat\">Text - {0}</s:String>\n    <s:String x:Key=\"transparencyinstructionstyleformat\">Style - {0}</s:String>\n    <s:String x:Key=\"transparencyinstructionlayerformat\">Layer {0} - {1}%</s:String>\n    <s:String x:Key=\"transparencyinstructionopacityformat\">{0} - {1}%</s:String>\n\n    <!-- Enums -->\n        <!-- Shapes -->\n    <s:String x:Key=\"enum_line\">Line</s:String>\n    <s:String x:Key=\"enum_rectangle\">Rectangle</s:String>\n    <s:String x:Key=\"enum_roundedrect\">Rounded rectangle</s:String>\n    <s:String x:Key=\"enum_ellipse\">Ellipse</s:String>\n        <!-- Color instruction effects -->\n    <s:String x:Key=\"enum_solid\">Solid</s:String>\n    <s:String x:Key=\"enum_fade\">Fading solid</s:String>\n    <s:String x:Key=\"enum_gradient\">Gradient</s:String>\n    <s:String x:Key=\"enum_fadegradient\">Fading gradient</s:String>\n        <!-- Color instruction transitions -->\n    <s:String x:Key=\"enum_linear\">Linear</s:String>\n    <s:String x:Key=\"enum_cubic\">Cubic</s:String>\n    <s:String x:Key=\"enum_sine\">Sine</s:String>\n    <s:String x:Key=\"enum_exponential\">Exponential</s:String>\n    <s:String x:Key=\"enum_back\">Back</s:String>\n        <!-- Transparency instruction option 1 -->\n    <s:String x:Key=\"enum_taskbar\">Taskbar opacity</s:String>\n    <s:String x:Key=\"enum_rainbowtaskbar\">Underlay opacity</s:String>\n    <s:String x:Key=\"enum_all\">Taskbar and underlay opacities</s:String>\n    <s:String x:Key=\"enum_layer\">Layer opacity</s:String>\n    <s:String x:Key=\"enum_style\">Taskbar style</s:String>\n    <s:String x:Key=\"enum_taskbarelements\">Taskbar elements</s:String>\n        <!-- Transparency instruction styles -->\n    <s:String x:Key=\"enum_default\">Default</s:String>\n    <s:String x:Key=\"enum_blur\">Blurred</s:String>\n    <s:String x:Key=\"enum_transparent\">Transparent</s:String>\n    \n    <!-- Instruction controls -->\n        <!-- Shape -->\n    <s:String x:Key=\"drawonce\">Draw only once</s:String>\n    <s:String x:Key=\"strokecolor\">Stroke color</s:String> <!-- stroke is a noun! -->\n    <s:String x:Key=\"fillcolor\">Fill color</s:String> <!-- fill is a noun! -->\n    <s:String x:Key=\"thickness\">Thickness</s:String>\n    <s:String x:Key=\"radius\">Border radius</s:String>\n    <s:String x:Key=\"fittaskbars\">Fit to taskbar</s:String> <!-- fit is a verb! -->\n        <!-- Color -->\n    <s:String x:Key=\"randomize\">Randomize colors</s:String>\n    <s:String x:Key=\"holdtime\">Hold time</s:String>\n    <s:String x:Key=\"fadetime\">Fade time</s:String>\n    <s:String x:Key=\"gradientangle\">Gradient angle °</s:String>\n    <s:String x:Key=\"layer\">Layer</s:String>\n    <s:String x:Key=\"milliseconds\">ms</s:String>\n        <!-- Image -->\n    <s:String x:Key=\"chooseimg\">Choose image</s:String>\n    <s:String x:Key=\"width\">Width</s:String>\n    <s:String x:Key=\"height\">Height</s:String>\n        <!-- Text -->\n    <s:String x:Key=\"fontsize\">Font size</s:String>\n    <s:String x:Key=\"fontcolor\">Font color</s:String>\n    <s:String x:Key=\"centerx\">Center on X-axis</s:String> <!-- center is a verb! -->\n        <!-- Transparency -->\n    <s:String x:Key=\"change\">Change</s:String>\n    <s:String x:Key=\"to\">to</s:String>\n\n\n\n    <!-- Instruction context menu -->\n    <s:String x:Key=\"duplicate\">Duplicate</s:String> <!-- it's a verb! -->\n    <s:String x:Key=\"delete\">Delete</s:String>\n    <s:String x:Key=\"duplicate_rev_color\">Duplicate - Swap colors</s:String>\n    \n    <!-- Tray window context menu -->\n    <s:String x:Key=\"openeditor\">Open editor</s:String>\n    <s:String x:Key=\"donate\">Donate</s:String>\n    <s:String x:Key=\"projectpage\">Open project page</s:String>\n    <s:String x:Key=\"issueorreq\">Submit an issue or request</s:String>\n    <s:String x:Key=\"exit\">Exit</s:String>\n\n    <!-- Dialog boxes -->\n    <s:String x:Key=\"msgbox_baddll\">There seems to be an issue with the RainbowTaskbar DLL injected into explorer.exe. \n        This process is very experimental, so please open up an issue on GitHub (Right-click RainbowTaskbar on system tray -> Submit an issue or request) \n        to try and debug the problem. Make sure to also include any other errors you might have encountered.</s:String>\n    <s:String x:Key=\"msgbox_olddll\">To enable transparency effects, RainbowTaskbar must restart the explorer.exe process.\n        Do you wish to proceed?</s:String>\n    <s:String x:Key=\"msgbox_badarch\">Your processor architecture (x64) is incompatible with this executable (x86). \n        Please download the correct executable (rnbtsk-x64.exe / setup-x64.exe) from GitHub releases.</s:String>\n    <s:String x:Key=\"msgbox_migrateoldcfg\">RainbowTaskbar has found a legacy config version.\n        Do you wish to migrate it to the new config format?\n    </s:String>\n    <s:String x:Key=\"msgbox_login\">\n        Input the code displayed on the login success page below\n    </s:String>\n    <s:String x:Key=\"msgbox_notloggedin\">You must be logged in to publish your config! Check the settings page to sign in.</s:String>\n    <s:String x:Key=\"msgbox_notloggedin_title\">Not logged in</s:String>\n    <s:String x:Key=\"msgbox_notloggedin2\">You must be logged in to like a config!</s:String>\n    <s:String x:Key=\"msgbox_fail\">Failed to publish config.</s:String>\n    <s:String x:Key=\"msgbox_fail_title\">Fail</s:String>\n    <s:String x:Key=\"msgbox_thumbnail\">Config info/data updated. Failed to upload thumbnail.</s:String>\n    <s:String x:Key=\"msgbox_property_title\">Create new property</s:String>\n    <s:String x:Key=\"msgbox_login_title\">Log in with code</s:String>\n    <s:String x:Key=\"msgbox_login_button\">Log in</s:String>\n    <s:String x:Key=\"msgbox_save_title\">Save your work?</s:String>\n    <s:String x:Key=\"msgbox_save\">Do you wish to save your current config?</s:String>\n    <s:String x:Key=\"msgbox_save_b1\">Save</s:String>\n    <s:String x:Key=\"msgbox_save_b2\">Don't save</s:String>\n    <s:String x:Key=\"msgbox_button_cancel\">Cancel</s:String>\n    <s:String x:Key=\"msgbox_update\">A new RainbowTaskbar update has released. Would you like to update?</s:String>\n    <s:String x:Key=\"msgbox_migrate\">Do you wish to migrate the legacy (v2) config and presets to the current version?</s:String>\n    <s:String x:Key=\"msgbox_issuegithub\">Use GitHub</s:String>\n    <!-- Fill with \"Translated by ...\" -->\n    <s:String x:Key=\"langcredits\">‎</s:String>\n\n</ResourceDictionary>"
  },
  {
    "path": "RainbowTaskbar/Languages/en_US.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Shapes;\n\nnamespace RainbowTaskbar.Languages\n{\n    /// <summary>\n    /// Interaction logic for en_US.xaml\n    /// </summary>\n    public partial class en_US : ResourceDictionary\n    {\n        public en_US()\n        {\n            \n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Languages/fr_FR.xaml",
    "content": "﻿<ResourceDictionary x:Class=\"RainbowTaskbar.Languages.fr_FR\"\r\n                    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:s=\"clr-namespace:System;assembly=mscorlib\">\r\n    <s:String x:Key=\"home\">Accueil</s:String>\r\n    <s:String x:Key=\"settings\">Paramètres</s:String>\r\n    <s:String x:Key=\"about\">À propos</s:String>\r\n    <s:String x:Key=\"browse\">Galerie</s:String>\r\n    <s:String x:Key=\"configs\">Configurations</s:String>\r\n\r\n    <!-- About Tab -->\r\n    <s:String x:Key=\"aboutrnb\">À propos de RainbowTaskbar</s:String>\r\n    <s:String x:Key=\"rnbweb\">Accéder au site de RainbowTaskbar</s:String>\r\n    <s:String x:Key=\"description\">RainbowTaskbar est un outil gratuit et open source qui permet de personnaliser l'apparence de la barre des tâches.</s:String>\r\n    <s:String x:Key=\"donations\">Les dons sont les bienvenus !</s:String>\r\n    \r\n    <!-- RainbowTaskbar is free software.\r\n         Made by ad2017 , with the help of zCri .-->\r\n\r\n    <!-- Configs Tab -->\r\n    <s:String x:Key=\"untitled\">Sans titre</s:String>\r\n    <s:String x:Key=\"new\">Nouveau</s:String>\r\n    <s:String x:Key=\"enum_classic\">Classique</s:String>\r\n    <s:String x:Key=\"enum_web\">Web</s:String>\r\n    \r\n    <!-- Instruction config edit -->\r\n    <s:String x:Key=\"runoncegroup\">Lancer un seul groupe une seule fois</s:String>\r\n    <s:String x:Key=\"loopinggroups\">Lancer plusieurs groupes en boucle</s:String>\r\n    <s:String x:Key=\"group\">Groupe</s:String>\r\n    <s:String x:Key=\"run\">Lancer</s:String>\r\n    <s:String x:Key=\"save\">Enregistrer</s:String>\r\n    <s:String x:Key=\"add\">Ajouter</s:String>\r\n    \r\n    <!-- Config edit -->\r\n    <s:String x:Key=\"name\">Titre</s:String>\r\n    <s:String x:Key=\"thumbnail\">Image</s:String>\r\n    <s:String x:Key=\"editconfig\">Modifier la configuration</s:String>\r\n    <s:String x:Key=\"saveandpublish\">Enregistrer et publier</s:String>\r\n    <s:String x:Key=\"publishstatus\" xml:space=\"preserve\">Statut de publication: </s:String> <!-- do not omit space at the end please! -->\r\n    <s:String x:Key=\"enum_published\">Dernière publication</s:String>\r\n    <s:String x:Key=\"enum_previouslypublished\">Publié précédemment, pas le plus récent</s:String>\r\n    <s:String x:Key=\"enum_notpublished\">Non publié</s:String>\r\n    <s:String x:Key=\"pickimg\">Choisir une image</s:String>\r\n    <s:String x:Key=\"copypreset\">Copier les instructions du préréglage</s:String>\r\n    <s:String x:Key=\"descriptionlit\">Description</s:String>\r\n    <s:String x:Key=\"addprop\">Ajouter une propriété</s:String>\r\n    <s:String x:Key=\"propname\">Nom de la propriété</s:String>\r\n    <s:String x:Key=\"propkey\">Clé de la propriété</s:String>\r\n    <s:String x:Key=\"proptype\">Type de la propriété</s:String>\r\n    <s:String x:Key=\"devtools\">Ouvrir les outils développeur</s:String>\r\n    <s:String x:Key=\"defpropkey\">propriété_1</s:String>\r\n    <s:String x:Key=\"defpropname\">Nouvelle propriété</s:String>\r\n\r\n    <!--  -->\r\n    <s:String x:Key=\"enum_string\">Chaîne</s:String>\r\n    <s:String x:Key=\"enum_number\">Nombre</s:String>\r\n    <s:String x:Key=\"enum_color\">Couleur</s:String>\r\n    <s:String x:Key=\"enum_boolean\">Booléen</s:String>\r\n\r\n    <!-- Config view -->\r\n    <s:String x:Key=\"filesize\" xml:space=\"preserve\">Taille du fichier: </s:String> <!-- do not omit space at the end please! -->\r\n    <s:String x:Key=\"filesizeextra\"> Ko (image inclue) </s:String> <!-- incl. = including, do not omit space at the end please! -->\r\n    <s:String x:Key=\"author\" xml:space=\"preserve\">Auteur: </s:String> <!-- do not omit space at the end please! -->\r\n    <s:String x:Key=\"likes\" xml:space=\"preserve\">Favoris: </s:String> <!-- do not omit space at the end please! -->\r\n    <s:String x:Key=\"download\">Télécharger</s:String><!-- verb! -->\r\n    <s:String x:Key=\"downloadnew\">Télécharger une copie</s:String><!-- download is a verb! -->\r\n    <s:String x:Key=\"like\">Ajouter aux favoris</s:String><!-- verb! -->\r\n    <s:String x:Key=\"unlike\">Supprimer des favoris</s:String><!-- verb! -->\r\n    <s:String x:Key=\"comments\">Commentaires</s:String>\r\n    <s:String x:Key=\"goback\">Retour</s:String>\r\n    <s:String x:Key=\"openweb\">Ouvrir dans le navigateur</s:String>\r\n\r\n    <!-- Home tab -->\r\n    <s:String x:Key=\"welcome\">Bienvenue dans l'éditeur de RainbowTaskbar !</s:String>\r\n    <s:String x:Key=\"whatsnew\">Nouveautés de la dernière mise à jour</s:String>\r\n    <s:String x:Key=\"review\">Déposer un avis (Microsoft Store)</s:String>\r\n\r\n    <s:String x:Key=\"issueremind\">*utiliser GitHub pour ouvrir un ticket ou soumettre une demande est le moyen recommandé.</s:String>\r\n    <s:String x:Key=\"issuetitle\">Sujet</s:String>\r\n    <s:String x:Key=\"issuedesc\">Description</s:String>\r\n    <s:String x:Key=\"issuecontact\">Information de contact (facultatif)</s:String>\r\n    \r\n    <!-- Settings tab -->\r\n    <s:String x:Key=\"general\">Général</s:String>\r\n    <s:String x:Key=\"runstartup\">Lancer au démarrage</s:String>\r\n    <s:String x:Key=\"checkupdate\">Rechercher des mises à jour</s:String>\r\n    <s:String x:Key=\"showicon\">Afficher l’icône dans la barre d’état système</s:String>\r\n    <s:String x:Key=\"language\">Langue</s:String>\r\n    <s:String x:Key=\"workshop\">Galerie</s:String>\r\n    <s:String x:Key=\"signedin\">Connecté en tant que</s:String>\r\n    <s:String x:Key=\"logingit\">Se connecter (GitHub)</s:String>\r\n    <s:String x:Key=\"logingoog\">Se connecter (Google)</s:String>\r\n    <s:String x:Key=\"signout\">Se déconnecter</s:String>\r\n    <s:String x:Key=\"passmouse\">Transmettre la souris à la sous-couche (peut utiliser le CPU)</s:String>\r\n    <s:String x:Key=\"allowjs\">Autoriser JavaScript</s:String>\r\n    <s:String x:Key=\"graphics\">Graphismes</s:String>\r\n    <s:String x:Key=\"interpquality\">Qualité d'interpolation (plus petit = meilleur)</s:String>\r\n    <s:String x:Key=\"multipletaskbars\">Plusieurs barre des tâches</s:String>\r\n    <s:String x:Key=\"perfimpact\">(la valeur actuelle peut impacter les performances)</s:String>\r\n    <s:String x:Key=\"samerad\">Même rayon</s:String>\r\n    <s:String x:Key=\"graphicsrepeat\">Répéter</s:String>\r\n    <s:String x:Key=\"comingsoon\">Arrive bientôt</s:String>\r\n    <s:String x:Key=\"webfps\">IPS Web maximum</s:String>\r\n    <s:String x:Key=\"systemdefault\">(Utiliser la langue du système)</s:String>\r\n    <s:String x:Key=\"globalprop\">Propriétés globales</s:String>\r\n    <s:String x:Key=\"globalpropdef\">*pour garder le paramètre de la configuration, utiliser '-1'</s:String>\r\n    <s:String x:Key=\"globalopacity\">Opacité de la barre (0-1)</s:String>\r\n    <s:String x:Key=\"reportex\">Envoyer les informations sur les exceptions non gérées</s:String>\r\n\r\n    <!-- Browse Tab -->\r\n    <s:String x:Key=\"search\">Rechercher...</s:String>\r\n    <!-- Sort by Likes/Match-->\r\n    <s:String x:Key=\"enum_likes\">Favoris</s:String>\r\n    <s:String x:Key=\"enum_match\">Correspondance</s:String>\r\n\r\n    <!-- Instructions and displayed format strings -->\r\n    <s:String x:Key=\"borderradiusinstruction\">Rayon de Bordure</s:String>\r\n    <s:String x:Key=\"clearlayerinstruction\">Calque vide</s:String>\r\n    <s:String x:Key=\"colorinstruction\">Couleur</s:String>\r\n    <s:String x:Key=\"delayinstruction\">Délai</s:String>\r\n    <s:String x:Key=\"imageinstruction\">Image</s:String>\r\n    <s:String x:Key=\"shapeinstruction\">Forme</s:String>\r\n    <s:String x:Key=\"textinstruction\">Texte</s:String>\r\n    <s:String x:Key=\"transparencyinstruction\">Transparence/Style</s:String>\r\n\r\n    <s:String x:Key=\"borderradiusinstructionformat\">Rayon de Bordure - {0}px</s:String>\r\n    <s:String x:Key=\"clearlayerinstructionformat\">Calque vide - {0}</s:String>\r\n    <s:String x:Key=\"colorinstructionrandomizedformat\">{0} - Aléatoire</s:String>\r\n    <!-- no translation --> <s:String x:Key=\"colorinstructiongradientformat\">{0} - {1} -> {2}</s:String>\r\n    <!-- no translation --> <s:String x:Key=\"colorinstructionsolidformat\">{0} - {1}</s:String>\r\n    <s:String x:Key=\"delayinstructionformat\">Délai - {0}ms</s:String>\r\n    <s:String x:Key=\"imageinstructionformat\">Image - {0}</s:String>\r\n    <s:String x:Key=\"shapeinstructionformat\">Forme - {0}</s:String>\r\n    <s:String x:Key=\"textinstructionformat\">Texte - {0}</s:String>\r\n    <s:String x:Key=\"transparencyinstructionstyleformat\">Style - {0}</s:String>\r\n    <s:String x:Key=\"transparencyinstructionlayerformat\">Calque {0} - {1}%</s:String>\r\n    <s:String x:Key=\"transparencyinstructionopacityformat\">{0} - {1}%</s:String>\r\n\r\n    <!-- Enums -->\r\n        <!-- Shapes -->\r\n    <s:String x:Key=\"enum_line\">Ligne</s:String>\r\n    <s:String x:Key=\"enum_rectangle\">Rectangle</s:String>\r\n    <s:String x:Key=\"enum_roundedrect\">Rectangle arrondi</s:String>\r\n    <s:String x:Key=\"enum_ellipse\">Ellipse</s:String>\r\n        <!-- Color instruction effects -->\r\n    <s:String x:Key=\"enum_solid\">Opaque</s:String>\r\n    <s:String x:Key=\"enum_fade\">Fondu opaque</s:String>\r\n    <s:String x:Key=\"enum_gradient\">Dégradé</s:String>\r\n    <s:String x:Key=\"enum_fadegradient\">Fondu en dégradé</s:String>\r\n        <!-- Color instruction transitions -->\r\n    <s:String x:Key=\"enum_linear\">Linéaire</s:String>\r\n    <s:String x:Key=\"enum_cubic\">Cubique</s:String>\r\n    <s:String x:Key=\"enum_sine\">Ondulation</s:String>\r\n    <s:String x:Key=\"enum_exponential\">Exponentiel</s:String>\r\n    <s:String x:Key=\"enum_back\">Retour</s:String>\r\n        <!-- Transparency instruction option 1 -->\r\n    <s:String x:Key=\"enum_taskbar\">Opacité de la barre des tâches</s:String>\r\n    <s:String x:Key=\"enum_rainbowtaskbar\">Opacité de la sous-couche</s:String>\r\n    <s:String x:Key=\"enum_all\">Opacité de la barre des tâches et de la sous-couche</s:String>\r\n    <s:String x:Key=\"enum_layer\">Opacité du calque</s:String>\r\n    <s:String x:Key=\"enum_style\">Style de la barre des tâches</s:String>\r\n    <s:String x:Key=\"enum_taskbarelements\">Taskbar elements</s:String>\r\n        <!-- Transparency instruction styles -->\r\n    <s:String x:Key=\"enum_default\">Par défaut</s:String>\r\n    <s:String x:Key=\"enum_blur\">Flou</s:String>\r\n    <s:String x:Key=\"enum_transparent\">Transparent</s:String>\r\n    \r\n    <!-- Instruction controls -->\r\n        <!-- Shape -->\r\n    <s:String x:Key=\"drawonce\">Dessiner une seule fois</s:String>\r\n    <s:String x:Key=\"strokecolor\">Couleur du contour</s:String> <!-- stroke is a noun! -->\r\n    <s:String x:Key=\"fillcolor\">Couleur de remplissage</s:String> <!-- fill is a noun! -->\r\n    <s:String x:Key=\"thickness\">Épaisseur</s:String>\r\n    <s:String x:Key=\"radius\">Rayon de bordure</s:String>\r\n    <s:String x:Key=\"fittaskbars\">Adapter à la barre des tâches</s:String> <!-- fit is a verb! -->\r\n        <!-- Color -->\r\n    <s:String x:Key=\"randomize\">Couleurs aléatoires</s:String>\r\n    <s:String x:Key=\"holdtime\">Durée de maintien</s:String>\r\n    <s:String x:Key=\"fadetime\">Durée de fondu</s:String>\r\n    <s:String x:Key=\"gradientangle\">Angle du dégradé °</s:String>\r\n    <s:String x:Key=\"layer\">Calque</s:String>\r\n    <s:String x:Key=\"milliseconds\">ms</s:String>\r\n        <!-- Image -->\r\n    <s:String x:Key=\"chooseimg\">Choisir une image</s:String>\r\n    <s:String x:Key=\"width\">Largeur</s:String>\r\n    <s:String x:Key=\"height\">Hauteur</s:String>\r\n        <!-- Text -->\r\n    <s:String x:Key=\"fontsize\">Taille de la police</s:String>\r\n    <s:String x:Key=\"fontcolor\">Couleur de la police</s:String>\r\n    <s:String x:Key=\"centerx\">Centrer sur l'axe X (horizontal)</s:String> <!-- center is a verb! -->\r\n        <!-- Transparency -->\r\n    <s:String x:Key=\"change\">Changer</s:String>\r\n    <s:String x:Key=\"to\">en</s:String>\r\n\r\n    <!-- Instruction context menu -->\r\n    <s:String x:Key=\"duplicate\">Dupliquer</s:String> <!-- it's a verb! -->\r\n    <s:String x:Key=\"delete\">Supprimer</s:String>\r\n    <s:String x:Key=\"duplicate_rev_color\">Dupliquer - Échanger les couleurs</s:String>\r\n    \r\n    <!-- Tray window context menu -->\r\n    <s:String x:Key=\"openeditor\">Ouvrir l'éditeur</s:String>\r\n    <s:String x:Key=\"donate\">Faire un don</s:String>\r\n    <s:String x:Key=\"projectpage\">Ouvrir la page du projet</s:String>\r\n    <s:String x:Key=\"issueorreq\">Ouvrir un ticket ou soumettre une demande</s:String>\r\n    <s:String x:Key=\"exit\">Quitter</s:String>\r\n    \r\n    <!-- Dialog boxes -->\r\n    <s:String x:Key=\"msgbox_baddll\">Il semble y avoir un problème avec la DLL de RainbowTaskbar injectée dans explorer.exe. \r\n        Ce processus étant encore expérimental, veuillez ouvrir un ticket sur GitHub (clic droit sur RainbowTaskbar dans la barre d’état système -> Ouvrir un ticket ou soumettre une demande) \r\n        afin d’aider à diagnostiquer le problème. Veillez également à joindre tout autre message d’erreur que vous auriez rencontré.</s:String>\r\n    <s:String x:Key=\"msgbox_olddll\">Pour activer les effets de transparence, RainbowTaskbar doit redémarrer le processus explorer.exe.\r\n        Souhaitez-vous continuer ?</s:String>\r\n    <s:String x:Key=\"msgbox_badarch\">Votre architecture de processeur (x64) est incompatible avec cet exécutable (x86).\r\n        Veuillez télécharger l’exécutable correspondant (rnbtsk-x64.exe / setup-x64.exe) depuis les publications GitHub.</s:String>\r\n    <s:String x:Key=\"msgbox_migrateoldcfg\">RainbowTaskbar a détecté une version de configuration héritée.\r\n        Souhaitez-vous la migrer vers le nouveau format de configuration ?\r\n    </s:String>\r\n    <s:String x:Key=\"msgbox_login\">\r\n        Veuillez saisir le code affiché sur la page de connexion réussie ci-dessous.\r\n    </s:String>\r\n    <s:String x:Key=\"msgbox_notloggedin\">Vous devez être connecté pour pouvoir publier votre configuration ! Rendez vous dans les paramètres pour vous connecter.</s:String>\r\n    <s:String x:Key=\"msgbox_notloggedin_title\">Non connecté</s:String>\r\n    <s:String x:Key=\"msgbox_notloggedin2\">Vous devez être connecté pour ajouter cette configuration à vos favoris !</s:String>\r\n    <s:String x:Key=\"msgbox_fail\">Erreur lors de la publication de la configuration.</s:String>\r\n    <s:String x:Key=\"msgbox_fail_title\">Erreur</s:String>\r\n    <s:String x:Key=\"msgbox_thumbnail\">Configuration mise à jour. Erreur lors de la publication de l'image.</s:String>\r\n    <s:String x:Key=\"msgbox_property_title\">Ajouter une propriété</s:String>\r\n    <s:String x:Key=\"msgbox_login_title\">Se connecter avec un code</s:String>\r\n    <s:String x:Key=\"msgbox_login_button\">Se connecter</s:String>\r\n    <s:String x:Key=\"msgbox_save_title\">Souhaitez-vous enregistrer votre progression ?</s:String>\r\n    <s:String x:Key=\"msgbox_save\">Souhaitez-vous enregistrer votre configuration actuelle ?</s:String>\r\n    <s:String x:Key=\"msgbox_save_b1\">Enregistrer</s:String>\r\n    <s:String x:Key=\"msgbox_save_b2\">Ne pas enregistrer</s:String>\r\n    <s:String x:Key=\"msgbox_button_cancel\">Annuler</s:String>\r\n    <s:String x:Key=\"msgbox_update\">Une nouvelle version de RainbowTaskbar est disponible. Souhaitez-vous mettre à jour ?</s:String>\r\n    <s:String x:Key=\"msgbox_migrate\">Souhaitez-vous migrer la configuration et les préréglages de la version héritée (v2) vers la version actuelle ?</s:String>\r\n    <s:String x:Key=\"msgbox_issuegithub\">Utiliser GitHub</s:String>\r\n    \r\n    <!-- Fill with \"Translated by ...\" -->\r\n    <s:String x:Key=\"langcredits\">Traduit par Jean-Baptiste A.</s:String>\r\n\r\n</ResourceDictionary>\r\n\r\n\r\n\r\n"
  },
  {
    "path": "RainbowTaskbar/Languages/fr_FR.xaml.cs",
    "content": "﻿using System.Windows;\r\n\r\nnamespace RainbowTaskbar.Languages\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for fr_FR.xaml\r\n    /// </summary>\r\n    public partial class fr_FR : ResourceDictionary\r\n    {\r\n        public fr_FR() {\r\n\r\n        }\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "RainbowTaskbar/Languages/ro_RO.xaml",
    "content": "﻿<ResourceDictionary x:Class=\"RainbowTaskbar.Languages.ro_RO\"\n                    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n                    xmlns:s=\"clr-namespace:System;assembly=mscorlib\">\n    <s:String x:Key=\"home\">Acasă</s:String>\n    <s:String x:Key=\"settings\">Setări</s:String>\n    <s:String x:Key=\"about\">Despre</s:String>\n    <s:String x:Key=\"browse\">Caută</s:String>\n    <s:String x:Key=\"configs\">Configurații</s:String>\n\n    <!-- About Tab -->\n    <s:String x:Key=\"aboutrnb\">Despre RainbowTaskbar</s:String>\n    <s:String x:Key=\"rnbweb\">Deschide site-ul RainbowTaskbar</s:String>\n    <s:String x:Key=\"description\">RainbowTaskbar este un instrument care vă permite să personalizați taskbar-ul.</s:String>\n    <s:String x:Key=\"donations\">Este complet gratuit, dar donațiile sunt apreciate!</s:String>\n    <!-- RainbowTaskbar is free software.\n         Made by ad2017 , with the help of zCri .-->\n\n    <!-- Configs Tab -->\n    <s:String x:Key=\"untitled\">Fără titlu</s:String>\n    <s:String x:Key=\"new\">Nou</s:String>\n    <s:String x:Key=\"enum_classic\">Clasic</s:String>\n    <s:String x:Key=\"enum_web\">Web</s:String>\n    \n    <!-- Instruction config edit -->\n    <s:String x:Key=\"runoncegroup\">Grup care execută o data</s:String>\n    <s:String x:Key=\"loopinggroups\">Grup care execută continuu</s:String>\n    <s:String x:Key=\"group\">Grup</s:String>\n    <s:String x:Key=\"run\">Execută</s:String>\n    <s:String x:Key=\"save\">Salvează</s:String>\n    <s:String x:Key=\"add\">Adaugă</s:String>\n        <!-- Config edit -->\n    <s:String x:Key=\"name\">Titlu</s:String>\n    <s:String x:Key=\"thumbnail\">Imagine</s:String>\n    <s:String x:Key=\"editconfig\">Modifică configurația</s:String>\n    <s:String x:Key=\"saveandpublish\">Salvează și publică</s:String>\n    <s:String x:Key=\"publishstatus\" xml:space=\"preserve\">Status: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"enum_published\">Cel mai nou publicat</s:String>\n    <s:String x:Key=\"enum_previouslypublished\">Publicat precedent, dar nu cel mai nou</s:String>\n    <s:String x:Key=\"enum_notpublished\">Nu a fost publicat</s:String>\n    <s:String x:Key=\"pickimg\">Alege o imagine</s:String>\n    <s:String x:Key=\"copypreset\">Copiază instrucțiuni din prestabilite</s:String>\n    <s:String x:Key=\"descriptionlit\">Descriere</s:String>\n    <s:String x:Key=\"addprop\">Adaugă proprietate</s:String>\n    <s:String x:Key=\"propname\">Nume proprietate</s:String>\n    <s:String x:Key=\"propkey\">Cheie proprietate</s:String>\n    <s:String x:Key=\"proptype\">Tip proprietate</s:String>\n    <s:String x:Key=\"defpropkey\">proprietate_1</s:String>\n    <s:String x:Key=\"defpropname\">Proprietate nouă</s:String>\n\n    <s:String x:Key=\"devtools\">Deschide instrumentele de dezvoltator</s:String>\n\n    <s:String x:Key=\"enum_string\">Text</s:String>\n    <s:String x:Key=\"enum_number\">Număr</s:String>\n    <s:String x:Key=\"enum_color\">Culoare</s:String>\n    <s:String x:Key=\"enum_boolean\">Boolean</s:String>\n    \n    \n    <!-- Config view -->\n    <s:String x:Key=\"filesize\" xml:space=\"preserve\">Mărime fișier: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"filesizeextra\"> KO (cu imagine)</s:String> <!-- incl. = including, do not omit space at the end please! -->\n    <s:String x:Key=\"author\" xml:space=\"preserve\">Autor: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"likes\" xml:space=\"preserve\">Aprecieri: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"download\">Descarcă</s:String><!-- verb! -->\n    <s:String x:Key=\"downloadnew\">Descarcă o copie nouă</s:String><!-- download is a verb! -->\n    <s:String x:Key=\"like\">Apreciază</s:String><!-- verb! -->\n    <s:String x:Key=\"unlike\">Nu mai aprecia</s:String><!-- verb! -->\n    <s:String x:Key=\"comments\">Comentarii</s:String>\n    <s:String x:Key=\"goback\">Înapoi</s:String>\n    <s:String x:Key=\"openweb\">Deschide în web</s:String>\n\n    <!-- Home tab -->\n    <s:String x:Key=\"welcome\">Bun venit la editor-ul RainbowTaskbar!</s:String>\n    <s:String x:Key=\"whatsnew\">Ce e nou în ultimul update</s:String>\n    <s:String x:Key=\"review\">Adaugă un review</s:String>\n\n    <s:String x:Key=\"issueremind\">*este preferată utilizarea platformei GitHub pentru a publica o problemă sau o cerere.</s:String>\n    <s:String x:Key=\"issuetitle\">Titlu cerere</s:String>\n    <s:String x:Key=\"issuedesc\">Descriere</s:String>\n    <s:String x:Key=\"issuecontact\">Date de contact (optional)</s:String>\n\n    <!-- Settings tab -->\n    <s:String x:Key=\"general\">General</s:String>\n    <s:String x:Key=\"runstartup\">Execută la pornirea sistemului</s:String>\n    <s:String x:Key=\"checkupdate\">Verifică actualizari</s:String>\n    <s:String x:Key=\"showicon\">Afișează iconița de notificari</s:String>\n    <s:String x:Key=\"language\">Limbă</s:String>\n    <s:String x:Key=\"workshop\">Workshop</s:String>\n    <s:String x:Key=\"signedin\">Autentificat ca</s:String>\n    <s:String x:Key=\"logingit\">Autentificare (GitHub)</s:String>\n    <s:String x:Key=\"logingoog\">Autentificare (Google)</s:String>\n    <s:String x:Key=\"signout\">Deconectare</s:String>\n    <s:String x:Key=\"passmouse\">Trimite mouse input la substrat (poate utiliza CPU)</s:String>\n    <s:String x:Key=\"allowjs\">Permite JavaScript</s:String>\n    <s:String x:Key=\"graphics\">Grafici</s:String>\n    <s:String x:Key=\"interpquality\">Calitate interpolare (mai mic = mai bun)</s:String>\n    <s:String x:Key=\"multipletaskbars\">Mai multe taskbar-uri</s:String>\n    <s:String x:Key=\"perfimpact\">(valoarea selectată poate afecta performanța)</s:String>\n    <s:String x:Key=\"samerad\">Aceeași rază</s:String>\n    <s:String x:Key=\"graphicsrepeat\">Repetă graficile</s:String>\n    <s:String x:Key=\"comingsoon\">În curând...</s:String>\n    <s:String x:Key=\"webfps\">FPS (cadre pe secundă) maxim web</s:String>\n    <s:String x:Key=\"systemdefault\">(Utilizează limba sistemului)</s:String>\n    <s:String x:Key=\"globalprop\">Proprietăți globale</s:String>\n    <s:String x:Key=\"globalpropdef\">*pentru a păstra setările configurației selectate, utilizați valoarea '-1'</s:String>\n    <s:String x:Key=\"globalopacity\">Transparență taskbar (0-1)</s:String>\n    <s:String x:Key=\"reportex\">Trimite informații despre erori</s:String>\n\n    <!-- Browse Tab -->\n    <s:String x:Key=\"search\">Caută...</s:String>\n    <!-- Sort by Likes/Match-->\n    <s:String x:Key=\"enum_likes\">După aprecieri</s:String>\n    <s:String x:Key=\"enum_match\">După potrivire</s:String>\n\n    <!-- Instructions and displayed format strings -->\n    <s:String x:Key=\"borderradiusinstruction\">Raza colțurilor</s:String>\n    <s:String x:Key=\"clearlayerinstruction\">Golește strat</s:String>\n    <s:String x:Key=\"colorinstruction\">Culoare</s:String>\n    <s:String x:Key=\"delayinstruction\">Întârziere</s:String>\n    <s:String x:Key=\"imageinstruction\">Imagine</s:String>\n    <s:String x:Key=\"shapeinstruction\">Formă</s:String>\n    <s:String x:Key=\"textinstruction\">Text</s:String>\n    <s:String x:Key=\"transparencyinstruction\">Transparență/Stil</s:String>\n\n    <s:String x:Key=\"borderradiusinstructionformat\">Raza colțurilor - {0}px</s:String>\n    <s:String x:Key=\"clearlayerinstructionformat\">Golește strat - {0}</s:String>\n    <s:String x:Key=\"colorinstructionrandomizedformat\">{0} - Aleatoriu</s:String>\n    <!-- no translation --> <s:String x:Key=\"colorinstructiongradientformat\">{0} - {1} -> {2}</s:String>\n    <!-- no translation --> <s:String x:Key=\"colorinstructionsolidformat\">{0} - {1}</s:String>\n    <s:String x:Key=\"delayinstructionformat\">Intârziere - {0}ms</s:String>\n    <s:String x:Key=\"imageinstructionformat\">Imagine - {0}</s:String>\n    <s:String x:Key=\"shapeinstructionformat\">Formă- {0}</s:String>\n    <s:String x:Key=\"textinstructionformat\">Text - {0}</s:String>\n    <s:String x:Key=\"transparencyinstructionstyleformat\">Stil - {0}</s:String>\n    <s:String x:Key=\"transparencyinstructionlayerformat\">Strat {0} - {1}%</s:String>\n    <s:String x:Key=\"transparencyinstructionopacityformat\">{0} - {1}%</s:String>\n\n    <!-- Enums -->\n        <!-- Shapes -->\n    <s:String x:Key=\"enum_line\">Linie</s:String>\n    <s:String x:Key=\"enum_rectangle\">Dreptunghi</s:String>\n    <s:String x:Key=\"enum_roundedrect\">Dreptunghi rotunjit</s:String>\n    <s:String x:Key=\"enum_ellipse\">Elipsă</s:String>\n        <!-- Color instruction effects -->\n    <s:String x:Key=\"enum_solid\">Solid</s:String>\n    <s:String x:Key=\"enum_fade\">Solid cu estompare</s:String>\n    <s:String x:Key=\"enum_gradient\">Gradient</s:String>\n    <s:String x:Key=\"enum_fadegradient\">Gradient cu estompare</s:String>\n        <!-- Color instruction transitions -->\n    <s:String x:Key=\"enum_linear\">Linear</s:String>\n    <s:String x:Key=\"enum_cubic\">Cubic</s:String>\n    <s:String x:Key=\"enum_sine\">Sinus</s:String>\n    <s:String x:Key=\"enum_exponential\">Exponențial</s:String>\n    <s:String x:Key=\"enum_back\">Înapoi</s:String>\n        <!-- Transparency instruction option 1 -->\n    <s:String x:Key=\"enum_taskbar\">Opacitate taskbar</s:String>\n    <s:String x:Key=\"enum_rainbowtaskbar\">Opacitate substrat</s:String>\n    <s:String x:Key=\"enum_all\">Opacitate taskbar și substrat</s:String>\n    <s:String x:Key=\"enum_layer\">Opacitate strat</s:String>\n    <s:String x:Key=\"enum_style\">Stilul taskbar-ului</s:String>\n    <s:String x:Key=\"enum_taskbarelements\">Elementele taskbar-ului</s:String>\n        <!-- Transparency instruction styles -->\n    <s:String x:Key=\"enum_default\">Prestabilit</s:String>\n    <s:String x:Key=\"enum_blur\">Blurat</s:String>\n    <s:String x:Key=\"enum_transparent\">Transparent</s:String>\n    \n    <!-- Instruction controls -->\n        <!-- Shape -->\n    <s:String x:Key=\"drawonce\">Desenează o singură dată</s:String>\n    <s:String x:Key=\"strokecolor\">Culoare linie</s:String> <!-- stroke is a noun! -->\n    <s:String x:Key=\"fillcolor\">Culoare umplutură</s:String> <!-- fill is a noun! -->\n    <s:String x:Key=\"thickness\">Grosime</s:String>\n    <s:String x:Key=\"radius\">Raza colțurilor</s:String>\n    <s:String x:Key=\"fittaskbars\">Potrivește la dimensiunea taskbar-ului</s:String> <!-- fit is a verb! -->\n        <!-- Color -->\n    <s:String x:Key=\"randomize\">Culori aleatorii</s:String>\n    <s:String x:Key=\"holdtime\">Timp de susținere</s:String>\n    <s:String x:Key=\"fadetime\">Timp de estompare</s:String>\n    <s:String x:Key=\"gradientangle\">Unghiul gradientului °</s:String>\n    <s:String x:Key=\"layer\">Strat</s:String>\n    <s:String x:Key=\"milliseconds\">ms</s:String>\n        <!-- Image -->\n    <s:String x:Key=\"chooseimg\">Alege imagine</s:String>\n    <s:String x:Key=\"width\">Lățime</s:String>\n    <s:String x:Key=\"height\">Înălțime</s:String>\n        <!-- Text -->\n    <s:String x:Key=\"fontsize\">Marime font</s:String>\n    <s:String x:Key=\"fontcolor\">Culoare font</s:String>\n    <s:String x:Key=\"centerx\">Centrează pe axa Ox</s:String> <!-- center is a verb! -->\n        <!-- Transparency -->\n    <s:String x:Key=\"change\">Schimbă</s:String>\n    <s:String x:Key=\"to\">la</s:String>\n\n\n\n    <!-- Instruction context menu -->\n    <s:String x:Key=\"duplicate\">Duplică</s:String> <!-- it's a verb! -->\n    <s:String x:Key=\"delete\">Șterge</s:String>\n    <s:String x:Key=\"duplicate_rev_color\">Duplică - Inversează culorile</s:String>\n    \n    <!-- Tray window context menu -->\n    <s:String x:Key=\"openeditor\">Deschide editor-ul</s:String>\n    <s:String x:Key=\"donate\">Donează</s:String>\n    <s:String x:Key=\"projectpage\">Deschide pagina proiectului</s:String>\n    <s:String x:Key=\"issueorreq\">Publică o cerere sau problema</s:String>\n    <s:String x:Key=\"exit\">Închide</s:String>\n\n    <!-- Dialog boxes -->\n    <s:String x:Key=\"msgbox_baddll\">Se pare că există o problema cu DLL-ul injectat in procesul explorer.exe. \n        Acest proces este experimental, va rugăm să publicați o problema pe GitHub (Click-dreapta pe iconița de notificari -> Publică o cerere sau problema) \n        pentru a permite depanarea problemei. Vă rugam să menționați și orice altă eroare ați mai întâmpinat.</s:String>\n    <s:String x:Key=\"msgbox_olddll\">Pentru a permite efectele de transparență, RainbowTaskbar trebuie să reporneasca procesul explorer.exe.\n        Doriți să continuați?</s:String>\n    <s:String x:Key=\"msgbox_badarch\">Tipul procesorului dvs. (x64) este incompatibil cu acest executabil (x86). \n        Vă rugăm să descărcați varianta corectă a programului (rnbtsk-x64.exe / setup-x64.exe) de pe GitHub.</s:String>\n    <s:String x:Key=\"msgbox_migrateoldcfg\">RainbowTaskbar a găsit o configurație veche.\n        Doriți să o actualizați la noul format?\n    </s:String>\n    <s:String x:Key=\"msgbox_login\">\n        Introduceți codul afișat pe pagina de autentificare cu succes\n    </s:String>\n    <s:String x:Key=\"msgbox_notloggedin\">Trebuie să fiți autentificat pentru a publica o configurație! Verificați pagina Setări pentru a vă autentifica.</s:String>\n    <s:String x:Key=\"msgbox_notloggedin_title\">Neautentificat</s:String>\n    <s:String x:Key=\"msgbox_notloggedin2\">Trebuie sa fiți autentificat pentru a aprecia o configurație!</s:String>\n    <s:String x:Key=\"msgbox_fail\">Nu s-a putut publica configurația.</s:String>\n    <s:String x:Key=\"msgbox_fail_title\">Eșec</s:String>\n    <s:String x:Key=\"msgbox_thumbnail\">Datele/informațiile configurației au fost actualizate. Nu s-a putut actualiza poza.</s:String>\n    <s:String x:Key=\"msgbox_property_title\">Creează proprietate nouă</s:String>\n    <s:String x:Key=\"msgbox_login_title\">Autentificare cu cod</s:String>\n    <s:String x:Key=\"msgbox_login_button\">Autentificare</s:String>\n    <s:String x:Key=\"msgbox_save_title\">Salvați?</s:String>\n    <s:String x:Key=\"msgbox_save\">Doriți să salvați configurația actuală?</s:String>\n    <s:String x:Key=\"msgbox_save_b1\">Salvează</s:String>\n    <s:String x:Key=\"msgbox_save_b2\">Nu salva</s:String>\n    <s:String x:Key=\"msgbox_button_cancel\">Anulează</s:String>\n    <s:String x:Key=\"msgbox_update\">Un nou update RainbowTaskbar a fost găsit. Doriți să actualizați?</s:String>\n    <s:String x:Key=\"msgbox_migrate\">Vrei să migrezi configurațiile v2 la v3 (actual)?</s:String>\n    <s:String x:Key=\"msgbox_issuegithub\">Folosește GitHub</s:String>\n    <!-- Fill with \"Translated by ...\" -->\n    <s:String x:Key=\"langcredits\">‎</s:String>\n\n</ResourceDictionary>"
  },
  {
    "path": "RainbowTaskbar/Languages/ro_RO.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Shapes;\n\nnamespace RainbowTaskbar.Languages\n{\n    /// <summary>\n    /// Interaction logic for ro_RO.xaml\n    /// </summary>\n    public partial class ro_RO : ResourceDictionary\n    {\n        public ro_RO()\n        {\n            \n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Languages/zh_CN.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Shapes;\n\nnamespace RainbowTaskbar.Languages {\n    /// <summary>\n    /// Interaction logic for zh_CN.xaml\n    /// </summary>\n    public partial class zh_CN : ResourceDictionary {\n        public zh_CN() {\n\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/Languages/zh_CN.xaml",
    "content": "﻿<ResourceDictionary x:Class=\"RainbowTaskbar.Languages.zh_CN\"\n                    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n                    xmlns:s=\"clr-namespace:System;assembly=mscorlib\">\n    <s:String x:Key=\"home\">主页</s:String>\n    <s:String x:Key=\"settings\">设置</s:String>\n    <s:String x:Key=\"about\">关于</s:String>\n    <s:String x:Key=\"browse\">浏览</s:String>\n    <s:String x:Key=\"configs\">配置</s:String>\n\n    <!-- About Tab -->\n    <s:String x:Key=\"aboutrnb\">关于 RainbowTaskbar</s:String>\n    <s:String x:Key=\"rnbweb\">打开 RainbowTaskbar 网站</s:String>\n    <s:String x:Key=\"description\">RainbowTaskbar 是一款系统增强工具，允许您极大地自定义任务栏的外观。</s:String>\n    <s:String x:Key=\"donations\">它完全免费使用，但非常欢迎捐赠支持！</s:String>\n    <!-- RainbowTaskbar is free software.\n         Made by ad2017 , with the help of zCri .-->\n\n    <!-- Configs Tab -->\n    <s:String x:Key=\"untitled\">未命名</s:String>\n    <s:String x:Key=\"new\">新建</s:String>\n    <s:String x:Key=\"enum_classic\">经典</s:String>\n    <s:String x:Key=\"enum_web\">网络</s:String>\n    \n    <!-- Instruction config edit -->\n    <s:String x:Key=\"runoncegroup\">运行一次组</s:String>\n    <s:String x:Key=\"loopinggroups\">循环组</s:String>\n    <s:String x:Key=\"group\">组</s:String>\n    <s:String x:Key=\"run\">运行</s:String>\n    <s:String x:Key=\"save\">保存</s:String>\n    <s:String x:Key=\"add\">添加</s:String>\n        <!-- Config edit -->\n    <s:String x:Key=\"name\">标题</s:String>\n    <s:String x:Key=\"thumbnail\">缩略图</s:String>\n    <s:String x:Key=\"editconfig\">编辑配置</s:String>\n    <s:String x:Key=\"saveandpublish\">保存并发布</s:String>\n    <s:String x:Key=\"publishstatus\" xml:space=\"preserve\">发布状态: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"enum_published\">最新发布</s:String>\n    <s:String x:Key=\"enum_previouslypublished\">先前已发布，但不是最新的</s:String>\n    <s:String x:Key=\"enum_notpublished\">未发布</s:String>\n    <s:String x:Key=\"pickimg\">选择图片</s:String>\n    <s:String x:Key=\"copypreset\">从预设复制指令</s:String>\n    <s:String x:Key=\"descriptionlit\">描述</s:String>\n    <s:String x:Key=\"addprop\">添加属性</s:String>\n    <s:String x:Key=\"propname\">属性名称</s:String>\n    <s:String x:Key=\"propkey\">属性键</s:String>\n    <s:String x:Key=\"proptype\">属性类型</s:String>\n    <s:String x:Key=\"defpropkey\">property_1</s:String>\n    <s:String x:Key=\"defpropname\">新建属性</s:String>\n\n    <s:String x:Key=\"devtools\">打开开发者工具</s:String>\n\n    <s:String x:Key=\"enum_string\">字符串</s:String>\n    <s:String x:Key=\"enum_number\">数字</s:String>\n    <s:String x:Key=\"enum_color\">颜色</s:String>\n    <s:String x:Key=\"enum_boolean\">布尔值</s:String>\n    <!-- Config view -->\n    <s:String x:Key=\"filesize\" xml:space=\"preserve\">文件大小: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"filesizeextra\"> KB (包含缩略图)</s:String> <!-- incl. = including, do not omit space at the end please! -->\n    <s:String x:Key=\"author\" xml:space=\"preserve\">作者: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"likes\" xml:space=\"preserve\">点赞数: </s:String> <!-- do not omit space at the end please! -->\n    <s:String x:Key=\"download\">下载</s:String><!-- verb! -->\n    <s:String x:Key=\"downloadnew\">下载新版本</s:String><!-- download is a verb! -->\n    <s:String x:Key=\"like\">点赞</s:String><!-- verb! -->\n    <s:String x:Key=\"unlike\">取消点赞</s:String><!-- verb! -->\n    <s:String x:Key=\"comments\">评论</s:String>\n    <s:String x:Key=\"goback\">返回</s:String>\n    <s:String x:Key=\"openweb\">在网页中打开</s:String>\n\n    <!-- Home tab -->\n    <s:String x:Key=\"welcome\">欢迎使用 RainbowTaskbar 编辑器！</s:String>\n    <s:String x:Key=\"whatsnew\">最新更新中的新功能</s:String>\n    <s:String x:Key=\"review\">商店评论</s:String>\n\n    <s:String x:Key=\"issueremind\">*最好使用 GitHub 提交问题或请求。</s:String>\n    <s:String x:Key=\"issuetitle\">问题标题</s:String>\n    <s:String x:Key=\"issuedesc\">描述</s:String>\n    <s:String x:Key=\"issuecontact\">联系信息（可选）</s:String>\n\n    <!-- Settings tab -->\n    <s:String x:Key=\"general\">常规</s:String>\n    <s:String x:Key=\"runstartup\">启动时运行</s:String>\n    <s:String x:Key=\"checkupdate\">检查更新</s:String>\n    <s:String x:Key=\"showicon\">显示托盘图标</s:String>\n    <s:String x:Key=\"language\">语言</s:String>\n    <s:String x:Key=\"workshop\">工作区</s:String>\n    <s:String x:Key=\"signedin\">已登录为</s:String>\n    <s:String x:Key=\"logingit\">登录（GitHub）</s:String>\n    <s:String x:Key=\"logingoog\">登录（Google）</s:String>\n    <s:String x:Key=\"signout\">注销</s:String>\n    <s:String x:Key=\"passmouse\">传递鼠标输入到底层（可能会使用 CPU）</s:String>\n    <s:String x:Key=\"allowjs\">允许 JavaScript</s:String>\n    <s:String x:Key=\"graphics\">图形</s:String>\n    <s:String x:Key=\"interpquality\">插值质量（数值越小越好）</s:String>\n    <s:String x:Key=\"multipletaskbars\">多个任务栏</s:String>\n    <s:String x:Key=\"perfimpact\">（当前设置可能会影响性能）</s:String>\n    <s:String x:Key=\"samerad\">相同的圆角半径</s:String>\n    <s:String x:Key=\"graphicsrepeat\">重复图形</s:String>\n    <s:String x:Key=\"comingsoon\">即将推出...</s:String>\n    <s:String x:Key=\"webfps\">最大网页帧率</s:String>\n    <s:String x:Key=\"systemdefault\">（使用系统语言）</s:String>\n    <s:String x:Key=\"globalprop\">全局属性</s:String>\n    <s:String x:Key=\"globalpropdef\">*为了保持配置的设置，使用值 '-1'</s:String>\n    <s:String x:Key=\"globalopacity\">任务栏透明度 (0-1)</s:String>\n    <s:String x:Key=\"reportex\">发送未处理异常的信息</s:String>\n\n    <!-- Browse Tab -->\n    <s:String x:Key=\"search\">搜索内容...</s:String>\n    <!-- Sort by Likes/Match-->\n    <s:String x:Key=\"enum_likes\">喜欢</s:String>\n    <s:String x:Key=\"enum_match\">匹配</s:String>\n\n    <!-- Instructions and displayed format strings -->\n    <s:String x:Key=\"borderradiusinstruction\">圆角半径</s:String>\n    <s:String x:Key=\"clearlayerinstruction\">清除图层</s:String>\n    <s:String x:Key=\"colorinstruction\">颜色</s:String>\n    <s:String x:Key=\"delayinstruction\">延迟</s:String>\n    <s:String x:Key=\"imageinstruction\">图像</s:String>\n    <s:String x:Key=\"shapeinstruction\">形状</s:String>\n    <s:String x:Key=\"textinstruction\">文本</s:String>\n    <s:String x:Key=\"transparencyinstruction\">透明度/样式</s:String>\n\n    <s:String x:Key=\"borderradiusinstructionformat\">圆角半径 - {0}px</s:String>\n    <s:String x:Key=\"clearlayerinstructionformat\">清除层 - {0}</s:String>\n    <s:String x:Key=\"colorinstructionrandomizedformat\">{0} - 随机</s:String>\n    <!-- no translation --> <s:String x:Key=\"colorinstructiongradientformat\">{0} - {1} -> {2}</s:String>\n    <!-- no translation --> <s:String x:Key=\"colorinstructionsolidformat\">{0} - {1}</s:String>\n    <s:String x:Key=\"delayinstructionformat\">延迟 - {0}ms</s:String>\n    <s:String x:Key=\"imageinstructionformat\">图像 - {0}</s:String>\n    <s:String x:Key=\"shapeinstructionformat\">形状 - {0}</s:String>\n    <s:String x:Key=\"textinstructionformat\">文本 - {0}</s:String>\n    <s:String x:Key=\"transparencyinstructionstyleformat\">样式 - {0}</s:String>\n    <s:String x:Key=\"transparencyinstructionlayerformat\">图层 {0} - {1}%</s:String>\n    <s:String x:Key=\"transparencyinstructionopacityformat\">{0} - {1}%</s:String>\n\n    <!-- Enums -->\n        <!-- Shapes -->\n    <s:String x:Key=\"enum_line\">直线</s:String>\n    <s:String x:Key=\"enum_rectangle\">矩形</s:String>\n    <s:String x:Key=\"enum_roundedrect\">圆角矩形</s:String>\n    <s:String x:Key=\"enum_ellipse\">椭圆</s:String>\n        <!-- Color instruction effects -->\n    <s:String x:Key=\"enum_solid\">纯色</s:String>\n    <s:String x:Key=\"enum_fade\">渐隐纯色</s:String>\n    <s:String x:Key=\"enum_gradient\">渐变</s:String>\n    <s:String x:Key=\"enum_fadegradient\">渐隐渐变</s:String>\n        <!-- Color instruction transitions -->\n    <s:String x:Key=\"enum_linear\">线性</s:String>\n    <s:String x:Key=\"enum_cubic\">三次方</s:String>\n    <s:String x:Key=\"enum_sine\">正弦</s:String>\n    <s:String x:Key=\"enum_exponential\">指数</s:String>\n    <s:String x:Key=\"enum_back\">回弹</s:String>\n        <!-- Transparency instruction option 1 -->\n    <s:String x:Key=\"enum_taskbar\">任务栏透明度</s:String>\n    <s:String x:Key=\"enum_rainbowtaskbar\">底层透明度</s:String>\n    <s:String x:Key=\"enum_all\">任务栏和底层透明度</s:String>\n    <s:String x:Key=\"enum_layer\">图层透明度</s:String>\n    <s:String x:Key=\"enum_style\">任务栏样式</s:String>\n    <s:String x:Key=\"enum_taskbarelements\">Taskbar elements</s:String>\n        <!-- Transparency instruction styles -->\n    <s:String x:Key=\"enum_default\">默认</s:String>\n    <s:String x:Key=\"enum_blur\">模糊</s:String>\n    <s:String x:Key=\"enum_transparent\">透明</s:String>\n    \n    <!-- Instruction controls -->\n        <!-- Shape -->\n    <s:String x:Key=\"drawonce\">仅绘制一次</s:String>\n    <s:String x:Key=\"strokecolor\">描边颜色</s:String> <!-- stroke is a noun! -->\n    <s:String x:Key=\"fillcolor\">填充颜色</s:String> <!-- fill is a noun! -->\n    <s:String x:Key=\"thickness\">厚度</s:String>\n    <s:String x:Key=\"radius\">圆角半径</s:String>\n    <s:String x:Key=\"fittaskbars\">适应任务栏</s:String> <!-- fit is a verb! -->\n        <!-- Color -->\n    <s:String x:Key=\"randomize\">随机颜色</s:String>\n    <s:String x:Key=\"holdtime\">保持时间</s:String>\n    <s:String x:Key=\"fadetime\">褪色时间</s:String>\n    <s:String x:Key=\"gradientangle\">渐变角度 °</s:String>\n    <s:String x:Key=\"layer\">图层</s:String>\n    <s:String x:Key=\"milliseconds\">毫秒</s:String>\n        <!-- Image -->\n    <s:String x:Key=\"chooseimg\">选择图像</s:String>\n    <s:String x:Key=\"width\">宽度</s:String>\n    <s:String x:Key=\"height\">高度</s:String>\n        <!-- Text -->\n    <s:String x:Key=\"fontsize\">字体大小</s:String>\n    <s:String x:Key=\"fontcolor\">字体颜色</s:String>\n    <s:String x:Key=\"centerx\">沿 X 轴居中</s:String> <!-- center is a verb! -->\n        <!-- Transparency -->\n    <s:String x:Key=\"change\">更改</s:String>\n    <s:String x:Key=\"to\">到</s:String>\n\n\n\n    <!-- Instruction context menu -->\n    <s:String x:Key=\"duplicate\">重复</s:String> <!-- it's a verb! -->\n    <s:String x:Key=\"delete\">删除</s:String>\n    <s:String x:Key=\"duplicate_rev_color\">复制 - 交换颜色</s:String>\n    \n    <!-- Tray window context menu -->\n    <s:String x:Key=\"openeditor\">打开编辑器</s:String>\n    <s:String x:Key=\"donate\">捐赠</s:String>\n    <s:String x:Key=\"projectpage\">打开项目页面</s:String>\n    <s:String x:Key=\"issueorreq\">提交问题或请求</s:String>\n    <s:String x:Key=\"exit\">退出</s:String>\n\n    <!-- Dialog boxes -->\n    <s:String x:Key=\"msgbox_baddll\">注入 explorer.exe 的 RainbowTaskbar DLL 似乎存在问题。 \n        此过程非常具有实验性，因此请在 GitHub 上打开一个问题（右键单击系统托盘上的 RainbowTaskbar -> 提交问题或请求）\n        尝试调试问题。请确保还包括您可能遇到的任何其他错误。</s:String>\n    <s:String x:Key=\"msgbox_olddll\">要启用透明效果，RainbowTaskbar 必须重新启动 explorer.exe 进程。\n        您想要继续吗？</s:String>\n    <s:String x:Key=\"msgbox_badarch\">您的处理器架构 (x64) 与此可执行文件 (x86) 不兼容。 \n        请从 GitHub 版本下载正确的可执行文件（rnbtsk-x64.exe / setup-x64.exe）。</s:String>\n    <s:String x:Key=\"msgbox_migrateoldcfg\">RainbowTaskbar 发现了旧版配置版本。\n        您希望将其迁移到新的配置格式吗？\n    </s:String>\n    <s:String x:Key=\"msgbox_login\">\n        输入下面登录成功页面显示的代码\n    </s:String>\n    <s:String x:Key=\"msgbox_notloggedin\">您必须登录才能发布您的配置！请前往设置页面进行登录。</s:String>\n    <s:String x:Key=\"msgbox_notloggedin_title\">未登录</s:String>\n    <s:String x:Key=\"msgbox_notloggedin2\">您必须登录才能点赞配置！</s:String>\n    <s:String x:Key=\"msgbox_fail\">发布配置失败。</s:String>\n    <s:String x:Key=\"msgbox_fail_title\">失败</s:String>\n    <s:String x:Key=\"msgbox_thumbnail\">配置信息/数据已更新。缩略图上传失败。</s:String>\n    <s:String x:Key=\"msgbox_property_title\">创建新属性</s:String>\n    <s:String x:Key=\"msgbox_login_title\">使用验证码登录</s:String>\n    <s:String x:Key=\"msgbox_login_button\">登录</s:String>\n    <s:String x:Key=\"msgbox_save_title\">保存您的工作吗？</s:String>\n    <s:String x:Key=\"msgbox_save\">您是否希望保存当前的配置？</s:String>\n    <s:String x:Key=\"msgbox_save_b1\">保存</s:String>\n    <s:String x:Key=\"msgbox_save_b2\">不保存</s:String>\n    <s:String x:Key=\"msgbox_button_cancel\">取消</s:String>\n    <s:String x:Key=\"msgbox_update\">RainbowTaskbar 有新版本发布了。您想要更新吗？</s:String>\n    <s:String x:Key=\"msgbox_migrate\">您是否希望将旧版（v2）配置和预设迁移到当前版本？</s:String>\n    <s:String x:Key=\"msgbox_issuegithub\">使用 GitHub</s:String>\n    <!-- Fill with \"Translated by ...\" -->\n    <s:String x:Key=\"langcredits\">大眼仔~旭</s:String>\n\n</ResourceDictionary>\n"
  },
  {
    "path": "RainbowTaskbar/Preferences/Settings.cs",
    "content": "﻿using Microsoft.Win32;\nusing PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Editor;\nusing RainbowTaskbar.HTTPAPI;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Net.Http;\nusing System.Net;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.Serialization;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Net.Http.Json;\nusing System.Dynamic;\nusing RainbowTaskbar.Configuration.Web;\nusing RainbowTaskbar.Configuration.Instruction.Instructions;\nusing System.Windows;\n#if MSIX_BUILD\nusing Windows.ApplicationModel;\n#endif\n\nnamespace RainbowTaskbar.Preferences {\n    public class Settings : INotifyPropertyChanged {\n        [OnChangedMethod(nameof(SaveChanged))]\n        public bool CheckUpdate { get; set; } = true;\n\n        \n        public int InterpolationQuality { get; set; } = 25;\n        [OnChangedMethod(nameof(SaveChanged))]\n        [OnChangedMethod(nameof(OnTaskbarBehaviourChanged))]\n        public bool GraphicsRepeat { get; set; } = false;\n        [OnChangedMethod(nameof(SaveChanged))]\n        [OnChangedMethod(nameof(OnTaskbarBehaviourChanged))]\n        public bool SameRadiusOnEach { get; set; } = false;\n        [OnChangedMethod(nameof(SaveChanged))]\n        [OnChangedMethod(nameof(OnLanguageChanged))]\n        public string Language { get; set; } = \"SystemDefault\";\n        [OnChangedMethod(nameof(SaveChanged))]\n        [OnChangedMethod(nameof(OnTrayIconVisibilityChanged))]\n        public bool ShowTrayIcon { get; set; } = true;\n\n        [OnChangedMethod(nameof(OnConfigChanged))]\n        public string SelectedConfigID { get; set; }\n\n        [OnChangedMethod(nameof(SaveChanged))]\n        [OnChangedMethod(nameof(OnTaskbarBehaviourChanged))]\n        public int MaxWebFPS { get; set; } = 40;\n\n        [JsonIgnore]\n        public string AccountUsername { get; set; } = \"\";\n        [JsonIgnore]\n        public bool LoggedIn { get; set; } = false;\n        public string LoginKey { get; set; }\n        public WorkshopAPI workshopAPI = null;\n\n        [OnChangedMethod(nameof(SaveChanged))]\n        [OnChangedMethod(nameof(OnWebTouchThroughChanged))]\n        public bool WebTouchThrough { get; set; } = true;\n        [OnChangedMethod(nameof(SaveChanged))]\n        [OnChangedMethod(nameof(OnWebScriptEnabledChanged))]\n        public bool WebScriptEnabled { get; set; } = true;\n        public void OnWebTouchThroughChanged() {\n            if (WebTouchThrough) App.StartHook();\n            else App.StopHook();\n        }\n        [OnChangedMethod(nameof(SaveChanged))]\n        [OnChangedMethod(nameof(OnTaskbarBehaviourChanged))]\n        [OnChangedMethod(nameof(OnGlobalOpacityChanged))]\n        public double GlobalOpacity { get; set; } = -1;\n\n        public Version Version { get; set; } = new Version(\"1.0\");\n\n        [OnChangedMethod(nameof(SaveChanged))]\n        public bool ReportExceptions { get; set; } = true;\n\n        public void OnGlobalOpacityChanged() {\n            if(GlobalOpacity != -1) App.taskbars.ForEach(x => {\n                new TransparencyInstruction() {\n                    Type = TransparencyInstruction.TransparencyInstructionType.Taskbar,\n                    Opacity = GlobalOpacity\n                }.Execute(x);\n            });\n        }\n\n        public void OnWebScriptEnabledChanged() {\n            App.taskbars.ForEach(x => {\n                try {\n                    x.webView.CoreWebView2.Settings.IsScriptEnabled = WebScriptEnabled;\n                }\n                catch {\n\n                }\n            });\n            if (App.Settings.SelectedConfig is WebConfig) Taskbar.SoftReset(true);\n        }\n        private Timer TryLoginTimer = null;\n        public async void OnLoginKeyChanged() {\n            if (App.Settings is null) return;\n            if (LoginKey is null) return;\n            try {\n                using var http = new HttpClient();\n                using var web = new WebClient();\n                var content = await http.PostAsJsonAsync(\"https://rnbsrv.ad2017.dev/user/me/info\", new { key = LoginKey });\n                dynamic json = JsonSerializer.Deserialize<ExpandoObject>(content.Content.ReadAsStringAsync().Result);\n                if (json.result.GetBoolean()) {\n                    dynamic user = JsonSerializer.Deserialize<ExpandoObject>(json.user);\n                    LoggedIn = true;\n                    if (TryLoginTimer is not null) {\n                        TryLoginTimer.Dispose();\n                        TryLoginTimer = null;\n                    }\n                    AccountUsername = user.username.ToString();\n                    workshopAPI = new WorkshopAPI() { LoginKey = LoginKey };\n                    ToFile();\n                }\n            } catch {\n                LoggedIn = false;\n                AccountUsername = \"\";\n                if(TryLoginTimer is null) {\n                    TryLoginTimer = new Timer((_) => {\n                        OnLoginKeyChanged();\n                    }, null, 30000, 30000);\n                }\n            }\n        }\n\n        [JsonIgnore]\n        public Config SelectedConfig { get => App.Configs.FirstOrDefault(x=>x.LocalID == SelectedConfigID, null); set => SelectedConfigID = value.LocalID; }\n\n        public bool FirstStart { get; set; } = true;\n\n        [JsonIgnore]\n        public bool RunAtStartup {\n            get {\n                if (App.IsMicrosoftStore()) {\n#if MSIX_BUILD\n                    StartupTask t = StartupTask.GetAsync(\"RnbTsk_Startup\").AsTask().Result;\n                    if (t is null) return false;\n                    \n                    return t.State == StartupTaskState.Enabled || t.State == StartupTaskState.EnabledByPolicy;\n#else\n                    return false;\n#endif\n                } else {\n                    return (string?) Registry.CurrentUser.OpenSubKey(\"Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\")\n                .GetValue(\"RainbowTaskbar\") == Environment.ProcessPath;\n                }\n            }\n\n            set {\n                if(App.IsMicrosoftStore()) {\n#if MSIX_BUILD\n                    StartupTask t = StartupTask.GetAsync(\"RnbTsk_Startup\").AsTask().Result;\n                    if (t is null) return;\n                    if (value)\n                        t.RequestEnableAsync();\n                    else\n                        t.Disable();\n#endif\n                } else {\n                        var key = Registry.CurrentUser.OpenSubKey(\"Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\", true);\n                    if (value)\n                        key.SetValue(\"RainbowTaskbar\", Environment.ProcessPath);\n                    else\n                        key.DeleteValue(\"RainbowTaskbar\");\n                    key.Close();\n                }\n\n                string prot = \"rnbtsk\";\n                RegistryKey reg = Registry.CurrentUser.OpenSubKey($\"Software\\\\Classes\\\\{prot}\", true);\n                if (reg != null) {\n                    reg = reg.OpenSubKey(@\"shell\\open\\command\", true);\n                    reg.SetValue(string.Empty, Environment.ProcessPath + \" \" + \"shell \\\"%1\\\"\");\n                    reg.Close();\n                } else {\n                    reg = Registry.CurrentUser.CreateSubKey($\"Software\\\\Classes\\\\{prot}\", true);\n                    reg.SetValue(string.Empty, \"URL: \" + prot);\n                    reg.SetValue(\"URL Protocol\", string.Empty);\n\n                    reg = reg.CreateSubKey(@\"shell\\open\\command\");\n                    reg.SetValue(string.Empty, Environment.ProcessPath + \" \" + \"shell \\\"%1\\\"\");\n                    reg.Close();\n                }\n            }\n        }\n\n        public string language {\n            get {\n                return Language == \"SystemDefault\" ? CultureInfo.CurrentUICulture.Name : Language;\n            }\n        }\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        public void OnTaskbarBehaviourChanged() {\n            if (App.Settings is null) return;\n            App.ReloadTaskbars();\n        }\n\n        public void OnLanguageChanged() {\n            if (App.Settings is null) return;\n            App.localization.Switch(language);\n            if (App.editor is not null) {\n                App.editor.Close();\n                App.editor = new EditorWindow();\n\n                App.trayWindow.TrayIcon.Dispose();\n                App.trayWindow.Close();\n                App.trayWindow = new();\n                App.LaunchEditor();\n            }\n        }\n\n        public void OnTrayIconVisibilityChanged() {\n            if (App.Settings is null) return;\n            if (App.trayWindow is not null) {\n                App.trayWindow.TrayIcon.Dispose();\n                App.trayWindow.Close();\n                App.trayWindow = null;\n            } else {\n                App.trayWindow = new();\n            }\n        }\n        public void OnConfigChanged() {\n            if (App.Settings is null) return;\n            App.ReloadTaskbars();\n        }\n\n        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) =>\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n\n        public static Settings FromFile(string file = null) {\n            if (file is null) file = Path.Join(App.rainbowTaskbarDir, \"settings.json\");\n\n            if (!File.Exists(file)) return new();\n            var settings = JsonSerializer.Deserialize<Settings>(File.ReadAllText(file));\n            settings.loaded = true;\n            return settings;\n        }\n        public void ToFile(string file = null) {\n            if (file is null) file = Path.Join(App.rainbowTaskbarDir, \"settings.json\");\n\n            File.WriteAllText(file, JsonSerializer.Serialize(this));\n        }\n        public bool loaded = false;\n        public void SaveChanged() {\n            if (!loaded) return;\n            ToFile();\n        }\n\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/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 RainbowTaskbar.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\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    public 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        public 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(\"RainbowTaskbar.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        public 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 string similar to .\n        /// </summary>\n        public static string g {\n            get {\n                return ResourceManager.GetString(\"g\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Byte[].\n        /// </summary>\n        public static byte[] monaco {\n            get {\n                object obj = ResourceManager.GetObject(\"monaco\", resourceCulture);\n                return ((byte[])(obj));\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized resource of type System.Drawing.Bitmap.\n        /// </summary>\n        public static System.Drawing.Bitmap Paypal {\n            get {\n                object obj = ResourceManager.GetObject(\"Paypal\", resourceCulture);\n                return ((System.Drawing.Bitmap)(obj));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/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  <data name=\"g\" xml:space=\"preserve\">\n    <value />\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"Paypal\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\Paypal.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral,\n            PublicKeyToken=b03f5f7f11d50a3a</value>\n  </data>\n  <data name=\"monaco\" type=\"System.Resources.ResXFileRef, System.Windows.Forms\">\n    <value>..\\Resources\\monaco.zip;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n</root>"
  },
  {
    "path": "RainbowTaskbar/Properties/Settings.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 RainbowTaskbar.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"17.14.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}\n"
  },
  {
    "path": "RainbowTaskbar/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</SettingsFile>\n"
  },
  {
    "path": "RainbowTaskbar/Properties/launchSettings.json",
    "content": "{\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"RainbowTaskbar\": {\n      \"commandName\": \"Project\",\n      \"hotReloadEnabled\": false\n    }\n  }\n}"
  },
  {
    "path": "RainbowTaskbar/RainbowTaskbar.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n    <PropertyGroup>\n        <OutputType>WinExe</OutputType>\n        <TargetFramework Condition=\"'$(Configuration)'=='Release (MSIX)'\">net8.0-windows10.0.19041.0</TargetFramework>\n        <TargetFramework Condition=\"'$(Configuration)'!='Release (MSIX)'\">net8.0-windows7.0</TargetFramework>\n        <UseWPF>true</UseWPF>\n        <Version>3.2.2</Version>\n        <PackageProjectUrl>https://ad2017.dev/rnb</PackageProjectUrl>\n        <Description>RainbowTaskbar is a Windows utility to customize the shell taskbar.</Description>\n        <Authors>ad2017gd, zCri</Authors>\n        <PackageIcon>icon.ico</PackageIcon>\n        <PackageIconUrl />\n        <RepositoryUrl>https://github.com/ad2017gd/RainbowTaskbar</RepositoryUrl>\n        <RepositoryType>GitHub</RepositoryType>\n        <Company></Company>\n        <NeutralLanguage>en</NeutralLanguage>\n        <IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>\n        <PackageReleaseNotes />\n        <AnalysisLevel>latest</AnalysisLevel>\n        \n        <Nullable>disable</Nullable>\n        <ErrorReport>prompt</ErrorReport>\n        <AssemblyVersion>3.2.2</AssemblyVersion>\n        <FileVersion>3.2.2</FileVersion>\n        <SignAssembly>False</SignAssembly>\n\t\t\n\t\t   <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>\n\t\t\n\t\t   <Platforms>AnyCPU;x64;x86;ARM64</Platforms>\n\t\t\n\t\t   <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n\t\t\n\t\t   <AssemblyName>RainbowTaskbar</AssemblyName>\n\t\t\n\t\t   <StartupObject>RainbowTaskbar.App</StartupObject>\n\t\t\n\t\t   <Configurations>Debug;Release;Release (MSIX)</Configurations>\n\n\n\n\n\n    </PropertyGroup>\n\n    <PropertyGroup Condition=\"'$(Configuration)'=='Release (MSIX)'\">\n        <DefineConstants>$(DefineConstants);MSIX_BUILD</DefineConstants>\n    </PropertyGroup>\n\n    <ItemGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n        <ProjectReference Include=\"..\\RainbowTaskbarDLL\\RainbowTaskbarDLL.vcxproj\" />\n    </ItemGroup>\n\n    <ItemGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n      <ProjectReference Include=\"..\\RainbowTaskbarDLL\\RainbowTaskbarDLL.vcxproj\" />\n    </ItemGroup>\n\n\n    <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n        <Optimize>False</Optimize>\n    </PropertyGroup>\n\n\n    <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n      <Optimize>False</Optimize>\n    </PropertyGroup>\n\n    <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x86'\">\n      <Optimize>False</Optimize>\n    </PropertyGroup>\n\n    <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      <Optimize>False</Optimize>\n    </PropertyGroup>\n\n\n    <ItemGroup>\n        <None Remove=\"Resources\\Paypal.png\" />\n        <Resource Include=\"Resources\\monaco.zip\">\n            <CopyToOutputDirectory>Never</CopyToOutputDirectory>\n        </Resource>\n        <None Include=\"Resources\\icon.ico\">\n            <Pack>True</Pack>\n        </None>\n\n        <EmbeddedResource Condition=\"'$(Configuration)'=='Release (MSIX)' Or '$(Configuration)'=='Release'\" Include=\"..\\x64\\Release\\RainbowTaskbarDLL_x64.dll\" Link=\"RainbowTaskbarDLL_x64.dll\">\n            <CopyToOutputDirectory>Never</CopyToOutputDirectory>\n        </EmbeddedResource>\n        <EmbeddedResource Condition=\"'$(Configuration)'=='Release (MSIX)' Or '$(Configuration)'=='Release'\" Include=\"..\\ARM64\\Release\\RainbowTaskbarDLL_ARM64.dll\" Link=\"RainbowTaskbarDLL_ARM64.dll\">\n            <CopyToOutputDirectory>Never</CopyToOutputDirectory>\n        </EmbeddedResource>\n\n\n        <EmbeddedResource Condition=\"'$(Configuration)'=='Debug'\" Include=\"..\\x64\\Debug\\RainbowTaskbarDLL_x64.dll\" Link=\"RainbowTaskbarDLL_x64.dll\">\n            <CopyToOutputDirectory>Never</CopyToOutputDirectory>\n        </EmbeddedResource>\n        <EmbeddedResource Condition=\"'$(Configuration)'=='Debug'\" Include=\"..\\ARM64\\Debug\\RainbowTaskbarDLL_ARM64.dll\" Link=\"RainbowTaskbarDLL_ARM64.dll\">\n            <CopyToOutputDirectory>Never</CopyToOutputDirectory>\n        </EmbeddedResource>\n    </ItemGroup>\n\n\n    <ItemGroup>\n        <PackageReference Include=\"Extended.Wpf.Toolkit\" Version=\"4.7.25103.5738\" />\n        <PackageReference Include=\"FastMember\" Version=\"1.5.0\" />\n        <PackageReference Include=\"gong-wpf-dragdrop\" Version=\"4.0.0\" />\n        <PackageReference Include=\"H.Pipes\" Version=\"15.0.0\" />\n        <PackageReference Include=\"H.Pipes.AccessControl\" Version=\"15.0.0\" />\n        <PackageReference Include=\"Hardcodet.NotifyIcon.Wpf\" Version=\"2.0.1\">\n        </PackageReference>\n        <PackageReference Include=\"Kasay.DependencyProperty.WPF.Fody\" Version=\"1.0.3\" />\n        <PackageReference Include=\"Markdig\" Version=\"0.40.0\" />\n        <PackageReference Include=\"Microsoft.Web.WebView2\" Version=\"1.0.3405.78\" />\n        <PackageReference Include=\"Microsoft.Xaml.Behaviors.Wpf\" Version=\"1.1.135\" />\n\n        <PackageReference Include=\"PropertyChanged.Fody\" Version=\"4.1.0\">\n            <PrivateAssets>all</PrivateAssets>\n            <ExcludeAssets>runtime</ExcludeAssets>\n            <IncludeAssets>compile; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n        </PackageReference>\n\n        <PackageReference Include=\"System.Drawing.Common\" Version=\"9.0.2\" />\n\n        <PackageReference Include=\"WebSocketSharp\" Version=\"1.0.3-rc11\" />\n\n        <PackageReference Include=\"WPF-UI\" Version=\"4.0.3\" />\n    </ItemGroup>\n\n\n    <ItemGroup>\n        <Resource Include=\"Resources\\icon.ico\">\n            <CopyToOutputDirectory>Never</CopyToOutputDirectory>\n        </Resource>\n        <Resource Include=\"Resources\\Paypal.png\">\n            <CopyToOutputDirectory>Never</CopyToOutputDirectory>\n        </Resource>\n    </ItemGroup>\n\n\n    <ItemGroup>\n        <Compile Update=\"App.xaml.cs\">\n            <CopyToOutputDirectory>Never</CopyToOutputDirectory>\n        </Compile>\n        <Compile Update=\"Editor\\Pages\\Controls\\ResultListItemControl.xaml.cs\">\n          <SubType>Code</SubType>\n        </Compile>\n        <Compile Update=\"Editor\\Pages\\Edit\\ViewComments.xaml.cs\">\n          <SubType>Code</SubType>\n        </Compile>\n        <Compile Update=\"Editor\\Pages\\Edit\\ViewInfo.xaml.cs\">\n          <SubType>Code</SubType>\n        </Compile>\n        <Compile Update=\"Editor\\Pages\\About.xaml.cs\">\n          <SubType>Code</SubType>\n        </Compile>\n        <Compile Update=\"Editor\\Pages\\EmptyPageBadFix2.xaml.cs\">\n          <SubType>Code</SubType>\n        </Compile>\n        <Compile Update=\"Languages\\ro_RO.xaml.cs\">\n          <SubType>Code</SubType>\n        </Compile>\n        <Compile Update=\"Properties\\Resources.Designer.cs\">\n            <DesignTime>True</DesignTime>\n            <AutoGen>True</AutoGen>\n            <DependentUpon>Resources.resx</DependentUpon>\n        </Compile>\n        <Compile Update=\"Properties\\Settings.Designer.cs\">\n            <DesignTimeSharedInput>True</DesignTimeSharedInput>\n            <AutoGen>True</AutoGen>\n            <DependentUpon>Settings.settings</DependentUpon>\n        </Compile>\n    </ItemGroup>\n\n\n    <ItemGroup>\n        <EmbeddedResource Update=\"Properties\\Resources.resx\">\n            <Generator>PublicResXFileCodeGenerator</Generator>\n            <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n        </EmbeddedResource>\n    </ItemGroup>\n\n\n    <ItemGroup>\n        <None Update=\"Properties\\Settings.settings\">\n            <Generator>SettingsSingleFileGenerator</Generator>\n            <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n        </None>\n\n        \n    </ItemGroup>\n\n\n    <ItemGroup>\n      <Folder Include=\"Editor\\Pages\\Edit\\Converters\\\" />\n    </ItemGroup>\n\n\n    <ItemGroup>\n      <ProjectReference Include=\"..\\RainbowTaskbarDLL\\RainbowTaskbarDLL.vcxproj\" />\n    </ItemGroup>\n\n\n    <ItemGroup>\n      <Page Update=\"Editor\\Pages\\Edit\\ViewComments.xaml\">\n        <SubType>Designer</SubType>\n      </Page>\n    </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "RainbowTaskbar/Taskbar.xaml",
    "content": "﻿<Window Name=\"RainbowTaskbar\"\n        x:Class=\"RainbowTaskbar.Taskbar\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:drawing=\"clr-namespace:RainbowTaskbar.Drawing\"\n         xmlns:wv2=\"clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf\" xmlns:local=\"clr-namespace:RainbowTaskbar.Helpers\"\n        mc:Ignorable=\"d\"\n        AllowsTransparency=\"True\"\n        ShowInTaskbar=\"False\"\n        WindowStyle=\"None\"\n        \n        SizeToContent=\"Manual\"\n        \n        Closing=\"Window_Closing\"\n        Background=\"Transparent\"\n        Title=\"Taskbar\" Height=\"1\" Width=\"2\">\n    <Window.Clip>\n        <CombinedGeometry GeometryCombineMode=\"Xor\">\n            <CombinedGeometry.Geometry1>\n                <GeometryGroup FillRule=\"Nonzero\">\n                    <RectangleGeometry x:Name=\"TaskbarClip\" Rect=\"0,0,1920,48\" RadiusX=\"0\" RadiusY=\"0\"/>\n                    <RectangleGeometry x:Name=\"TaskbarClipHide\" Rect=\"0,0,1920,48\" RadiusX=\"0\" RadiusY=\"0\"/>\n                </GeometryGroup>\n            </CombinedGeometry.Geometry1>\n            <CombinedGeometry.Geometry2>\n                <RectangleGeometry x:Name=\"AutoHideClip\" Rect=\"0,0,0,0\" RadiusX=\"0\" RadiusY=\"0\"/>\n            </CombinedGeometry.Geometry2>\n        </CombinedGeometry>\n    </Window.Clip>\n    <Grid x:Name=\"MainGrid\" Background=\"Transparent\">\n        <Grid x:Name=\"WebGrid\" Background=\"Transparent\">\n            <wv2:WebView2 x:Name=\"webView_\" DefaultBackgroundColor=\"Transparent\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\"></wv2:WebView2>\n        </Grid>\n        \n        <Grid x:Name=\"ClassicGrid\" Background=\"Transparent\">\n            <Canvas x:Name=\"Layer0\"/>\n            <Canvas x:Name=\"Layer1\"/>\n            <Canvas x:Name=\"Layer2\"/>\n            <Canvas x:Name=\"Layer3\"/>\n            <Canvas x:Name=\"Layer4\"/>\n            <Canvas x:Name=\"Layer5\"/>\n            <Canvas x:Name=\"Layer6\"/>\n            <Canvas x:Name=\"Layer7\"/>\n            <Canvas x:Name=\"Layer8\"/>\n            <Canvas x:Name=\"Layer9\"/>\n            <Canvas x:Name=\"Layer10\"/>\n            <Canvas x:Name=\"Layer11\"/>\n            <Canvas x:Name=\"Layer12\"/>\n            <Canvas x:Name=\"Layer13\"/>\n            <Canvas x:Name=\"Layer14\"/>\n            <Canvas x:Name=\"Layer15\"/>\n        </Grid>\n    </Grid>\n</Window>"
  },
  {
    "path": "RainbowTaskbar/Taskbar.xaml.cs",
    "content": "﻿using Microsoft.Web.WebView2.Core;\nusing Microsoft.Web.WebView2.WinForms;\nusing Microsoft.Web.WebView2.Wpf;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Configuration.Instruction.Instructions;\nusing RainbowTaskbar.Drawing;\nusing RainbowTaskbar.Helpers;\nusing RainbowTaskbar.HTTPAPI;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Nodes;\nusing System.Text.Json.Serialization;\nusing System.Text.RegularExpressions;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Input;\nusing System.Windows.Interop;\nusing System.Windows.Media;\nusing System.Windows.Media.Media3D;\nusing Wpf.Ui.Controls;\nusing static RainbowTaskbar.Taskbar;\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement;\nusing WebView2 = Microsoft.Web.WebView2.Wpf.WebView2;\n\nnamespace RainbowTaskbar;\n\n/// <summary>\n///     Interaction logic for Taskbar.xaml\n/// </summary>\npublic partial class Taskbar : System.Windows.Window {\n\n    public CanvasManager canvasManager;\n    public bool secondary;\n    public TaskbarHelper taskbarHelper;\n    public TaskbarViewModel viewModel;\n    public WindowHelper windowHelper;\n    public Mutex webViewReady_ = new Mutex();\n    public Mutex webViewReady { get => App.Settings.GraphicsRepeat ? webViewReady_ : App.webViewReady; }\n    public WebView2 webView { get => App.Settings.GraphicsRepeat ?  webView_ : App.webView; }\n\n    public int UnderlayOffset { get => taskbarHelper.YOffset; set => taskbarHelper.YOffset = value; }\n\n    \n    public Taskbar(IntPtr HWND, bool secondary) {\n        webViewReady_.WaitOne();\n        InitializeComponent();\n        this.secondary = secondary;\n\n        viewModel = new TaskbarViewModel(this, HWND);\n        Closing += viewModel.OnWindowClosing;\n        DataContext = viewModel;\n\n        \n        if(HWND != IntPtr.Zero && !App.Settings.GraphicsRepeat) {\n            //webView_.Dispose();\n            webView_ = null;\n        }\n\n    }\n    \n\n    public Taskbar(IntPtr HWND) : this(HWND, false) { }\n\n    #region Ugly win32 message handler\n    \n    public IntPtr hwndInsertAfter = IntPtr.Zero;\n    public struct WINDOWPOS {\n        public IntPtr hwnd;\n        public IntPtr hwndInsertAfter;\n        public int x;\n        public int y;\n        public int cx;\n        public int cy;\n        public uint flags;\n    }\n    public const int WM_WINDOWPOSCHANGING = 0x46;\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    private static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);\n    [DllImport(\"user32.dll\", SetLastError = true, CharSet = CharSet.Auto)]\n    static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);\n    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) {\n        if (msg == WM_WINDOWPOSCHANGING) {\n            WINDOWPOS wp = (WINDOWPOS) System.Runtime.InteropServices.Marshal.PtrToStructure(lParam, typeof(WINDOWPOS));\n            if (GetWindow(wp.hwndInsertAfter, 3) != hwndInsertAfter) {\n                //taskbarHelper.PlaceWindowUnder(this);\n                \n                taskbarHelper.SetBlur();\n                hwndInsertAfter = taskbarHelper.HWND;\n            }\n        }\n        if (msg == WM_Shell) {\n            var wnd = lParam;\n            var clname = new StringBuilder(256);\n            GetClassName(wnd, clname, clname.Capacity);\n\n            // fix: used to hide underlay when peeking window on taskbar\n            var dontcare = clname.ToString() == \"XamlExplorerHostIslandWindow\" || clname.ToString() == \"Shell_InputSwitchTopLevelWindow\";\n\n            if ((uint) wParam == 53 && !dontcare) \n                App.IsAppFullscreen = true;\n            if ((uint) wParam == 54 && !dontcare) \n                App.IsAppFullscreen = false;\n        }\n        return IntPtr.Zero;\n    }\n\n\n    [DllImport(\"user32.dll\", SetLastError = true, CharSet = CharSet.Auto)]\n    static extern uint RegisterWindowMessage(string lpString);\n\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    static extern bool RegisterShellHookWindow(IntPtr window);\n\n    private uint WM_Shell = 0;\n    \n\n    protected override void OnSourceInitialized(EventArgs e) {\n        base.OnSourceInitialized(e);\n        var hWnd = new WindowInteropHelper(this).EnsureHandle();\n        HwndSource source = (HwndSource) HwndSource.FromHwnd(hWnd);\n        if (!secondary) {\n            RegisterShellHookWindow(new WindowInteropHelper(this).EnsureHandle());\n            WM_Shell = RegisterWindowMessage(\"SHELLHOOK\");\n        }\n        source.AddHook(WndProc);\n    }\n    #endregion\n\n    private void RainbowTaskbar_Closed(object sender, EventArgs e) {\n        taskbarHelper.Style = TaskbarHelper.TaskbarStyle.ForceDefault;\n        taskbarHelper.SetBlur();\n        \n    }\n\n\n    public static void SetupLayers() {\n       App.Current.Dispatcher.Invoke(() => {\n           if (App.Settings.GraphicsRepeat) {\n               App.taskbars.ForEach(t => {\n                   t.canvasManager.layers = new LayerManager(t);\n               });\n           }\n           else {\n               App.layers = new LayerManager();\n                \n               App.layers.width = (int) App.taskbars.Sum(t => t.Width);\n               App.layers.height = (int) App.taskbars[0].Height;\n\n           }\n       });\n    }\n    private static void SetupWebView(WebView2 webView, Mutex mutex = null) {\n        \n\n\n        var envasync = CoreWebView2Environment.CreateAsync(null, Path.GetTempPath(), new CoreWebView2EnvironmentOptions());\n        Task.Run(() => {\n            var env = envasync.Result;\n            App.Current.Dispatcher.Invoke(() => {\n                Task t = null;\n                // THIS IS MAD \n                try {\n                    t = webView.EnsureCoreWebView2Async(env);\n                }\n                catch {\n                    try {\n                        t = webView.EnsureCoreWebView2Async();\n                    } catch {\n                        return;\n                    }\n                }\n                Task.Run(() => {\n                    try { t.Wait(); } catch { return; }\n                    webView.Dispatcher.Invoke(() => {\n                        if(mutex is not null) mutex.ReleaseMutex();\n\n                        \n\n                        webView.CoreWebView2.Settings.AreBrowserAcceleratorKeysEnabled = false;\n                        webView.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;\n                        webView.CoreWebView2.Settings.IsSwipeNavigationEnabled = false;\n                        webView.CoreWebView2.Settings.IsStatusBarEnabled = false;\n                        webView.CoreWebView2.Settings.IsPinchZoomEnabled = false;\n                        webView.CoreWebView2.Settings.AreDevToolsEnabled = false;\n                        webView.CoreWebView2.Settings.UserAgent = \"RainbowTaskbar Web Display https://ad2017.dev/rnb\";\n                        webView.CoreWebView2.IsMuted = true;\n\n\n\n                        webView.CoreWebView2.MemoryUsageTargetLevel = Microsoft.Web.WebView2.Core.CoreWebView2MemoryUsageTargetLevel.Low;\n\n                        webView.CoreWebView2.ProcessFailed += (_, _) => {\n                            App.ReloadTaskbars();\n                        };\n                    });\n                });\n            });\n        });\n\n        \n    }\n\n    [Serializable]\n    public class RectangleF {\n        public float X { get; set; }\n        public float Y { get; set; }\n        public float Width { get; set; }\n        public float Height { get; set; }\n\n        public RectangleF(System.Drawing.Rectangle rectangle) {\n            X = rectangle.X;\n            Y = rectangle.Y;\n            Width = rectangle.Width;\n            Height = rectangle.Height;\n        }\n        public RectangleF(System.Drawing.RectangleF rectangle) {\n            X = rectangle.X;\n            Y = rectangle.Y;\n            Width = rectangle.Width;\n            Height = rectangle.Height;\n        }\n        public RectangleF(RectangleF rectangle) {\n            X = rectangle.X;\n            Y = rectangle.Y;\n            Width = rectangle.Width;\n            Height = rectangle.Height;\n        }\n\n        public static RectangleF operator*(RectangleF left, float right) {\n            var nw = new RectangleF(left);\n            nw.X *= right;\n            nw.Y *= right;\n            nw.Width *= right;\n            nw.Height *= right;\n            return nw;\n        }\n    }\n    [Serializable]\n    public class UIData {\n        [JsonPropertyName(\"systemTrayFrame\")]\n        public RectangleF SystemTrayFrame { get; set; }\n        [JsonPropertyName(\"taskbarFrameRepeater\")]\n        public RectangleF TaskbarFrameRepeater { get; set; }\n        [JsonPropertyName(\"taskbar\")]\n        public RectangleF Taskbar { get; set; }\n        [JsonPropertyName(\"taskbarIndex\")]\n        public int Index { get; set; }\n\n        public UIData(string rawUIData, Taskbar t) {\n            var form = JsonSerializer.Deserialize<ExplorerTAP.ExplorerTAP.UIData>(rawUIData);\n            SystemTrayFrame = new(form.SystemTrayFrame);\n            var off = ExplorerTAP.ExplorerTAP.GetYPosition(t);\n            SystemTrayFrame.Y -= off;\n            TaskbarFrameRepeater = new(form.TaskbarFrameRepeater);\n            TaskbarFrameRepeater.Y -= off;\n\n            SystemTrayFrame *= (t.windowHelper.scale);\n            TaskbarFrameRepeater *= (t.windowHelper.scale);\n\n            Taskbar = new(t.taskbarHelper.GetRectangle());\n\n            SystemTrayFrame.Height = Taskbar.Height;\n            Index = App.taskbars.IndexOf(t);\n        }\n    }\n\n    public class CS2WVMessage<T> {\n        [JsonPropertyName(\"message\")]\n        public string Message { get; set; } = \"\";\n        [JsonPropertyName(\"data\")]\n        public T Data { get; set; }\n        public CS2WVMessage(string message, T data) {\n            Message = message;\n            Data = data;\n        }\n    }\n\n    public List<UIData> UIDataForAllTaskbars() {\n        try {\n            return App.taskbars.Select(x => new UIData(x.windowHelper.LastUIData, x)).ToList();\n        } catch { return new List<UIData>(); }\n    }\n\n    EventHandler uiChangedHandler = null;\n\n    public void SetupWebViewMessageReceiver() {\n        uiChangedHandler = (_, args) => {\n            if (webView.CoreWebView2 is null) return;\n            webView.CoreWebView2.PostWebMessageAsString(JsonSerializer.Serialize(new CS2WVMessage<List<UIData>>(\"ui\",UIDataForAllTaskbars())));\n        };\n        windowHelper.TaskbarUIChanged += uiChangedHandler;\n        webView.WebMessageReceived += (_, args) => {\n            var message = JsonSerializer.Deserialize<JsonNode>(args.WebMessageAsJson);\n            switch (message[\"m\"]?.GetValue<string?>()) {\n                case \"style\": {\n                        var taskbars = new List<Taskbar>(App.Settings.GraphicsRepeat ? new List<Taskbar>() { this } : App.taskbars);\n                        taskbars.ForEach(x => {\n                            new TransparencyInstruction() {\n                                Type = TransparencyInstruction.TransparencyInstructionType.Style,\n                                Style = (TransparencyInstruction.TransparencyInstructionStyle) (message[\"style\"]?.GetValue<int?>() ?? (int) TransparencyInstruction.TransparencyInstructionStyle.Default)\n                            }.Execute(x);\n                        });\n                        break;\n                    }\n                case \"transparency\": {\n                        var taskbars = new List<Taskbar>(App.Settings.GraphicsRepeat ? new List<Taskbar>() { this } : App.taskbars);\n                        taskbars.ForEach(x => {\n                            new TransparencyInstruction() {\n                                Type = (TransparencyInstruction.TransparencyInstructionType) (message[\"which\"]?.GetValue<int?>() ?? (int) TransparencyInstruction.TransparencyInstructionType.RainbowTaskbar),\n                                Layer = message[\"layer\"]?.GetValue<int?>() ?? 0,\n                                Opacity = message[\"v\"]?.GetValue<double?>() ?? 1\n                            }.Execute(x);\n                        });\n                        break;\n                    }\n                case \"offset\": {\n                        var taskbars = new List<Taskbar>(App.Settings.GraphicsRepeat ? new List<Taskbar>() { this } : App.taskbars);\n                        taskbars.ForEach(x => {\n                            var old = UnderlayOffset;\n                            UnderlayOffset = Math.Max(Math.Min(message[\"v\"]?.GetValue<int?>() ?? 0, 96), -96);\n                            int nwh = App.layers is not null ? (App.layers.height - UnderlayOffset) : ((canvasManager.layers?.height ?? 48) - UnderlayOffset);\n                            x.Height = nwh;\n                        });\n\n                        break;\n                    }\n                case \"ui\": {\n                        webView.CoreWebView2.PostWebMessageAsString(JsonSerializer.Serialize(new CS2WVMessage<List<UIData>>(\"ui\", UIDataForAllTaskbars())));\n                        break;\n                    }\n                case \"audio\":\n                    // request audio stream\n                    // todo\n\n                    break;\n            }\n        };\n    }\n    public static void SetupWebViews() {\n        \n        App.Current.Dispatcher.Invoke(() => {\n            if (App.Settings.GraphicsRepeat) {\n                App.taskbars.ForEach((t) => {\n                    SetupWebView(t.webView, t.webViewReady_);\n                    t.SetupWebViewMessageReceiver();\n                });\n            }\n            else {\n                if (App.hiddenWebViewHost is null) App.hiddenWebViewHost = new();\n                App.hiddenWebViewHost.Show();\n                SetupWebView(App.hiddenWebViewHost.webView_, App.webViewReady);\n                App.taskbars.ForEach((t) => {\n                    t.SetupWebViewMessageReceiver();\n                    Task.Run(() => {\n                        App.webViewReady.WaitOne();\n                        App.webViewReady.ReleaseMutex();\n\n                        App.Current.Dispatcher.Invoke(() => {\n\n                            App.hiddenWebViewHost.Background = Brushes.Transparent;\n                            var taskbars = App.taskbars;\n                            App.hiddenWebViewHost.MinWidth = App.taskbars.Sum(t2 => t2.Width);\n                            App.hiddenWebViewHost.MinHeight = App.taskbars.Max(t2 => t2.Height);\n\n                            App.hiddenWebViewHost.Top = 19999;\n                            App.hiddenWebViewHost.Left = 19999;\n\n                            t.windowHelper.Duplicate(new WindowInteropHelper(App.hiddenWebViewHost).EnsureHandle());\n                        });\n\n                    });\n                });\n            }\n        });\n    }\n\n    public static void SoftReset(bool startConfig = true, Config cfg = null) {\n        if (cfg is null) cfg = App.Settings.SelectedConfig;\n        if (cfg is InstructionConfig) {\n            var config = cfg as InstructionConfig;\n            \n            // insane coding\n            ;\n            (new List<Instruction>(config.Data.RunOnceGroup.Instructions)).Concat(config.Data.LoopGroups.Select(x => x.Instructions).SelectMany(x => x)).ToList().ForEach((i) => {\n                if (i is ImageInstruction) {\n                    ((ImageInstruction) i).drawn = false;\n                }\n                if (i is ShapeInstruction) {\n                    ((ShapeInstruction) i).drawn = false;\n                }\n                if (i is TextInstruction) {\n                    ((TextInstruction) i).drawn = false;\n                }\n            });\n        }\n\n        if(cfg is not null && startConfig) cfg.Start();\n    }\n\n    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) {\n        windowHelper.TaskbarUIChanged -= uiChangedHandler;\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/TaskbarViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Interop;\nusing System.Windows.Media;\n\nusing RainbowTaskbar.Drawing;\nusing RainbowTaskbar.Helpers;\nusing RainbowTaskbar.HTTPAPI;\nnamespace RainbowTaskbar;\n\npublic class TaskbarViewModel {\n    //public readonly CancellationTokenSource cts;\n    private readonly Taskbar Window;\n    //public Thread drawThread;\n    //public Thread zThread;\n\n\n    public TaskbarViewModel(Taskbar window, IntPtr HWND) {\n        Window = window;\n        window.Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));\n\n        window.taskbarHelper =\n            new TaskbarHelper(\n                HWND,\n                window.secondary);\n        window.windowHelper = new WindowHelper(window, window.taskbarHelper);\n        window.taskbarHelper.window = window;\n        window.taskbarHelper.PositionChangedHook();\n        window.taskbarHelper.UpdateRadius();\n\n        IntPtr thisHwnd = new WindowInteropHelper(window).Handle;\n        TaskbarHelper.SetWindowLong(thisHwnd, TaskbarHelper.GWL_EXSTYLE, (uint) (TaskbarHelper.GetWindowLong(thisHwnd, TaskbarHelper.GWL_EXSTYLE).ToInt32() | 0x00000080L) /*WS_EX_TOOLWINDOW*/);\n\n        var Taskbar = window.taskbarHelper.GetRectangle(true);\n        //window.Left = 0;\n        //window.Top = 0;\n        double scale = window.taskbarHelper.GetScalingFactor();\n        window.MinWidth = Taskbar.Width * (1/ scale);\n        window.Width = Taskbar.Width * (1 / scale);\n        window.MinHeight = Taskbar.Height * (1 / scale);\n        window.Height = Taskbar.Height * (1 / scale);\n\n\n        window.TaskbarClip.RadiusX = window.TaskbarClip.RadiusY = 0;\n        window.TaskbarClip.Rect = new(0, 0, window.Width, window.Height);\n\n        window.TaskbarClipHide.RadiusX = window.TaskbarClipHide.RadiusY = 0;\n        window.TaskbarClipHide.Rect = new(0, 0, 0, 0);\n\n        if (HWND == IntPtr.Zero) return;\n        window.canvasManager = new CanvasManager(window, new Canvas[] {\n                window.Layer0, window.Layer1, window.Layer2, window.Layer3, window.Layer4, window.Layer5,\n                window.Layer6, window.Layer7, window.Layer8, window.Layer9, window.Layer10, window.Layer11,\n                window.Layer12, window.Layer13, window.Layer14, window.Layer15\n            });\n\n        foreach (var cvs in window.canvasManager.canvases) {\n            cvs.Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));\n        }\n       \n        \n\n        //cts = new CancellationTokenSource();\n        //StartZThread(window);\n    }\n    /*\n    public void StartZThread(Taskbar window) {\n        var token = cts.Token;\n        \n\n        zThread = new Thread(() => {\n                while (!token.IsCancellationRequested) {\n                    TaskbarHelper taskbar = null;\n                    window.Dispatcher.Invoke(() => { taskbar = window.taskbarHelper; });\n\n                    taskbar.SetWindowZUnder(window);\n                    taskbar.SetBlur();\n                    token.WaitHandle.WaitOne(100);\n                }\n            })\n            {IsBackground = true};\n\n        zThread.Start();\n    }\n    */\n    public void OnWindowClosing(object sender, CancelEventArgs e) {\n        Window.taskbarHelper.PositionChangedUnhook();\n        Window.windowHelper.alive = false;\n        //cts.Cancel();\n        //cts.Dispose();\n\n\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/TrayWindow.xaml",
    "content": "﻿<Window x:Class=\"RainbowTaskbar.TrayWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:RainbowTaskbar\" xmlns:tb=\"http://www.hardcodet.net/taskbar\"\n        mc:Ignorable=\"d\"\n        Title=\"TrayWindow\" Height=\"0\" Width=\"0\"\n        Visibility=\"Hidden\">\n    <Window.Resources>\n        <ResourceDictionary>\n            <ResourceDictionary.MergedDictionaries>\n                <ResourceDictionary Source=\"Languages/en_US.xaml\" />\n\n            </ResourceDictionary.MergedDictionaries>\n        </ResourceDictionary>\n\n\n    </Window.Resources>\n    <Window.ContextMenu>\n        <ContextMenu>\n            <MenuItem x:Name=\"Open\" Click=\"Open_Click\" Header=\"{DynamicResource openeditor}\"></MenuItem>\n            <MenuItem x:Name=\"Donate\" Click=\"TrayIcon_TrayMouseDoubleClick\" Header=\"{DynamicResource donate}\"></MenuItem>\n            <MenuItem x:Name=\"ProjectPage\" Click=\"ProjectPage_Click\" Header=\"{DynamicResource projectpage}\"></MenuItem>\n            <MenuItem x:Name=\"Issue\" Click=\"Issue_Click\" Header=\"{DynamicResource issueorreq}\"></MenuItem>\n            <MenuItem x:Name=\"Exit\" Click=\"Exit_Click\" Header=\"{DynamicResource exit}\"></MenuItem>\n        </ContextMenu>\n    </Window.ContextMenu>\n    <Grid>\n        <tb:TaskbarIcon Name=\"TrayIcon\"\n                        IconSource=\"pack://application:,,,/RainbowTaskbar;component/Resources/icon.ico\"\n                        ToolTipText=\"{DynamicResource name}\" />\n    </Grid>\n</Window>\n"
  },
  {
    "path": "RainbowTaskbar/TrayWindow.xaml.cs",
    "content": "﻿using RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Helpers;\n\n//using RainbowTaskbar.UserControls;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Interop;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Shapes;\nusing static RainbowTaskbar.Taskbar;\n\nnamespace RainbowTaskbar {\n    /// <summary>\n    /// Interaction logic for TrayWindow.xaml\n    /// </summary>\n    public partial class TrayWindow : Window {\n        \n\n        public TrayWindow() {\n            InitializeComponent();\n\n            TrayIcon.TrayMouseDoubleClick += TrayIcon_TrayMouseDoubleClick;\n            TrayIcon.ToolTipText = $\"RainbowTaskbar {Assembly.GetExecutingAssembly().GetName().Version?.ToString()}\";\n            TrayIcon.ContextMenu = this.ContextMenu;\n            App.localization.Enable(TrayIcon.ContextMenu.Resources.MergedDictionaries);\n            App.trayWindow = this;\n\n        }\n\n        private void TrayIcon_TrayMouseDoubleClick(object sender, RoutedEventArgs e) {\n\n            App.LaunchEditor();\n        }\n\n        private void Open_Click(object sender, RoutedEventArgs e) {\n            e.Handled = true;\n            App.LaunchEditor();\n        }\n\n        private void Exit_Click(object sender, RoutedEventArgs e) {\n            e.Handled = true;\n            App.Exit();\n        }\n\n        private void Issue_Click(object sender, RoutedEventArgs e) {\n            e.Handled = true;\n            Process.Start(new ProcessStartInfo(\"https://github.com/ad2017gd/RainbowTaskbar/issues/new/choose\") { UseShellExecute = true });\n        }\n\n        private void ProjectPage_Click(object sender, RoutedEventArgs e) {\n            e.Handled = true;\n            Process.Start(new ProcessStartInfo(\"https://ad2017.dev/rnb\") { UseShellExecute = true });\n        }\n    }\n}\n"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Dynamic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.Serialization;\nusing System.Text.RegularExpressions;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Media.Animation;\nusing System.Xml;\nusing PropertyChanged;\nusing RainbowTaskbar.HTTPAPI;\nusing System.Diagnostics;\nusing RainbowTaskbar.V2Legacy.Configuration.Instructions;\n\nnamespace RainbowTaskbar.V2Legacy.Configuration;\n\n[DataContract]\npublic class Config : INotifyPropertyChanged {\n    public Config() {\n    }\n\n    [field: DataMember] public int ConfigFileVersion { get; set; } = 0;\n\n    [field: DataMember] public bool CheckUpdate { get; set; } = true;\n    [field: DataMember] public long MagicCookie { get; set; } = 0;\n\n    [field: DataMember]\n    public BindingList<Instruction> Instructions { get; set; } = new BindingList<Instruction>();\n    [field: DataMember]\n    public BindingList<InstructionPreset> Presets { get; set; } = new BindingList<InstructionPreset>();\n\n    [field: DataMember]\n    public bool IsAPIEnabled { get; set; } = false;\n\n    [field: DataMember]\n    public int APIPort { get; set; } = 9093;\n\n    [field: DataMember]\n    public int InterpolationQuality { get; set; } = 25;\n\n    [field: DataMember]\n    public bool GraphicsRepeat { get; set; } = true;\n\n    [field: DataMember]\n    public bool SameRadiusOnEach { get; set; } = false;\n\n    [field: DataMember]\n    public string Language { get; set; } = \"SystemDefault\";\n\n    [field: DataMember]\n    public bool FirstStart { get; set; } = true;\n\n    public event PropertyChangedEventHandler PropertyChanged;\n}"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instruction.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.Serialization;\nusing System.Text.RegularExpressions;\nusing System.Threading;\nusing FastMember;\n\n\nnamespace RainbowTaskbar.V2Legacy.Configuration;\n\n[DataContract]\n[KnownType(\"GetKnownInstructionTypes\")]\npublic abstract class Instruction : INotifyPropertyChanged {\n    public static IEnumerable<Type> InstructionTypes { get; set; } = GetKnownInstructionTypes();\n\n    public abstract string Description { get; }\n\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    public static IEnumerable<Type> GetKnownInstructionTypes() {\n        if (InstructionTypes == null)\n            InstructionTypes = Assembly.GetExecutingAssembly().GetTypes()\n                .Where(type => typeof(Instruction).IsAssignableFrom(type)).ToList();\n\n        return InstructionTypes;\n    }\n\n    public bool Execute(Taskbar window) => Execute(window, CancellationToken.None);\n\n    public abstract bool Execute(Taskbar window, CancellationToken token);\n}"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/InstructionPreset.cs",
    "content": "﻿using System.ComponentModel;\nusing System.Runtime.Serialization;\n\nnamespace RainbowTaskbar.V2Legacy.Configuration;\n\n[DataContract]\npublic class InstructionPreset {\n    [field: DataMember] public string Name { get; set; }\n    [field: DataMember] public BindingList<Instruction> Instructions { get; set; }\n}"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/BorderRadiusInstruction.cs",
    "content": "﻿using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\n\nnamespace RainbowTaskbar.V2Legacy.Configuration.Instructions;\n\n[DataContract]\ninternal class BorderRadiusInstruction : Instruction {\n    [field: DataMember] public int Radius { get; set; } = 0;\n\n    public override string Description {\n        get {\n            return null;\n        }\n    }\n\n    public override bool Execute(Taskbar window, CancellationToken _) {\n        return false;\n    }\n\n}"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/ClearLayerInstruction.cs",
    "content": "﻿using System.Dynamic;\nusing System.Linq;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Media;\nusing System.Windows.Shapes;\n\nnamespace RainbowTaskbar.V2Legacy.Configuration.Instructions;\n\n[DataContract]\ninternal class ClearLayerInstruction : Instruction {\n    [field: DataMember] public int Layer { get; set; } = 0;\n\n    public override string Description {\n        get {\n            return null;\n        }\n    }\n\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        return false;\n    }\n\n}"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/ColorInstruction.cs",
    "content": "﻿\nusing System.Drawing;\nusing System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows.Media;\nusing RainbowTaskbar.Interpolation;\nusing Color = System.Drawing.Color;\nusing Brush = System.Windows.Media.Brush;\nusing RainbowTaskbar.Languages;\nusing RainbowTaskbar.V2Legacy.Configuration;\n\nnamespace RainbowTaskbar.V2Legacy.Configuration.Instructions;\n\n[DataContract]\ninternal class ColorInstruction : Instruction {\n\n    public override string Description {\n        get {\n            return \"\";\n        }\n    }\n    public enum ColorInstructionEffect {\n        Solid,\n        Fade,\n        Gradient,\n        FadeGradient\n    }\n\n    public enum ColorInstructionTransition {\n        Linear,\n        Sine,\n        Cubic,\n        Exponential,\n        Back\n    }\n\n    [field: DataMember] public int Time { get; set; } = 1;\n\n    [field: DataMember] public Color Color1 { get; set; } = Color.FromArgb(0, 0, 0);\n\n    [field: DataMember] public ColorInstructionEffect Effect { get; set; }\n\n    [field: DataMember] public Color Color2 { get; set; } = Color.FromArgb(0, 0, 0);\n\n    [field: DataMember] public int Time2 { get; set; } = 1;\n\n    [field: DataMember] public ColorInstructionTransition Transition { get; set; }\n\n    [field: DataMember] public double Angle { get; set; } = 0;\n\n    [field: DataMember] public int Layer { get; set; } = 0;\n\n    [field: DataMember] public bool Randomize { get; set; } = false;\n\n    public bool Has2Colors { get => Effect == ColorInstructionEffect.FadeGradient || Effect == ColorInstructionEffect.Gradient; }\n\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        return true;\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/DelayInstruction.cs",
    "content": "﻿using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nnamespace RainbowTaskbar.V2Legacy.Configuration.Instructions;\n\n[DataContract]\ninternal class DelayInstruction : Instruction {\n    [field: DataMember] public int Time { get; set; } = 1;\n\n    public override string Description {\n        get {\n            return \"\";\n        }\n    }\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        return true;\n    }\n\n}"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/ImageInstruction.cs",
    "content": "﻿using System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Imaging;\nusing System.Dynamic;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nnamespace RainbowTaskbar.V2Legacy.Configuration.Instructions;\n\n[DataContract]\ninternal class ImageInstruction : Instruction {\n\n    [field: DataMember] public int Layer { get; set; } = 0;\n\n    [field: DataMember] public string Path { get; set; } = \"\";\n\n    [field: DataMember] public int X { get; set; } = 0;\n\n    [field: DataMember] public int Y { get; set; } = 0;\n\n    [field: DataMember] public int Width { get; set; } = 0;\n\n    [field: DataMember] public int Height { get; set; } = 0;\n\n    [field: DataMember] public double Opacity { get; set; } = 1;\n\n    [field: DataMember] public bool DrawOnce { get; set; } = false;\n\n    public override string Description {\n        get {\n            return \"\";\n        }\n    }\n\n\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        \n        return false;\n    }\n\n}"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/ShapeInstruction.cs",
    "content": "﻿\nusing System;\nusing System.Dynamic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Media;\nusing System.Windows.Shapes;\nusing RainbowTaskbar.Interpolation;\nusing RainbowTaskbar.Languages;\n\nnamespace RainbowTaskbar.V2Legacy.Configuration.Instructions;\n\n[DataContract]\npublic class ShapeInstruction : Instruction {\n\n    [field: DataMember]\n    public int Layer { get; set; } = 0;\n\n    [field: DataMember]\n    public ShapeInstructionShapes Shape { get; set; } = ShapeInstructionShapes.Line;\n\n    [field: DataMember] public int X { get; set; } = 0;\n\n    [field: DataMember] public int Y { get; set; } = 0;\n\n    [field: DataMember] public int X2 { get; set; } = 0;\n\n    [field: DataMember] public int Y2 { get; set; } = 0;\n\n    [field: DataMember] public bool DrawOnce { get; set; } = false;\n\n    [field: DataMember]\n    public System.Drawing.Color Fill { get; set; } = System.Drawing.Color.FromArgb(255, 0, 0, 0);\n\n    [field: DataMember]\n    public System.Drawing.Color Line { get; set; } = System.Drawing.Color.FromArgb(255, 0, 0, 0);\n\n    [field: DataMember]\n    public int LineSize { get; set; } = 1;\n\n    [field: DataMember]\n    public int Radius { get; set; } = 0;\n\n    [field: DataMember]\n    public bool FitTaskbars { get; set; } = false;\n\n    public override string Description {\n        get {\n            return \"\";\n        }\n    }\n\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        \n\n        return false;\n    }\n\n    public enum ShapeInstructionShapes {\n        Line,\n        Rectangle,\n        Ellipse\n    }\n\n}\n"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/TextInstruction.cs",
    "content": "﻿using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Media;\nusing RainbowTaskbar.Interpolation;\nusing Color = System.Drawing.Color;\n\nnamespace RainbowTaskbar.V2Legacy.Configuration.Instructions;\n\n[DataContract]\ninternal class TextInstruction : Instruction {\n\n\n    [field: DataMember] public int Layer { get; set; } = 1;\n\n    [field: DataMember] public string Text { get; set; } = \"\";\n\n    [field: DataMember] public int X { get; set; } = 0;\n\n    [field: DataMember] public int Y { get; set; } = 0;\n\n    [field: DataMember] public string Font { get; set; } = \"Arial\";\n\n    [field: DataMember] public int Size { get; set; } = 32;\n\n    [field: DataMember] public bool DrawOnce { get; set; } = false;\n\n    [field: DataMember] public Color Color { get; set; } = Color.Black;\n\n    [field: DataMember] public bool Center { get; set; } = false;\n\n    public override string Description {\n        get {\n            return \"\";\n        }\n    }\n\n\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        \n        return false;\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/TransparencyInstruction.cs",
    "content": "﻿using System;\nusing System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows.Controls;\nusing RainbowTaskbar.Helpers;\nusing RainbowTaskbar.Languages;\n\nnamespace RainbowTaskbar.V2Legacy.Configuration.Instructions;\n\n[DataContract]\npublic class TransparencyInstruction : Instruction {\n    public enum TransparencyInstructionStyle {\n        Default,\n        Blur,\n        Transparent\n    }\n\n    public enum TransparencyInstructionType {\n        Taskbar,\n        RainbowTaskbar,\n        All,\n        Style,\n        Layer\n    }\n\n    [field: DataMember] public TransparencyInstructionType Type { get; set; }\n\n    [field: DataMember] public double Opacity { get; set; } = 1;\n\n    [field: DataMember] public TransparencyInstructionStyle Style { get; set; }\n\n    [field: DataMember] public int Layer { get; set; }\n\n    public override string Description {\n        get {\n            return \"\";\n\n        }\n    }\n\n    public override bool Execute(Taskbar window, CancellationToken token) {\n        return false;\n    }\n}"
  },
  {
    "path": "RainbowTaskbar/msix.build.props",
    "content": "﻿<Project>\n  <PropertyGroup>\n    <IsMsixBuild>true</IsMsixBuild>\n    <DefineConstants>$(DefineConstants);MSIX_BUILD</DefineConstants>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "RainbowTaskbar.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.1.32407.343\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"RainbowTaskbar\", \"RainbowTaskbar\\RainbowTaskbar.csproj\", \"{03366AEB-0D3C-453B-BB5F-50DFB417D325}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"RainbowTaskbarDLL\", \"RainbowTaskbarDLL\\RainbowTaskbarDLL.vcxproj\", \"{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}\"\nEndProject\nProject(\"{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}\") = \"MSIXPkg2\", \"MSIXPkg2\\MSIXPkg2.wapproj\", \"{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|ARM64 = Debug|ARM64\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease (MSIX)|ARM64 = Release (MSIX)|ARM64\n\t\tRelease (MSIX)|x64 = Release (MSIX)|x64\n\t\tRelease (MSIX)|x86 = Release (MSIX)|x86\n\t\tRelease|ARM64 = Release|ARM64\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Debug|ARM64.ActiveCfg = Debug|ARM64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Debug|ARM64.Build.0 = Debug|ARM64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Debug|x64.Build.0 = Debug|x64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Debug|x86.Build.0 = Debug|x86\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release (MSIX)|ARM64.ActiveCfg = Release (MSIX)|ARM64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release (MSIX)|ARM64.Build.0 = Release (MSIX)|ARM64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release (MSIX)|x64.ActiveCfg = Release (MSIX)|x64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release (MSIX)|x64.Build.0 = Release (MSIX)|x64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release (MSIX)|x86.ActiveCfg = Release (MSIX)|x86\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release (MSIX)|x86.Build.0 = Release (MSIX)|x86\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release|ARM64.ActiveCfg = Release|ARM64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release|ARM64.Build.0 = Release|ARM64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release|x64.ActiveCfg = Release|x64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release|x64.Build.0 = Release|x64\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release|x86.ActiveCfg = Release|x86\n\t\t{03366AEB-0D3C-453B-BB5F-50DFB417D325}.Release|x86.Build.0 = Release|x86\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Debug|ARM64.ActiveCfg = Debug|ARM64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Debug|ARM64.Build.0 = Debug|ARM64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Debug|x64.Build.0 = Debug|x64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Debug|x86.Build.0 = Debug|Win32\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release (MSIX)|ARM64.ActiveCfg = Release|ARM64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release (MSIX)|ARM64.Build.0 = Release|ARM64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release (MSIX)|x64.ActiveCfg = Release|x64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release (MSIX)|x64.Build.0 = Release|x64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release (MSIX)|x86.ActiveCfg = Release (MSIX)|Win32\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release (MSIX)|x86.Build.0 = Release (MSIX)|Win32\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release|ARM64.ActiveCfg = Release|ARM64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release|ARM64.Build.0 = Release|ARM64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release|x64.ActiveCfg = Release|x64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release|x64.Build.0 = Release|x64\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release|x86.ActiveCfg = Release|Win32\n\t\t{3FF5D07D-44D1-4B85-9465-4793B3A9EE8A}.Release|x86.Build.0 = Release|Win32\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Debug|ARM64.ActiveCfg = Debug|ARM64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Debug|ARM64.Build.0 = Debug|ARM64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Debug|ARM64.Deploy.0 = Debug|ARM64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Debug|x64.Build.0 = Debug|x64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Debug|x64.Deploy.0 = Debug|x64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Debug|x86.Build.0 = Debug|x86\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Debug|x86.Deploy.0 = Debug|x86\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release (MSIX)|ARM64.ActiveCfg = Release (MSIX)|ARM64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release (MSIX)|ARM64.Build.0 = Release (MSIX)|ARM64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release (MSIX)|ARM64.Deploy.0 = Release (MSIX)|ARM64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release (MSIX)|x64.ActiveCfg = Release (MSIX)|x64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release (MSIX)|x64.Build.0 = Release (MSIX)|x64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release (MSIX)|x64.Deploy.0 = Release (MSIX)|x64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release (MSIX)|x86.ActiveCfg = Release (MSIX)|x86\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release (MSIX)|x86.Build.0 = Release (MSIX)|x86\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release (MSIX)|x86.Deploy.0 = Release (MSIX)|x86\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release|ARM64.ActiveCfg = Release|ARM64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release|ARM64.Build.0 = Release|ARM64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release|ARM64.Deploy.0 = Release|ARM64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release|x64.ActiveCfg = Release (MSIX)|x64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release|x64.Build.0 = Release (MSIX)|x64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release|x64.Deploy.0 = Release (MSIX)|x64\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release|x86.ActiveCfg = Release|x86\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release|x86.Build.0 = Release|x86\n\t\t{EEAF81A9-BB63-40D9-A733-7F25D2313DF5}.Release|x86.Deploy.0 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {C4E67E8A-1256-45FB-8FC7-156FD12B1E62}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "RainbowTaskbarDLL/AppearanceServiceAPI.cpp",
    "content": "﻿#include \"AppearanceServiceAPI.h\"\n#include \"Taskbar.h\"\n#include \"winrt.h\"\n#include <comdef.h>\n#include <tchar.h>\n\n#include <winrt/Windows.UI.Core.h>\nHRESULT STDMETHODCALLTYPE AppearanceServiceAPI::SetAppearanceType(UINT type) {_F\n    if (!active) return S_FALSE;\n    try {\n_E      auto watch = treeWatch.get();\n_E      for (auto& [handle, taskbar] : watch->taskbarMap) {\n_E          Taskbar& t = taskbar;//?\n_E          switch (type) {\n_E          case 0: // default\n_E              taskbar.dispatcher.RunAsync(winrt::Windows::UI::Core::CoreDispatcherPriority::High, [&]() {\n_E                  t.rectangleBackground.Fill(t.originalBrush);\n_E                  t.border.Opacity(1);\n_E              });\n_E              \n_E              break;\n_E          case 2: // transparent\n_E              taskbar.dispatcher.RunAsync(winrt::Windows::UI::Core::CoreDispatcherPriority::High, [&]() {\n_E                  t.rectangleBackground.Fill(winrt::Windows::UI::Xaml::Media::SolidColorBrush(winrt::Windows::UI::Colors::Transparent()));\n_E                  t.border.Opacity(0);\n_E              });\n_E              \n_E              break;\n_E\n_E          case 1: // blurred (?)\n_E              taskbar.dispatcher.RunAsync(winrt::Windows::UI::Core::CoreDispatcherPriority::High, [&]() {\n_E                  auto brush = winrt::Windows::UI::Xaml::Media::AcrylicBrush();\n_E                  brush.TintColor(winrt::Windows::UI::Colors::Transparent());\n_E                  brush.TintOpacity(0);\n_E                  brush.TintLuminosityOpacity(0.0);\n_E                  brush.BackgroundSource(winrt::Windows::UI::Xaml::Media::AcrylicBackgroundSource::Backdrop);\n_E                  t.rectangleBackground.Fill(brush);\n_E                  t.border.Opacity(1);\n_E              });\n_E              break;\n_E          }\n_E      }\n    }\n    catch (...) {\n        HRESULT res = winrt::to_hresult();\n        _com_error err(res);\n        WCHAR data[1024];\n        __EFMT(data, err.ErrorMessage());\n        return res;\n    }\n\n    return S_OK;\n}\n\nHRESULT STDMETHODCALLTYPE AppearanceServiceAPI::ChangeTaskbarElementsOpacity(UINT alpha) {_F\n    if (!active) return S_FALSE;\n    try {\n_E      auto watch = treeWatch.get();\n_E      for (auto& [handle, taskbar] : watch->taskbarMap) {\n_E          Taskbar& t = taskbar;//?\n_E          if (t.SystemTrayFrame && t.TaskbarFrameRepeater) {\n_E              t.SystemTrayFrame.Opacity(alpha / 255.0);\n_E              t.TaskbarFrameRepeater.Opacity(alpha / 255.0);\n_E          }\n_E      }\n    }\n    catch (...) {\n        HRESULT res = winrt::to_hresult();\n        _com_error err(res);\n        WCHAR data[1024];\n        __EFMT(data, err.ErrorMessage());\n        return res;\n    }\n\n    return S_OK;\n}\n\nHRESULT STDMETHODCALLTYPE AppearanceServiceAPI::Close() try { _F\n_E  SetAppearanceType(0);\n_E  ChangeTaskbarElementsOpacity(255);\n_E  return 0;\n}\ncatch (...)\n{\n    HRESULT res = winrt::to_hresult();\n    _com_error err(res);\n    WCHAR data[1024];\n    __EFMT(data, err.ErrorMessage());\n    return res;\n}\n\nHRESULT STDMETHODCALLTYPE AppearanceServiceAPI::Version() { \n\n    return 5;\n}\n\n//#include <fstream>\n//HRESULT STDMETHODCALLTYPE AppearanceServiceAPI::DebugGetUITree(BSTR* tree) try { _F\n//_E  auto watch = treeWatch.get();\n//\n//_E  if (!watch->taskbarMap.begin()->first) return S_FALSE;\n//_E  std::wstring str = std::wstring();\n//    for (auto& taskbar : watch->taskbarMap) {\n//_E      auto frame = watch->ConvertFromH<winrt::Windows::UI::Xaml::FrameworkElement>(taskbar.first);\n//_E      auto root = frame.Parent().as<winrt::Windows::UI::Xaml::FrameworkElement>();\n//_E      auto children = watch->FindChildrenRecursive(std::nullopt, root, 0);\n////_E      std::sort(children.begin(), children.end(), [&](std::pair<int, winrt::Windows::UI::Xaml::FrameworkElement>& a, std::pair<int, winrt::Windows::UI::Xaml::FrameworkElement>& b) { return a.first < b.first; });\n//_E      for (auto& child : children) {\n//_E          auto iinsp = watch->ConvertFromH<IInspectable>(watch->ConvertToH(child.second));\n//_E          winrt::hstring str3 = winrt::get_class_name(iinsp);\n//_E          auto add = std::wstring(child.first*2, ' ');\n//_E          auto pt = child.second.TransformToVisual(watch->root).TransformPoint(winrt::Windows::Foundation::Point(0, 0));\n//_E          auto felem = child.second.try_as< winrt::Windows::UI::Xaml::FrameworkElement>();\n//_E          str = str + add + std::wstring{ str3 } + L\" \" + (felem ? std::wstring{ felem.Name() } : L\"NULL\") + L\" \" + L\" \" + std::to_wstring(pt.X) + L\" \" + std::to_wstring(pt.Y) + L\"\\n\";\n//\n//_E\n//        }\n//        str = str + L\"\\n\\n\\n\";\n//    }\n//_E  BSTR bstr = SysAllocStringLen(str.data(), str.size());\n//_E  if (tree)\n//        *tree = bstr;\n//\n//} catch (...) {\n//    HRESULT res = winrt::to_hresult();\n//    \n//    _com_error err(res);\n//    WCHAR data[1024];\n//    __EFMT(data, err.ErrorMessage());\n//    return res;\n//}\n\n\\\n\nHRESULT STDMETHODCALLTYPE AppearanceServiceAPI::GetDataPtr(){\n    auto watch = treeWatch.get();\n    return (HRESULT)watch->data;\n}\n\n\n\n\n\n\nHRESULT AppearanceServiceAPI::Invoke(DISPID dispIdMember, // 0 or 1\n    REFIID riid, // null\n    LCID lcid, // null\n    WORD wFlags, // DISPATCH_METHOD\n    DISPPARAMS* pDispParams,\n    VARIANT* pVarResult,\n    EXCEPINFO* pExcepInfo,\n    unsigned int* puArgErr\n) {\n    // this is such a shitty implementation but I DONT CARE!\n    switch (dispIdMember)\n    {\n    case 0:\n        if (pDispParams->cArgs == 1 && pDispParams->rgvarg[0].vt == VT_UI4)\n        {\n            UINT appearanceType = pDispParams->rgvarg[0].ulVal;\n            HRESULT hr = SetAppearanceType(appearanceType);\n            if (FAILED(hr))\n                return hr;\n        }\n        return S_OK;\n\n    case 1:\n    {\n        HRESULT hr = Close();\n        if (FAILED(hr))\n            return hr;\n        return S_OK;\n    }\n    case 2:\n        return Version();\n    case 3: {\n        return GetDataPtr();\n    case 4:\n        if (pDispParams->cArgs == 1 && pDispParams->rgvarg[0].vt == VT_UI4)\n        {\n            UINT opac = pDispParams->rgvarg[0].ulVal;\n            HRESULT hr = ChangeTaskbarElementsOpacity(opac);\n            if (FAILED(hr))\n                return hr;\n        }\n        return S_OK;\n    }\n\n}\n\n    return DISP_E_MEMBERNOTFOUND;\n}\nHRESULT STDMETHODCALLTYPE AppearanceServiceAPI::GetTypeInfoCount(UINT* pctinfo)\n{\n    return E_NOTIMPL;\n}\n\nHRESULT STDMETHODCALLTYPE AppearanceServiceAPI::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo)\n{\n    return E_NOTIMPL;\n}\n\nHRESULT STDMETHODCALLTYPE AppearanceServiceAPI::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId)\n{\n    return E_NOTIMPL;\n}\n\nvoid AppearanceServiceAPI::Unload() {\n    CoRevokeClassObject(s_proxyCookie);\n}\n\nDWORD s_proxyCookie = 0;\nDWORD s_activeObjectCookie = 0;\n\nAppearanceServiceAPI::AppearanceServiceAPI(winrt::com_ptr<VisualTreeWatch> watch) try {_F\n    treeWatch = watch;\n\n    watch->data = (struct RainbowTaskbarData*)malloc(sizeof(struct RainbowTaskbarData));\n    memset(watch->data, 0, sizeof(struct RainbowTaskbarData));\n\n    winrt::com_ptr<IUnknown> stub;\n    const CLSID CLSID_PROXY = PROXY_CLSID_IS;\n_E  winrt::check_hresult(DllGetClassObject(CLSID_PROXY, winrt::guid_of<decltype(stub)::type>(), (void**)stub.put()));\n_E  winrt::check_hresult(CoRegisterClassObject(CLSID_PROXY, stub.get(), CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &s_proxyCookie));\n_E\n_E  winrt::check_hresult(RegisterActiveObject(static_cast<IDispatch*>(this), CLSID_AppearanceServiceAPI, ACTIVEOBJECT_STRONG, &s_activeObjectCookie));\n\n}\ncatch (...)\n{\n    HRESULT res = winrt::to_hresult();\n    _com_error err(res);\n    WCHAR data[1024];\n    __EFMT(data, err.ErrorMessage());\n}"
  },
  {
    "path": "RainbowTaskbarDLL/AppearanceServiceAPI.h",
    "content": "﻿#pragma once\n#include \"winrt.h\"\n#include \"VisualTreeWatch.h\"\n#include <winrt/Windows.Foundation.h>\n#include \"RainbowTaskbarDLL_h.h\"\n#include \"ErrorDebug.h\"\n\nextern DWORD s_proxyCookie;\nextern DWORD s_activeObjectCookie;\n\nclass AppearanceServiceAPI : public winrt::implements<AppearanceServiceAPI, IDispatch, IErrorDebug, winrt::non_agile>\n{\nprivate:\n    size_t line = 0;\n    char* file = 0;\npublic:\n    winrt::com_ptr<VisualTreeWatch> treeWatch;\n\n    \n    bool active = true;\n\n    HRESULT STDMETHODCALLTYPE SetAppearanceType(UINT type);\n    HRESULT STDMETHODCALLTYPE ChangeTaskbarElementsOpacity(UINT alpha);\n\n    HRESULT STDMETHODCALLTYPE Close();\n\n    HRESULT STDMETHODCALLTYPE Version();\n\n    HRESULT STDMETHODCALLTYPE GetDataPtr();\n\n    HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember,\n        REFIID riid,\n        LCID lcid,\n        WORD wFlags,\n        DISPPARAMS* pDispParams,\n        VARIANT* pVarResult,\n        EXCEPINFO* pExcepInfo,\n        unsigned int* puArgErr\n    ) override;\n\n    // BORING!\n    HRESULT STDMETHODCALLTYPE GetTypeInfoCount(\n        UINT* pctinfo) override;\n\n    HRESULT STDMETHODCALLTYPE GetTypeInfo(\n        UINT iTInfo,\n        LCID lcid,\n        ITypeInfo** ppTInfo) override;\n\n    HRESULT STDMETHODCALLTYPE GetIDsOfNames(\n        REFIID riid,\n        LPOLESTR* rgszNames,\n        UINT cNames,\n        LCID lcid,\n        DISPID* rgDispId) override;\n\n\n    AppearanceServiceAPI(winrt::com_ptr<VisualTreeWatch> watch);\n    static void Unload();\n\n    \n};\n\n"
  },
  {
    "path": "RainbowTaskbarDLL/ArmFix/RpcProxy.h",
    "content": "﻿/*++\n\nCopyright (c) Microsoft Corporation. All rights reserved.\n\nModule Name:\n\n    rpcproxy.h\n\nAbstract:\n\n    Definitions for rpc proxy  stubs.\n\nCompiler switches:\n\n    -DREGISTER_PROXY_DLL\n        Generates DllMain, DllRegisterServer, and DllUnregisterServer functions\n        for automatically registering a proxy DLL.\n\n    -DPROXY_CLSID=clsid\n        Specifies a class ID to be used by the proxy DLL.\n\n    -DPROXY_CLSID_IS={0x6f11fe5c,0x2fc5,0x101b,{0x9e,0x45,0x00,0x00,0x0b,0x65,0xc7,0xef}}\n        Specifies the value of the class ID to be used by the proxy DLL.\n\n    -DENTRY_PREFIX=<prefix>\n        String to be prepended on all the DllGetClassObject etc routines\n        in dlldata.c.  This includes: DllGetClassObject, DllCanUnloadNow\n        and DllMain, DllRegisterServer, and DllUnregisterServer.\n\n    -DNT35_STRICT\n        Specifies that the target platform is Windows NT 3.5. This switch disables\n        the new functions added after the Windows NT 3.5 release.\n\n--*/\n\n// This version of the rpcndr.h file corresponds to MIDL version 5.0.+\n// used with NT5 beta1+ env from build #1700 on.\n\n#ifndef __RPCPROXY_H_VERSION__\n#define __RPCPROXY_H_VERSION__      ( 477 )\n#endif // __RPCPROXY_H_VERSION__\n\n#include <winapifamily.h>\n\n#if !defined(_KRPCENV_)\n\n#ifndef __RPCPROXY_H__\n#define __RPCPROXY_H__\n#if _MSC_VER > 1000\n#pragma once\n#endif\n\n#define __midl_proxy\n\n#ifdef __REQUIRED_RPCPROXY_H_VERSION__\n    #if ( __RPCPROXY_H_VERSION__ < __REQUIRED_RPCPROXY_H_VERSION__ )\n        #error incorrect <rpcproxy.h> version. Use the header that matches with the MIDL compiler.\n    #endif\n#endif\n\n// If this is the first file included __RPC_WIN64__ is not defined yet.\n#if defined(_M_IA64) || defined(_WIN64)\n#include <pshpack8.h>\n#endif\n\n#include <basetsd.h>\n\n#ifndef INC_OLE2\n#define INC_OLE2\n#endif\n\n#ifndef DECLSPEC_SELECTANY\n#if (_MSC_VER >= 1200)\n#define DECLSPEC_SELECTANY __declspec(selectany)\n#else\n#define DECLSPEC_SELECTANY\n#endif\n#endif\n\n#ifndef DECLSPEC_NOINLINE\n#if (_MSC_VER >= 1200)\n#define DECLSPEC_NOINLINE __declspec(noinline)\n#else\n#define DECLSPEC_NOINLINE\n#endif\n#endif\n\n#ifndef RPCPROXY_IID_DECLSPEC_SECTION\n#if (_MSC_VER >= 1100)\n#pragma section(\"rpcproxy$_iid\", read)\n#define RPCPROXY_IID_DECLSPEC_SECTION __declspec(allocate(\"rpcproxy$_iid\"))\n#else\n#define RPCPROXY_IID_DECLSPEC_SECTION\n#endif\n#endif\n\n\n#if defined(WIN32) || defined(_WIN64)\n\n//We need to define REFIID, REFCLSID, REFGUID, & REFFMTID here so that the\n//proxy code won't get the const GUID *const definition.\n#ifndef GUID_DEFINED\n#include <guiddef.h>\n#endif /* GUID_DEFINED */\n\n#if defined(__cplusplus)\nextern \"C\"\n{\n#endif\n\n#pragma region Application or OneCore or Games Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n\n// forward declarations\n\n// By default, this header cannot be compiled as C++ without defining CINTERFACE (which uses a\n// C-style view of COM interfaces for C++ in MIDL-generated headers), because type definitions here\n// depend on *Vtbl types not present in this configuration. Define RPCPROXY_ENABLE_CPP_NO_CINTERFACE\n// to enable this when needed.\n#if defined(RPCPROXY_ENABLE_CPP_NO_CINTERFACE) && defined(__cplusplus) && !defined(CINTERFACE)\ntypedef struct IRpcStubBufferVtbl IRpcStubBufferVtbl;\ntypedef struct ICallFactoryVtbl ICallFactoryVtbl;\ntypedef struct IReleaseMarshalBuffersVtbl IReleaseMarshalBuffersVtbl;\ntypedef struct IPSFactoryBufferVtbl IPSFactoryBufferVtbl;\n#endif\n\ntypedef struct tagCInterfaceStubVtbl CInterfaceStubVtbl;\ntypedef struct tagCInterfaceProxyVtbl CInterfaceProxyVtbl;\n\ntypedef struct tagCInterfaceStubVtbl *  PCInterfaceStubVtblList;\ntypedef struct tagCInterfaceProxyVtbl *  PCInterfaceProxyVtblList;\ntypedef const char *                    PCInterfaceName;\ntypedef int __stdcall IIDLookupRtn( const IID * pIID, int * pIndex );\ntypedef IIDLookupRtn * PIIDLookup;\n\n// Uses a default lookup mechanism\n#define NdrDefaultIIDLookup ((PIIDLookup)-1)\n\n#if _MSC_VER >= 1200\n#pragma warning(push)\n#pragma warning(disable:4610) // struct can never be instantiated - user defined constructor required\n#pragma warning(disable:4510) // default constructor could not be generated\n#pragma warning(disable:4512) // assignment operator could not be generated\n#endif\n\n// pointers to arrays of CInterfaceProxyVtbl's and CInterfaceStubVtbls\ntypedef struct tagProxyFileInfo\n{\n    const PCInterfaceProxyVtblList *pProxyVtblList;\n    const PCInterfaceStubVtblList  *pStubVtblList;\n    const PCInterfaceName *         pNamesArray;\n    const IID **                    pDelegatedIIDs;\n    const PIIDLookup                pIIDLookupRtn;\n    unsigned short                  TableSize;\n    unsigned short                  TableVersion;\n    const IID **                    pAsyncIIDLookup;\n    LONG_PTR                        Filler2;\n    LONG_PTR                        Filler3;\n    LONG_PTR                        Filler4;\n}ProxyFileInfo;\n\n#if _MSC_VER >= 1200\n#pragma warning(pop)\n#endif\n\n// extended info with list of interface names\ntypedef ProxyFileInfo ExtendedProxyFileInfo;\n\n#include <rpc.h>\n#include <rpcndr.h>\n#include <string.h>\n#include <memory.h>\n\ntypedef struct tagCInterfaceProxyHeader\n{\n    //\n    // New fields should be added here, at the beginning of the structure.\n    //\n#ifdef USE_STUBLESS_PROXY\n    const void *    pStublessProxyInfo;\n#endif\n    const IID *     piid;\n} CInterfaceProxyHeader;\n\n// Macro used for ANSI compatible stubs.\n\n#define CINTERFACE_PROXY_VTABLE( n )  \\\nstruct \\\n{                                     \\\n    CInterfaceProxyHeader header;     \\\n    void *Vtbl[ n ];                  \\\n}\n\n#define IInspectableInterfaceProxyTag ((void *)-1)\n#define IUnknownInterfaceProxyTag ((void *)-2)\n\n#if _MSC_VER >= 1200\n#pragma warning(push)\n#endif\n#pragma warning( disable:4200 )\ntypedef struct tagCInterfaceProxyVtbl\n{\n    CInterfaceProxyHeader header;\n#if defined( _MSC_VER )\n    void *Vtbl[];\n#else\n    void *Vtbl[1];\n#endif\n} CInterfaceProxyVtbl;\n#if _MSC_VER >= 1200\n#pragma warning(pop)\n#else\n#pragma warning( default:4200 )\n#endif\n\ntypedef\nvoid\n(__RPC_STUB * PRPC_STUB_FUNCTION) (\n    IRpcStubBuffer          *   This,\n    IRpcChannelBuffer       *   _pRpcChannelBuffer,\n    PRPC_MESSAGE                _pRpcMessage,\n    DWORD *pdwStubPhase);\n\ntypedef struct tagCInterfaceStubHeader\n{\n    //New fields should be added here, at the beginning of the structure.\n    const IID               *   piid;\n    const MIDL_SERVER_INFO  *   pServerInfo;\n    ULONG               DispatchTableCount;\n    const PRPC_STUB_FUNCTION *  pDispatchTable;\n} CInterfaceStubHeader;\n\n#define IInspectableNdrStubCall2CommonStubListTag ((const PRPC_STUB_FUNCTION*)-1)\n#define IInspectableNdrStubCall3CommonStubListTag ((const PRPC_STUB_FUNCTION*)-2)\n\n#if !defined(RPCPROXY_ENABLE_CPP_NO_CINTERFACE) || !defined(__cplusplus) || defined(CINTERFACE)\ntypedef struct tagCInterfaceStubVtbl\n{\n    CInterfaceStubHeader        header;\n    IRpcStubBufferVtbl          Vtbl;\n} CInterfaceStubVtbl;\n\n#define RPCPROXY_GET_STUB_HEADER(StubVtblListEntry) (&(StubVtblListEntry)->header)\n#else\n\n// No definition of CInterfaceStubVtbl is provided in this configuration, but\n// RPCPROXY_GET_STUB_HEADER can be used to get the stub header from an entry in\n// a stub vtable list.\n#define RPCPROXY_GET_STUB_HEADER(StubVtblListEntry) (reinterpret_cast<const CInterfaceStubHeader*>(StubVtblListEntry))\n\n#endif\n\ntypedef struct tagCInterfaceStubVtblTag\n{\n    CInterfaceStubHeader        header;\n    void *                      tag;\n} CInterfaceStubVtblTag;\n\ntypedef struct tagCStdStubBuffer\n{\n    const struct IRpcStubBufferVtbl *   lpVtbl; //Points to Vtbl field in CInterfaceStubVtbl.\n    LONG                                RefCount;\n    struct IUnknown *                   pvServerObject;\n\n    const struct ICallFactoryVtbl *     pCallFactoryVtbl;\n    const IID *                         pAsyncIID;\n    struct IPSFactoryBuffer *           pPSFactory;\n    const struct IReleaseMarshalBuffersVtbl *     pRMBVtbl;\n} CStdStubBuffer;\n\ntypedef struct tagCStdPSFactoryBuffer\n{\n    const IPSFactoryBufferVtbl  *   lpVtbl;\n    LONG                            RefCount;\n    const ProxyFileInfo **          pProxyFileList;\n    LONG                            Filler1;  //Reserved for future use.\n} CStdPSFactoryBuffer;\n\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */\n#pragma endregion\n\n#pragma region Desktop or OneCore Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n\nRPCRTAPI\nvoid\nRPC_ENTRY\nNdrProxyInitialize(\n    void *              This,\n    PRPC_MESSAGE        pRpcMsg,\n    PMIDL_STUB_MESSAGE  pStubMsg,\n    PMIDL_STUB_DESC     pStubDescriptor,\n    unsigned int        ProcNum );\n\nRPCRTAPI\nvoid\nRPC_ENTRY\nNdrProxyGetBuffer(\n    void *              This,\n    PMIDL_STUB_MESSAGE pStubMsg);\n\nRPCRTAPI\nvoid\nRPC_ENTRY\nNdrProxySendReceive(\n    void                *This,\n    MIDL_STUB_MESSAGE   *pStubMsg);\n\nRPCRTAPI\nvoid\nRPC_ENTRY\nNdrProxyFreeBuffer(\n    void                *This,\n    MIDL_STUB_MESSAGE   *pStubMsg);\n\n\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */\n#pragma endregion\n\n#pragma region Application or OneCore or Games Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n\nRPCRTAPI\nHRESULT\nRPC_ENTRY\nNdrProxyErrorHandler(\n    DWORD dwExceptionCode);\n    \n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */\n#pragma endregion\n\n#pragma region Desktop or OneCore Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n\nRPCRTAPI\nvoid\nRPC_ENTRY\nNdrStubInitialize(\n    PRPC_MESSAGE        pRpcMsg,\n    PMIDL_STUB_MESSAGE  pStubMsg,\n    PMIDL_STUB_DESC     pStubDescriptor,\n    IRpcChannelBuffer * pRpcChannelBuffer);\n    \n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */\n#pragma endregion\n\n#pragma region Application or OneCore or Games Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n\nRPCRTAPI\nvoid\nRPC_ENTRY\nNdrStubInitializePartial(\n    PRPC_MESSAGE        pRpcMsg,\n    PMIDL_STUB_MESSAGE  pStubMsg,\n    PMIDL_STUB_DESC     pStubDescriptor,\n    IRpcChannelBuffer * pRpcChannelBuffer,\n    ULONG       RequestedBufferSize);\n\nvoid __RPC_STUB NdrStubForwardingFunction(\n    IN  IRpcStubBuffer *    This,\n    IN  IRpcChannelBuffer * pChannel,\n    IN  PRPC_MESSAGE        pmsg,\n    OUT DWORD             * pdwStubPhase);\n    \n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */\n#pragma endregion\n\n#pragma region Desktop or OneCore Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n\nRPCRTAPI\nvoid\nRPC_ENTRY\nNdrStubGetBuffer(\n    IRpcStubBuffer *    This,\n    IRpcChannelBuffer * pRpcChannelBuffer,\n    PMIDL_STUB_MESSAGE  pStubMsg);\n\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */\n#pragma endregion\n\n#pragma region Application or OneCore or Games Family\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n\nRPCRTAPI\nHRESULT\nRPC_ENTRY\nNdrStubErrorHandler(\n    DWORD               dwExceptionCode);\n\nHRESULT STDMETHODCALLTYPE\nCStdStubBuffer_QueryInterface(\n    IRpcStubBuffer  *   This,\n    REFIID              riid,\n    void            **  ppvObject);\n\nULONG STDMETHODCALLTYPE\nCStdStubBuffer_AddRef(\n    IRpcStubBuffer *    This);\n\nULONG STDMETHODCALLTYPE\nCStdStubBuffer_Release(\n    IRpcStubBuffer *    This);\n\nULONG STDMETHODCALLTYPE\nNdrCStdStubBuffer_Release(\n    IRpcStubBuffer *    This,\n    IPSFactoryBuffer *  pPSF);\n\nHRESULT STDMETHODCALLTYPE\nCStdStubBuffer_Connect(\n    IRpcStubBuffer *    This,\n    IUnknown *          pUnkServer);\n\nvoid STDMETHODCALLTYPE\nCStdStubBuffer_Disconnect(\n    IRpcStubBuffer *    This);\n\nHRESULT STDMETHODCALLTYPE\nCStdStubBuffer_Invoke(\n    IRpcStubBuffer  *   This,\n    RPCOLEMESSAGE   *   pRpcMsg,\n    IRpcChannelBuffer * pRpcChannelBuffer);\n\nIRpcStubBuffer * STDMETHODCALLTYPE\nCStdStubBuffer_IsIIDSupported(\n    IRpcStubBuffer  *   This,\n    REFIID riid);\n\nULONG STDMETHODCALLTYPE\nCStdStubBuffer_CountRefs(\n    IRpcStubBuffer  *   This);\n\nHRESULT STDMETHODCALLTYPE\nCStdStubBuffer_DebugServerQueryInterface(\n    IRpcStubBuffer  *   This,\n    void **ppv);\n\nvoid STDMETHODCALLTYPE\nCStdStubBuffer_DebugServerRelease(\n    IRpcStubBuffer  *   This,\n    void *pv);\n\nHRESULT STDMETHODCALLTYPE\nCStdStubBuffer2_QueryInterface(\n    IRpcStubBuffer  *   This,\n    REFIID              riid,\n    void            **  ppvObject);\n\nULONG STDMETHODCALLTYPE\nCStdStubBuffer2_Release(\n    IRpcStubBuffer *This);\n\nHRESULT STDMETHODCALLTYPE\nCStdStubBuffer2_Connect(\n    IRpcStubBuffer *pthis,\n    IUnknown *pUnkServer);\n\nvoid STDMETHODCALLTYPE\nCStdStubBuffer2_Disconnect(\n    IRpcStubBuffer *pthis);\n\nULONG STDMETHODCALLTYPE\nCStdStubBuffer2_CountRefs(\n    IRpcStubBuffer *pthis);\n\nULONG STDMETHODCALLTYPE\nNdrCStdStubBuffer2_Release(\n    IRpcStubBuffer *This,\n    IPSFactoryBuffer * pPSF);\n\nHRESULT STDMETHODCALLTYPE\nCStdAsyncStubBuffer_QueryInterface(\n    IRpcStubBuffer *pthis,\n    REFIID riid,\n    void **ppvObject);\n\nULONG STDMETHODCALLTYPE\nCStdAsyncStubBuffer_AddRef(\n    IRpcStubBuffer *pthis);\n\nULONG STDMETHODCALLTYPE\nCStdAsyncStubBuffer_Release(\n    IRpcStubBuffer *pthis);\n\nHRESULT STDMETHODCALLTYPE\nCStdAsyncStubBuffer_Connect(\n    IRpcStubBuffer *pthis,\n    IUnknown *pUnkServer);\n\nvoid STDMETHODCALLTYPE\nCStdAsyncStubBuffer_Disconnect(\n    IRpcStubBuffer *pthis);\n\nHRESULT STDMETHODCALLTYPE\nCStdAsyncStubBuffer_Invoke(\n    IRpcStubBuffer *pthis,\n    RPCOLEMESSAGE *_prpcmsg,\n    IRpcChannelBuffer *_pRpcChannelBuffer);\n\nULONG STDMETHODCALLTYPE\nCStdAsyncStubBuffer2_Release(\n    IRpcStubBuffer *pthis);\n\nHRESULT STDMETHODCALLTYPE\nCStdAsyncStubBuffer2_Connect(\n    IRpcStubBuffer *pthis,\n    IUnknown *pUnkServer);\n\nvoid STDMETHODCALLTYPE\nCStdAsyncStubBuffer2_Disconnect(\n    IRpcStubBuffer *pthis);\n\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient3(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient4(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient5(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient6(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient7(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient8(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient9(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient10(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient11(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient12(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient13(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient14(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient15(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient16(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient17(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient18(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient19(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient20(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient21(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient22(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient23(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient24(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient25(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient26(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient27(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient28(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient29(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient30(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient31(void);\nDECLSPEC_CHPE_GUEST void STDMETHODCALLTYPE ObjectStublessClient32(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction3(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction4(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction5(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction6(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction7(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction8(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction9(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction10(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction11(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction12(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction13(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction14(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction15(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction16(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction17(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction18(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction19(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction20(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction21(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction22(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction23(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction24(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction25(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction26(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction27(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction28(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction29(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction30(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction31(void);\n\nDECLSPEC_CHPE_GUEST\nvoid STDMETHODCALLTYPE\nNdrProxyForwardingFunction32(void);\n\n#define CStdStubBuffer_METHODS \\\n    CStdStubBuffer_QueryInterface, \\\n    CStdStubBuffer_AddRef, \\\n    CStdStubBuffer_Release, \\\n    CStdStubBuffer_Connect, \\\n    CStdStubBuffer_Disconnect, \\\n    CStdStubBuffer_Invoke, \\\n    CStdStubBuffer_IsIIDSupported, \\\n    CStdStubBuffer_CountRefs, \\\n    CStdStubBuffer_DebugServerQueryInterface, \\\n    CStdStubBuffer_DebugServerRelease\n\n#define CStdStubBuffer_DELEGATING_METHODS 0,0,CStdStubBuffer2_Release,0,0,0,0,0,0,0\n#define CStdAsyncStubBuffer_METHODS 0,0,0,0,0,0,0,0,0,0\n#define CStdAsyncStubBuffer_DELEGATING_METHODS 0,0,0,0,0,0,0,0,0,0\n\n#define CStdStubBuffer_METHODS_OPT              \\\n    CStdStubBuffer_QueryInterface,              \\\n    CStdStubBuffer_AddRef,                      \\\n    CStdStubBuffer_Release,                     \\\n    CStdStubBuffer_Connect,                     \\\n    CStdStubBuffer_Disconnect,                  \\\n    CStdStubBuffer_Invoke,                      \\\n    CStdStubBuffer_IsIIDSupported,              \\\n    CStdStubBuffer_CountRefs,                   \\\n    CStdStubBuffer_DebugServerQueryInterface,   \\\n    CStdStubBuffer_DebugServerRelease\n\n#define CStdStubBuffer_DELEGATING_METHODS_OPT   \\\n    CStdStubBuffer2_QueryInterface,             \\\n    CStdStubBuffer_AddRef,                      \\\n    CStdStubBuffer2_Release,                    \\\n    CStdStubBuffer2_Connect,                    \\\n    CStdStubBuffer2_Disconnect,                 \\\n    CStdStubBuffer_Invoke,                      \\\n    CStdStubBuffer_IsIIDSupported,              \\\n    CStdStubBuffer2_CountRefs,                  \\\n    CStdStubBuffer_DebugServerQueryInterface,   \\\n    CStdStubBuffer_DebugServerRelease\n\n#define CStdAsyncStubBuffer_METHODS_OPT             \\\n    CStdAsyncStubBuffer_QueryInterface,             \\\n    CStdAsyncStubBuffer_AddRef,                     \\\n    CStdAsyncStubBuffer_Release,                    \\\n    CStdAsyncStubBuffer_Connect,                    \\\n    CStdAsyncStubBuffer_Disconnect,                 \\\n    CStdAsyncStubBuffer_Invoke,                     \\\n    CStdStubBuffer_IsIIDSupported,                  \\\n    CStdStubBuffer_CountRefs,                       \\\n    CStdStubBuffer_DebugServerQueryInterface,       \\\n    CStdStubBuffer_DebugServerRelease\n\n#define CStdAsyncStubBuffer_DELEGATING_METHODS_OPT  \\\n    CStdAsyncStubBuffer_QueryInterface,             \\\n    CStdAsyncStubBuffer_AddRef,                     \\\n    CStdAsyncStubBuffer2_Release,                   \\\n    CStdAsyncStubBuffer2_Connect,                   \\\n    CStdAsyncStubBuffer2_Disconnect,                \\\n    CStdAsyncStubBuffer_Invoke,                     \\\n    CStdStubBuffer_IsIIDSupported,                  \\\n    CStdStubBuffer2_CountRefs,                      \\\n    CStdStubBuffer_DebugServerQueryInterface,       \\\n    CStdStubBuffer_DebugServerRelease\n\n#define CStdStubBuffer_METHODS_TAG ((void *)-1)\n#define CStdStubBuffer_DELEGATING_METHODS_TAG ((void *)-2)\n#define CStdAsyncStubBuffer_METHODS_TAG ((void *)-3)\n#define CStdAsyncStubBuffer_DELEGATING_METHODS_TAG ((void *)-4)\n\n//+-------------------------------------------------------------------------\n//\n//  Macro definitions for the proxy file\n//\n//--------------------------------------------------------------------------\n\n#define IID_GENERIC_CHECK_IID(name,pIID,index) memcmp( pIID, name##_ProxyVtblList[ index ]->header.piid, 16 )\n\n#define IID_BS_LOOKUP_SETUP     int result, low=-1;\n\n#define IID_BS_LOOKUP_INITIAL_TEST(name, sz, split)   \\\n    result = name##_CHECK_IID( split );               \\\n    if ( result > 0 )                                 \\\n        { low = sz - split; }                         \\\n    else if ( !result )                               \\\n        { low = split; goto found_label; }\n\n#define IID_BS_LOOKUP_NEXT_TEST(name, split )      \\\n        result = name##_CHECK_IID( low + split );  \\\n        if ( result >= 0 )                         \\\n        { low = low + split; if ( !result ) goto found_label; }\n\n#define IID_BS_LOOKUP_RETURN_RESULT(name, sz, index )  \\\n    low = low + 1;                                     \\\n    if (low >= sz)                                     \\\n        goto not_found_label;                          \\\n    result = name##_CHECK_IID( low );                  \\\n    if (result)                                        \\\n        goto not_found_label;                          \\\n    found_label: (index) = low; return 1;              \\\n    not_found_label: return 0;\n\n//+-------------------------------------------------------------------------\n//\n//  Macro and routine definitions for the dlldata file\n//\n//--------------------------------------------------------------------------\n\n/****************************************************************************\n * Proxy Dll APIs\n ****************************************************************************/\n\nRPCRTAPI\nHRESULT\nRPC_ENTRY\nNdrDllGetClassObject (\n    IN  REFCLSID                rclsid,\n    IN  REFIID                  riid,\n    OUT void **                 ppv,\n    IN const ProxyFileInfo **   pProxyFileList,\n    IN const CLSID *            pclsid,\n    IN CStdPSFactoryBuffer *    pPSFactoryBuffer);\n\nRPCRTAPI\nHRESULT\nRPC_ENTRY\nNdrDllCanUnloadNow(\n    IN CStdPSFactoryBuffer *    pPSFactoryBuffer);\n\n// if the user specified a routine prefix, pick it up...\n//     if not, add nothing\n\n#ifndef ENTRY_PREFIX\n\n#ifndef DllMain\n#define DISABLE_THREAD_LIBRARY_CALLS(x) DisableThreadLibraryCalls(x)\n#endif\n\n#define ENTRY_PREFIX\n#define DLLREGISTERSERVER_ENTRY DllRegisterServer\n#define DLLUNREGISTERSERVER_ENTRY DllUnregisterServer\n#define DLLMAIN_ENTRY DllMain\n\n#define DLLGETCLASSOBJECT_ENTRY DllGetClassObject\n#define DLLCANUNLOADNOW_ENTRY DllCanUnloadNow\n#define DLLRPCDUMMYCALL_ENTRY DllRpcDummyCall\n\n#else   // ENTRY_PREFIX\n\n#define __rpc_macro_expand2(a, b) a##b\n#define __rpc_macro_expand(a, b) __rpc_macro_expand2(a,b)\n#define DLLREGISTERSERVER_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllRegisterServer)\n#define DLLUNREGISTERSERVER_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllUnregisterServer)\n#define DLLMAIN_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllMain)\n\n#define DLLGETCLASSOBJECT_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllGetClassObject)\n#define DLLCANUNLOADNOW_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllCanUnloadNow)\n#define DLLRPCDUMMYCALL_ENTRY __rpc_macro_expand(ENTRY_PREFIX, DllRpcDummyCall)\n\n#endif  // ENTRY_PREFIX\n\n#ifndef DISABLE_THREAD_LIBRARY_CALLS\n#define DISABLE_THREAD_LIBRARY_CALLS(x)\n#endif\n\n/*************************************************************************\nThe following new functions were added after the Windows NT 3.5 release.\n*************************************************************************/\n\nRPCRTAPI\nHRESULT\nRPC_ENTRY\nNdrDllRegisterProxy(\n    IN HMODULE                  hDll,\n    IN const ProxyFileInfo **   pProxyFileList,\n    IN const CLSID *            pclsid);\n\nRPCRTAPI\nHRESULT\nRPC_ENTRY\nNdrDllUnregisterProxy(\n    IN HMODULE                  hDll,\n    IN const ProxyFileInfo **   pProxyFileList,\n    IN const CLSID *            pclsid);\n\n#define REGISTER_PROXY_DLL_ROUTINES(pProxyFileList, pClsID) \\\n    \\\n    HINSTANCE hProxyDll = 0; \\\n    \\\n    /*DllMain saves the DLL module handle for later use by DllRegisterServer */ \\\n    BOOL WINAPI DLLMAIN_ENTRY( \\\n        HINSTANCE  hinstDLL, \\\n        DWORD  fdwReason, \\\n        LPVOID  lpvReserved) \\\n    { \\\n        UNREFERENCED_PARAMETER(lpvReserved); \\\n        if(fdwReason == DLL_PROCESS_ATTACH) \\\n            { \\\n            hProxyDll = hinstDLL; \\\n            DISABLE_THREAD_LIBRARY_CALLS(hinstDLL); \\\n            } \\\n        return TRUE; \\\n    } \\\n    \\\n    /* DllRegisterServer registers the interfaces contained in the proxy DLL. */ \\\n    HRESULT STDAPICALLTYPE DLLREGISTERSERVER_ENTRY() \\\n    { \\\n        return NdrDllRegisterProxy(hProxyDll, (const ProxyFileInfo **)pProxyFileList, pClsID); \\\n    }  \\\n    \\\n    /* DllUnregisterServer unregisters the interfaces contained in the proxy DLL. */ \\\n    HRESULT STDAPICALLTYPE DLLUNREGISTERSERVER_ENTRY() \\\n    { \\\n        return NdrDllUnregisterProxy(hProxyDll, (const ProxyFileInfo **)pProxyFileList, pClsID); \\\n    }\n\n//Delegation support.\n#define STUB_FORWARDING_FUNCTION        NdrStubForwardingFunction\n\n/*************************************************************************\nEnd of new functions.\n*************************************************************************/\n\n// PROXY_CLSID has precedence over PROXY_CLSID_IS\n\n#ifdef PROXY_CLSID\n\n#define CLSID_PSFACTORYBUFFER extern CLSID PROXY_CLSID;\n\n#else // PROXY_CLSID\n\n#ifdef PROXY_CLSID_IS\n#define CLSID_PSFACTORYBUFFER const CLSID CLSID_PSFactoryBuffer = PROXY_CLSID_IS;\n#define PROXY_CLSID     CLSID_PSFactoryBuffer\n#else // PROXY_CLSID_IS\n#define CLSID_PSFACTORYBUFFER\n#endif //PROXY_CLSID_IS\n\n#endif //PROXY_CLSID\n\n// if the user specified an override for the class id, it is\n// PROXY_CLSID at this point\n\n#ifndef PROXY_CLSID\n#define GET_DLL_CLSID   \\\n    ( aProxyFileList[0]->pStubVtblList[0] != 0 ? \\\n    aProxyFileList[0]->pStubVtblList[0]->header.piid : 0)\n#else  //PROXY_CLSID\n#define GET_DLL_CLSID   &PROXY_CLSID\n#endif //PROXY_CLSID\n\n\n\n#define EXTERN_PROXY_FILE(name) \\\n    EXTERN_C const ProxyFileInfo name##_ProxyFileInfo;\n\n#define PROXYFILE_LIST_START    \\\n    extern const ProxyFileInfo* const aProxyFileList[]    = {\n\n#define REFERENCE_PROXY_FILE(name)  \\\n    & name##_ProxyFileInfo\n\n#define PROXYFILE_LIST_END      \\\n    0 };\n\n// return pointers to the class information\n\n#define DLLDATA_GETPROXYDLLINFO(pPFList,pClsid) \\\n    void RPC_ENTRY GetProxyDllInfo( const ProxyFileInfo*** pInfo, const CLSID ** pId )  \\\n        {   \\\n        *pInfo  = (const ProxyFileInfo**)pPFList;  \\\n        *pId    = pClsid;   \\\n        };\n\n// ole entry points:\n#define DLLGETCLASSOBJECTROUTINE(pPFlist, pClsid,pFactory)    \\\n_Check_return_ HRESULT STDAPICALLTYPE DLLGETCLASSOBJECT_ENTRY ( \\\n     _In_ REFCLSID rclsid, \\\n     _In_ REFIID riid, \\\n     _Outptr_ void ** ppv ) \\\n        { \\\n        return  \\\n            NdrDllGetClassObject(rclsid,riid,ppv,(const ProxyFileInfo**)pPFlist,pClsid,pFactory ); \\\n        }\n\n#define DLLCANUNLOADNOW(pFactory)   \\\n HRESULT STDAPICALLTYPE DLLCANUNLOADNOW_ENTRY()    \\\n    {   \\\n    return NdrDllCanUnloadNow( pFactory );    \\\n    }\n\n\n#define DLLRPCDUMMYCALL    \\\n    void __cdecl DLLRPCDUMMYCALL_ENTRY(void)    \\\n        {   \\\n        /* Don't define __purecall method anymore */ \\\n        }\n\n#define CSTDSTUBBUFFERRELEASE(pFactory)   \\\nDECLSPEC_XFGVIRT(IUnknown, Release) \\\nULONG STDMETHODCALLTYPE CStdStubBuffer_Release(IRpcStubBuffer *This) \\\n    {   \\\n    return NdrCStdStubBuffer_Release(This,(IPSFactoryBuffer *)pFactory);   \\\n    }   \\\n\n#ifdef PROXY_DELEGATION\n#define CSTDSTUBBUFFER2RELEASE(pFactory)   \\\nDECLSPEC_XFGVIRT(IUnknown, Release) \\\nULONG STDMETHODCALLTYPE CStdStubBuffer2_Release(IRpcStubBuffer *This) \\\n    {   \\\n    return NdrCStdStubBuffer2_Release(This,(IPSFactoryBuffer *)pFactory);   \\\n    }\n#else\n#define CSTDSTUBBUFFER2RELEASE(pFactory)\n#endif //PROXY_DELEGATION\n\n\n#ifdef REGISTER_PROXY_DLL\n#define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID ) REGISTER_PROXY_DLL_ROUTINES(pProxyFileList,pClsID )\n#else\n#define DLLREGISTRY_ROUTINES(pProxyFileList,pClsID )\n#endif //REGISTER_PROXY_DLL\n\n\n// the dll entry points that must be defined\n#define DLLDATA_ROUTINES(pProxyFileList,pClsID )    \\\n    \\\n    CLSID_PSFACTORYBUFFER \\\n    \\\n    CStdPSFactoryBuffer       gPFactory = {0,0,0,0};  \\\n    \\\n    DLLDATA_GETPROXYDLLINFO(pProxyFileList,pClsID) \\\n    \\\n    DLLGETCLASSOBJECTROUTINE(pProxyFileList,pClsID,&gPFactory)    \\\n    \\\n    DLLCANUNLOADNOW(&gPFactory)   \\\n    \\\n    CSTDSTUBBUFFERRELEASE(&gPFactory)   \\\n    \\\n    CSTDSTUBBUFFER2RELEASE(&gPFactory) \\\n    \\\n    DLLRPCDUMMYCALL    \\\n    \\\n    DLLREGISTRY_ROUTINES(pProxyFileList, pClsID) \\\n    \\\n\n    // more code goes here...\n\n\n#define DLLDATA_STANDARD_ROUTINES   \\\n    DLLDATA_ROUTINES( (const ProxyFileInfo**) pProxyFileList, &CLSID_PSFactoryBuffer )  \\\n\n#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */\n#pragma endregion\n\n#if defined(__cplusplus)\n} // extern \"C\"\n#endif\n\n#endif // WIN32 or _WIN64_\n\n#if defined(_M_IA64) || defined(_M_AMD64)\n#include <poppack.h>\n#endif\n\n#endif // __RPCPROXY_H__\n\n#endif // _KRPCENV_\n"
  },
  {
    "path": "RainbowTaskbarDLL/ErrorDebug.h",
    "content": "﻿#pragma once\n\nstruct TaskbarInfo {\n    HWND taskbar;\n    int YPosition;\n    char _reserved[16];\n};\nstruct TaskbarInfo2 {\n    HWND taskbar;\n    void* UIData;\n    int UIDataSize;\n};\n\nstruct RainbowTaskbarData {\n    struct TaskbarInfo lTaskbarInfo[8];\n    struct TaskbarInfo2 lTaskbarInfo2[8];\n};\n\nstruct IErrorDebug\n{\nprivate:\n    size_t line;\n    char* file;\n};\n\n\n#define _E this->line = __LINE__;\n#define _F this->file = (char*)__FILE__;\n\n#define __EFMT(buf,X) swprintf_s(buf, L\"Exception on line %zd, in file %hs: %ls\", this->line, this->file, X); MessageBoxW(0, buf, L\"RainbowTaskbarDLL Error\", 0);\n#define _EFMT(buf,x) __EFMT(buf,x)"
  },
  {
    "path": "RainbowTaskbarDLL/Factory.h",
    "content": "﻿#pragma once\n#include <Unknwn.h>\n#include \"winrt.h\"\n\ntemplate<class T>\nstruct Factory : winrt::implements<Factory<T>, IClassFactory>\n{\n    HRESULT STDMETHODCALLTYPE CreateInstance(IUnknown* pUnkOuter, REFIID riid, void** ppvObject) override try\n    {\n        *ppvObject = nullptr;\n        return winrt::make<T>().as(riid, ppvObject);\n    }\n    catch (...)\n    {\n        return winrt::to_hresult();\n    }\n\n    HRESULT STDMETHODCALLTYPE LockServer(BOOL fLock) noexcept override\n    {\n        if (fLock)\n        {\n            ++winrt::get_module_lock();\n        }\n        else\n        {\n            --winrt::get_module_lock();\n        }\n\n        return S_OK;\n    }\n};"
  },
  {
    "path": "RainbowTaskbarDLL/IUnused.h",
    "content": "﻿#pragma once\n"
  },
  {
    "path": "RainbowTaskbarDLL/IUnused.idl",
    "content": "﻿import \"oaidl.idl\";\nimport \"ocidl.idl\";\n\n[\nobject,\nuuid(3e987340-78d8-48ce-aa6b-46ec8ba343c7)\n]\ninterface IUnused : IUnknown {\n\n}"
  },
  {
    "path": "RainbowTaskbarDLL/RainbowTaskbarDLL.def",
    "content": "﻿EXPORTS\nDllGetClassObject PRIVATE\nDllCanUnloadNow PRIVATE\nSetAppearanceTypeDLL\nCloseDLL\nVersionDLL\nGetDataPtrDLL\nDebugGetUITreeDLL\nSetTaskbarElementsOpacityDLL"
  },
  {
    "path": "RainbowTaskbarDLL/RainbowTaskbarDLL.idl",
    "content": "﻿import \"unknwn.idl\";\nimport \"ocidl.idl\";\n\n[uuid(b9684566-2c89-11ee-be56-0242ac120002)]\nlibrary RainbowTaskbarDLL {\n    [uuid(c9d60190-2c89-11ee-be56-0242ac120002)]\n    coclass TAPSite \n    {\n        interface IObjectWithSite;\n    }\n\n    [uuid(5a71c99f-5386-48a9-9165-de45a6a305ff)]\n    coclass AppearanceServiceAPI \n    {\n        interface IDispatch;\n    }\n\n\n}"
  },
  {
    "path": "RainbowTaskbarDLL/RainbowTaskbarDLL.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"..\\packages\\Microsoft.Windows.CppWinRT.2.0.250303.1\\build\\native\\Microsoft.Windows.CppWinRT.props\" Condition=\"Exists('..\\packages\\Microsoft.Windows.CppWinRT.2.0.250303.1\\build\\native\\Microsoft.Windows.CppWinRT.props')\" />\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|ARM64\">\n      <Configuration>Debug</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release (MSIX)|ARM64\">\n      <Configuration>Release (MSIX)</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release (MSIX)|Win32\">\n      <Configuration>Release (MSIX)</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release (MSIX)|x64\">\n      <Configuration>Release (MSIX)</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|ARM64\">\n      <Configuration>Release</Configuration>\n      <Platform>ARM64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <Keyword>Win32Proj</Keyword>\n    <ProjectGuid>{3ff5d07d-44d1-4b85-9465-4793b3a9ee8a}</ProjectGuid>\n    <RootNamespace>RainbowTaskbarDLL</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n    <CppWinRTModernIDL>false</CppWinRTModernIDL>\n    <CppWinRTLibs>false</CppWinRTLibs>\n    <CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <CppWinRTModernIDL>false</CppWinRTModernIDL>\n    <CppWinRTLibs>false</CppWinRTLibs>\n    <CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <CppWinRTModernIDL>false</CppWinRTModernIDL>\n    <CppWinRTLibs>false</CppWinRTLibs>\n    <CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n    <CppWinRTModernIDL>false</CppWinRTModernIDL>\n    <CppWinRTLibs>false</CppWinRTLibs>\n    <CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n    <CppWinRTModernIDL>false</CppWinRTModernIDL>\n    <CppWinRTLibs>false</CppWinRTLibs>\n    <CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <CppWinRTModernIDL>false</CppWinRTModernIDL>\n    <CppWinRTLibs>false</CppWinRTLibs>\n    <CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <CppWinRTModernIDL>false</CppWinRTModernIDL>\n    <CppWinRTLibs>false</CppWinRTLibs>\n    <CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <CppWinRTModernIDL>false</CppWinRTModernIDL>\n    <CppWinRTLibs>false</CppWinRTLibs>\n    <CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|ARM64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <CppWinRTModernIDL>false</CppWinRTModernIDL>\n    <CppWinRTLibs>false</CppWinRTLibs>\n    <CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|ARM64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <TargetName>$(ProjectName)_$(PlatformName)</TargetName>\n    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>\n    <CustomBuildAfterTargets>Build</CustomBuildAfterTargets>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <TargetName>$(ProjectName)_$(PlatformName)</TargetName>\n    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>\n    <CustomBuildAfterTargets>Build</CustomBuildAfterTargets>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|Win32'\">\n    <TargetName>$(ProjectName)_$(PlatformName)</TargetName>\n    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>\n    <CustomBuildAfterTargets>Build</CustomBuildAfterTargets>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <TargetName>$(ProjectName)_$(PlatformName)</TargetName>\n    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>\n    <CustomBuildAfterTargets>Build</CustomBuildAfterTargets>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n    <TargetName>$(ProjectName)_$(PlatformName)</TargetName>\n    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>\n    <CustomBuildAfterTargets>Build</CustomBuildAfterTargets>\n    <IncludePath>ArmFix;$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <TargetName>$(ProjectName)_$(PlatformName)</TargetName>\n    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>\n    <CustomBuildAfterTargets>Build</CustomBuildAfterTargets>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">\n    <TargetName>$(ProjectName)_$(PlatformName)</TargetName>\n    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>\n    <CustomBuildAfterTargets>Build</CustomBuildAfterTargets>\n    <IncludePath>ArmFix;$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|x64'\">\n    <TargetName>$(ProjectName)_$(PlatformName)</TargetName>\n    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>\n    <CustomBuildAfterTargets>Build</CustomBuildAfterTargets>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|ARM64'\">\n    <TargetName>$(ProjectName)_$(PlatformName)</TargetName>\n    <CustomBuildBeforeTargets>Build</CustomBuildBeforeTargets>\n    <CustomBuildAfterTargets>Build</CustomBuildAfterTargets>\n    <IncludePath>ArmFix;$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;_DEBUG;RAINBOWTASKBARDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);_CRT_NO_SECURE_WARNINGS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <LanguageStandard_C>stdc17</LanguageStandard_C>\n      <AdditionalIncludeDirectories>\n      </AdditionalIncludeDirectories>\n      <AdditionalOptions>/DENTRY_PREFIX=Old /DPROXY_CLSID_IS=\"{ 0x5a71c99f, 0x5386, 0x48a9, 0x9165, 0xde, 0x45, 0xa6, 0xa3, 0x05, 0xff }\" %(AdditionalOptions)</AdditionalOptions>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);Ole32.lib;OleAut32.lib;rpcrt4.lib;user32.lib;WindowsApp.lib;</AdditionalDependencies>\n      <ModuleDefinitionFile>RainbowTaskbarDLL.def</ModuleDefinitionFile>\n    </Link>\n    <Manifest>\n      <TypeLibraryFile>\n      </TypeLibraryFile>\n    </Manifest>\n    <Midl>\n      <ProxyFileName>\n      </ProxyFileName>\n    </Midl>\n    <CustomBuildStep>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n      <Message>Cleaning proxy files</Message>\n    </CustomBuildStep>\n    <PreBuildEvent>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n    </PreBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;NDEBUG;RAINBOWTASKBARDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);_CRT_NO_SECURE_WARNINGS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <LanguageStandard_C>stdc17</LanguageStandard_C>\n      <AdditionalIncludeDirectories>\n      </AdditionalIncludeDirectories>\n      <AdditionalOptions>/DENTRY_PREFIX=Old /DPROXY_CLSID_IS=\"{ 0x5a71c99f, 0x5386, 0x48a9, 0x9165, 0xde, 0x45, 0xa6, 0xa3, 0x05, 0xff }\" %(AdditionalOptions)</AdditionalOptions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);Ole32.lib;OleAut32.lib;rpcrt4.lib;user32.lib;WindowsApp.lib;</AdditionalDependencies>\n      <ModuleDefinitionFile>RainbowTaskbarDLL.def</ModuleDefinitionFile>\n    </Link>\n    <Manifest>\n      <TypeLibraryFile>\n      </TypeLibraryFile>\n    </Manifest>\n    <Midl>\n      <ProxyFileName>\n      </ProxyFileName>\n    </Midl>\n    <CustomBuildStep>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n      <Message>Cleaning proxy files</Message>\n    </CustomBuildStep>\n    <PreBuildEvent>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n    </PreBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;NDEBUG;RAINBOWTASKBARDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);_CRT_NO_SECURE_WARNINGS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <LanguageStandard_C>stdc17</LanguageStandard_C>\n      <AdditionalIncludeDirectories>\n      </AdditionalIncludeDirectories>\n      <AdditionalOptions>/DENTRY_PREFIX=Old /DPROXY_CLSID_IS=\"{ 0x5a71c99f, 0x5386, 0x48a9, 0x9165, 0xde, 0x45, 0xa6, 0xa3, 0x05, 0xff }\" %(AdditionalOptions)</AdditionalOptions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);Ole32.lib;OleAut32.lib;rpcrt4.lib;user32.lib;WindowsApp.lib;</AdditionalDependencies>\n      <ModuleDefinitionFile>RainbowTaskbarDLL.def</ModuleDefinitionFile>\n    </Link>\n    <Manifest>\n      <TypeLibraryFile>\n      </TypeLibraryFile>\n    </Manifest>\n    <Midl>\n      <ProxyFileName>\n      </ProxyFileName>\n    </Midl>\n    <CustomBuildStep>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n      <Message>Cleaning proxy files</Message>\n    </CustomBuildStep>\n    <PreBuildEvent>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n    </PreBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_DEBUG;RAINBOWTASKBARDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);_CRT_NO_SECURE_WARNINGS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <LanguageStandard_C>stdc17</LanguageStandard_C>\n      <AdditionalIncludeDirectories>\n      </AdditionalIncludeDirectories>\n      <AdditionalOptions>/DENTRY_PREFIX=Old /DPROXY_CLSID_IS=\"{ 0x5a71c99f, 0x5386, 0x48a9, 0x9165, 0xde, 0x45, 0xa6, 0xa3, 0x05, 0xff }\" %(AdditionalOptions)</AdditionalOptions>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);Ole32.lib;OleAut32.lib;rpcrt4.lib;user32.lib;WindowsApp.lib;</AdditionalDependencies>\n      <ModuleDefinitionFile>RainbowTaskbarDLL.def</ModuleDefinitionFile>\n    </Link>\n    <Manifest>\n      <TypeLibraryFile>\n      </TypeLibraryFile>\n    </Manifest>\n    <Midl>\n      <ProxyFileName>\n      </ProxyFileName>\n    </Midl>\n    <CustomBuildStep>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n      <Message>Cleaning proxy files</Message>\n    </CustomBuildStep>\n    <PreBuildEvent>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n    </PreBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|ARM64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_DEBUG;RAINBOWTASKBARDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);_CRT_NO_SECURE_WARNINGS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <LanguageStandard_C>stdc17</LanguageStandard_C>\n      <AdditionalIncludeDirectories>\n      </AdditionalIncludeDirectories>\n      <AdditionalOptions>/DENTRY_PREFIX=Old /DPROXY_CLSID_IS=\"{ 0x5a71c99f, 0x5386, 0x48a9, 0x9165, 0xde, 0x45, 0xa6, 0xa3, 0x05, 0xff }\" %(AdditionalOptions)</AdditionalOptions>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);Ole32.lib;OleAut32.lib;rpcrt4.lib;user32.lib;WindowsApp.lib;</AdditionalDependencies>\n      <ModuleDefinitionFile>RainbowTaskbarDLL.def</ModuleDefinitionFile>\n    </Link>\n    <Manifest>\n      <TypeLibraryFile>\n      </TypeLibraryFile>\n    </Manifest>\n    <Midl>\n      <ProxyFileName>\n      </ProxyFileName>\n    </Midl>\n    <CustomBuildStep>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n      <Message>Cleaning proxy files</Message>\n    </CustomBuildStep>\n    <PreBuildEvent>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n    </PreBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>NDEBUG;RAINBOWTASKBARDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);_CRT_NO_SECURE_WARNINGS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <LanguageStandard_C>stdc17</LanguageStandard_C>\n      <AdditionalIncludeDirectories>\n      </AdditionalIncludeDirectories>\n      <AdditionalOptions>/DENTRY_PREFIX=Old /DPROXY_CLSID_IS=\"{ 0x5a71c99f, 0x5386, 0x48a9, 0x9165, 0xde, 0x45, 0xa6, 0xa3, 0x05, 0xff }\" %(AdditionalOptions)</AdditionalOptions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);Ole32.lib;OleAut32.lib;rpcrt4.lib;user32.lib;WindowsApp.lib;</AdditionalDependencies>\n      <ModuleDefinitionFile>RainbowTaskbarDLL.def</ModuleDefinitionFile>\n    </Link>\n    <Manifest>\n      <TypeLibraryFile>\n      </TypeLibraryFile>\n    </Manifest>\n    <Midl>\n      <ProxyFileName>\n      </ProxyFileName>\n    </Midl>\n    <CustomBuildStep>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n      <Message>Cleaning proxy files</Message>\n    </CustomBuildStep>\n    <PreBuildEvent>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n    </PreBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|ARM64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>NDEBUG;RAINBOWTASKBARDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);_CRT_NO_SECURE_WARNINGS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <LanguageStandard_C>stdc17</LanguageStandard_C>\n      <AdditionalIncludeDirectories>\n      </AdditionalIncludeDirectories>\n      <AdditionalOptions>/DENTRY_PREFIX=Old /DPROXY_CLSID_IS=\"{ 0x5a71c99f, 0x5386, 0x48a9, 0x9165, 0xde, 0x45, 0xa6, 0xa3, 0x05, 0xff }\" %(AdditionalOptions)</AdditionalOptions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);Ole32.lib;OleAut32.lib;rpcrt4.lib;user32.lib;WindowsApp.lib;</AdditionalDependencies>\n      <ModuleDefinitionFile>RainbowTaskbarDLL.def</ModuleDefinitionFile>\n    </Link>\n    <Manifest>\n      <TypeLibraryFile>\n      </TypeLibraryFile>\n    </Manifest>\n    <Midl>\n      <ProxyFileName>\n      </ProxyFileName>\n    </Midl>\n    <CustomBuildStep>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n      <Message>Cleaning proxy files</Message>\n    </CustomBuildStep>\n    <PreBuildEvent>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n    </PreBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>NDEBUG;RAINBOWTASKBARDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);_CRT_NO_SECURE_WARNINGS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <LanguageStandard_C>stdc17</LanguageStandard_C>\n      <AdditionalIncludeDirectories>\n      </AdditionalIncludeDirectories>\n      <AdditionalOptions>/DENTRY_PREFIX=Old /DPROXY_CLSID_IS=\"{ 0x5a71c99f, 0x5386, 0x48a9, 0x9165, 0xde, 0x45, 0xa6, 0xa3, 0x05, 0xff }\" %(AdditionalOptions)</AdditionalOptions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);Ole32.lib;OleAut32.lib;rpcrt4.lib;user32.lib;WindowsApp.lib;</AdditionalDependencies>\n      <ModuleDefinitionFile>RainbowTaskbarDLL.def</ModuleDefinitionFile>\n    </Link>\n    <Manifest>\n      <TypeLibraryFile>\n      </TypeLibraryFile>\n    </Manifest>\n    <Midl>\n      <ProxyFileName>\n      </ProxyFileName>\n    </Midl>\n    <CustomBuildStep>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n      <Message>Cleaning proxy files</Message>\n    </CustomBuildStep>\n    <PreBuildEvent>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n    </PreBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release (MSIX)|ARM64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>NDEBUG;RAINBOWTASKBARDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions);_CRT_NO_SECURE_WARNINGS;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <LanguageStandard_C>stdc17</LanguageStandard_C>\n      <AdditionalIncludeDirectories>\n      </AdditionalIncludeDirectories>\n      <AdditionalOptions>/DENTRY_PREFIX=Old /DPROXY_CLSID_IS=\"{ 0x5a71c99f, 0x5386, 0x48a9, 0x9165, 0xde, 0x45, 0xa6, 0xa3, 0x05, 0xff }\" %(AdditionalOptions)</AdditionalOptions>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableUAC>false</EnableUAC>\n      <AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);Ole32.lib;OleAut32.lib;rpcrt4.lib;user32.lib;WindowsApp.lib;</AdditionalDependencies>\n      <ModuleDefinitionFile>RainbowTaskbarDLL.def</ModuleDefinitionFile>\n    </Link>\n    <Manifest>\n      <TypeLibraryFile>\n      </TypeLibraryFile>\n    </Manifest>\n    <Midl>\n      <ProxyFileName>\n      </ProxyFileName>\n    </Midl>\n    <CustomBuildStep>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n      <Message>Cleaning proxy files</Message>\n    </CustomBuildStep>\n    <PreBuildEvent>\n      <Command>cd \"%(ProjectDir)\" &amp;&amp; del /q *_p.c</Command>\n    </PreBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"AppearanceServiceAPI.h\" />\n    <ClInclude Include=\"ErrorDebug.h\" />\n    <ClInclude Include=\"Factory.h\" />\n    <ClInclude Include=\"framework.h\" />\n    <ClInclude Include=\"IUnused.h\" />\n    <ClInclude Include=\"RainbowTaskbarDLL_h.h\" />\n    <ClInclude Include=\"TAP.h\" />\n    <ClInclude Include=\"Taskbar.h\" />\n    <ClInclude Include=\"VisualTreeWatch.h\" />\n    <ClInclude Include=\"winrt.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"AppearanceServiceAPI.cpp\" />\n    <ClCompile Include=\"csharpinterop.cpp\" />\n    <ClCompile Include=\"dlldata.c\" />\n    <ClCompile Include=\"dllmain.cpp\" />\n    <ClCompile Include=\"IUnused_i.c\" />\n    <ClCompile Include=\"IUnused_p.c\" />\n    <ClCompile Include=\"RainbowTaskbarDLL_i.c\" />\n    <ClCompile Include=\"TAP.cpp\" />\n    <ClCompile Include=\"VisualTreeWatch.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n    <None Include=\"RainbowTaskbarDLL.def\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Midl Include=\"IUnused.idl\">\n      <DeploymentContent>false</DeploymentContent>\n    </Midl>\n    <Midl Include=\"RainbowTaskbarDLL.idl\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n    <Import Project=\"..\\packages\\Microsoft.Windows.CppWinRT.2.0.250303.1\\build\\native\\Microsoft.Windows.CppWinRT.targets\" Condition=\"Exists('..\\packages\\Microsoft.Windows.CppWinRT.2.0.250303.1\\build\\native\\Microsoft.Windows.CppWinRT.targets')\" />\n  </ImportGroup>\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.Windows.CppWinRT.2.0.250303.1\\build\\native\\Microsoft.Windows.CppWinRT.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Microsoft.Windows.CppWinRT.2.0.250303.1\\build\\native\\Microsoft.Windows.CppWinRT.props'))\" />\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.Windows.CppWinRT.2.0.250303.1\\build\\native\\Microsoft.Windows.CppWinRT.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Microsoft.Windows.CppWinRT.2.0.250303.1\\build\\native\\Microsoft.Windows.CppWinRT.targets'))\" />\n  </Target>\n</Project>"
  },
  {
    "path": "RainbowTaskbarDLL/RainbowTaskbarDLL.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"framework.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"winrt.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"TAP.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"RainbowTaskbarDLL_h.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"VisualTreeWatch.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Factory.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Taskbar.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"AppearanceServiceAPI.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"IUnused.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"ErrorDebug.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"TAP.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"RainbowTaskbarDLL_i.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"VisualTreeWatch.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"AppearanceServiceAPI.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"csharpinterop.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"IUnused_i.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dlldata.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"IUnused_p.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"RainbowTaskbarDLL.def\">\n      <Filter>Source Files</Filter>\n    </None>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Midl Include=\"RainbowTaskbarDLL.idl\">\n      <Filter>Source Files</Filter>\n    </Midl>\n    <Midl Include=\"IUnused.idl\">\n      <Filter>Source Files</Filter>\n    </Midl>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "RainbowTaskbarDLL/TAP.cpp",
    "content": "﻿#include \"TAP.h\"\n#include \"AppearanceServiceAPI.h\"\n#include \"RainbowTaskbarDLL_h.h\"\n\n\n#include <comdef.h>\n#include <tchar.h>\n#include <winrt/Windows.UI.Core.h>\n\n\n\nHRESULT TAP::SetSite(IUnknown* pUnk) try\n{_F\n_E  winrt::com_ptr<IUnknown> cast;\n_E  cast.copy_from(pUnk);\n_E\n_E  visualTreeService = cast.as<IVisualTreeService3>();\n\n_E  visualTreeWatch = winrt::make_self<VisualTreeWatch>();\n_E  visualTreeWatch->xamlDiagnostics = cast.as<IXamlDiagnostics>();\n_E  \n_E  visualTreeService->AdviseVisualTreeChange(visualTreeWatch.get());\n_E  winrt::com_ptr<::IInspectable> _disp;\n_E  visualTreeWatch->xamlDiagnostics->GetDispatcher(_disp.put());\n_E  visualTreeWatch->dispatcher = _disp.as<winrt::Windows::UI::Core::CoreDispatcher>();\n_E  return S_OK;\n\n}\ncatch (...)\n{\n    HRESULT res = winrt::to_hresult();\n    _com_error err(res);\n    WCHAR data[1024];\n    __EFMT(data, err.ErrorMessage());\n    return res;\n}\n\nHRESULT TAP::GetSite(REFIID riid, void** ppvSite) noexcept\n{\n    return visualTreeService.as(riid, ppvSite);\n}"
  },
  {
    "path": "RainbowTaskbarDLL/TAP.h",
    "content": "﻿#pragma once\n#include \"winrt.h\"\n#include \"VisualTreeWatch.h\"\n#include <combaseapi.h>\n#include <ocidl.h>\n#include <xamlOM.h>\n#include \"AppearanceServiceAPI.h\"\n#include \"ErrorDebug.h\"\n\n\n\nclass TAP : public winrt::implements<TAP, IObjectWithSite, IErrorDebug, winrt::non_agile>\n{\nprivate:\n    size_t line = 0;\n    char* file = 0;\npublic:\n    HRESULT STDMETHODCALLTYPE SetSite(IUnknown* pUnkSite) override;\n    HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void** ppvSite) noexcept override;\n\n    winrt::com_ptr<IVisualTreeService3> visualTreeService;\n    winrt::com_ptr<VisualTreeWatch> visualTreeWatch;\n};\n\n"
  },
  {
    "path": "RainbowTaskbarDLL/Taskbar.h",
    "content": "﻿#pragma once\n#include \"winrt.h\"\n\nstruct UITree {\n    winrt::Windows::UI::Xaml::UIElement element{ nullptr };\n    std::vector<UITree> children;\n};\n\nstruct Taskbar {\npublic:\n    winrt::Windows::UI::Xaml::Shapes::Rectangle rectangleBackground = nullptr;\n    winrt::Windows::UI::Xaml::Shapes::Rectangle border = nullptr;\n    winrt::Windows::UI::Xaml::Media::Brush originalBrush = nullptr;\n    winrt::Windows::UI::Core::CoreDispatcher dispatcher = nullptr;\n    winrt::Windows::UI::Xaml::FrameworkElement gripper = nullptr;\n    winrt::Windows::UI::Xaml::FrameworkElement frame = nullptr;\n    winrt::Windows::UI::Xaml::FrameworkElement SystemTrayFrame = nullptr;\n    winrt::Windows::UI::Xaml::FrameworkElement TaskbarFrameRepeater = nullptr;\n    \n    HWND handle = NULL;\n    int tInfoIndex = 0;\n\n    Taskbar() {\n\n    }\n};"
  },
  {
    "path": "RainbowTaskbarDLL/VisualTreeWatch.cpp",
    "content": "﻿\n#include \"VisualTreeWatch.h\"\n#include \"winrt.h\"\n#include \"Taskbar.h\"\n#include <winrt/Windows.UI.Xaml.Hosting.h>\n#include <windows.ui.xaml.hosting.desktopwindowxamlsource.h>\n#include <winrt/Windows.UI.Xaml.h>\n#include <winrt/Windows.UI.Xaml.Shapes.h>\n#include <winrt/Windows.UI.Xaml.Media.h>\n#include <winrt/Windows.UI.Core.h>\n\n#include <comdef.h>\n#include <tchar.h>\n#include <inspectable.h>\n#include <winstring.h>\n#include <fstream>\n#include <winrt/base.h>\n\nwinrt::Windows::UI::Xaml::FrameworkElement FindRootElement(winrt::Windows::UI::Xaml::FrameworkElement child)\n{\n    const auto parent = winrt::Windows::UI::Xaml::Media::VisualTreeHelper::GetParent(child).try_as<winrt::Windows::UI::Xaml::FrameworkElement>();\n    if (parent)\n    {\n        return FindRootElement(parent);\n    }\n    else\n    {\n        return child;\n    }\n    \n}\n\nstd::vector<std::pair<int, winrt::Windows::UI::Xaml::FrameworkElement>> VisualTreeWatch::FindChildrenRecursive(std::optional<std::wstring> name, winrt::Windows::UI::Xaml::UIElement root, int deep = 0)\ntry {\n    auto children = std::vector<std::pair<int, winrt::Windows::UI::Xaml::FrameworkElement>>();\n  \n    auto childrenc = winrt::Windows::UI::Xaml::Media::VisualTreeHelper::GetChildrenCount(root);\n    for (int i = 0; i < childrenc; i++) {\n        auto child_ = winrt::Windows::UI::Xaml::Media::VisualTreeHelper::GetChild(root, i);\n        auto child = child_.try_as< winrt::Windows::UI::Xaml::FrameworkElement>();\n        if (!name.has_value() || (child && child.Name() == name.value())) {\n            children.push_back(std::pair<int, winrt::Windows::UI::Xaml::FrameworkElement>(deep, child));\n        }\n        auto recurse = FindChildrenRecursive(name, child, deep+1);\n        children.insert(children.end(), recurse.begin(), recurse.end());\n        \n  \n    }\n    return children;\n}\ncatch (...) {\n    return std::vector<std::pair<int, winrt::Windows::UI::Xaml::FrameworkElement>>();\n}\n\nwinrt::Windows::UI::Xaml::FrameworkElement VisualTreeWatch::FindChildRecursive(std::wstring name, winrt::Windows::UI::Xaml::UIElement root)\ntry {\n    auto childrenc = winrt::Windows::UI::Xaml::Media::VisualTreeHelper::GetChildrenCount(root);\n    for (int i = 0; i < childrenc; i++) {\n        auto child_ = winrt::Windows::UI::Xaml::Media::VisualTreeHelper::GetChild(root, i);\n        auto child = child_.try_as< winrt::Windows::UI::Xaml::FrameworkElement>();\n        if (child && child.Name() == name) {\n            return child;\n        }\n        auto recurse = FindChildRecursive(name, child);\n        if (recurse) return recurse;\n\n\n    }\n    return nullptr;\n}\ncatch (...) {\n    return nullptr;\n}\n\nwinrt::Windows::Foundation::IAsyncAction VisualTreeWatch::StartYPosTask(Taskbar* taskbar) try { _F\n_E    data->lTaskbarInfo[taskbar->tInfoIndex]._reserved[0] = 1;\n_E    co_await winrt::resume_background();\n_E    co_await winrt::resume_after(std::chrono::seconds(1));\n      while (true) {\n_E        co_await winrt::resume_foreground(dispatcher);\n_E        auto v = taskbar->gripper.TransformToVisual(root).TransformPoint(winrt::Windows::Foundation::Point(0, 0)).Y;\n_E        co_await winrt::resume_background();\n_E        data->lTaskbarInfo[taskbar->tInfoIndex].YPosition = v;\n_E        co_await winrt::resume_after(std::chrono::milliseconds(16));\n      }\n}\ncatch (...) {\n    HRESULT res = winrt::to_hresult();\n    _com_error err(res);\n    WCHAR data[1024];\n    __EFMT(data, err.ErrorMessage());\n}\n#include <cwchar>\nwinrt::Windows::Foundation::IAsyncAction VisualTreeWatch::StartUITask(Taskbar* taskbar) try { _F\n_E    data->lTaskbarInfo2[taskbar->tInfoIndex].UIData = malloc(1024 * sizeof(wchar_t));\n_E    memset(data->lTaskbarInfo2[taskbar->tInfoIndex].UIData, 0, 1024 * sizeof(wchar_t));\n_E\n_E    data->lTaskbarInfo2[taskbar->tInfoIndex].UIDataSize = 1024 * sizeof(wchar_t);\n_E\n_E    co_await winrt::resume_background();\n_E    co_await winrt::resume_after(std::chrono::seconds(1));\n_E    co_await winrt::resume_foreground(dispatcher);\n_E\n_E    auto start = taskbar->frame.Parent().try_as< winrt::Windows::UI::Xaml::FrameworkElement>();\n_E\n_E    auto SystemTrayFrame = FindChildRecursive(L\"SystemTrayFrameGrid\", start);\n_E    auto TaskbarFrameRepeater = FindChildRecursive(L\"TaskbarFrameRepeater\", start);\n_E    taskbar->SystemTrayFrame = SystemTrayFrame;\n_E    taskbar->TaskbarFrameRepeater = TaskbarFrameRepeater;\n_E    auto StartButton = FindChildRecursive(L\"LaunchListButton\", TaskbarFrameRepeater);\n_E\n_E    auto stfPt = winrt::Windows::Foundation::Point(0, 0);\n_E    auto stfSize = winrt::Windows::Foundation::Size(0, 0);\n_E    auto tfrPt = winrt::Windows::Foundation::Point(0, 0);\n_E    auto tfrSize = winrt::Windows::Foundation::Size(0, 0);\n_E\n_E    co_await winrt::resume_background();\n_E    \n      while (true) {\n\n_E        co_await winrt::resume_foreground(dispatcher);\n\n_E        auto n_stfPt = SystemTrayFrame.TransformToVisual(root).TransformPoint(winrt::Windows::Foundation::Point(0, 0));\n_E        auto n_stfSize = SystemTrayFrame.DesiredSize();\n_E        auto n_tfrPt = StartButton.TransformToVisual(root).TransformPoint(winrt::Windows::Foundation::Point(0, 0));\n_E        auto n_tfrSize = TaskbarFrameRepeater.DesiredSize();\n_E\n_E        co_await winrt::resume_background();\n_E\n_E        if (n_stfPt != stfPt || n_stfSize != stfSize || n_tfrPt != tfrPt || n_tfrSize != tfrSize) {\n_E          std::swprintf((wchar_t*)data->lTaskbarInfo2[taskbar->tInfoIndex].UIData, data->lTaskbarInfo2[taskbar->tInfoIndex].UIDataSize - 1,\n                L\"{\\\"stfPt\\\":[%f,%f],\\\"stfSize\\\":[%f,%f],\\\"tfrPt\\\":[%f,%f],\\\"tfrSize\\\":[%f,%f]}\", n_stfPt.X, n_stfPt.Y, n_stfSize.Width, n_stfSize.Height, n_tfrPt.X, n_tfrPt.Y, n_tfrSize.Width, n_tfrSize.Height);\n_E            stfPt = n_stfPt;\n_E            stfSize = n_stfSize;\n_E            tfrPt = n_tfrPt;\n_E            tfrSize = n_tfrSize;\n_E        }\n_E\n_E        co_await winrt::resume_after(std::chrono::milliseconds(16));\n      }\n}\ncatch (...) {\n    HRESULT res = winrt::to_hresult();\n    _com_error err(res);\n    WCHAR data[1024];\n    __EFMT(data, err.ErrorMessage());\n}\n\nHRESULT VisualTreeWatch::OnVisualTreeChange(ParentChildRelation rel, VisualElement element, VisualMutationType mutationType)\n{_F\n    try {\n        // Navigate down the visual tree and find the taskbarframes\n    // * this is required because we cannot get the DesktopWindowXamlSource by navigating up the tree\n\n    // we also cannot get its children so we wait for an element that has it as its parent, \n    // its weird idk\n_E      auto changed = ConvertFromH< winrt::Windows::UI::Xaml::Hosting::IDesktopWindowXamlSource>(rel.Parent);\n_E      if (changed && mutationType == Add) {\n_E          root = ConvertFromH<winrt::Windows::UI::Xaml::FrameworkElement>(element.Handle);\n_E          if (root) {\n_E\n_E              auto frame = FindChildRecursive(L\"TaskbarFrame\", root);\n_E              if(frame){\n                    [&]() -> winrt::Windows::Foundation::IAsyncAction {\n                        if (dispatcher) {\n                            co_await winrt::resume_background();\n                            co_await winrt::resume_after(std::chrono::milliseconds(1000));\n                            co_await winrt::resume_foreground(dispatcher);\n                        }\n_E                      InstanceHandle handle = ConvertToH(frame);\n_E\n_E                      auto rect_ = FindChildRecursive(L\"BackgroundFill\", frame);\n_E                      if(rect_){\n_E                          auto rect = rect_.try_as<winrt::Windows::UI::Xaml::Shapes::Rectangle>();\n_E                          if (rect) {\n_E                              \n_E                              if (taskbarMap.find(handle) == taskbarMap.end()) {\n_E                                  Taskbar t = Taskbar();\n_E                                  t.originalBrush = rect.Fill();\n_E                                  t.rectangleBackground = rect;\n_E                                  t.dispatcher = rect.Dispatcher();\n_E                                  t.frame = frame;\n_E                                  HWND hwnd;\n_E                                  changed.try_as<IDesktopWindowXamlSourceNative>()->get_WindowHandle(&hwnd);\n_E                                  t.handle = GetParent(hwnd);\n_E                                  for (int i = 0; i < 8; i++) {\n_E                                      if (!data->lTaskbarInfo[i].taskbar) {\n_E                                          data->lTaskbarInfo[i].taskbar = t.handle;\n_E                                          data->lTaskbarInfo2[i].taskbar = t.handle;\n_E                                          t.tInfoIndex = i;\n_E                                          break;\n_E                                      }\n_E                                  }\n\n_E                                  \n_E\n_E\n_E                                  taskbarMap.emplace(handle, t);\n_E                              }\n_E                          }\n_E                      }\n_E\n_E                      auto border_ = FindChildRecursive(L\"BackgroundStroke\", frame);\n_E                      if(border_){\n_E                          auto border = border_.try_as<winrt::Windows::UI::Xaml::Shapes::Rectangle>();\n_E                          if (border) {\n_E                              if(taskbarMap.find(handle) != taskbarMap.end()) \n                                    taskbarMap.find(handle)->second.border = border;\n_E                          }\n_E                      }\n                        \n_E\n_E                      auto gripper = FindChildRecursive(L\"GripperControl\", frame);\n_E                      if (gripper) {\n_E                          if(taskbarMap.find(handle) != taskbarMap.end()) {\n_E                              auto& tb = taskbarMap.find(handle)->second;\n_E                              tb.gripper = gripper.try_as< winrt::Windows::UI::Xaml::FrameworkElement>();\n_E                              StartYPosTask(&taskbarMap.find(handle)->second);\n_E                              \n_E                          \n_E                          }\n_E                      }\n                        StartUITask(&taskbarMap.find(handle)->second);\n                    }();\n_E\n_E              }\n_E          }\n_E      }\n        \n\n    }\n    catch (...) {\n        HRESULT res = winrt::to_hresult();\n        _com_error err(res);\n        WCHAR data[1024];\n        __EFMT(data, err.ErrorMessage());\n        return res;\n    }\n    \n    return S_OK;\n}\n\nvoid VisualTreeWatch::Stop() {\n    xamlDiagnostics.as<IVisualTreeService3>()->UnadviseVisualTreeChange(this);\n}\n\n\nHRESULT VisualTreeWatch::OnElementStateChanged(InstanceHandle, VisualElementState, LPCWSTR) noexcept\n{\n    return S_OK;\n}\n\n\nVisualTreeWatch::VisualTreeWatch() {\n    appService = winrt::make_self<AppearanceServiceAPI>(get_strong());\n    \n\n}"
  },
  {
    "path": "RainbowTaskbarDLL/VisualTreeWatch.h",
    "content": "﻿#pragma once\n\n\n#include \"winrt.h\"\n#include <xamlOM.h>\n#include \"Taskbar.h\"\n\n\n\nclass AppearanceServiceAPI;\nclass VisualTreeWatch;\n#include \"AppearanceServiceAPI.h\"\n#include \"ErrorDebug.h\"\n\nclass VisualTreeWatch : public winrt::implements<VisualTreeWatch, IVisualTreeServiceCallback2, IErrorDebug, winrt::non_agile>\n{\n    HRESULT STDMETHODCALLTYPE OnVisualTreeChange(ParentChildRelation relation, VisualElement element, VisualMutationType mutationType) override;\n    HRESULT STDMETHODCALLTYPE OnElementStateChanged(InstanceHandle element, VisualElementState elementState, LPCWSTR context) noexcept override;\n\nprivate:\n    size_t line = 0;\n    char* file = 0;\n    \npublic:\n    winrt::com_ptr<IXamlDiagnostics> xamlDiagnostics;\n    winrt::com_ptr<AppearanceServiceAPI> appService;\n    winrt::Windows::UI::Xaml::FrameworkElement root = nullptr; \n    winrt::Windows::UI::Core::CoreDispatcher dispatcher = nullptr;\n    winrt::Windows::UI::Xaml::Hosting::IDesktopWindowXamlSource dwxsource = nullptr;\n    struct RainbowTaskbarData* data;\n    HANDLE hPipe = 0;\n    int taskbarFrames = 0;\n\n    std::map<InstanceHandle, Taskbar> taskbarMap = std::map<InstanceHandle, Taskbar>();\n    std::map<InstanceHandle, winrt::Windows::UI::Xaml::Hosting::IDesktopWindowXamlSource> dwxsourceMap = std::map<InstanceHandle, winrt::Windows::UI::Xaml::Hosting::IDesktopWindowXamlSource>();\n    \n    VisualTreeWatch();\n    void Stop();\n\n    template<typename T>\n    T ConvertFromH(InstanceHandle handle)\n    {\n        winrt::Windows::Foundation::IInspectable obj;\n\n        xamlDiagnostics->GetIInspectableFromHandle(handle, reinterpret_cast<::IInspectable**>(winrt::put_abi(obj)));\n\n        return obj.try_as<T>();\n    }\n\n    template<typename T>\n    InstanceHandle ConvertToH(T obj)\n    {\n        InstanceHandle handle = 0;\n        xamlDiagnostics->GetHandleFromIInspectable(reinterpret_cast<::IInspectable*>(winrt::get_abi(obj)), &handle);\n\n        return handle;\n    }\n    std::vector<std::pair<int, winrt::Windows::UI::Xaml::FrameworkElement>> FindChildrenRecursive(std::optional<std::wstring> name, winrt::Windows::UI::Xaml::UIElement root, int deep);\n    winrt::Windows::UI::Xaml::FrameworkElement FindChildRecursive(std::wstring name, winrt::Windows::UI::Xaml::UIElement root);\n    winrt::Windows::Foundation::IAsyncAction StartYPosTask(Taskbar* taskbar);\n    winrt::Windows::Foundation::IAsyncAction StartUITask(Taskbar* taskbar);\n\n};\n\n"
  },
  {
    "path": "RainbowTaskbarDLL/csharpinterop.cpp",
    "content": "﻿#include \"winrt.h\"\n#include \"RainbowTaskbarDLL_h.h\"\n#include <comdef.h>\n#include <windows.h>\n#include <winuser.h>\n\n\n#include <winrt/Windows.ApplicationModel.h>\n\n#define IF_GET_API                                                              \\\nHRESULT hr;                                                                     \\\nwinrt::com_ptr<::IUnknown> _API;                                                  \\\nif (FAILED(hr = GetActiveObject(CLSID_AppearanceServiceAPI, 0, _API.put()))) {  \\\n    return hr;                                                                  \\\n}                                                                               \\\nwinrt::com_ptr<::IDispatch> API = _API.try_as<::IDispatch>();                       \\\nif (API != nullptr)\n\n#define INVOKE(x) API->Invoke(x, IID_NULL, 0, DISPATCH_METHOD, &params, 0, 0, 0)\n\n#define NO_ARGS(x)                                                              \\\nDISPPARAMS params;                                                              \\\nparams.cArgs = 0;                                                               \\\nparams.cNamedArgs = 0;                                                          \\\nhr = INVOKE(x);                                                                 \\\nreturn hr\n\n\n\n#define SAType 0\n#define Close 1\n#define Version 2\n#define GetDataPtr 3\n#define SetTaskbarElementsOpacity 4\n\n#define DGetUiTree 10\n\n__declspec(dllexport) STDAPI SetAppearanceTypeDLL(UINT type) {\n    IF_GET_API {\n        VARIANTARG arg = {0};\n        arg.vt = VT_UI4;\n        arg.ulVal = type;\n\n        DISPPARAMS params;\n        params.cArgs = 1;\n        params.cNamedArgs = 0;\n        params.rgvarg = &arg;\n        hr = INVOKE(SAType);\n        return hr;\n    } else {\n        return E_FAIL;\n    }\n\n}\n\n__declspec(dllexport) STDAPI CloseDLL() {\n    IF_GET_API {\n        NO_ARGS(Close);\n    \n    } else {\n        return E_FAIL;\n    }\n}\n__declspec(dllexport) STDAPI VersionDLL() {\n    IF_GET_API {\n        NO_ARGS(Version);\n    } else {\n        return 0;\n    }\n}\n__declspec(dllexport) STDAPI GetDataPtrDLL() {\n    IF_GET_API {\n        NO_ARGS(GetDataPtr);\n    } else {\n        return 0;\n    }\n}\n\n__declspec(dllexport) STDAPI DebugGetUITreeDLL(BSTR* tree) {\n    return E_FAIL;\n\n}\n\n\n__declspec(dllexport) STDAPI SetTaskbarElementsOpacityDLL(UINT opac) {\n    IF_GET_API{\n        VARIANTARG arg = {0};\n        arg.vt = VT_UI4;\n        arg.ulVal = opac;\n\n        DISPPARAMS params;\n        params.cArgs = 1;\n        params.cNamedArgs = 0;\n        params.rgvarg = &arg;\n        hr = INVOKE(SetTaskbarElementsOpacity);\n        return hr;\n    }\nelse {\n    return E_FAIL;\n}\n\n}"
  },
  {
    "path": "RainbowTaskbarDLL/dllmain.cpp",
    "content": "﻿// dllmain.cpp : Defines the entry point for the DLL application.\n#include \"framework.h\"\n#include \"winrt.h\"\n#include \"TAP.h\"\n#include \"RainbowTaskbarDLL_h.h\"\n#include \"Factory.h\"\n\n\n_Check_return_ STDAPI OldDllGetClassObject(_In_ REFCLSID rclsid, _In_ REFIID riid, _Outptr_ LPVOID* ppv);\n\n#include <comdef.h>\n#include <tchar.h>\nSTDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) try\n{\n    if (rclsid == CLSID_TAPSite) {\n        return winrt::make<Factory<TAP>>().as(riid, ppv);\n    }\n    else {\n        return OldDllGetClassObject(rclsid, riid, ppv);;\n    }\n}\ncatch (...)\n{\n    HRESULT res = winrt::to_hresult();\n    _com_error err(res);\n    MessageBox(0, err.ErrorMessage(), _T(\"DllGetClassObject RainbowTaskbarDLL Error\"), 0);\n    return res;\n}\n\nSTDAPI DllCanUnloadNow()\n{\n    return S_OK;\n}\n\n\nBOOL APIENTRY DllMain( HMODULE hModule,\n                       DWORD  ul_reason_for_call,\n                       LPVOID lpReserved\n                     )\n{\n   \n    switch (ul_reason_for_call)\n    {\n    case DLL_PROCESS_ATTACH:\n        break;\n    case DLL_THREAD_ATTACH:\n\n        break;\n    case DLL_THREAD_DETACH:\n\n        break;\n    case DLL_PROCESS_DETACH:\n        AppearanceServiceAPI::Unload();\n        break;\n    }\n    return TRUE;\n}\n\n"
  },
  {
    "path": "RainbowTaskbarDLL/framework.h",
    "content": "#pragma once\n\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n// Windows Header Files\n#include <windows.h>\n"
  },
  {
    "path": "RainbowTaskbarDLL/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Microsoft.Windows.CppWinRT\" version=\"2.0.250303.1\" targetFramework=\"native\" />\n</packages>"
  },
  {
    "path": "RainbowTaskbarDLL/winrt.h",
    "content": "﻿#pragma once\n\n\n#include <guiddef.h>\n#include <Unknwn.h>\n#include <winrt/base.h>\n\n#include <winrt/Windows.UI.Xaml.Hosting.h>\n#include <windows.ui.xaml.hosting.desktopwindowxamlsource.h>\n#include <winrt/Windows.UI.Xaml.h>\n#include <winrt/Windows.UI.Xaml.Shapes.h>\n#include <winrt/Windows.UI.Xaml.Media.h>\n"
  },
  {
    "path": "SetupARM64.iss",
    "content": "; Script generated by the Inno Setup Script Wizard.\n; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!\n\n#define MyAppName \"RainbowTaskbar\"\n#define MyAppVersion \"3.2.1\"\n#define MyAppPublisher \"ad2017gd\"\n#define MyAppURL \"https://ad2017.dev/rnb\"\n#define MyAppExeName \"rnbtsk-arm64.exe\"\n\n[Setup]\n; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.\n; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)\nAppId={{B9A6581F-9669-42A0-8F7C-0F8EC815121E}\nAppName={#MyAppName}\nAppVersion={#MyAppVersion}\n;AppVerName={#MyAppName} {#MyAppVersion}\nAppPublisher={#MyAppPublisher}\nAppPublisherURL={#MyAppURL}\nAppSupportURL={#MyAppURL}\nAppUpdatesURL={#MyAppURL}\nDefaultDirName={autopf}\\{#MyAppName}\nUninstallDisplayIcon={app}\\{#MyAppExeName}\n; \"ArchitecturesAllowed=x64compatible\" specifies that Setup cannot run\n; on anything but x64 and Windows 11 on Arm.\nArchitecturesAllowed=x64compatible\n; \"ArchitecturesInstallIn64BitMode=x64compatible\" requests that the\n; install be done in \"64-bit mode\" on x64 or Windows 11 on Arm,\n; meaning it should use the native 64-bit Program Files directory and\n; the 64-bit view of the registry.\nArchitecturesInstallIn64BitMode=x64compatible\nDisableProgramGroupPage=yes\n; Uncomment the following line to run in non administrative install mode (install for current user only).\n;PrivilegesRequired=lowest\nOutputBaseFilename=setup-arm64\nSetupIconFile=RainbowTaskbar\\Resources\\icon.ico\nSolidCompression=yes\nWizardStyle=modern\nWizardSmallImageFile=RainbowTaskbar\\Resources\\icon.bmp\n\n[Languages]\nName: \"english\"; MessagesFile: \"compiler:Default.isl\"\nName: \"french\"; MessagesFile: \"compiler:Languages\\French.isl\"\n\n[Tasks]\nName: \"desktopicon\"; Description: \"{cm:CreateDesktopIcon}\"; GroupDescription: \"{cm:AdditionalIcons}\"; Flags: unchecked\n\n[Files]\nSource: \"RainbowTaskbar\\bin\\Release\\net6.0-windows\\publisharm64\\{#MyAppExeName}\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"RainbowTaskbar\\Resources\\icon.ico\"; DestDir: \"{app}\"; Flags: ignoreversion\n; NOTE: Don't use \"Flags: ignoreversion\" on any shared system files\n\n[Icons]\nName: \"{autoprograms}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"; IconFilename: \"{app}\\icon.ico\"\nName: \"{autodesktop}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"; Tasks: desktopicon; IconFilename: \"{app}\\icon.ico\"\n\n[Run]\nFilename: \"{app}\\{#MyAppExeName}\"; Description: \"{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}\"; Flags: nowait postinstall skipifsilent\n\n"
  },
  {
    "path": "SetupX64.iss",
    "content": "; Script generated by the Inno Setup Script Wizard.\n; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!\n\n#define MyAppName \"RainbowTaskbar\"\n#define MyAppVersion \"3.2.1\"\n#define MyAppPublisher \"ad2017gd\"\n#define MyAppURL \"https://ad2017.dev/rnb\"\n#define MyAppExeName \"rnbtsk-x64.exe\"\n\n[Setup]\n; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.\n; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)\nAppId={{C8E94E62-682A-464A-9BE5-DE8A70350F75}\nAppName={#MyAppName}\nAppVersion={#MyAppVersion}\n;AppVerName={#MyAppName} {#MyAppVersion}\nAppPublisher={#MyAppPublisher}\nAppPublisherURL={#MyAppURL}\nAppSupportURL={#MyAppURL}\nAppUpdatesURL={#MyAppURL}\nDefaultDirName={autopf}\\{#MyAppName}\nUninstallDisplayIcon={app}\\{#MyAppExeName}\n; \"ArchitecturesAllowed=x64compatible\" specifies that Setup cannot run\n; on anything but x64 and Windows 11 on Arm.\nArchitecturesAllowed=x64compatible\n; \"ArchitecturesInstallIn64BitMode=x64compatible\" requests that the\n; install be done in \"64-bit mode\" on x64 or Windows 11 on Arm,\n; meaning it should use the native 64-bit Program Files directory and\n; the 64-bit view of the registry.\nArchitecturesInstallIn64BitMode=x64compatible\nDisableProgramGroupPage=yes\n; Uncomment the following line to run in non administrative install mode (install for current user only).\n;PrivilegesRequired=lowest\nOutputBaseFilename=setup-x64\nSetupIconFile=RainbowTaskbar\\Resources\\icon.ico\nSolidCompression=yes\nWizardStyle=modern\nWizardSmallImageFile=RainbowTaskbar\\Resources\\icon.bmp\n\n\n[Languages]\nName: \"english\"; MessagesFile: \"compiler:Default.isl\"\nName: \"french\"; MessagesFile: \"compiler:Languages\\French.isl\"\n\n[Tasks]\nName: \"desktopicon\"; Description: \"{cm:CreateDesktopIcon}\"; GroupDescription: \"{cm:AdditionalIcons}\"; Flags: unchecked\n\n[Files]\nSource: \"RainbowTaskbar\\bin\\Release\\net6.0-windows\\publish64\\{#MyAppExeName}\"; DestDir: \"{app}\"; Flags: ignoreversion\nSource: \"RainbowTaskbar\\Resources\\icon.ico\"; DestDir: \"{app}\"; Flags: ignoreversion\n; NOTE: Don't use \"Flags: ignoreversion\" on any shared system files\n\n[Icons]\nName: \"{autoprograms}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"; IconFilename: \"{app}\\icon.ico\"\nName: \"{autodesktop}\\{#MyAppName}\"; Filename: \"{app}\\{#MyAppExeName}\"; Tasks: desktopicon; IconFilename: \"{app}\\icon.ico\"\n\n[Run]\nFilename: \"{app}\\{#MyAppExeName}\"; Description: \"{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}\"; Flags: nowait postinstall skipifsilent\n\n"
  }
]